Не путайте бесусловное и тупое (от незнания) пересоздание индикаторов на каждом тике с разумным (редким и по необходимости) созданием индикатора. В первом случае получаете стократный тормоз и утечку ресурсов, а во втором - идеальную работу.
Renat: Не путайте бесусловное и тупое (от незнания) пересоздание индикаторов на каждом тике с разумным (редким и по необходимости) созданием индикатора. В первом случае получаете стократный тормоз и утечку ресурсов, а во втором - идеальную работу.
Я прекрасно понимаю что Karlsonпо незнанию сделал ошибку, так же понимаю и суть этой ошибки.
Но предложите разумную схему для решения его задачи. Человеку нужно использовать код записанный в индикаторе, но параметр(ы) этого кода определяются динамично перед каждым обращением к данным индикатора?
У меня есть решение, правда оно содержит длл, но вы же ратуете за чистый mql, вот и предложите решение на mql.
ЗЫ я уже упоминал об отглушении OnCalculate() и расчётах в событиях, но через событие можно передать три параметра. В моём решении тут на помощь приходит длл которая через лонг передаёт адрес массива с параметрами, в индикаторе по этому адресу получаются данные.
Если у вас есть решение на mql просто покажите пальцем, тут народ понятливый.
Я прекрасно понимаю что Karlsonпо незнанию сделал ошибку, так же понимаю и суть этой ошибки.
Но предложите разумную схему для решения его задачи. Человеку нужно использовать код записанный в индикаторе, но параметр(ы) этого кода определяются динамично перед каждым обращением к данным индикатора?
Сколько разных индикаторов в реальности надо создать? Наверняка не больше 10, иначе будет просто бессмысленная трата ресурсов.
Так как изменений параметров конечно, то можно просто создать коллекцию из индикаторов, в которую нужный индикатор добавляется по необходимости. Если индикаторов заведомо меньше 10 и они имеют явный смысл (начальные, подтверждающие, корректирующие и тд), то можно создать именованные переменные хендлов с нужными параметрами.
Но предложите разумную схему для решения его задачи. Человеку нужно использовать код записанный в индикаторе, но параметр(ы) этого кода определяются динамично перед каждым обращением к данным индикатора?
Задумался немного. Если параметр(ы) кода определяются динамично перед каждым обращением к данным индикатора, то почему бы процедуру определения таких параметров также не запихнуть в код индикатора? Иными словами, все, абсолютно все расчёты, - в индикатор.
Или есть ситуации, когда такой поход принципиально невозможен?
Задумался немного. Если параметр(ы) кода определяются динамично перед каждым обращением к данным индикатора, то почему бы процедуру определения таких параметров также не запихнуть в код индикатора? Иными словами, все, абсолютно все расчёты, - в индикатор.
Или есть ситуации, когда такой поход принципиально невозможен?
Есть такие ситуации, например когда параметры вычисляются другим(и) индикатором(и) и возвращаются советнику, а советник на основе например нейронки решает какую модель задействовать. Те заранее неизвестно какой из наборов параметров будет применён.
Пробую собрать мультивалютник. Остановился пока на схеме, которую предложил Николай Косицин в своей статье "Создание эксперта, торгующего на разных инструментах". Столкнулся с проблемой, когда результаты отличаются, если запустить тест с разных инструментов, но на одних и тех же параметрах. Пробежался по форуму и нашёл, что многие пришли к тому, что этот вопрос можно решить при помощи функции OnTimer(). Андрей Хатимлянский посоветовал вот здесь:
Отвяжитесь от тиков конкретного инструмента (OnTick) - это же мультивалютник! Работайте по таймеру или ловите момент образования бара на всех рабочих инструментах, это будет надежнее.
Я попробовал ловить момент образования бара на всех инструментах, но у меня не вышло добиться нужного результата.
Например:
В функции, которая предназначена для определения нового бара я явно указываю инструмент и таймфрейм.
bool isNewBar(string Symbol_, ENUM_TIMEFRAMES Timeframe)
{
// В статической переменной будем помнить время открытия последнего бараstaticdatetime last_time = 0;
// Текущее времяdatetime lastbar_time = (ENUM_SERIES_INFO_INTEGER)SeriesInfoInteger(Symbol_,Timeframe,SERIES_LASTBAR_DATE);
// Если это первый вызов функцииif(last_time == 0)
{
// Установим время и выйдем
last_time = lastbar_time;
return(false);
}
// Если время отличаетсяif(last_time != lastbar_time)
{
// Запомним время и вернем true
last_time = lastbar_time;
return(true);
}
// Дошли до этого места - значит бар не новый, вернем falsereturn(false);
}
В функции OnTick() схема, которую предложил Николай Косицин.
Например:
voidOnTick()
{
// Объявление массивов переменных для торговых сигналов staticbool UpSignal[2], DnSignal[2];
// Получение торговых сигналов
TradeSignalCounter(0, остальные параметры);
TradeSignalCounter(1, остальные параметры);
// Совершение торговых операций
TradePerformer(0, остальные параметры);
TradePerformer(1, остальные параметры);
}
Функция isNewBar(Symbol,Timeframe) вызывается в функции, в которой исполняются торговые операции, то есть в TradePerformer(параметры).
То есть проверка нового бара происходит каждый раз для каждого инструмента отдельно. Если нового бара нет, то проверяем следующий символ. И так на каждом тике. Но этот вариант не срабатывает.
Подскажите, как правильно реализовать проверку нового бара в мультивалютном эксперте в представленной схеме.
Для авторизации и пользования сайтом MQL5.com необходимо разрешить использование файлов Сookie.
Пожалуйста, включите в вашем браузере данную настройку, иначе вы не сможете авторизоваться.
Вы вошли в аккаунт. Двухфакторная аутентификация отключена. Настройте её заново и отсканируйте новый QR-код или продолжите с отключённой двухфакторной аутентификацией.
Не путайте бесусловное и тупое (от незнания) пересоздание индикаторов на каждом тике с разумным (редким и по необходимости) созданием индикатора. В первом случае получаете стократный тормоз и утечку ресурсов, а во втором - идеальную работу.
Я прекрасно понимаю что Karlson по незнанию сделал ошибку, так же понимаю и суть этой ошибки.
Но предложите разумную схему для решения его задачи. Человеку нужно использовать код записанный в индикаторе, но параметр(ы) этого кода определяются динамично перед каждым обращением к данным индикатора?
У меня есть решение, правда оно содержит длл, но вы же ратуете за чистый mql, вот и предложите решение на mql.
ЗЫ я уже упоминал об отглушении OnCalculate() и расчётах в событиях, но через событие можно передать три параметра. В моём решении тут на помощь приходит длл которая через лонг передаёт адрес массива с параметрами, в индикаторе по этому адресу получаются данные.
Если у вас есть решение на mql просто покажите пальцем, тут народ понятливый.
Я прекрасно понимаю что Karlson по незнанию сделал ошибку, так же понимаю и суть этой ошибки.
Но предложите разумную схему для решения его задачи. Человеку нужно использовать код записанный в индикаторе, но параметр(ы) этого кода определяются динамично перед каждым обращением к данным индикатора?
Сколько разных индикаторов в реальности надо создать? Наверняка не больше 10, иначе будет просто бессмысленная трата ресурсов.
Так как изменений параметров конечно, то можно просто создать коллекцию из индикаторов, в которую нужный индикатор добавляется по необходимости. Если индикаторов заведомо меньше 10 и они имеют явный смысл (начальные, подтверждающие, корректирующие и тд), то можно создать именованные переменные хендлов с нужными параметрами.
Но предложите разумную схему для решения его задачи. Человеку нужно использовать код записанный в индикаторе, но параметр(ы) этого кода определяются динамично перед каждым обращением к данным индикатора?
Задумался немного. Если параметр(ы) кода определяются динамично перед каждым обращением к данным индикатора, то почему бы процедуру определения таких параметров также не запихнуть в код индикатора? Иными словами, все, абсолютно все расчёты, - в индикатор.
Или есть ситуации, когда такой поход принципиально невозможен?
Задумался немного. Если параметр(ы) кода определяются динамично перед каждым обращением к данным индикатора, то почему бы процедуру определения таких параметров также не запихнуть в код индикатора? Иными словами, все, абсолютно все расчёты, - в индикатор.
Или есть ситуации, когда такой поход принципиально невозможен?
Есть такие ситуации, например когда параметры вычисляются другим(и) индикатором(и) и возвращаются советнику, а советник на основе например нейронки решает какую модель задействовать. Те заранее неизвестно какой из наборов параметров будет применён.
Подскажите пожалуйста почему в таком простом индикаторе нулевой(первый с права) бар не просчитывается везде кроме недельного графа?
Ой) подставил сюда: SimpleMAOnBuffer(e,prev_calculated,PERIOD+1,p,vect,mabuf); вместо e - rates_total и все заработало)
Пробую собрать мультивалютник. Остановился пока на схеме, которую предложил Николай Косицин в своей статье "Создание эксперта, торгующего на разных инструментах". Столкнулся с проблемой, когда результаты отличаются, если запустить тест с разных инструментов, но на одних и тех же параметрах. Пробежался по форуму и нашёл, что многие пришли к тому, что этот вопрос можно решить при помощи функции OnTimer(). Андрей Хатимлянский посоветовал вот здесь:
Отвяжитесь от тиков конкретного инструмента (OnTick) - это же мультивалютник! Работайте по таймеру или ловите момент образования бара на всех рабочих инструментах, это будет надежнее.
Я попробовал ловить момент образования бара на всех инструментах, но у меня не вышло добиться нужного результата.
Например:
В функции, которая предназначена для определения нового бара я явно указываю инструмент и таймфрейм.
В функции OnTick() схема, которую предложил Николай Косицин.
Например:
Функция isNewBar(Symbol,Timeframe) вызывается в функции, в которой исполняются торговые операции, то есть в TradePerformer(параметры).
Например:
То есть проверка нового бара происходит каждый раз для каждого инструмента отдельно. Если нового бара нет, то проверяем следующий символ. И так на каждом тике. Но этот вариант не срабатывает.
Подскажите, как правильно реализовать проверку нового бара в мультивалютном эксперте в представленной схеме.
Править ошибки человека с ником Expert ? это нужно в тему юмор.