MQL-код эксперта «20/200 pips» версия 3.

Внимание !!!

Нельзя использовать этого эксперта, в том виде в котором он дан ниже, для торговли на реальном счету. Для этого в нем не хватает дополнительных функций обработки ошибок и защиты от сбоев в работе. Его работа на реальном счету может привести к недовольству со стороны ДЦ, вплоть до блокирования счета.

//+------------------------------------------------------------------+
//|                                            20/200 expert v3.mq4  |
//|                                                    1H   EUR/USD  |
//|                                                    Smirnov Pavel |
//|                                                 www.autoforex.ru |
//+------------------------------------------------------------------+

#property copyright "Smirnov Pavel"
#property link      "www.autoforex.ru"

extern int TakeProfit_L = 40; // Уровень тейкпрофит в пунктах
extern int StopLoss_L = 133;  // уровень стоплосс в пунктах
extern int TakeProfit_S = 27; // Уровень тейкпрофит в пунктах
extern int StopLoss_S = 200;  // уровень стоплосс в пунктах
extern int TradeTime=18;      // Время входа в рынок
extern int t1=7;
extern int t2=2;
extern int delta_L=9;
extern int delta_S=10;
extern double lot = 0.1;      // Размер лота
extern int Orders=1;          // максимальное количество одновременно открытых позиций
extern int MaxOpenTime=138;

int ticket,total,cnt;
bool cantrade=true;
double closeprice;
double tmp;

int OpenLong(double volume=0.1)
// функция открывает длинную позицию размером лота=volume 
{
  int slippage=10;
  string comment="20/200 expert v2 (Long)";
  color arrow_color=Red;
  int magic=0;

  ticket=OrderSend(Symbol(),OP_BUY,volume,Ask,slippage,Ask-StopLoss_L*Point,
                      Ask+TakeProfit_L*Point,comment,magic,0,arrow_color);
  if(ticket>0)
  {
    if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))
    {
      return(0);
    }
    else
      {
        Print("OpenLong(),OrderSelect() - выдал ошибку : ",GetLastError());
        return(-1);
      }
  }
  else
  {
    Print("Error opening Buy order : ",GetLastError());
    return(-1);
  }
}

int OpenShort(double volume=0.1)
// функция открывает короткую позицию размером лота=volume
{
  int slippage=10;
  string comment="20/200 expert v2 (Short)";
  color arrow_color=Red;
  int magic=0;

  ticket=OrderSend(Symbol(),OP_SELL,volume,Bid,slippage,Bid+StopLoss_S*Point,
                      Bid-TakeProfit_S*Point,comment,magic,0,arrow_color);
  if(ticket>0)
  {
    if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))
      {
        return(0);
      }
    else
      {
        Print("OpenShort(),OrderSelect() - выдал ошибку : ",GetLastError());
        return(-1);
      }
  }
  else
  {
    Print("Error opening Sell order : ",GetLastError());
    return(-1);
  }
}

int init()
{
  return(0);
}

int deinit()
{
  return(0);
}

int start()
{
  if((TimeHour(TimeCurrent())>TradeTime)) cantrade=true;
  // проверяем есть ли открытые ордера ...
  total=OrdersTotal();
  if(total<Orders)
  {
    // ... если нет ни одного открытого ордера, то идем дальше
    // проверяем настало ли время для торговли
    if((TimeHour(TimeCurrent())==TradeTime)&&(cantrade))
    {
      // ... если настало время, то
      if (((Open[t1]-Open[t2])>delta_S*Point)) //Если цена уменьшилась на величину delta
      {
        //условие выполнено значит входим в короткую позицию:
        // проверяем есть ли свободные деньги для открытия короткой позиции
        if(AccountFreeMarginCheck(Symbol(),OP_SELL,lot)<=0 || GetLastError()==134)
        {
          Print("Not enough money");
          return(0);
        }
        OpenShort(lot);

        cantrade=false; //запрещаем торговать повторно до следующего бара
        return(0);
      }
      if (((Open[t2]-Open[t1])>delta_L*Point)) //Если цена изменилась на величину delta
      {
        // условие выполнено значит входим в длинную позицию
        // проверяем есть ли свободные деньги на счету
        if(AccountFreeMarginCheck(Symbol(),OP_BUY,lot)<=0 || GetLastError()==134)
        {
          Print("Not enough money");
          return(0);
        }
        OpenLong(lot);
        cantrade=false;
        return(0);
      }
    }
  }
// блок проверки времени жизни сделки, если MaxOpenTime=0, то проверку не проводим.
  if(MaxOpenTime>0)
  {
    for(cnt=0;cnt<total;cnt++)
    {
      if (OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES))
      {
         tmp = (TimeCurrent()-OrderOpenTime())/3600.0;
         if (((NormalizeDouble(tmp,8)-MaxOpenTime)>=0))
        {
          RefreshRates();
          if (OrderType()==OP_BUY)
            closeprice=Bid;
          else
            closeprice=Ask;
          if (OrderClose(OrderTicket(),OrderLots(),closeprice,10,Green))
          {
            Print("Принудительное закрытие сделки - №",OrderTicket());
            OrderPrint();
          }
          else
            Print("OrderClose() в блоке проверки времени жизни сделки вернул ошибку - ",GetLastError());
        }
      }
      else
        Print("OrderSelect() в блоке проверки времени жизни сделки вернул ошибку - ",GetLastError());
    }
  }
  return(0);
}