В следующие выходные (и по золоту с 00:00 по 01:00) посмотрю возвраты давний ф-ций mql4, может они прояснят ситуацию без обращения к сессиям..
"\n IsExpertEnabled()= ", IsExpertEnabled(), "\n IsTradeAllowed()= ", IsTradeAllowed(), "\n IsTradeAllowed(symbolF, TimeLocal() )= ", IsTradeAllowed(symbolF, TimeLocal() ), "\n IsTradeAllowed(symbolF, TimeCurrent() )= ", IsTradeAllowed(symbolF, TimeCurrent() ), "\n IsTradeContextBusy()= ", IsTradeContextBusy(), "\n MarketInfo(symbolF, MODE_TRADEALLOWED)= ", MarketInfo(symbolF, MODE_TRADEALLOWED),
А пока сделал вот такую ф-цию выяснения по сессии - можно торговать или нет.
Функция возвращает ДАТУ (чего нет просто в SymbolInfoSessionTrade) и время начала и окончания сессии.
Обращается раз в минуту, для экономии ресурсов. В принципе должна подходить и к тестеру стратегий MONDAY он всегда MONDAY.
void OnTick() { //--- datetime From, To; string symbolF = _Symbol; bool Trade_Session = dz_SymbolInfoSessionTrade(symbolF, From, To); Print("Trade_Session= ", Trade_Session, " From= ", TimeToString(From, TIME_DATE|TIME_SECONDS), " To= ", TimeToString(To, TIME_DATE|TIME_SECONDS) ); if(From == 0 || To == 0) { Sleep(500); Trade_Session = dz_SymbolInfoSessionTrade(symbolF, From, To); Print("!! Repeat Trade_Session= ", Trade_Session, " From= ", TimeToString(From, TIME_DATE|TIME_SECONDS), " To= ", TimeToString(To, TIME_DATE|TIME_SECONDS) ); } } //+------------------------------------------------------------------+ bool dz_SymbolInfoSessionTrade(string symbolF, datetime &fromF, datetime &toF) { int session_indexF=0; datetime vr_fromF, vr_toF; static datetime IST_iTimeM1, mem_fromF, mem_toF; static bool mem_resF, firstOk; if(IST_iTimeM1 != iTime(symbolF, PERIOD_M1, 0) ) { IST_iTimeM1 = iTime(symbolF, PERIOD_M1, 0); firstOk = false; ENUM_DAY_OF_WEEK day_of_weekF = ENUM_DAY_OF_WEEK(DayOfWeek() ); //day_of_weekF = 5; // >>>>> >>>>> while(SymbolInfoSessionTrade(symbolF, day_of_weekF, session_indexF, vr_fromF, vr_toF) && !IsStopped() ) { firstOk = true; datetime timeDifferenceF = vr_toF - vr_fromF; fromF = StringToTime(TimeToString(TimeCurrent(), TIME_DATE) + " " + TimeToString(vr_fromF, TIME_SECONDS) ); toF = fromF + timeDifferenceF; mem_fromF = fromF; mem_toF = toF; Print(EnumToString(day_of_weekF)," session= ", session_indexF, " fromF= ", TimeToString(fromF, TIME_DATE|TIME_SECONDS), " toF= ", TimeToString(toF, TIME_DATE|TIME_SECONDS) ); if(TimeCurrent() >= fromF && TimeCurrent() < toF) { mem_resF = true; break; } if(TimeCurrent() < fromF) { mem_resF = false; break; } session_indexF++; } // while(!IsStopped() ) } //if(IST_iTimeM1 if(firstOk) { fromF = mem_fromF; toF = mem_toF; }else { fromF = 0; toF = 0; mem_resF = false; } return(mem_resF); }
Эти ф-ции вне торговой сессии возвращают false или 0 для MarkeInfo
IsTradeAllowed(symbolF, TimeCurrent() ) MarketInfo(symbolF, MODE_TRADEALLOWED)
Интересно, а какой аналог этих ф-ций есть в MQL5? Или там только по сессиям можно понять можно торговать или нет.
Есть такой символ как BRENT-SEP16
Так в этом символе ф-ция SymbolInfoSessionTrade
возвращает с первого взгляда перепутанные местами "from" и "to" пример
session_indexF= 0 fromF= 03:05:00 toF= 00:55:00
и этот момент я учел в новой версии своей ф-ции.
-------------------------------------
И еще один интересный момент, как понятно из времени торговой сессии с 00:00 понедельника и до 00:55 можно торговать, и действительно в это время ручками я открыл и удалил ордер без проблем.
А в это время ф-ции IsTradeAllowed(symbolF, TimeCurrent() ) и MarketInfo(symbolF, MODE_TRADEALLOWED)
возвращают FALSE !!! Так, что сессии имеют приоритет.
Пример
0 00:17:09.985 0_session05 BRENT-SEP16,H4: !! SymbolInfoInteger(SYMBOL_TRADE_MODE)= SYMBOL_TRADE_MODE_FULL BRENT-SEP16
0 00:17:09.985 0_session05 BRENT-SEP16,H4: !! TerminalInfoInteger(TERMINAL_TRADE_ALLOWED)= 1
0 00:17:09.985 0_session05 BRENT-SEP16,H4: !! MQLInfoInteger(MQL_TRADE_ALLOWED)= 1
0 00:17:09.985 0_session05 BRENT-SEP16,H4: !! TerminalInfoInteger(TERMINAL_CONNECTED)= 1
0 00:17:09.985 0_session05 BRENT-SEP16,H4: !! AccountInfoInteger(ACCOUNT_TRADE_ALLOWED)= 1
0 00:17:09.985 0_session05 BRENT-SEP16,H4: !! AccountInfoInteger(ACCOUNT_TRADE_EXPERT)= 1
0 00:17:09.985 0_session05 BRENT-SEP16,H4: !! dz_SymbolInfoSessionTrade= true
0 00:17:09.985 0_session05 BRENT-SEP16,H4: !! MarketInfo(symbolF, MODE_TRADEALLOWED)= 0.0
0 00:17:09.985 0_session05 BRENT-SEP16,H4: !! IsTradeAllowed(symbolF, TimeCurrent() )= false
0 00:17:09.985 0_session05 BRENT-SEP16,H4: session_indexF= 0 fromF= 2016.07.19 03:05:00 toF= 2016.07.19 00:55:00
Как видно моя ф-ция dz_SymbolInfoSessionTrade вернула TRUE.
bool dz_SymbolInfoSessionTrade(string symbolF, bool oneF) { int session_indexF=0; datetime vr_toF=0, vr_fromF=0, fromF=0, toF=0, TimeCurrentDay=0; bool resF=false, logOn = true; ENUM_DAY_OF_WEEK day_of_weekF = ENUM_DAY_OF_WEEK(DayOfWeek() ); static int IST_hour = -1; while(SymbolInfoSessionTrade(symbolF, day_of_weekF, session_indexF, vr_fromF, vr_toF) && !IsStopped() ) { TimeCurrentDay = StringToTime(TimeToString(TimeCurrent(), TIME_DATE) ); fromF = TimeCurrentDay + vr_fromF; toF = TimeCurrentDay + vr_toF; //-------- if(IST_hour != Hour() || oneF) { Print("session_indexF= ", session_indexF, " fromF= ", fromF, " toF= ", toF); } if(fromF < toF) { if(TimeCurrent() >= fromF && TimeCurrent() < toF) { resF = true; //Print("fromF < toF"); break; } }else { if(TimeCurrent() < toF || TimeCurrent() >= fromF) { resF = true; //Print(" ! toF < fromF"); break; } } session_indexF++; } // while(!IsStopped() ) //-------- if( (IST_hour != Hour() || oneF) && (fromF == 0 || toF == 0) ) { Print("!!! session_indexF= ", session_indexF, " fromF= ", fromF, " toF= ", toF); } IST_hour = Hour(); return(resF); }
Как я подозреваю, остался один неучтенный момент - это пятница, время с 00:00 до 00:55, в это время dz_SymbolInfoSessionTrade вернет FALSE,
надо еще подумать....
Очень полезная тема! Вам тут не одиноко? )
Есть такой символ как BRENT-SEP16
Так в этом символе ф-ция SymbolInfoSessionTrade
возвращает с первого взгляда перепутанные местами "from" и "to" пример
session_indexF= 0 fromF= 03:05:00 toF= 00:55:00
Почему решили, что перепутаны?
Торговля разрешена с 03:05:00 до 23:59:59 и с 00:00:00 до 00:55:00
Интересно, а какой аналог этих ф-ций есть в MQL5? Или там только по сессиям можно понять можно торговать или нет.
Сюда заглядывали?
https://www.mql5.com/ru/docs/runtime/tradepermission
- www.mql5.com
Очень полезная тема! Вам тут не одиноко? )
Почему решили, что перепутаны?
Торговля разрешена с 03:05:00 до 23:59:59 и с 00:00:00 до 00:55:00
Уже не один.. и поэтому не одиноко )))
Да, все именно так, я выше написал только с "первого взгляда", и эту ситуацию надо обрабатывать по другому, что я и сделал.
Но осталась нерешенной Пятница. В пятницу, с 00:00:00 до 00:55:00 ф-ция запретит торговать хотя реально будет можно, потому что вернется всего одна сессия с временем
с 03:05 до 23:05.
Здесь надо еще учитывать Четверг который заползает на пятницу.....
А, кстати, интересный вопрос. Как можно задавать сессии для конкретного дня, залезая на другой день? Если бы они были одинаковыми на все 7 дней — то да. А иначе появляется неоднозначность.
Мне, например, по приведенному скриншоту не понятно, можно ли торговать в пятницу с 00:00 до 00:55, т.к. для нее указан совершенно конкретный интервал 03:05-23:05.
Хотелось бы комментариев разработчиков.
Получается, нужна возможность указывать несколько интервалов для каждого дня или сложная функция парсинга торговых сессий с учетом перехода через дни.
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
А собственно поиск начался с того, что все ниже перечисленные проверки, в воскресенье (и по золоту в понедельник с 00:00 по 01:00) разрешили советнику торговать
Мне кажется, что для выяснения можно ли советнику сейчас торговать достаточно узнать время Торговой Сессии.
А зачем вообще нужно знать время Котировочной Сессии если советник не может открыть или закрыть ордер в это время?
Вот пример по XAUUSD (золото "Альпы") , котировочная сессия начинается с 00:00, а торговая с 01:00.