Подскажите, как вы определяете время начало дня FORTS в советниках ?
Сейчас определяю без учета праздников и переносов рабочих дней и т.п. Ничего в голову не приходит кроме запроса истории баров... может быть есть варианты проще ?
Начало дня, на ФОРТС, всегда начинается в 19-00 или 19-05 (при экспирации) и делится на сессии
Вечерняя сессия: Начало 19-00 (19-05) конец 23-50
Утренняя сессия: Начало 10-00 конец 14-00
Дневная сессия: Начало 14-05 конец 18-45
input string TimeStMon = "10:00:00"; //Время начала утренней сессии input string TimeStDay = "14:05:00"; //Время начала дневной сессии input string TimeStEvn = "19:05:00"; //Время начала вечерней сессии ulong time_st_mon; ulong time_st_day; ulong time_st_evn; time_st_mon = GetStringTime(TimeStMon); time_st_day = GetStringTime(TimeStDay); time_st_evn = GetStringTime(TimeStEvn); //+------------------------------------------------------------------+ //| Expert Get string time function | //+------------------------------------------------------------------+ ulong GetStringTime(const string a_string) { int str_size = StringLen(a_string); if(str_size == 8) { int k = StringFind(a_string, ":", 2); if(k == 2) { string s_hour = StringSubstr(a_string, 0, k); k = StringFind(a_string, ":", 5); if(k == 5) { string s_min = StringSubstr(a_string, 3, k-3); string s_sec = StringSubstr(a_string, 6, str_size - k - 1); ulong t_sec = ulong(StringToInteger(s_sec)); ulong t_min = ulong(StringToInteger(s_min)) * 60; ulong t_hour = ulong(StringToInteger(s_hour)) * 3600; return(t_hour + t_min + t_sec); } } } return(0); }
//+------------------------------------------------------------------+ //| Expert Check traiding time function | //+------------------------------------------------------------------+ bool CheckTradingTime(MqlDateTime &t_time) { t_time.year = 0; TimeTradeServer(t_time); if(t_time.year > 0) { // 13 * 3600 + 59 * 60 + 30 = 50370 - 13:59:30 // 14 * 3600 = 50400 - 14:00:00 // 14 * 3600 + 30 = 50430 - 14:00:30 // 14 * 3600 + 60 = 50460 - 14:01:00 // 18 * 3600 + 44 * 60 + 30 = 67470 - 18:44:30 // 18 * 3600 + 45 * 60 = 67500 - 18:45:00 // 18 * 3600 + 45 * 60 + 30 = 67530 - 18:45:30 // 18 * 3600 + 46 * 60 = 67560 - 18:46:00 // 19 * 3600 = 68400 - 19:00:00 // 19 * 3600 + 60 = 68460 - 19:01:00 // 23 * 3600 + 49 * 60 + 30 = 85770 - 23:49:30 // 23 * 3600 + 50 * 60 = 85800 - 23:50:00 // 23 * 3600 + 50 * 60 + 30 = 85830 - 23:50:30 // 23 * 3600 + 51 * 60 = 85860 - 23:51:00 //--- ulong trade_time = t_time.hour * 3600 + t_time.min * 60 + t_time.sec; if(((trade_time >= time_st_mon) && (trade_time < 50370)) || ((trade_time >= time_st_day) && (trade_time < 67470)) || ((trade_time >= time_st_evn) && (trade_time < 85770))) { return(true); } } else Print(__FUNCTION__, ": Ошибка! Не получено время торгового сервера!"); return(false); }
https://www.mql5.com/ru/docs/marketinformation/symbolinfosessionquote
- www.mql5.com
Под временем начала дня я имею ввиду не просто 19 00. А время дня вместе с датой. Допустим сейчас 11 :00 вторник, как определить в какие именно 19 00 часов начался торговый день ? Это ведь не обязательно понедельник. Понедельник мог быть и выходным. Начало дня мне нужно для подсчета оставшихся не эффективных транзакций.
Вряд ли что-то проще истории баров получится придумать.
Под временем начала дня я имею ввиду не просто 19 00. А время дня вместе с датой. Допустим сейчас 11 :00 вторник, как определить в какие именно 19 00 часов начался торговый день ? Это ведь не обязательно понедельник. Понедельник мог быть и выходным. Начало дня мне нужно для подсчета оставшихся не эффективных транзакций.
Задача понятна.
Для учета транзакций я использую глобальные переменные терминала (не путать с гл. переменными в советнике)
//+------------------------------------------------------------------+ //| Expert Set transaction count function | //+------------------------------------------------------------------+ void SetTransCount() { double tr_count = 0; double ses_cnt = 0; uint i = 0; do { i++; if(GlobalVariableGet("ses_count", ses_cnt)) { if(GlobalVariableSetOnCondition("ses_count", ses_cnt + 1, ses_cnt)) { i = 100; } } } while(i < 100); //--- i = 0; do { i++; if(GlobalVariableGet("trans_count", tr_count)) { if(GlobalVariableSetOnCondition("trans_count", tr_count + 1, tr_count)) { i = 100; } } } while(i < 100); }
В переменной
"ses_count"
Хранится счетчик транзакций за сессию (в клиринг обнуляется)
В переменной
"trans_count"
хранится общий счетчик транзакций (обнуляется после 18-45)
это гораздо эффективнее истории баров
Соответственно функция проверки торгового времени принимает вид:
input ulong OrdFistSes = 600; //Ордеров за 1 сессию //+------------------------------------------------------------------+ //| Expert Check traiding time function | //+------------------------------------------------------------------+ bool CheckTradingTime(MqlDateTime &t_time) { t_time.year = 0; TimeTradeServer(t_time); if(t_time.year > 0) { datetime lk_time = TimeCurrent(); // 13 * 3600 + 59 * 60 + 30 = 50370 - 13:59:30 // 14 * 3600 = 50400 - 14:00:00 // 14 * 3600 + 30 = 50430 - 14:00:30 // 14 * 3600 + 60 = 50460 - 14:01:00 // 18 * 3600 + 44 * 60 + 30 = 67470 - 18:44:30 // 18 * 3600 + 45 * 60 = 67500 - 18:45:00 // 18 * 3600 + 45 * 60 + 30 = 67530 - 18:45:30 // 18 * 3600 + 46 * 60 = 67560 - 18:46:00 // 19 * 3600 = 68400 - 19:00:00 // 19 * 3600 + 60 = 68460 - 19:01:00 // 23 * 3600 + 49 * 60 + 30 = 85770 - 23:49:30 // 23 * 3600 + 50 * 60 = 85800 - 23:50:00 // 23 * 3600 + 50 * 60 + 30 = 85830 - 23:50:30 // 23 * 3600 + 51 * 60 = 85860 - 23:51:00 //--- ulong trade_time = t_time.hour * 3600 + t_time.min * 60 + t_time.sec; if(((trade_time >= time_st_mon) && (trade_time < 50370)) || ((trade_time >= time_st_day) && (trade_time < 67470)) || ((trade_time >= time_st_evn) && (trade_time < 85770))) { return(true); } else { //--- if(GlobalVariableCheck("ses_count") == true) { double trc_value = GlobalVariableGet("ses_count"); if((trade_time >= 50430) && (trade_time <= 50460)) //14:00:30 - 14:01:00 { if(long(trc_value) != 0) { GlobalVariableSet("ses_count", 0); Print(__FUNCTION__, ": Сейчас ", TimeToString(lk_time), ", если есть необходимость, можно закрыть терминал."); } else { if(GlobalVariableCheck(Symbol()) == true) GlobalVariableDel(Symbol()); } } else if((trade_time >= 67530) && (trade_time <= 67560)) //18:45:30 - 18:46:00 { if(long(trc_value) != 0) { GlobalVariableSet("ses_count", 0); GlobalVariableSet("trans_count", 0); Print(__FUNCTION__, ": Сейчас ", TimeToString(lk_time), ", если есть необходимость, можно закрыть терминал."); } else { if(GlobalVariableCheck(Symbol()) == true) GlobalVariableDel(Symbol()); } } else if((trade_time >= 85830) && (trade_time <= 85860)) //23:50:30 - 23:51:00 { if(long(trc_value) > 0) { if(trc_value < double(OrdFistSes)) { GlobalVariableSet("ses_count", trc_value - double(OrdFistSes)); } else { GlobalVariableSet("ses_count", 0); } Print(__FUNCTION__, ": Сейчас ", TimeToString( lk_time ), ", если есть необходимость, можно закрыть терминал."); } else { if(GlobalVariableCheck(Symbol()) == true) GlobalVariableDel(Symbol()); } } } else Print(__FUNCTION__, ": Ошибка! Глобальная переменная терминала 'ses_count' не найдена!"); } } else Print(__FUNCTION__, ": Ошибка! Не получено время торгового сервера!"); return(false); }
- www.mql5.com
https://www.mql5.com/ru/docs/marketinformation/symbolinfosessiontrade
https://www.mql5.com/ru/docs/marketinformation/symbolinfosessionquote
Сами-то проверяли, то что советуете?
Сами-то проверяли, то что советуете?
))) Главное в документации прочесть.
В переменной
Хранится счетчик транзакций за сессию (в клиринг обнуляется)
В переменной
хранится общий счетчик транзакций (обнуляется после 18-45)
это гораздо эффективнее истории баров
Соответственно функция проверки торгового времени принимает вид:
Спасибо за код. Я правда не понял зачем вам количество транзакций за сессию ?
Вы обнули счетчик транзакций в 19 00. Во время вечерней сессии намолотили много комиссии. С учетом комиссии у вас осталось 10 000 транзакций. Несколько торговых дней вы пропустили. Запускаете советник в 10 00 делаете до 19 00 все оставшиеся 10 000 транзакций и получаете штраф т.к те 10 000 транзакций относились не к тому торговому дню.
))) Главное в документации прочесть.
Время окончания сессии в секундах от 00 часов 00 минут, в полученном значении дату следует игнорировать.
Ну получите вот эти часы
и что будете с этим делать?¿? Как принимать решение торговать или наблюдать?
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Подскажите, как вы определяете время начало дня FORTS в советниках ?
Сейчас определяю без учета праздников и переносов рабочих дней и т.п. Ничего в голову не приходит кроме запроса истории баров... может быть есть варианты проще ?