Открывать ордер только 1 раз в свече

 

Здравствуйте, подскажите функцию или как правильно составить правило, чтобы ордер мог открываться только 1 раз за 1 свечу. например при таймфрейма m30 - 1 раз в пол часа. Бывает так что внутри свечи ордер может открыться несколько раз, а это мне нужно.

Просьба помочь.

 
Killa:

Здравствуйте, подскажите функцию или как правильно составить правило, чтобы ордер мог открываться только 1 раз за 1 свечу. например при таймфрейма m30 - 1 раз в пол часа. Бывает так что внутри свечи ордер может открыться несколько раз, а это мне нужно.

Просьба помочь.

Посмотрите функции Кима(все давно придумано).https://forum.mql4.com/ru/11287
 

Это только я уже третий раз отчечаю на этот вопрос.

Можно так.

При открытии ордера запоминаете время

t=iTime(NULL,0,0)

А перед открытием ордера ставите условие

if (iBarShift(NULL,0,t)>0)
 
//+------------------------------------------------------------------+
//|  Проверяет был ли открыт последний ордер на этой же свече        |
//|  Checks whether the opened last the order on the same candle     |
//+------------------------------------------------------------------+
bool IfOrdOpClSelfBar(int magik = 0, int typ = -1,string sy = "",int per = 0){
   if(sy == ""){sy = Symbol();}
   if(per==0){per=Period();}
   for(int i = OrdersTotal(); i>=0; i--){
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)){
         if(OrderSymbol()!=sy){continue;}
         if(OrderType()==typ||typ==-1){
            if(OrderMagicNumber()==magik||magik==0){
               if(OrderOpenTime()>iTime(sy,per,0)){return(true);}
            }
         }
      }
   }
   for(i = OrdersHistoryTotal(); i>=0; i--){
      if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)){
         if(OrderSymbol()!=sy){continue;}
         if(OrderType()==typ||typ==-1){
            if(OrderMagicNumber()==magik||magik==0){
               if(OrderCloseTime()>iTime(sy,per,0)&&
                  OrderOpenTime()>iTime(sy,per,0)){return(true);}
            }
         }
      }
   }   
   return(false);
}
//+------------------------------------------------------------------+
//|  Проверяет был ли открыт последний ордер на этой же свече        |
//|  Checks whether the opened last the order on the same candle     |
//+------------------------------------------------------------------+
bool IfOrdOpSelfBar(int magik = 0, int typ = -1,string sy = "",int per = 0){
   if(sy == ""){sy = Symbol();}
   if(per==0){per=Period();}
   for(int i = OrdersTotal(); i>=0; i--){
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)){
         if(OrderSymbol()!=sy){continue;}
         if(OrderType()==typ||typ==-1){
            if(OrderMagicNumber()==magik||magik==0){
               if(OrderOpenTime()>iTime(sy,per,0)){return(true);}
            }
         }
      }
   }
   return(false);
}
 

А что так сложно?

Нельзя разве просто пересчитать ордера (если терминал перезагрузился) и проверить время их открытия t=OrderOpenPrice().

А условие по времени if (iBarShift(NULL,0,t)>0) поставить перед открытием ордеров.

 
FOReignEXchange:

А что так сложно?

Нельзя разве просто пересчитать ордера (если терминал перезагрузился) и проверить время их открытия t=OrderOpenPrice().

А условие по времени if (iBarShift(NULL,0,t)>0) поставить перед открытием ордеров.

Зато надежно
 
Спасибо всем за ответы, респект и уважуха)
 

При

   int Bar = Period(); //--- Свеча
   //--- Делаем выборку по закрытым ордерам
   for(int h = OrdersHistoryTotal(); h>=0; h--){
      //---
      if(OrderSelect(h,SELECT_BY_POS,MODE_HISTORY)){
         //---
         if(OrderSymbol()!=EASymbol){continue;}
         if(OrderType()==OpType){
            if(OrderMagicNumber()==MagicNumber){
               if(OrderCloseTime()>iTime(EASymbol,Bar,0)){return(TRUE);}
            }
         }
      }
   } 
  
   //---
   return (FALSE);
}

Скорость тестирования уменьшилась в 10 раз. Подскажите возможен ли альтернативный вариант.

 
Killa:

При

Скорость тестирования уменьшилась в 10 раз. Подскажите возможен ли альтернативный вариант.

Альтернативнй вариант - после открытия ордера запоминать время открытия в переменной.

А перед открытием сравнивать с ней iTime свечи.

Для теста сгодится на ура.

 

попробуйте так,это должно несколько ускорить:

  int Bar = Period(); //--- Свеча
  int x_time = iTime(EASymbol,Bar,0);
   //--- Делаем выборку по закрытым ордерам
   for(int h = OrdersHistoryTotal(); h>=0; h--){
      //---
      if(OrderSelect(h,SELECT_BY_POS,MODE_HISTORY)){
         //---
         if(OrderSymbol()!=EASymbol){continue;}
         if(OrderType()!=OpType){continue;}
         if(OrderMagicNumber()!=MagicNumber){continue;}
         if(OrderCloseTime()>x_time){return(TRUE);} 
      }
   } 
  
   //---
   return (FALSE);
}
 
paukas:

Альтернативнй вариант - после открытия ордера запоминать время открытия в переменной.

А перед открытием сравнивать с ней iTime свечи.

Для теста сгодится на ура.


Почему только для теста?

В он-лайн (при перезагрузке если Вы имеете ввиду) можно пересчитывать ордера и запоминать время t=OrderOpenTime(). Можно игнорировать те ордера, где iBarShift(NYLL,o,t)>0. Ввести какой-нибудь флаг, чтобы при каждом тике ордера не пересчитывались. Нагрузки не будет.

Смотря какая система.

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