IBARSHIFT

 

Господа! Прошу о помощи!

Задача заключается в том, чтобы запретить советнику торговать на определенном баре, если в этом баре произошло закрытие сделки.

if (OrderSelect(i-1,SELECT_BY_POS)==true)

{ ...

int x=(OrderClosePrice()/OrderClosePrice())*2;

if (x-1>=iBarShift(Symbol(),0,OrderCloseTime()))

{y=false;}

... }

Все было бы хорошо, если iBarshift мог возвращать смещение баров не только от OrderOpenTime, но и от OrderCloseTime. А так, получается, что эта схема не работает.

Подскажите, пожалуйста, либо как исправить схему, либо название функции типа iBarShift, только для OrderCloseTime. А еще лучше как запретить советнику торговать на определенном баре :))

Заранее СПАСИБО!!!

 
Pavlik20:

Господа! Прошу о помощи!

Задача заключается в том, чтобы запретить советнику торговать на определенном баре, если в этом баре произошло закрытие сделки.

if (OrderSelect(i-1,SELECT_BY_POS)==true)

{ ...

int x=(OrderClosePrice()/OrderClosePrice())*2;

if (x-1>=iBarShift(Symbol(),0,OrderCloseTime()))

{y=false;}

... }

Все было бы хорошо, если iBarshift мог возвращать смещение баров не только от OrderOpenTime, но и от OrderCloseTime. А так, получается, что эта схема не работает.

Подскажите, пожалуйста, либо как исправить схему, либо название функции типа iBarShift, только для OrderCloseTime. А еще лучше как запретить советнику торговать на определенном баре :))

Заранее СПАСИБО!!!


Да ему все равно - он работает от любого времени.

int iBarShift( string symbol, int timeframe, datetime time, bool exact=false) 
Поиск бара по времени. Функция возвращает смещение бара, которому принадлежит указанное время. 
Если для указанного времени бар отсутствует ("дыра" в истории), то функция возвращает, в зависимости 
от параметра exact, -1 или смещение ближайшего бара.
 

Мысль правильная - берете время закрытия бара и считаете его номер, то есть смещение от нулевого бара. Проверьте остальные расчеты под условным оператором.

 
for (int i=1; i<=OrdersTotal(); i++) // Цикл перебора ордеров
{
if (OrderSelect(i-1,SELECT_BY_POS)==true) // Если есть следующий
{

datetime CT=OrderCloseTime();

int x=(OrderClosePrice()/OrderClosePrice())*2;

if((x-1)>=iBarShift("EUROUSD",0,CT))

{y=false;} // не разрешаем торговлю

}

Далее я ввел функцию Alert (iBarShift("EUROUSD",0,CT));

Тестер открывает только одну сделку, после нее iBarShift остается равным нулю, соответственно торговать советник не будет. Не понимаю где ошибка...

 

Следующая функция вычисляет время открытия следующего бара в зависимости от текущего времени и от таймфрэйма без использования функций МТ4:

Просто дождитесь этого времени и торгуйте дальше !

datetime NextBar (datetime d, int TF) {
      return((d/TF/60+1)*TF*60);
} 
 

Спасибо большое за ответ!

Правда, я не очень понял что Вы подразумеваете под d и TF? Прокомментируете, пожалуйста. Буду Вам очень благодарен!

Но я тут еще на одну красивую версию натолкнулся:

int oldTime;
int init(){
   oldTime = Time[0];
   return(0);
}
int start(){
   if(oldTime != Time[0){
   // first tick of new bar found
   // do something useful
   oldTime = Time[0];
   return(0)

}

 
Pavlik20:

Спасибо большое за ответ!

Правда, я не очень понял что Вы подразумеваете под d и TF? Прокомментируете, пожалуйста. Буду Вам очень благодарен!

Но я тут еще на одну красивую версию натолкнулся:

}


А если учебник почитаете, - весь мир в ладони будет.
 

Нет, последняя версия, все-таки не совсем то..

Tara, я честно прочел учебник. Но подобного вопроса там не обсуждалось, а чтобы самому сообразить. то пока еще не хватает опыта программирования. Поэтому и спрашиваю на форуме. Мне кажется он для этого и создан.

 
Pavlik20:

Спасибо большое за ответ!

Правда, я не очень понял что Вы подразумеваете под d и TF? Прокомментируете, пожалуйста. Буду Вам очень благодарен!


d - текущее время закрытия ордера

TF - текущий таймфрэйм

Если опять что-то не понятно, пишите ! Поясню ...

 
LEOK:


d - текущее время закрытия ордера

TF - текущий таймфрэйм

Если опять что-то не понятно, пишите ! Поясню ...


Спасибо! Теперь все предельно ясно :)
 
Pavlik20:

Господа! Прошу о помощи!

Задача заключается в том, чтобы запретить советнику торговать на определенном баре, если в этом баре произошло закрытие сделки.

if (OrderSelect(i-1,SELECT_BY_POS)==true)

{ ...

int x=(OrderClosePrice()/OrderClosePrice())*2;

if (x-1>=iBarShift(Symbol(),0,OrderCloseTime()))

{y=false;}

... }

Все было бы хорошо, если iBarshift мог возвращать смещение баров не только от OrderOpenTime, но и от OrderCloseTime. А так, получается, что эта схема не работает.

Подскажите, пожалуйста, либо как исправить схему, либо название функции типа iBarShift, только для OrderCloseTime. А еще лучше как запретить советнику торговать на определенном баре :))

Заранее СПАСИБО!!!


Еще на эту тему - https://forum.mql4.com/ru/19624#713258
Причина обращения: