1. Потому что поддержка не всегда выдает корректную информацию. Вы сами это указали про дилера Альпари. + это накладно: выяснить у каждого дилера переход. Ведь тогда не получается создать хорошего решения, я не знаю, конечный пользователь у кого обсулживается.
2. Ну, вроде как, да, но вот если дилер не переход с зимнего на летнее и обратно, то получается в расчетах какая-то странная штука.
Я попробовал чутка модифицировать вашу библиотеку, но, видимо, что-то не так пошло. Думал код привести к тому, что советник автоматически определяет время GMT и торгует именно по GMT, а не по серверу брокера. Не уверен, что код оптимальный, но решение, кажется, работает. Правда, у тех дилеров, что время не меняют - там получаются какие-то неверные расчеты.
Что вы изменили?
Можете ли вы назвать мне брокера (ссылка), где это не работает?
Можете ли вы назвать мне брокера (ссылка), где это не работает?
Я только что использовал его снова:
1.
- не стал зацикливаться на EURUSD, туда, куда поставлен советник, ту пару и берем.
- время тоже не стал жестко фиксировать, я просто отнимаю 1 год от текущего.
datetime setDate = StringToTime(IntegerToString(NowYear()-1)+".06.21 14:00");
nextDST("EUR", setDate); // EUR: get DST and set next change
И по ссылке передаю параметры bool setBokerOffset(string symbol, int &USwinEUwin1, int &USsumEUsum1, int &USsumEUwin1), что их динамично получить вот это блок
2. Альфа-форекс. Могу в лс дать данные от демо-счета, чтобы вы могли проверить, не открывая ничего. Дело в том, что дилер не переходит с зимнего на летнее, а разница с GMT все равно возникает.
3. Немного не понял, как и где использована конструкция.
Вообще перешел на гринвич. И время перехода на зимнее определяю как разницу серверного времени и гринвича. Единственно, что для каждого брокера эту разницу приходится считать самому и забивать в константы советника. Просто когда у пользователей разные сдвиги, у брокеров, у бирж, и время перехода на зимнее не одинаково, гринвич одинаков для всех.
Valeriy Yastremskiy #: Вообще перешел на гринвич. И время перехода на зимнее определяю как разницу серверного времени и гринвича. Единственно, что для каждого брокера эту разницу приходится считать самому и забивать в константы советника. Просто когда у пользователей разные сдвиги, у брокеров, у бирж, и время перехода на зимнее не одинаково, гринвич одинаков для всех.
А как именно вы это сделали? Каким образом высчитывается константы?
А как именно вы это сделали? Каким образом высчитывается константы?
Время гринвича минус таймкаррент, с переходом на зимнее он изменится на час. Писал как то время начала и окончания работы, с клиентом разница в час +3 и +2, у брокеров +3, +2, -6 по гринвичу.))) А начинать работу надо было в определенное время, одинаковое для всех. Гринвич одинаков, а серверное и локальное время разные. Код из учебника Федосеева переделал.)
В общем проблема как бы, что нет штатной функции разницы серверного и гринвича времени. Но она считается. Тут еще затык, что у локального времени тоже может быть переход на зимнее время, и в отличное время, от перехода у брокера.
// TimeGMT()-TimeCurrent(); летом одна величина, зимой другая.
// TimeGMTOffset() = TimeGMT() - TimeLocal(); серверным временем нет штатной функции
#property strict
//+------------------------------------------------------------------+class CTradeTimeGMT{
protected:
int StartTime;
int EndTime;
int GMTShiftTest;
int GMTShiftCur;
public:
void Init(int StartHour, int StartMinute, int EndHour, int EndMinute, int GMTshift){
StartTime=3600*StartHour+60*StartMinute;
EndTime=3600*EndHour+60*EndMinute;
GMTShiftCur=GMTshift;
GMTShiftTest=GMTshift+int((TimeGMTOffset())/3600);
//Alert(TimeGMTOffset()); if(MQLInfoInteger( MQL_TESTER))GMTShiftCur=GMTShiftTest;
}
bool Check(int GMTshift){
int CurTime=(int)((TimeGMT()+(GMTShiftCur*3600))%86400);
if(StartTime<EndTime){
return(CurTime>=StartTime && CurTime<EndTime);
}
else{
return(CurTime>=StartTime || CurTime<EndTime);
}
}
};
Время гринвича минус таймкаррент, с переходом на зимнее он изменится на час. Писал как то время начала и окончания работы, с клиентом разница в час +3 и +2, у брокеров +3, +2, -6 по гринвичу.))) А начинать работу надо было в определенное время, одинаковое для всех. Гринвич одинаков, а серверное и локальное время разные. Код из учебника Федосеева переделал.)
В общем проблема как бы, что нет штатной функции разницы серверного и гринвича времени. Но она считается. Тут еще затык, что у локального времени тоже может быть переход на зимнее время, и в отличное время, от перехода у брокера.
Спасибо, да, такое решение есть в голове, оно +- так и реализовано. Но вы в последнем абзаце указали на всю боль)
Я знаю, что эта статья была опубликована уже давно, но я только что нашел ее. Спасибо, что поделились этой работой. Мне нужно провести некоторое тестирование, чтобы действительно понять ее. Но пока у меня есть простой вопрос:
Я вижу, что вы используете другой метод вычисления дня недели, а не полагаетесь на структуру MqlDateTime.day_of_week. Почему вы используете этот другой метод вычисления, есть ли преимущество в точности? Или это просто для того, чтобы избежать преобразования в структуру?
Я начал кодировать некоторые основы времени, такие как HoD(), а затем бросил вызов и другим вещам, так как выглядит проще написать DoW(...) вместо того, чтобы назначать время в struct и запрашивать другие значения - не стесняйтесь использовать то, что вам нравится.
//+------------------------------------------------------------------+//| Вычислите изменения перехода на летнее время в Лондоне, Великобритания |//| Validated to https://www.timeanddate.com/time/change/uk/london |//+------------------------------------------------------------------+void DST_Europe(int iYear, datetime &dst_start, datetime &dst_end)
{
datetime dt1,dt2;
MqlDateTime st1,st2;
/* Переход на зимнее время в Великобритании начинается в 01:00 по местному времени в последнее воскресенье марта
и заканчивается в 02:00 по местному времени в последнее воскресенье октября */.
dt1=StringToTime((string)iYear+".03.31 01:00");
dt2=StringToTime((string)iYear+".10.31 02:00");
TimeToStruct(dt1,st1);
TimeToStruct(dt2,st2);
dst_start=dt1-(st1.day_of_week*86400);
dst_end =dt2-(st2.day_of_week*86400);
}
//+------------------------------------------------------------------+//| Вычислите изменения летнего времени в Нью-Йорке, США |//| Проверено на https://www.timeanddate.com/time/change/usa/new-york|.//+------------------------------------------------------------------+void DST_USA(int iYear, datetime &dst_start, datetime &dst_end)
{
datetime dt1,dt2;
MqlDateTime st1,st2;
/* Переход на зимнее время в США начинается в 02:00 по местному времени во второе воскресенье марта
и заканчивается в 02:00 по местному времени в первое воскресенье ноября */
dt1=StringToTime((string)iYear+".03.14 02:00");
dt2=StringToTime((string)iYear+".11.07 02:00");
TimeToStruct(dt1,st1);
TimeToStruct(dt2,st2);
dst_start=dt1-(st1.day_of_week*86400);
dst_end =dt2-(st2.day_of_week*86400);
}
//+------------------------------------------------------------------+//||//+------------------------------------------------------------------+voidOnStart()
{
datetime dst_start,dst_end;
dst_start=dst_end=0;
//--- В Европейском Союзе летнее время начинается в последнее воскресенье в//--- марта и заканчивается в последнее воскресенье октября.|Print("========= European Summer Time (DST) =========");
for(int year=2010; year<=2029; year++)
{
DST_Europe(year,dst_start,dst_end);
Print("DST starts on ",dst_start," and ends on ",dst_end);
}
//--- В Соединенных Штатах летнее время начинается во второе воскресенье | года.//--- марта и заканчивается в первое воскресенье ноября.|Print("========= American Summer Time (DST) =========");
for(int year=2010; year<=2029; year++)
{
DST_USA(year,dst_start,dst_end);
Print("DST starts on ",dst_start," and ends on ",dst_end);
}
}
//+------------------------------------------------------------------+/*
вывод:
========= Европейское летнее время (DST) =========
DST начинается в 2010.03.28 01:00:00 и заканчивается в 2010.10.31 02:00:00
DST начинается в 2011.03.27 01:00:00 и заканчивается в 2011.10.30 02:00:00
DST начинается 2012.03.25 01:00:00 и заканчивается 2012.10.28 02:00:00
DST начинается 2013.03.31 01:00:00 и заканчивается 2013.10.27 02:00:00
DST начинается 2014.03.30 01:00:00 и заканчивается 2014.10.26 02:00:00
DST начинается 2015.03.29 01:00:00 и заканчивается 2015.10.25 02:00:00
DST начинается 2016.03.27 01:00:00 и заканчивается 2016.10.30 02:00:00
DST начинается 2017.03.26 01:00:00 и заканчивается 2017.10.29 02:00:00
DST начинается 2018.03.25 01:00:00 и заканчивается 2018.10.28 02:00:00
DST начинается 2019.03.31 01:00:00 и заканчивается 2019.10.27 02:00:00
DST начинается 2020.03.29 01:00:00 и заканчивается 2020.10.25 02:00:00
DST начинается 2021.03.28 01:00:00 и заканчивается 2021.10.31 02:00:00
DST начинается в 2022.03.27 01:00:00 и заканчивается в 2022.10.30 02:00:00
DST начинается в 2023.03.26 01:00:00 и заканчивается в 2023.10.29 02:00:00
DST начинается в 2024.03.31 01:00:00 и заканчивается в 2024.10.27 02:00:00
DST начинается в 2025.03.30 01:00:00 и заканчивается в 2025.10.26 02:00:00
DST начинается в 2026.03.29 01:00:00 и заканчивается в 2026.10.25 02:00:00
DST начинается в 2027.03.28 01:00:00 и заканчивается 2027.10.31 02:00:00
DST начинается 2028.03.26 01:00:00 и заканчивается 2028.10.29 02:00:00
DST начинается 2029.03.25 01:00:00 и заканчивается 2029.10.28 02:00:00
========= Американское летнее время (DST) =========
DST начинается 2010.03.14 02:00:00 и заканчивается 2010.11.07 02:00:00
DST начинается 2011.03.13 02:00:00 и заканчивается 2011.11.06 02:00:00
DST начинается 2012.03.11 02:00:00 и заканчивается 2012.11.04 02:00:00
DST начинается 2013.03.10 02:00:00 и заканчивается 2013.11.03 02:00:00
DST начинается 2014.03.09 02:00:00 и заканчивается 2014.11.02 02:00:00
DST начинается 2015.03.08 02:00:00 и заканчивается 2015.11.01 02:00:00
DST начинается 2016.03.13 02:00:00 и заканчивается 2016.11.06 02:00:00
DST начинается 2017.03.12 02:00:00 и заканчивается 2017.11.05 02:00:00
DST начинается 2018.03.11 02:00:00 и заканчивается 2018.11.04 02:00:00
DST начинается 2019.03.10 02:00:00 и заканчивается 2019.11.03 02:00:00
DST начинается в 2020.03.08 02:00:00 и заканчивается в 2020.11.01 02:00:00
DST начинается в 2021.03.14 02:00:00 и заканчивается в 2021.11.07 02:00:00
DST начинается в 2022.03.13 02:00:00 и заканчивается в 2022.11.06 02:00:00
DST начинается в 2023.03.12 02:00:00 и заканчивается в 2023.11.05 02:00:00
DST начинается в 2024.03.10 02:00:00 и заканчивается в 2024.11.03 02:00:00
DST начинается в 2025.03.09 02:00:00 и заканчивается в 2025.11.02 02:00:00
DST начинается в 2026.03.08 02:00:00 и заканчивается в 2026.11.01 02:00:00
DST начинается в 2027.03.14 02:00:00 и заканчивается 2027.11.07 02:00:00
DST начинается 2028.03.12 02:00:00 и заканчивается 2028.11.05 02:00:00
DST начинается 2029.03.11 02:00:00 и заканчивается 2029.11.04 02:00:00
*/
1. Потому что поддержка не всегда выдает корректную информацию. Вы сами это указали про дилера Альпари. + это накладно: выяснить у каждого дилера переход. Ведь тогда не получается создать хорошего решения, я не знаю, конечный пользователь у кого обсулживается.
2. Ну, вроде как, да, но вот если дилер не переход с зимнего на летнее и обратно, то получается в расчетах какая-то странная штука.
Я попробовал чутка модифицировать вашу библиотеку, но, видимо, что-то не так пошло. Думал код привести к тому, что советник автоматически определяет время GMT и торгует именно по GMT, а не по серверу брокера. Не уверен, что код оптимальный, но решение, кажется, работает. Правда, у тех дилеров, что время не меняют - там получаются какие-то неверные расчеты.
1.
- не стал зацикливаться на EURUSD, туда, куда поставлен советник, ту пару и берем.
- время тоже не стал жестко фиксировать, я просто отнимаю 1 год от текущего.
И по ссылке передаю параметры bool setBokerOffset(string symbol, int &USwinEUwin1, int &USsumEUsum1, int &USsumEUwin1), что их динамично получить вот это блок
2. Альфа-форекс. Могу в лс дать данные от демо-счета, чтобы вы могли проверить, не открывая ничего. Дело в том, что дилер не переходит с зимнего на летнее, а разница с GMT все равно возникает.
3. Немного не понял, как и где использована конструкция.
3. Немного не понял, как и где использована конструкция.
In an indicator that is the top of the loop though all bars.
Вообще перешел на гринвич. И время перехода на зимнее определяю как разницу серверного времени и гринвича. Единственно, что для каждого брокера эту разницу приходится считать самому и забивать в константы советника. Просто когда у пользователей разные сдвиги, у брокеров, у бирж, и время перехода на зимнее не одинаково, гринвич одинаков для всех.
А как именно вы это сделали? Каким образом высчитывается константы?
А как именно вы это сделали? Каким образом высчитывается константы?
Время гринвича минус таймкаррент, с переходом на зимнее он изменится на час. Писал как то время начала и окончания работы, с клиентом разница в час +3 и +2, у брокеров +3, +2, -6 по гринвичу.))) А начинать работу надо было в определенное время, одинаковое для всех. Гринвич одинаков, а серверное и локальное время разные. Код из учебника Федосеева переделал.)
В общем проблема как бы, что нет штатной функции разницы серверного и гринвича времени. Но она считается. Тут еще затык, что у локального времени тоже может быть переход на зимнее время, и в отличное время, от перехода у брокера.
Время гринвича минус таймкаррент, с переходом на зимнее он изменится на час. Писал как то время начала и окончания работы, с клиентом разница в час +3 и +2, у брокеров +3, +2, -6 по гринвичу.))) А начинать работу надо было в определенное время, одинаковое для всех. Гринвич одинаков, а серверное и локальное время разные. Код из учебника Федосеева переделал.)
В общем проблема как бы, что нет штатной функции разницы серверного и гринвича времени. Но она считается. Тут еще затык, что у локального времени тоже может быть переход на зимнее время, и в отличное время, от перехода у брокера.
Спасибо, да, такое решение есть в голове, оно +- так и реализовано. Но вы в последнем абзаце указали на всю боль)
Привет @Carl Schreiber С Новым годом.
Я знаю, что эта статья была опубликована уже давно, но я только что нашел ее. Спасибо, что поделились этой работой. Мне нужно провести некоторое тестирование, чтобы действительно понять ее. Но пока у меня есть простой вопрос:
Я вижу, что вы используете другой метод вычисления дня недели, а не полагаетесь на структуру MqlDateTime.day_of_week. Почему вы используете этот другой метод вычисления, есть ли преимущество в точности? Или это просто для того, чтобы избежать преобразования в структуру?
Этот код автоматически вычисляет DST для европейских и американских брокеров:
https://www.mql5.com/ru/code/27860
Приведенный выше код был использован в Forex Market Hours https://www.mql5.com/ru/code/27771 для расчета изменения времени перехода на летнее время.
Аналогичные функции можно построить для разных регионов мира.