Как закрыть ордер через определенное время

 

Добрый день

Нужно написать советник, закрывающий ордер через определенное число часов.

Реализовал в тестовом режиме ( считал часовые тики), а в реале теперь не знаю как реализовать ( понятно, если советник круглосуточно висит, то тоже можно считать часы, но я хочу сделать чтобы советник можно было  останавливать и вновь запускать). По астрономическому времени не получается - мешают субботы и воскресенья и  праздники.

Хотел использовать функцию IsTradeAllowed(symbol, time) - чтобы исключить нерабочие часы, но    почему-то эта функция в выходные тоже возвращает true (?).

Подскажите  пожалуйста- какую еще функцию можно использовать ?

 
Alex406:

Добрый день

Нужно написать советник, закрывающий ордер через определенное число часов.

Реализовал в тестовом режиме ( считал часовые тики), а в реале теперь не знаю как реализовать ( понятно, если советник круглосуточно висит, то тоже можно считать часы, но я хочу сделать чтобы советник можно было  останавливать и вновь запускать). По астрономическому времени не получается - мешают субботы и воскресенья и  праздники.

Хотел использовать функцию IsTradeAllowed(symbol, time) - чтобы исключить нерабочие часы, но    почему-то эта функция в выходные тоже возвращает true (?).

Подскажите  пожалуйста- какую еще функцию можно использовать ?

узнать сколько минут (минутных баров) прошло с момента открытия ордера : iBarShift(OrderSymbol(),PERIOD_M1,OrderOpenTime());

 
Maxim Kuznetsov:

узнать сколько минут (минутных баров) прошло с момента открытия ордера : iBarShift(OrderSymbol(),PERIOD_M1,OrderOpenTime());

Иногда , особенно ночью не в каждой минуте есть тики. Получается так , что за 60 минут било приметно 57 баров.

А то можете просто вычислить время в минутах = (TimeCurrent()-OrderOpenTime())/60

 
Ivan Ivanov:

Иногда , особенно ночью не в каждой минуте есть тики. Получается так , что за 60 минут било приметно 57 баров.

А то можете просто вычислить время в минутах = (TimeCurrent()-OrderOpenTime())/60


Тут уж смотря, что нужно топикстартеру. Судя по всему, ему нужно именно количество баров, т. к. есть упоминание о том, что мешают субботы и воскресенья. Таким образом, либо считаем все время без исключения, либо только то, когда были бары. Но если учесть, что говорилось именно о часах, то на Н1 проблема отсутствия баров встречается крайне редко. Поэтому просто:

int nOrderExistanceHours = iBarShift(OrderSymbol(),PERIOD_H1, <время открытия ордера>);
 
Ihor Herasko:

Тут уж смотря, что нужно топикстартеру. Судя по всему, ему нужно именно количество баров, т. к. есть упоминание о том, что мешают субботы и воскресенья. Таким образом, либо считаем все время без исключения, либо только то, когда были бары. Но если учесть, что говорилось именно о часах, то на Н1 проблема отсутствия баров встречается крайне редко. Поэтому просто:


Спасибо, с iBarShift все получилось.Нужны были именно рабочие часы.А через астрономическое время  мешают не только субботы и воскресенья, но и праздники, и укороченные сессии перед праздниками.

 
Ihor Herasko:

Тут уж смотря, что нужно топикстартеру. Судя по всему, ему нужно именно количество баров, т. к. есть упоминание о том, что мешают субботы и воскресенья. Таким образом, либо считаем все время без исключения, либо только то, когда были бары. Но если учесть, что говорилось именно о часах, то на Н1 проблема отсутствия баров встречается крайне редко. Поэтому просто:

c PERIOD_H1 топикстартер может сильно попасть :-) если сделка открылась в 11.55 то уже в 12.01 iBarShift скажет что прошёл целый час и сделку нужно закрыть. Наверное у него пока прокатывает, если открывает сделки строго по границе часов, но это ненавсегда :-)
 
Maxim Kuznetsov:
c PERIOD_H1 топикстартер может сильно попасть :-) если сделка открылась в 11.55 то уже в 12.01 iBarShift скажет что прошёл целый час и сделку нужно закрыть. Наверное у него пока прокатывает, если открывает сделки строго по границе часов, но это ненавсегда :-)

Я оттестировал на истории, при методе на открытии бара. Главная задача теперь - чтобы в реале  точно так же моделировалось. Запрограммировал, что открывать буду в теч. нескольких минут в начале часа , а  колво часов буду считать по  iBarShift.  По логике должно работать как на истории. Конечно , отличия все равно будут - если  открывать в понедельник в 0 часов  - возможен гэп, который при тестировании на истории при методе на открытии бара не учитывается. Но это отдельно  нужно поисследовать.

 
Maxim Kuznetsov:
c PERIOD_H1 топикстартер может сильно попасть :-) если сделка открылась в 11.55 то уже в 12.01 iBarShift скажет что прошёл целый час и сделку нужно закрыть. Наверное у него пока прокатывает, если открывает сделки строго по границе часов, но это ненавсегда :-)

Понятно, что у каждой задачи есть свои нюансы, которые нужно учесть. Главное, что дано верное направление для поиска решения.

 
Alex406:

Я оттестировал на истории, при методе на открытии бара. Главная задача теперь - чтобы в реале  точно так же моделировалось.


В данном конкретном случае даже не могу придумать, что может быть в плане отличий. Поэтому в онлайн будет все то же самое

Запрограммировал, что открывать буду в теч. нескольких минут в начале часа , а  колво часов буду считать по  iBarShift.  По логике должно работать как на истории. Конечно , отличия все равно будут - если  открывать в понедельник в 0 часов  - возможен гэп, который при тестировании на истории при методе на открытии бара не учитывается. Но это отдельно  нужно поисследовать.

Час открытия можно отбрасывать, считая только полные часовые бары после бара открытия и до текущего бара. Таким образом, если открытие произошло даже в 11:00:01, а сейчас 12:59:50, то прошло все равно 0 часов. Вот в 13:00:00 будет 1 полный час.
 
Ihor Herasko:


В данном конкретном случае даже не могу придумать, что может быть в плане отличий. Поэтому в онлайн будет все то же самое

Час открытия можно отбрасывать, считая только полные часовые бары после бара открытия и до текущего бара. Таким образом, если открытие произошло даже в 11:00:01, а сейчас 12:59:50, то прошло все равно 0 часов. Вот в 13:00:00 будет 1 полный час.

Может в 12:01. А то два часа уже прошло. Вода выкипела и пельмени разварились