Робот не открывает сделки на реальном счете

 

Всем привет!

Народ, прошу помощи знающих. Суть такова: сделал себе торгового робота, за основу взял стандартный советник в МТ4 Moving Average. В тестере работает, на демке включил - работает. Включил на реале - не торгует. Не могу понять в чем причина. Может кто знает в чем проблема, буду рад совету. Спасибо.

 
luckytrader5:

Всем привет!

Народ, прошу помощи знающих. Суть такова: сделал себе торгового робота, за основу взял стандартный советник в МТ4 Moving Average. В тестере работает, на демке включил - работает. Включил на реале - не торгует. Не могу понять в чем причина. Может кто знает в чем проблема, буду рад совету. Спасибо.

Так никто не скажет. Нужен код, отправляющий сделку... Или хотя бы коды ошибок...

 
Как минимум может быть конкурсный счет, и на нем торговля экспертом запрещена. Вообще нужно больше информации, как вам уже сказали.
 

Зачем код то нужен))) или код ошибки.Достаточно посмотреть в журнал)))

Спросишь ,вероятно каждый ответить, что как минимум год занимается программированием и лет 10 в реальной торгвле)))

 
darirunu1:

Зачем код то нужен))) или код ошибки.Достаточно посмотреть в журнал)))

Спросишь ,вероятно каждый ответить, что как минимум год занимается программированием и лет 10 в реальной торгвле)))

Кхе-кхе, в журнале печатаются ошибки а если ошибка в алгоритме или в водимых параметрах и нет функции принта ошибки то в журнале Вы об этом не узнаете )

 
VVT:

Кхе-кхе, в журнале печатаются ошибки а если ошибка в алгоритме или в водимых параметрах и нет функции принта ошибки то в журнале Вы об этом не узнаете )

Ну тут мой шар говорит, что алгоритм вроде у него нормально работает. В тестере и на демке открывает ведь. Так что скорее всего какие-то ограничения.

 
Konstantin Nikitin:

Ну тут мой шар говорит, что алгоритм вроде у него нормально работает. В тестере и на демке открывает ведь. Так что скорее всего какие-то ограничения.

Я к тому, что без кода это гадание на ромашке 

 
Yevhenii Levchenko:

Так никто не скажет. Нужен код, отправляющий сделку... Или хотя бы коды ошибок...

Вот код. Прошу не судить строго, так как собирал все сам.


#define MAGICMA  20110426


extern string Moving ="Настройки мувингов";

extern int MovingPeriod1       = 52;

extern int MovingShift1        = 0;

extern int MovingPeriod2       = 144;

extern int MovingShift2        = 0;


extern string Stoch ="Настройки стохастика";

extern int KPeriod1 = 14;

extern int StochOversold1         = 10;

extern int StochOverbought1       = 90;

extern int KPeriod2 = 14;

extern int StochOversold2         = 10;

extern int StochOverbought2       = 90;


extern string Trailing_Funcion = "Настройки Трейлинг стоп";

extern double Lots               = 0.2;

extern double StopLoss           = 0.01;

extern double TakeProfit         = 0.03;

extern bool tral =true;

extern int TrailingStop = 300; // Растояние в пунктах, откуда начнем тралить

extern int TrailingStep = 0; // Шаг трала


//| Функция трейлинг стоп лосс |

void T_SL()

  {

   int i=0;

   for(i=0; i<OrdersTotal(); i++)

     {

      if(!(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)))

         continue;

      if(OrderSymbol() != Symbol())

         continue;

      if(OrderMagicNumber()!=MAGICMA)

         continue;

      if(OrderType()==OP_BUY)

        {

         if(NormalizeDouble(Bid-OrderOpenPrice(),Digits)>NormalizeDouble(TrailingStop*Point,Digits))

           {

            if(NormalizeDouble(OrderStopLoss(),Digits)<NormalizeDouble(Bid-(TrailingStop+TrailingStep-1)*Point,Digits))

              {

               OrderModify(OrderTicket(), OrderOpenPrice(), NormalizeDouble(Bid-TrailingStop*Point,Digits), OrderTakeProfit(), 0, CLR_NONE);

              }

           } //end if(NormalizeDouble(Bid-OrderOpenPrice(),Digits)>NormalizeDouble(TrailingStop*Point,Digits))

        } //end if(OrderType()==OP_BUY)

      if(OrderType()==OP_SELL)

        {

         if(NormalizeDouble(OrderOpenPrice()-Ask,Digits)>NormalizeDouble(TrailingStop*Point,Digits))

           {

            if(OrderStopLoss()==0 || NormalizeDouble(OrderStopLoss(),Digits)>NormalizeDouble(Ask+(TrailingStop+TrailingStep-1)*Point,Digits))

              {

               OrderModify(OrderTicket(), OrderOpenPrice(), NormalizeDouble(Ask+TrailingStop*Point,Digits), OrderTakeProfit(), 0, CLR_NONE);

              }

           }

        }

     }

  }

//| Конец функции трейлинг стоп лосс |

//+------------------------------------------------------------------+

//| Calculate open positions                                         |

//+------------------------------------------------------------------+

int CalculateCurrentOrders(string symbol)

  {

   int buys=0,sells=0;

//----

   for(int i=0;i<OrdersTotal();i++)

     {

      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) break;

      if(OrderSymbol()==Symbol() && OrderMagicNumber()==MAGICMA)

        {

         if(OrderType()==OP_BUY)  buys++;

         if(OrderType()==OP_SELL) sells++;

        }

     }

//---- return orders volume

   if(buys>10) return(buys);

   else if(sells>10) return(sells);

  }

//+------------------------------------------------------------------+

//| Check for open order conditions                                  |

//+------------------------------------------------------------------+

void CheckForOpen()

  {

//---- go trading only for first tiks of new bar

   if(Volume[0]>1) return;

//---- get Moving Average   

   int    res;  

//---- 

   double ma10=iMA(NULL,0,MovingPeriod1,MovingShift1,MODE_SMA,PRICE_CLOSE,0); // Значение Moving  Average на текущем баре

   double ma11=iMA(NULL,0,MovingPeriod1,MovingShift1,MODE_SMA,PRICE_CLOSE,1); // Значение Moving  Average на предыдущем баре

   double ma12=iMA(NULL,0,MovingPeriod1,MovingShift1,MODE_SMA,PRICE_CLOSE,2); // Значение Moving  Average на предпредыдущем баре

   double ma20=iMA(NULL,0,MovingPeriod2,MovingShift2,MODE_SMA,PRICE_CLOSE,0); // Значение Moving  Average на текущем баре

   double ma21=iMA(NULL,0,MovingPeriod2,MovingShift2,MODE_SMA,PRICE_CLOSE,1); // Значение Moving  Average на предыдущем баре

   double ma22=iMA(NULL,0,MovingPeriod2,MovingShift2,MODE_SMA,PRICE_CLOSE,2); // Значение Moving  Average на предпредыдущем баре

   double st1=iStochastic(NULL,0,KPeriod1,3,3,MODE_SMA,0,MODE_MAIN,0);

   double st2=iStochastic(NULL,5,KPeriod2,3,3,MODE_SMA,0,MODE_MAIN,0);

//---- buy 

   if(ma11>ma12 && ma10>ma11 && ma21>ma22 && ma20>ma21 && Close[1]>ma10 && st1<StochOversold1 && st2<StochOversold2)  // Moving  Average растет, Stochastic ниже уровня перепроданности и цена выше Moving  Average

     {

      res=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,Ask-StopLoss,Ask+TakeProfit,"",MAGICMA,0,Blue);

      return;

     }      

//---- sell   

   if(ma11<ma12 && ma10<ma11 && ma21<ma22 && ma20<ma21 && Close[1]<ma10 && st1>StochOverbought1 && st2>StochOverbought2)  // Moving  Average убывает, Stochastic выше уровня перекупленности и цена ниже Moving  Average

     {

      res=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,Bid+StopLoss,Bid-TakeProfit,"",MAGICMA,0,Red);

      return;

     }     

  }  

//+------------------------------------------------------------------+

//| Check for close order conditions                                 |

//+------------------------------------------------------------------+

void CheckForClose()

  {

   double ma10=iMA(NULL,0,MovingPeriod1,MovingShift1,MODE_SMA,PRICE_CLOSE,0); // Значение Moving  Average на текущем баре

   double ma11=iMA(NULL,0,MovingPeriod1,MovingShift1,MODE_SMA,PRICE_CLOSE,1); // Значение Moving  Average на предыдущем баре

   double ma12=iMA(NULL,0,MovingPeriod1,MovingShift1,MODE_SMA,PRICE_CLOSE,2); // Значение Moving  Average на предпредыдущем баре

   double ma20=iMA(NULL,0,MovingPeriod2,MovingShift2,MODE_SMA,PRICE_CLOSE,0); // Значение Moving  Average на текущем баре

   double ma21=iMA(NULL,0,MovingPeriod2,MovingShift2,MODE_SMA,PRICE_CLOSE,1); // Значение Moving  Average на предыдущем баре

   double ma22=iMA(NULL,0,MovingPeriod2,MovingShift2,MODE_SMA,PRICE_CLOSE,2); // Значение Moving  Average на предпредыдущем баре

//--- go trading only for first tiks of new bar

   if(Volume[0]>1)

      return;

//--- get Moving Average


//---

   for(int i=0; i<OrdersTotal(); i++)

     {

      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false)

         break;

      if(OrderMagicNumber()!=MAGICMA || OrderSymbol()!=Symbol())

         continue;

      //--- check order type

      if(OrderType()==OP_BUY)

        {

         if(ma11<ma12 && ma10<ma11 && ma21<ma22 && ma20<ma21)

           {

            if(!OrderClose(OrderTicket(),OrderLots(),Bid,3,White))

               Print("OrderClose error ",GetLastError());

           }

         break;

        }

      if(OrderType()==OP_SELL)

        {

         if(ma11>ma12 && ma10>ma11 && ma21>ma22 && ma20>ma21)

           {

            if(!OrderClose(OrderTicket(),OrderLots(),Ask,3,White))

               Print("OrderClose error ",GetLastError());

           }

         break;

        }

     }

//---

  }

//+------------------------------------------------------------------+

//| Start function                                                   |

//+------------------------------------------------------------------+

void start()

  {

     if(tral)

     {

      T_SL();

     }

//---- check for history and trading

   if(Bars<100 || IsTradeAllowed()==false) return;

//---- calculate open orders by current symbol

   if(CalculateCurrentOrders(Symbol())==0) CheckForOpen();

   else      CheckForClose();

  }

//+------------------------------------------------------------------+

 
luckytrader5:   Вот код. Прошу не судить строго, так как собирал все сам.
#define MAGICMA  20110426
extern string Moving ="Настройки мувингов";
extern int MovingPeriod1       = 52;
extern int MovingShift1        = 0;
extern int MovingPeriod2       = 144;
extern int MovingShift2        = 0;
extern string Stoch ="Настройки стохастика";
extern int KPeriod1 = 14;
extern int StochOversold1      = 10;
extern int StochOverbought1    = 90;
extern int KPeriod2 = 14;
extern int StochOversold2      = 10;
extern int StochOverbought2    = 90;
extern string Trailing_Funcion = "Настройки Трейлинг стоп";
extern double Lots             = 0.2;
extern double StopLoss         = 0.01;
extern double TakeProfit       = 0.03;
extern bool tral =true;
extern int TrailingStop = 300; // Растояние в пунктах, откуда начнем тралить
extern int TrailingStep = 0; // Шаг трала

//| Функция трейлинг стоп лосс |
void T_SL()
  {
   int i=0;
   for(i=0; i<OrdersTotal(); i++)
     {
      if(!(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)))
         continue;
      if(OrderSymbol() != Symbol())
         continue;
      if(OrderMagicNumber()!=MAGICMA)
         continue;
      if(OrderType()==OP_BUY)
        {
         if(NormalizeDouble(Bid-OrderOpenPrice(),Digits)>NormalizeDouble(TrailingStop*Point,Digits))
           {
            if(NormalizeDouble(OrderStopLoss(),Digits)<NormalizeDouble(Bid-(TrailingStop+TrailingStep-1)*Point,Digits))
              {
               OrderModify(OrderTicket(), OrderOpenPrice(), NormalizeDouble(Bid-TrailingStop*Point,Digits), OrderTakeProfit(), 0, CLR_NONE);
              }
           } //end if(NormalizeDouble(Bid-OrderOpenPrice(),Digits)>NormalizeDouble(TrailingStop*Point,Digits))
        } //end if(OrderType()==OP_BUY)
      if(OrderType()==OP_SELL)
        {
         if(NormalizeDouble(OrderOpenPrice()-Ask,Digits)>NormalizeDouble(TrailingStop*Point,Digits))
           {
            if(OrderStopLoss()==0 || NormalizeDouble(OrderStopLoss(),Digits)>NormalizeDouble(Ask+(TrailingStop+TrailingStep-1)*Point,Digits))
              {
               OrderModify(OrderTicket(), OrderOpenPrice(), NormalizeDouble(Ask+TrailingStop*Point,Digits), OrderTakeProfit(), 0, CLR_NONE);
              }
           }
        }
     }
  }
//| Конец функции трейлинг стоп лосс |

//+------------------------------------------------------------------+
//| Calculate open positions                                         |
//+------------------------------------------------------------------+
int CalculateCurrentOrders(string symbol)
  {
   int buys=0,sells=0;
//----
   for(int i=0;i<OrdersTotal();i++)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) break;
      if(OrderSymbol()==Symbol() && OrderMagicNumber()==MAGICMA)
        {
         if(OrderType()==OP_BUY)  buys++;
         if(OrderType()==OP_SELL) sells++;
        }
     }
//---- return orders volume
   if(buys>10) return(buys);
   else if(sells>10) return(sells);
  }

//+------------------------------------------------------------------+
//| Check for open order conditions                                  |
//+------------------------------------------------------------------+
void CheckForOpen()
  {
//---- go trading only for first tiks of new bar
   if(Volume[0]>1) return;
//---- get Moving Average   
   int    res;  
//---- 
   double ma10=iMA(NULL,0,MovingPeriod1,MovingShift1,MODE_SMA,PRICE_CLOSE,0); // Значение Moving  Average на текущем баре
   double ma11=iMA(NULL,0,MovingPeriod1,MovingShift1,MODE_SMA,PRICE_CLOSE,1); // Значение Moving  Average на предыдущем баре
   double ma12=iMA(NULL,0,MovingPeriod1,MovingShift1,MODE_SMA,PRICE_CLOSE,2); // Значение Moving  Average на предпредыдущем баре
   double ma20=iMA(NULL,0,MovingPeriod2,MovingShift2,MODE_SMA,PRICE_CLOSE,0); // Значение Moving  Average на текущем баре
   double ma21=iMA(NULL,0,MovingPeriod2,MovingShift2,MODE_SMA,PRICE_CLOSE,1); // Значение Moving  Average на предыдущем баре
   double ma22=iMA(NULL,0,MovingPeriod2,MovingShift2,MODE_SMA,PRICE_CLOSE,2); // Значение Moving  Average на предпредыдущем баре
   double st1=iStochastic(NULL,0,KPeriod1,3,3,MODE_SMA,0,MODE_MAIN,0);
   double st2=iStochastic(NULL,5,KPeriod2,3,3,MODE_SMA,0,MODE_MAIN,0);
//---- buy 
   if(ma11>ma12 && ma10>ma11 && ma21>ma22 && ma20>ma21 && Close[1]>ma10 && st1<StochOversold1 && st2<StochOversold2)  // Moving  Average растет, Stochastic ниже уровня перепроданности и цена выше Moving  Average
     {
      res=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,Ask-StopLoss,Ask+TakeProfit,"",MAGICMA,0,Blue);
      return;
     }      
//---- sell   
   if(ma11<ma12 && ma10<ma11 && ma21<ma22 && ma20<ma21 && Close[1]<ma10 && st1>StochOverbought1 && st2>StochOverbought2)  // Moving  Average убывает, Stochastic выше уровня перекупленности и цена ниже Moving  Average
     {
      res=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,Bid+StopLoss,Bid-TakeProfit,"",MAGICMA,0,Red);
      return;
     }     
  }  

//+------------------------------------------------------------------+
//| Check for close order conditions                                 |
//+------------------------------------------------------------------+
void CheckForClose()
  {
   double ma10=iMA(NULL,0,MovingPeriod1,MovingShift1,MODE_SMA,PRICE_CLOSE,0); // Значение Moving  Average на текущем баре
   double ma11=iMA(NULL,0,MovingPeriod1,MovingShift1,MODE_SMA,PRICE_CLOSE,1); // Значение Moving  Average на предыдущем баре
   double ma12=iMA(NULL,0,MovingPeriod1,MovingShift1,MODE_SMA,PRICE_CLOSE,2); // Значение Moving  Average на предпредыдущем баре
   double ma20=iMA(NULL,0,MovingPeriod2,MovingShift2,MODE_SMA,PRICE_CLOSE,0); // Значение Moving  Average на текущем баре
   double ma21=iMA(NULL,0,MovingPeriod2,MovingShift2,MODE_SMA,PRICE_CLOSE,1); // Значение Moving  Average на предыдущем баре
   double ma22=iMA(NULL,0,MovingPeriod2,MovingShift2,MODE_SMA,PRICE_CLOSE,2); // Значение Moving  Average на предпредыдущем баре
//--- go trading only for first tiks of new bar
   if(Volume[0]>1)
      return;
//--- get Moving Average
//---
   for(int i=0; i<OrdersTotal(); i++)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false)
         break;
      if(OrderMagicNumber()!=MAGICMA || OrderSymbol()!=Symbol())
         continue;
      //--- check order type
      if(OrderType()==OP_BUY)
        {
         if(ma11<ma12 && ma10<ma11 && ma21<ma22 && ma20<ma21)
           {
            if(!OrderClose(OrderTicket(),OrderLots(),Bid,3,White))
               Print("OrderClose error ",GetLastError());
           }
         break;
        }
      if(OrderType()==OP_SELL)
        {
         if(ma11>ma12 && ma10>ma11 && ma21>ma22 && ma20>ma21)
           {
            if(!OrderClose(OrderTicket(),OrderLots(),Ask,3,White))
               Print("OrderClose error ",GetLastError());
           }
         break;
        }
     }
//---
  }

//+------------------------------------------------------------------+
//| Start function                                                   |
//+------------------------------------------------------------------+
void start()
  {
     if(tral)
     {
      T_SL();
     }
//---- check for history and trading
   if(Bars<100 || IsTradeAllowed()==false) return;
//---- calculate open orders by current symbol
   if(CalculateCurrentOrders(Symbol())==0) CheckForOpen();
   else      CheckForClose();
  }
//+------------------------------------------------------------------+

Вот так в два раза короче и потому понятнее. В виде прикрепленного файла - во много раз еще

В тестере выглядит так:

Ну и зачем его в демо и тем более на реал пускать?

Посмотрите на минутный график, т.е М1. Иногда за минуту цена на 100 пунктов проходит. Это при лоте 0,2 за минуту можно получить 20 долларов прибыли. А представьте Вам экран закрыли и показывают раз в 52 минуты. Много наторгуете? Причем здесь 52 минуты? А это Вы у автора спросите, это в его программе стоит MovingPeriod1 = 52;  и даже MovingPeriod2 = 144;

Мне кажется, автор потролить чуть-чуть захотел

Или у него как у Звездочета который Мамаев Магомед Хан-Магомедович лишняя штука баксов?

Файлы:
-EXP-1.mq4  8 kb
 
luckytrader5:

Вот код. Прошу не судить строго, так как собирал все сам.

Смотрите по фильтру взятия позиций. Слишком много фильтров, то-же плохо. Может ни когда не сложиться условие что позиция возьмется.
А так парочку проверок все равно не помешает.
#define MAGICMA  20110426

input string Moving ="Настройки мувингов";
input int MovingPeriod1       = 52;
input int MovingShift1        = 0;
input int MovingPeriod2       = 144;
input int MovingShift2        = 0;
input string Stoch ="Настройки стохастика";
input int KPeriod1 = 14;
input int StochOversold1         = 10;
input int StochOverbought1       = 90;
input int KPeriod2 = 14;
input int StochOversold2         = 10;
input int StochOverbought2       = 90;
input string Trailing_Funcion = "Настройки Трейлинг стоп";
input double Lots               = 0.2;
input double StopLoss           = 0.01;
input double TakeProfit         = 0.03;
input bool tral =true;
input int TrailingStop = 300; // Растояние в пунктах, откуда начнем тралить
input int TrailingStep = 0; // Шаг трала

double i_ma[2][3];

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
    {
//---
     if(!AccountInfoInteger(ACCOUNT_TRADE_EXPERT))
         {
          Comment("Trading is prohibited for the ", AccountInfoInteger(ACCOUNT_LOGIN), " account. ",
                  "It is possible that the connection to the trading account was made using an investment password. ",
                  "Check the terminal log to see if there is such an entry: \"",
                  AccountInfoInteger(ACCOUNT_LOGIN), " trading disabled-investor mode\".");
          ExpertRemove();
         }

//---
     return(INIT_SUCCEEDED);
    }
//| Функция трейлинг стоп лосс |
void T_SL()
    {
     int i=0;
     for(i=0; i<OrdersTotal(); i++)
         {
          if(!(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)))
               continue;
          if(OrderSymbol() != Symbol())
               continue;
          if(OrderMagicNumber()!=MAGICMA)
               continue;
          switch(OrderType())
              {
               case OP_BUY:
                    if(NormalizeDouble(Bid-OrderOpenPrice(),Digits)<=NormalizeDouble(TrailingStop*Point,Digits))
                         break;
                    if(NormalizeDouble(OrderStopLoss(),Digits)<NormalizeDouble(Bid-(TrailingStop+TrailingStep-1)*Point,Digits))
                         if(OrderModify(OrderTicket(), OrderOpenPrice(), NormalizeDouble(Bid-TrailingStop*Point,Digits), OrderTakeProfit(), 0, CLR_NONE))
                              break;
                    break;
               case OP_SELL:
                    if(NormalizeDouble(OrderOpenPrice()-Ask,Digits)<=NormalizeDouble(TrailingStop*Point,Digits))
                         break;
                    if(OrderStopLoss()==0 || NormalizeDouble(OrderStopLoss(),Digits)>NormalizeDouble(Ask+(TrailingStop+TrailingStep-1)*Point,Digits))
                         if(OrderModify(OrderTicket(), OrderOpenPrice(), NormalizeDouble(Ask+TrailingStop*Point,Digits), OrderTakeProfit(), 0, CLR_NONE))
                              break;
              }
         }
    }
//| Конец функции трейлинг стоп лосс |
//+------------------------------------------------------------------+
//| Calculate open positions                                         |
//+------------------------------------------------------------------+
int CalculateCurrentOrders(string symbol)
    {
     int buys=0,sells=0;
//----
     for(int i=0; i<OrdersTotal(); i++)
         {
          if(!OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
               continue;
          if(OrderSymbol()!=_Symbol)
               continue;
          if(OrderMagicNumber()!=MAGICMA)
               continue;
          switch(OrderType())
              {
               case OP_BUY:
                    buys++;
                    break;
               case OP_SELL:
                    sells++;
                    break;
              }
         }
//---- return orders volume
     if(buys>10)
          return(buys);

     if(sells>10)
          return(sells);
//---
     return 0;
    }
//+------------------------------------------------------------------+
//| Check for open order conditions                                  |
//+------------------------------------------------------------------+
void CheckForOpen()
    {
//---- go trading only for first tiks of new bar
     if(Volume[0]>1)
          return;
//---- get Moving Average
     int    res;
//----
     double st1=iStochastic(NULL,0,KPeriod1,3,3,MODE_SMA,0,MODE_MAIN,0);
     double st2=iStochastic(NULL,5,KPeriod2,3,3,MODE_SMA,0,MODE_MAIN,0);
//---- buy
     if(i_ma[0][1]>i_ma[0][2])
          if(i_ma[0][0]>i_ma[0][1])
               if(i_ma[1][1]>i_ma[1][2])
                    if(i_ma[1][0]>i_ma[1][1])
                         if(Close[1]>i_ma[0][0])
                              if(st1<StochOversold1)
                                   if(st2<StochOversold2)
                                       {
                                        res=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,Ask-StopLoss,Ask+TakeProfit,"",MAGICMA,0,Blue);
                                        return;
                                       }
//---- sell
     if(i_ma[0][1]<i_ma[0][2])
          if(i_ma[0][0]<i_ma[0][1])
               if(i_ma[1][1]<i_ma[1][2])
                    if(i_ma[1][0]<i_ma[1][1])
                         if(Close[1]<i_ma[0][0])
                              if(st1>StochOverbought1)
                                   if(st2>StochOverbought2)
                                       {
                                        res=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,Bid+StopLoss,Bid-TakeProfit,"",MAGICMA,0,Red);
                                        return;
                                       }
    }
//+------------------------------------------------------------------+
//| Check for close order conditions                                 |
//+------------------------------------------------------------------+
void CheckForClose()
    {
//--- go trading only for first tiks of new bar
     if(Volume[0]>1)
          return;
//--- get Moving Average
//---
     for(int i=0; i<OrdersTotal(); i++)
         {
          if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false)
               break;
          if(OrderMagicNumber()!=MAGICMA || OrderSymbol()!=Symbol())
               continue;
          //--- check order type
          if(OrderType()==OP_BUY)
              {
               if(i_ma[0][1]<i_ma[0][2] && i_ma[0][0]<i_ma[0][1] && i_ma[1][1]<i_ma[1][2] && i_ma[1][0]<i_ma[1][1])
                   {
                    if(!OrderClose(OrderTicket(),OrderLots(),Bid,3,White))
                         Print("OrderClose error ",GetLastError());
                   }
               break;
              }
          if(OrderType()==OP_SELL)
              {
               if(i_ma[0][1]>i_ma[0][2] && i_ma[0][0]>i_ma[0][1] && i_ma[1][1]>i_ma[1][2] && i_ma[1][0]>i_ma[1][1])
                   {
                    if(!OrderClose(OrderTicket(),OrderLots(),Ask,3,White))
                         Print("OrderClose error ",GetLastError());
                   }
               break;
              }
         }
//---
    }

//+------------------------------------------------------------------+

//| Start function                                                   |

//+------------------------------------------------------------------+

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnTick()
    {
     if(!CheckingTrading())
          return;
     if(tral)
         {
          T_SL();
         }
//---- check for history and trading
     if(Bars<100 || IsTradeAllowed()==false)
          return;
//---- calculate open orders by current symbol
     for(int i=0; i<3; i++)
         {
          i_ma[0][0]=iMA(NULL,0,MovingPeriod1,MovingShift1,MODE_SMA,PRICE_CLOSE,0); // Значение Moving  Average на текущем баре
          i_ma[0][1]=iMA(NULL,0,MovingPeriod1,MovingShift1,MODE_SMA,PRICE_CLOSE,1); // Значение Moving  Average на предыдущем баре
          i_ma[0][2]=iMA(NULL,0,MovingPeriod1,MovingShift1,MODE_SMA,PRICE_CLOSE,2); // Значение Moving  Average на предпредыдущем баре
          i_ma[1][0]=iMA(NULL,0,MovingPeriod2,MovingShift2,MODE_SMA,PRICE_CLOSE,0); // Значение Moving  Average на текущем баре
          i_ma[1][1]=iMA(NULL,0,MovingPeriod2,MovingShift2,MODE_SMA,PRICE_CLOSE,1); // Значение Moving  Average на предыдущем баре
          i_ma[1][2]=iMA(NULL,0,MovingPeriod2,MovingShift2,MODE_SMA,PRICE_CLOSE,2); // Значение Moving  Average на предпредыдущем баре
         }
     if(CalculateCurrentOrders(Symbol())==0)
          CheckForOpen();
     else
          CheckForClose();
    }

//+------------------------------------------------------------------+
// Проверка возможности торговли                                     |
//+------------------------------------------------------------------+
bool CheckingTrading(void)
    {
     static bool result = true;
//---
     if(!MQLInfoInteger(MQL_TRADE_ALLOWED))
         {
          if(result)
               Print("The expert is not allowed to trade!");
          Comment("The expert is not allowed to trade!");
          result = false;
          return false;
         }
//---
     if(!TerminalInfoInteger(TERMINAL_CONNECTED))
         {
          if(result)
               Print("No connection to the server!");
          Comment("No connection to the server!");
          result = false;
          return false;
         }
     Comment("");
     result = true;

     return true;
    }
//+------------------------------------------------------------------+
 
Konstantin Erin:

Вот так в два раза короче и потому понятнее. В виде прикрепленного файла - во много раз еще

В тестере выглядит так:

Ну и зачем его в демо и тем более на реал пускать? Мне кажется, автор потролить чуть-чуть захотел

Может у него как у Звездочета который Мамаев Магомед Хан-Магомедович лишняя штука баксов?

Ну хочется человеку однако =)))

Причина обращения: