Запрет торговли в одном баре. - страница 3

 

Такой вопрос:

В 5:00 по Гринвичу, при определенных условиях, выставляется отложенный ордер байстоп или селлстоп. При срабатывании ордера открывается куча ордеров. Какую функцию нужно применить к отложенным ордерам, чтобы открывался только один ордер на одном баре?

И еще: как сделать так, чтобы открылось 3 ордера через каждые 15 пунктов?

Спасибо.

 
Implex >>:
Мне всегда помогала такая строка в начале кода:
if(Volume[0]>1) return;

дело в том что если по разным причина вы не поймали первый тик ( например бывает что первый тик вы можете получит Volume [0] больше чем 2 или 3

отсутвие связи при отправке первого тика дилингов и вы не ловите первый тик

так же дилинг просто может первый тик нового бара прислать сразу Volume[0] больше чем 1

например при гепах ...


потому конструкция

static datetime NewBarTime=0;

void start ()
{
   if ( NewBarTime != iTime(0,PERIOD_XX, 0 ) )
   {
      NewBarTime = iTime(0,PERIOD_XX, 0 ); // точно новый бар
   }
}


надежна!

 
KimIV >>:

Пример использования:

if (NumberOfBarOpenLastPos()>0) {
  // Можно открывать позиции
}

Если нет открытых позиций, функция принимает значение -1, а следовательно открытие позиции становится невозможным.

Правильно:

if (NumberOfBarOpenLastPos()!=0) {
  // Можно открывать позиции
}
 
Если кто знает, подскажите.
Мне нужно сделать так, что-бы после открытия трех сделок советник больше не открывал сделки в этом баре.
 
Maniac:
Если кто знает, подскажите.
Мне нужно сделать так, что-бы после открытия трех сделок советник больше не открывал сделки в этом баре.

При успешной отправке OrderSend - наращивайте счетчик N++.

И потом перед открытием очередного ордера - проверяйте N и треубемый масимум ордеров. и время открытия последнего ордера и время текущего бара

+ Также вам понадобится обнулять N, когда ордеров не будет

 
sergeev:

При успешной отправке OrderSend - наращивайте счетчик N++.

И потом перед открытием очередного ордера - проверяйте N и треубемый масимум ордеров. и время открытия последнего ордера и время текущего бара

+ Также вам понадобится обнулять N, когда ордеров не будет


Это проблемное решение и неверное с точки зрения логики

поясню...

---

что Вы посоветуете

если вы нарастили счетчик,

и например

1 пропадает электричество - затем появляется

2 или просто перезапустили эксперт!

3 вы вышли из МТ4 и снова зашли


что происходит при запуске эксперта и что со счетчиком? правильно он равен = 0

--

Вариант предложенный Kim надежней!

 
YuraZ:

Это проблемное решение и неверное с точки зрения логики

поясню...

---

что Вы посоветуете

если вы нарастили счетчик,

и например

1 пропадает электричество - затем появляется

2 или просто перезапустили эксперт!

3 вы вышли из МТ4 и снова зашли


что происходит при запуске эксперта и что со счетчиком? правильно он равен = 0

--

Вариант предложенный Kim надежней!



значит надо на каждом тике посчитать ордера ...

Типа если открыт sell то os=1, если еще селл то os=2 и так далее.

Для контроля открытия на одном баре обычно пользуюсь сравнением переменной и количества баров в начале кода и в конце кода переменная приравнивается количеству баров на графике.

Такой код не подводил меня не в тестере ни в торговле.

 

также считаю счетчики отстоем - зачем что-то сохранять, когда это можно получить непосредственно из журнала ордеров - объективно и независимо ни от чего..

нужно всего ничего - функция определяющая новый бар, и функция гарантированно открывающая ордер,

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

соответственно,

if(newBar()){

openOrder(..);// 1-й

openOrder(..);// 2-й

openOrder(..);//3-й
}

ну или более гибко

if(newBar()){

err = openOrder(..);//1-й

while (err == ERR_WAITING){
   err = openOrder(...);//1-й
}

err = openOrder(..);//2-й

while (err == ERR_WAITING){
   err = openOrder(...);//2-й
}

err = openOrder(..);//3-й

while (err == ERR_WAITING){
   err = openOrder(...);//3-й
}

}
ну и до кучи, отслеживать наличие критических ситуаций с сохранением информации, с тем чтобы на следующем тике исправить ситуацию с не окрывшимися ордерами, если оно еще актуально..
 

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

Файлы:
e.mq4  4 kb
 
//+------------------------------------------------------------------+
//|  Проверяет был ли открыт последний ордер на этой же свече        |
//|  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);
}

Вызов для любого ордера , с любым магиком на текущем символе и в пределах свечи текущего таймфрейма :

    if(!IfOrdOpSelfBar()){
        Открыть ордер;
    }
Причина обращения: