MQL-код эксперта механической торговой системы «20/200 pips».

Внимание !!!

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

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

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

extern int TakeProfit = 20; // Уровень тейкпрофит в пунктах
extern int StopLoss = 200; // уровень стоплосс в пунктах
extern int TradeTime=18;
extern int t1=7;
extern int t2=2;
extern int delta=7;
extern double lot = 0.1;

int ticket;
bool cantrade=true;

int OpenLong(double volume=0.1)
{
  int slippage=10;
  string comment="20/200 expert (Long)";
  color arrow_color=Red;
  int magic=0;

  ticket=OrderSend(Symbol(),OP_BUY,volume,Ask,slippage,Ask-StopLoss*Point,
                      Ask+TakeProfit*Point,comment,magic,0,arrow_color);
  if(ticket>0)
  {
    if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))
    {
      Print("Buy order opened : ",OrderOpenPrice());
      return(0);
    }
  }
  else
  {
    Print("Error opening Buy order : ",GetLastError());
    return(-1);
  }
}

int OpenShort(double volume=0.1)
{
  int slippage=10;
  string comment="20/200 expert (Short)";
  color arrow_color=Red;
  int magic=0;

  ticket=OrderSend(Symbol(),OP_SELL,volume,Bid,slippage,Bid+StopLoss*Point,
                      Bid-TakeProfit*Point,comment,magic,0,arrow_color);
  if(ticket>0)
  {
    if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))
      {
        Print("Sell order opened : ",OrderOpenPrice());
        return(0);
      }
  }
  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;
  // проверяем есть ли открытые ордера ...
  if(OrdersTotal()<1)
  {
    // ... если нет ни одного открытого ордера, то идем дальше
    // проверяем настало ли время для торговли
    if((TimeHour(TimeCurrent())==TradeTime)&&(TimeMinute(TimeCurrent())>=0)&&(cantrade))
    {
      // ... если настало время, то
      if ((Open[t1]-Open[t2])>delta*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*Point) //Если цена изменилась на величину delta
      {
        // условие выполнено значит входим в длинную позицию
        // проверяем есть ли свободные деньги на счету
        if(AccountFreeMarginCheck(Symbol(),OP_BUY,lot)<=0 || GetLastError()==134)
        {
          Print("Not enough money");
          return(0);
        }
        OpenLong(lot);
        cantrade=false;
        return(0);
      }
    }
  }
  return(0);
}