Знаю, что таймер не идеальное решение. Знаю, что есть нюансы глюки и отключение таймера.
Меня устраивает вариант шпионов. Сейчас использую несколько другой подход, но суть та же. Часто, если есть возможность, то шпионы сразу шлют сигналы на закрытие/открытие/модификацию или какую-то ключевую инфу для формирования сигналов уже в самом советнике. Это распараллеливает расчеты, а советнику в основном достаются только торговые функции.
В настоящее время мультивалютных торговых систем, индикаторов и экспертов разработано огромное количество. Тем не менее, до сих пор создатели этого "огромного количества" сталкивались со специфическими для мультивалютных систем трудностями. С выпуском в свет терминала MetaTrader 5 и языка программирования MQL5 появилась возможность реализации...
Меня устраивает вариант шпионов. Сейчас использую несколько другой подход, но суть та же. Часто, если есть возможность, то шпионы сразу шлют сигналы на закрытие/открытие/модификацию или какую-то ключевую инфу для формирования сигналов уже в самом советнике. Это распараллеливает расчеты, а советнику в основном достаются только торговые функции.
Спасибо. Когда то читал эту статью.
Шпионы эту гуд. А как же тестер ?
Да и события графика также иногда тормозят. Иногда весь терминал висит ( недавно столкнулся с багом при работе с copybuffer ) при копировании данных, графи подвисает на неопределённое время. В том числе события графика.
А что тестер? Шпионы там работают по тикам того торгового инструмента, на котором запущены. События шлют исправно.
Что значит "события графика также иногда тормозят"? Нужны примеры. Например, я не шлю тики, а шлю в основном сигналы - очередь событий при этом не загромождается и тормозов никаких нет.
Vladislav Andruschenko:
Иногда весь терминал висит ( недавно столкнулся с багом при работе с copybuffer ) при копировании данных, графи подвисает на неопределённое время. В том числе события графика.
Ну, баги, конечно, к теме ветки, но мы же про сам принцип работы мультивалютника. Для разбора багов нужны примеры.
А что тестер? Шпионы там работают по тикам того торгового инструмента, на котором запущены. События шлют исправно.
Что значит "события графика также иногда тормозят"? Нужны примеры. Например, я не шлю тики, а шлю в основном сигналы - очередь событий при этом не загромождается и тормозов никаких нет.
Ну, баги, конечно, к теме ветки, но мы же про сам принцип работы мультивалютника. Для разбора багов нужны примеры.
Спасибо. Попробую разобрать и проверить варианты событиями графика.
Че бодаетесь? Сделали бы вместе что-нибудь полезное.
Станислав выложил фантастический по полезности скрипт в КБ. С легкостью создает архивы с MQL-работами, куда включаются mq?-файлы и ресурсы.
У меня советник из сотни mqh-файлов. С помощью скрипта теперь могу запросто переносить в исходниках советник, контролировать версии и делиться с другими.
This script allows you to assemble a zip-file of your MQL5-program with all dependencies automatically. The dependencies are: included source files via #include directive (both modes of absolute () and relative ("") references are supported); icons linked by #property icon directive; resources (images, sounds, and other types) embedded by...
Anton Shpilyuk:
2) Циклом-перебором до тех пор пока дата не будет совпадать(минус - скорость работы)
это так?
По теме "получить индекс бара по времени copyrates"
Ужас, реально так! Стояла задача в индикаторе получить бары М1 таймфрейма, хотя сам индикатор работает на М5 таймфрейме.
1. пришлось инициализировать нужный таймфрейм в OnCalculate(), чтобы он подгрузился до старта индикатора (после инициализации флаг FirstStartFlag = false;). Помним, что в индикаторах, если не подгружено, выдаст -1 или загрузит не полностью, поэтому проверяем сколько загружено, если не достаточно, идем в начало return(0);
объявляем массив MqlRates rates[]; в начале, где cnt_bars*5; - пересчитываем количество баров М5 в М1
//--- загрузка данных М1 таймфрейма для поминутной экспирации в оптимизаторе if(FirstStartFlag)
{
int count = cnt_bars*5;
int copied=CopyRates(_Symbol,PERIOD_M1,0,count,rates);
if(copied>0)
{
if(debug) Print("Скопировано баров: "+IntegerToString(copied)+", надо было "+IntegerToString(count));
if(copied<count)
{
Print("Не удалось получить достаточно исторических данных, ждем");
return(0);
}
}
else
{
Print("Не удалось получить исторические данные, ждем");
return(0);
}
ArraySetAsSeries(rates,true);
}
После этого уже в теле нужной функции каждый раз при расчетах обновляем исторические данные по М1:
//--- загрузка актуальных данных М1 таймфрейма для поминутной экспирации в оптимизаторе int count = cnt_bars*5;
copied=CopyRates(_Symbol,PERIOD_M1,0,count,rates);
if(copied>0)
{
Print("cnt_Statist() Скопировано баров: "+IntegerToString(copied)+", надо было "+IntegerToString(count));
if(copied<count)
{
Print("cnt_Statist() Не удалось получить достаточно исторических данных");
}
}
else
{
Print("cnt_Statist() Не удалось получить исторические данные");
}
ArraySetAsSeries(rates,true);
Далее, в цикле перебора М5 баров делаем вложенный цикл поиска индекса соответствующего М1 бара, time[s] - текущий обрабатываемый бар М5 таймфрейма:
Ну и далее используем этот индекс для нахождения нужных данных М1 баров, в моём случае rates[IndexRates-5].time и rates[IndexRates-k-4].close
Слава богу этот вложенный цикл быстро перебирает бары. даже на истории 90 дней. А так бы хотелось, чтобы можно было искать индекс бара в массиве rates[].time по типу двоичного поиска функцией ArrayBsearch
Константы, перечисления и структуры / Торговые константы / Информация об исторических данных по инструменту - справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
Для авторизации и пользования сайтом MQL5.com необходимо разрешить использование файлов Сookie.
Пожалуйста, включите в вашем браузере данную настройку, иначе вы не сможете авторизоваться.
Вы вошли в аккаунт. Двухфакторная аутентификация отключена. Настройте её заново и отсканируйте новый QR-код или продолжите с отключённой двухфакторной аутентификацией.
на M1 не возможно сходство в принципе, на остальных можно
разработчики так сделали, что сейчас можно почти любой индкатор с помощью кастомных символом разобрать на части.
даже не знаю, разработчиком быть, или лучше скопировать
Спасибо.
Меня устраивает вариант шпионов. Сейчас использую несколько другой подход, но суть та же. Часто, если есть возможность, то шпионы сразу шлют сигналы на закрытие/открытие/модификацию или какую-то ключевую инфу для формирования сигналов уже в самом советнике. Это распараллеливает расчеты, а советнику в основном достаются только торговые функции.
Меня устраивает вариант шпионов. Сейчас использую несколько другой подход, но суть та же. Часто, если есть возможность, то шпионы сразу шлют сигналы на закрытие/открытие/модификацию или какую-то ключевую инфу для формирования сигналов уже в самом советнике. Это распараллеливает расчеты, а советнику в основном достаются только торговые функции.
А что тестер? Шпионы там работают по тикам того торгового инструмента, на котором запущены. События шлют исправно.
Что значит "события графика также иногда тормозят"? Нужны примеры. Например, я не шлю тики, а шлю в основном сигналы - очередь событий при этом не загромождается и тормозов никаких нет.
Ну, баги, конечно, к теме ветки, но мы же про сам принцип работы мультивалютника. Для разбора багов нужны примеры.
А что тестер? Шпионы там работают по тикам того торгового инструмента, на котором запущены. События шлют исправно.
Что значит "события графика также иногда тормозят"? Нужны примеры. Например, я не шлю тики, а шлю в основном сигналы - очередь событий при этом не загромождается и тормозов никаких нет.
Ну, баги, конечно, к теме ветки, но мы же про сам принцип работы мультивалютника. Для разбора багов нужны примеры.
Так если реализовано безусловное подхватывание инклудников, то макросы+шаблоны не создадут проблем с этим, верно?
Че бодаетесь? Сделали бы вместе что-нибудь полезное.
Че бодаетесь? Сделали бы вместе что-нибудь полезное.
Станислав выложил фантастический по полезности скрипт в КБ. С легкостью создает архивы с MQL-работами, куда включаются mq?-файлы и ресурсы.
У меня советник из сотни mqh-файлов. С помощью скрипта теперь могу запросто переносить в исходниках советник, контролировать версии и делиться с другими.
Спасибо. Попробую разобрать и проверить варианты событиями графика.
Загляните в веточку, недавно как раз разбирал вопрос подробно - https://www.mql5.com/ru/forum/327888
Anton Shpilyuk: 2) Циклом-перебором до тех пор пока дата не будет совпадать(минус - скорость работы) это так?По теме "получить индекс бара по времени copyrates"
Ужас, реально так! Стояла задача в индикаторе получить бары М1 таймфрейма, хотя сам индикатор работает на М5 таймфрейме.
1. пришлось инициализировать нужный таймфрейм в OnCalculate(), чтобы он подгрузился до старта индикатора (после инициализации флаг FirstStartFlag = false;). Помним, что в индикаторах, если не подгружено, выдаст -1 или загрузит не полностью, поэтому проверяем сколько загружено, если не достаточно, идем в начало return(0);
объявляем массив MqlRates rates[]; в начале, где cnt_bars*5; - пересчитываем количество баров М5 в М1
После этого уже в теле нужной функции каждый раз при расчетах обновляем исторические данные по М1:
Далее, в цикле перебора М5 баров делаем вложенный цикл поиска индекса соответствующего М1 бара, time[s] - текущий обрабатываемый бар М5 таймфрейма:
Ну и далее используем этот индекс для нахождения нужных данных М1 баров, в моём случае rates[IndexRates-5].time и rates[IndexRates-k-4].close
Слава богу этот вложенный цикл быстро перебирает бары. даже на истории 90 дней. А так бы хотелось, чтобы можно было искать индекс бара в массиве rates[].time по типу двоичного поиска функцией ArrayBsearch