Здравствуйте, подскажите функцию или как правильно составить правило, чтобы ордер мог открываться только 1 раз за 1 свечу. например при таймфрейма m30 - 1 раз в пол часа. Бывает так что внутри свечи ордер может открыться несколько раз, а это мне нужно.
Просьба помочь.
Это только я уже третий раз отчечаю на этот вопрос.
Можно так.
При открытии ордера запоминаете время
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) поставить перед открытием ордеров.
При
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 раз. Подскажите возможен ли альтернативный вариант.
При
Скорость тестирования уменьшилась в 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); }
Альтернативнй вариант - после открытия ордера запоминать время открытия в переменной.
А перед открытием сравнивать с ней iTime свечи.
Для теста сгодится на ура.
Почему только для теста?
В он-лайн (при перезагрузке если Вы имеете ввиду) можно пересчитывать ордера и запоминать время t=OrderOpenTime(). Можно игнорировать те ордера, где iBarShift(NYLL,o,t)>0. Ввести какой-нибудь флаг, чтобы при каждом тике ордера не пересчитывались. Нагрузки не будет.
Смотря какая система.
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Здравствуйте, подскажите функцию или как правильно составить правило, чтобы ордер мог открываться только 1 раз за 1 свечу. например при таймфрейма m30 - 1 раз в пол часа. Бывает так что внутри свечи ордер может открыться несколько раз, а это мне нужно.
Просьба помочь.