Прошу подсказать с кодом советника на MQL4

 

Здравствуйте. Код открывает и закрывает ордера, но не обрабатывает открытые ордера.


В коде сделан принт в журнал "Есть открытый ордер !***", "Ошибка выделения ордера***", но ни одна запись не выводится. Прошу подсказать в чем ошибка, что открытые ордера не обрабатываются ?

//+------------------------------------------------------------------+
//|                                                     RoboV3.2.mq4 |
//|                        Copyright 2016, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2016, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
   
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
  
  //----1
 
  double LOT=0.01;
     
  int MAPER=10;
  int MASHIFT=2;
  
  double Spread= NormalizeDouble(0.0001,Digits);
  
  int i;
  
  
  
  double MA[];
  ArrayResize(MA,MAPER,10);
  ArrayInitialize(MA,EMPTY_VALUE); 
  
    
  
  string MYSYMBOL=_Symbol;
  double ICLOSE=iOpen(MYSYMBOL,PERIOD_H1,0);
  
    
  double Free=AccountFreeMargin();
  double One_Lot =MarketInfo(MYSYMBOL,MODE_MARGININIT);
  double Min_Lot =MarketInfo(MYSYMBOL,MODE_MINLOT);
  
   
  for (i = 0;i<(MAPER-1); i++)
 {
 MA[i]= iMA(MYSYMBOL,NULL,MAPER,MASHIFT,MODE_EMA,PRICE_OPEN,i);
 }
 
  
  //----1
  
  //----2
  
for(int j=0;i<=OrdersTotal();j++)
     {
      if(OrderSelect(j,SELECT_BY_POS,MODE_TRADES)==true)
      {Print ("Есть открытый ордер !***");
      
       }
       else Print ("Ошибка выделения ордера***",GetLastError() );
//      if(OrderSymbol()!=Symbol()) continue;
      //--- check order type 
      if(OrderType()==OP_BUY)
        {
        Print ("Есть открытый лонг !***");
         if(Open[1]>MA[0] && Close[1]< MA[0])
           {
            if(!OrderClose(OrderTicket(),OrderLots(),Bid,3,White))
               Print("OrderClose error ",GetLastError());
           else 
           Print("Order LONG Закрылся !!! ");
           }
           
           
         break;
        }
      if(OrderType()==OP_SELL)
        {
         if(Open[1]<MA[0] && Close[1]>MA[0])
           {
            if(!OrderClose(OrderTicket(),OrderLots(),Ask,3,White))
           
              Print("OrderClose error ",GetLastError());
              else 
           Print("Order SELL Закрылся !!! ");
           }
           
         break;
        }
     }
    
  if (OrdersTotal()<1)
  {
  
  if ((MA[0]<Open[0]) && MA[0] > Open[1] ) // Событие для покупки
  
   {
    Print("Сигнал на лонг сработал");
    int ticket1 = OrderSend(MYSYMBOL,OP_BUY,LOT,Ask,Spread,Ask-0.008,Ask+0.008,"My order",16384,0,clrRed); 
           
           if(ticket1 <0)        
          
           { 
         Print("OrderSendOpenLong завершилась с ошибкой #",ticket1,GetLastError()); 
           } 
          else 
           Print("Функция OrderSendOpenLong успешно выполнена #",ticket1); 
   }
  
 if ((Open[0]<MA[0]) && Open[1] > MA[0] ) // Событие для продажи
    
    {
    Print("Сигнал на шорт сработал");
    int ticket2=OrderSend(MYSYMBOL,OP_SELL,LOT,Bid,Spread,Bid+0.008,Bid-0.008,"My order",16384,0,clrBlue); 
           
           if(ticket2 <0)        
           { 
         Print("OrderSendOpenShort завершилась с ошибкой # ",ticket2,GetLastError()); 
           } 
          else 
           Print("Функция OrderSendOpenShort успешно выполнена# ",ticket2);
           
           
    
    
 }

 }



 //----2
  
 
 //----3
 
 

}
     

  

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

А внимательней на цикл перебора ордеров посмотреть?

i и j зачем путаете?

Исправьте путаницу, а дальше, думаю, справитесь сами.

 

На будущее: переменную цикла можно использовать в другом цикле, если предыдущий цикл завершился, и циклы друг в друга не вложены.

j не нужна.

 
Igor Konyashin:

А внимательней на цикл перебора ордеров посмотреть?

i и j зачем путаете?

Исправьте путаницу, а дальше, думаю, справитесь сами.

Большое спасибо ! Заработало.
 
Igor Konyashin:

На будущее: переменную цикла можно использовать в другом цикле, если предыдущий цикл завершился, и циклы друг в друга не вложены.

j не нужна.

Не подскажете по коду ? Я исправил, сделки открываются и закрываются(после вашей помощи) правильно, но когда срабатывает тейк профит, почему-то, скрипт видит что ордер все еще открыт, как можно исправить ?

Немного модифицированный код:

//+------------------------------------------------------------------+
//|                                                     RoboV3.2.mq4 |
//|                        Copyright 2016, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2016, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
   
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
  
  //----1
 
  double LOT=0.01;
     
  int MAPER=10;
  int MASHIFT=2;
  
  double Spread= NormalizeDouble(0.0001,Digits);
  
  int i;
  
  
  
  double MA[];
  ArrayResize(MA,MAPER,10);
  ArrayInitialize(MA,EMPTY_VALUE); 
  
    
  
  string MYSYMBOL=_Symbol;
  double ICLOSE=iOpen(MYSYMBOL,PERIOD_H1,0);
  
    
  double Free=AccountFreeMargin();
  double One_Lot =MarketInfo(MYSYMBOL,MODE_MARGININIT);
  double Min_Lot =MarketInfo(MYSYMBOL,MODE_MINLOT);
  
   
  for (i = 0;i<(MAPER-1); i++)
 {
 MA[i]= iMA(MYSYMBOL,NULL,MAPER,MASHIFT,MODE_EMA,PRICE_OPEN,i);
 }
 
  
  //----1
  
  //----2
  
for(int j=0;j<=OrdersTotal();j++)
     {
      if(OrderSelect(j,SELECT_BY_POS,MODE_TRADES)==true)
      {Print ("Есть открытый ордер !***","Type:", OrderType(),"***","Ticket:",OrderTicket());
      
       }
       else Print ("Ошибка выделения ордера Type:",OrderType(),"Ticket",OrderTicket(),"Error:", GetLastError() );
//      if(OrderSymbol()!=Symbol()) continue;
      //--- check order type 
      if(OrderType()==OP_BUY)
        {
        Print ("Есть открытый лонг !***");
         if(Open[1]>MA[0] && Close[1]< MA[0])
           {
            if(!OrderClose(OrderTicket(),OrderLots(),Bid,3,White))
               Print("OrderClose error ",GetLastError());
           else 
           Print("Order LONG Закрылся !!! ");
           }
           
           
         break;
        }
      if(OrderType()==OP_SELL)
        {
         if(Open[1]<MA[0] && Close[1]>MA[0])
           {
            if(!OrderClose(OrderTicket(),OrderLots(),Ask,3,White))
           
              Print("OrderClose error ",GetLastError());
              else 
           Print("Order SELL Закрылся !!! ");
           }
           
         break;
        }
     }
    
  if (OrdersTotal()<1)
  {
  
  if ((MA[0]<Open[0]) && MA[0] > Open[1] ) // Событие для покупки
  
   {
    Print("Сигнал на лонг сработал");
    int ticket1 = OrderSend(MYSYMBOL,OP_BUY,LOT,Ask,Spread,Ask-0.008,Ask+0.008,"My order",16384,0,clrRed); 
           
           if(ticket1 <0)        
          
           { 
         Print("OrderSendOpenLong завершилась с ошибкой #",ticket1,GetLastError()); 
           } 
          else 
           Print("Функция OrderSendOpenLong успешно выполнена #",ticket1); 
   }
  
 if ((Open[0]<MA[0]) && Open[1] > MA[0] ) // Событие для продажи
    
    {
    Print("Сигнал на шорт сработал");
    int ticket2=OrderSend(MYSYMBOL,OP_SELL,LOT,Bid,Spread,Bid+0.008,Bid-0.008,"My order",16384,0,clrBlue); 
           
           if(ticket2 <0)        
           { 
         Print("OrderSendOpenShort завершилась с ошибкой # ",ticket2,GetLastError()); 
           } 
          else 
           Print("Функция OrderSendOpenShort успешно выполнена# ",ticket2);
           
           
    
    
 }

 }



 //----2
  
 
 //----3
 
 

}
     

  

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

Лог журнала:

2016.02.19 09:54:53.026 2015.01.22 22:00  Robot-3.3 GBPUSD,H1: Есть открытый лонг !***
2016.02.19 09:54:53.026 2015.01.22 22:00  Robot-3.3 GBPUSD,H1: Ошибка выделения ордера Type:0Ticket0Error:4051
2016.02.19 09:54:52.962 2015.01.22 21:00  Robot-3.3 GBPUSD,H1: Есть открытый лонг !***
2016.02.19 09:54:52.962 2015.01.22 21:00  Robot-3.3 GBPUSD,H1: Ошибка выделения ордера Type:0Ticket0Error:4051
2016.02.19 09:54:52.898 2015.01.22 20:00  Robot-3.3 GBPUSD,H1: Есть открытый лонг !***
2016.02.19 09:54:52.898 2015.01.22 20:00  Robot-3.3 GBPUSD,H1: Ошибка выделения ордера Type:0Ticket0Error:4051
2016.02.19 09:54:52.834 2015.01.22 19:00  Robot-3.3 GBPUSD,H1: Есть открытый лонг !***
2016.02.19 09:54:52.834 2015.01.22 19:00  Robot-3.3 GBPUSD,H1: Ошибка выделения ордера Type:0Ticket0Error:4051
2016.02.19 09:54:52.770 2015.01.22 18:00  Robot-3.3 GBPUSD,H1: Есть открытый лонг !***
2016.02.19 09:54:52.770 2015.01.22 18:00  Robot-3.3 GBPUSD,H1: Ошибка выделения ордера Type:0Ticket0Error:4051
2016.02.19 09:54:52.706 2015.01.22 17:00  Robot-3.3 GBPUSD,H1: Есть открытый лонг !***
2016.02.19 09:54:52.706 2015.01.22 17:00  Robot-3.3 GBPUSD,H1: Ошибка выделения ордера Type:0Ticket0Error:4051
2016.02.19 09:54:52.706 2015.01.22 17:00  Tester: take profit #7 at 1.50505 (1.50499 / 1.50501)
2016.02.19 09:54:52.642 2015.01.22 16:00  Robot-3.3 GBPUSD,H1: Есть открытый ордер !***Type:1***Ticket:7
2016.02.19 09:54:52.578 2015.01.22 15:00  Robot-3.3 GBPUSD,H1: Функция OrderSendOpenShort успешно выполнена# 7
2016.02.19 09:54:52.578 2015.01.22 15:00  Robot-3.3 GBPUSD,H1: open #7 sell 0.01 GBPUSD at 1.51305 sl: 1.52105 tp: 1.50505 ok
 
Дмитрий:

Не подскажете по коду ? Я исправил, сделки открываются и закрываются(после вашей помощи) правильно, но когда срабатывает тейк профит, почему-то, скрипт видит что ордер все еще открыт, как можно исправить ?


Проверять наличие ордеров. Если нету - выходить из OnTick и ждать следующего тика.
 

У вас странная логика советника в целом. Вы, видимо, кусками откуда-то себе понатаскали и склеили всё воедино.

Продумайте изначально, с чистого листа, саму структуру и общую логику советника.


Я бы рекомендовал следующий вариант:

- Получаем значения MA в массив

- Если есть ордер(а), сопровождаем их (ставим безубыток, закрываем если появилось условие на закрытие и т.д.)

- Иначе, если нет ордеров, то смотрим, имеются ли условия для их открытия (сравниваем MA с Open, и т.д.)

 
for(int j=0;i<=OrdersTotal();j++)
или jjj или iii
нужно <

	          
 
Спасибо большое вам Vasyl Nosal и

Igor Konyashin


Работаю оба варианта !!!:

<

и

if (OrdersTotal()>0) 
{
for(int j=0;j<OrdersTotal();j++)

...
}


При использовании ошибка пропадает.

 
Дмитрий:
Спасибо большое вам Vasyl Nosal и

Igor Konyashin


Работаю оба варианта !!!:

и


При использовании ошибка пропадает.

Если так

if (OrdersTotal()>0) 
{
for(int j=0;j<OrdersTotal();j++)

... 

то это не нужно

 if (OrdersTotal()>0

{