voidOnChartEvent( constint id, // идентификатор события constlong& lparam, // параметр события типа long constdouble& dparam,// параметр события типа double conststring& sparam // параметр события типа string
)
{
Print(My_Name, " --- ", id, " lparam = ", lparam, " dparam = ", dparam, " sparam = ", sparam, " ChartID() = ", ChartID() ); // <<|+|+|+<< //
}
Объясните, пожалуйста..
Нажимаю клавишу = получаю событие id = 0. Это можно повторять многократно. Результат получается тот же до тех пор, пока не нажат пробел.
Нажат пробел = получаю событие id = 0. После этого никакие манипуляции с клавиатурой к событиям не приводят.
Чтобы выйти из ступора, нажимаю кнопку мыши = получаю событие id = 4. После этого опять можно клацать по клавиатуре = события приходят на каждое нажатие. Пока не нажат пробел = с тем же результатом.
Вопрос: Это я дурак чего-то не понимаю или так не должно быть? Прошу указать ссылку.
там такой прикол в индикатороах, что таймсерии бывают еще не готовы, т.е. он не может сразу скопировать цену в массив. Для этого надо проверять доступна ли история по ТФ, если нет то делать попытку копирования снова и ждать поа она не подгрузится, в цикле
это кривые руки программиста, если он об этом не знал
слип это не нормально
Как такое возможно в тестере? Я понимаю, если проблема на реале или в тестере там нет истории... Впрочем, как должна выглядеть эта проверка?
Поэтому и не ясна ситуация, если предположить, что нет цен для расчета, то произойдет 1 раз расчет индикатора и буфер останется незаполненным, но это не так - он заполнится, если добавить sleep в советник и подождать. Может индикатор медленно ведет расчет и его просто не дожидается тестер? Но как это проверить?
Индикатор рассчитывается 1 раз при появление нового бара, что реализовано, если я правильно понимаю таким образом:
это подтверждается и простым принтом.
Поэтому и не ясна ситуация, если предположить, что нет цен для расчета, то произойдет 1 раз расчет индикатора и буфер останется незаполненным, но это не так - он заполнится, если добавить sleep в советник и подождать. Может индикатор медленно ведет расчет и его просто не дожидается тестер? Но как это проверить?
Да, с таймером в советнике тест проходит чуть дальше, чем без таймера, но хуже чем со Sleep, да и таймер по сути тот же Sleep.
Кажется, я понял в чем проблема, индикатор рассчитывается по данным двух других индикаторов, в коде происходит запрос числа посчитанных баров других индикаторов
//+------------------------------------------------------------------+//| |//+------------------------------------------------------------------+int CChannel::BarsCalculated(void)
{
int upchbars=BarsCalculated(m_upch);
int dnchbars=BarsCalculated(m_dnch);
if(upchbars<=dnchbars) return(upchbars);
return(dnchbars);
}
и ожидаемое расчетное число баров
int barsch=(InpChPeriod==PERIOD_CURRENT?rates_total:Bars(_Symbol,InpChPeriod));
Если эти два значения не совпадают и получается, что буфер не заполняется.
Если я правильно понимаю, то индикаторы выполняются в одном потоке, и их приоритет выстраивается по времени их создания, т.е. получается, что индикатор к которому я обращаюсь из советника имеет больший приоритет и он свой расчет выполняет первым, а потом после окончания расчета отдает поток тем индикаторам, на основании которых (по данным буферов) должен происходить расчет.
В принте видно, что если поставить Sleep достаточного размера, то происходит перерасчет в индикаторе(пока не понимаю как), и почему только через 13 секунд?
И, что же я должен сделать, что бы получить правильный расчет, попытка использовать while в советнике до ожидания значения в буфере не помогает - происходит зависание.
короче получать значения до тех пор в цикле, пока они не совпадут, только после этого выполнять следующий код
Так дело в том, что пока не отработает один индикатор, данные (поток) не передаются другому, т.е. цикл в индикаторе без окончания работы OnCalculate этого индикатора не поможет. А как только OnCalculate заканчивается, то сразу отдаются данные советнику, а они ошибочны.
Объясните, пожалуйста..
Нажимаю клавишу = получаю событие id = 0. Это можно повторять многократно. Результат получается тот же до тех пор, пока не нажат пробел.
Нажат пробел = получаю событие id = 0. После этого никакие манипуляции с клавиатурой к событиям не приводят.
Чтобы выйти из ступора, нажимаю кнопку мыши = получаю событие id = 4. После этого опять можно клацать по клавиатуре = события приходят на каждое нажатие. Пока не нажат пробел = с тем же результатом.
Вопрос: Это я дурак чего-то не понимаю или так не должно быть? Прошу указать ссылку.
Здравствуйте, коллеги.
Вопрос такой: в mql4 для того, чтобы посчитать количество позиций можно было прописать функцию, к примеру, такую
Как это дело реализуется в mql5? Как можно посчитать позиции по магику? или по типу?
Добавьте перед MQL4-функцией эту строку
и она станет работать в MT5.
там такой прикол в индикатороах, что таймсерии бывают еще не готовы, т.е. он не может сразу скопировать цену в массив. Для этого надо проверять доступна ли история по ТФ, если нет то делать попытку копирования снова и ждать поа она не подгрузится, в цикле
это кривые руки программиста, если он об этом не знал
слип это не нормальноКак такое возможно в тестере? Я понимаю, если проблема на реале или в тестере там нет истории... Впрочем, как должна выглядеть эта проверка?
Разработчики игнорируют моё сообщение, прискорбно.
Как такое возможно в тестере? Я понимаю, если проблема на реале или в тестере там нет истории... Впрочем, как должна выглядеть эта проверка?
Разработчики игнорируют моё сообщение, прискорбно.
проверка скоприровались ли цены, если Copyclose или что там возвращает -1 значит не скопировались
проверка скоприровались ли цены, если Copyclose или что там возвращает -1 значит не скопировались
Индикатор рассчитывается 1 раз при появление нового бара, что реализовано, если я правильно понимаю таким образом:
это подтверждается и простым принтом.
Поэтому и не ясна ситуация, если предположить, что нет цен для расчета, то произойдет 1 раз расчет индикатора и буфер останется незаполненным, но это не так - он заполнится, если добавить sleep в советник и подождать. Может индикатор медленно ведет расчет и его просто не дожидается тестер? Но как это проверить?
Индикатор рассчитывается 1 раз при появление нового бара, что реализовано, если я правильно понимаю таким образом:
это подтверждается и простым принтом.
Поэтому и не ясна ситуация, если предположить, что нет цен для расчета, то произойдет 1 раз расчет индикатора и буфер останется незаполненным, но это не так - он заполнится, если добавить sleep в советник и подождать. Может индикатор медленно ведет расчет и его просто не дожидается тестер? Но как это проверить?
может, таймером надо засекать тогда
может, таймером надо засекать тогда
Да, с таймером в советнике тест проходит чуть дальше, чем без таймера, но хуже чем со Sleep, да и таймер по сути тот же Sleep.
Кажется, я понял в чем проблема, индикатор рассчитывается по данным двух других индикаторов, в коде происходит запрос числа посчитанных баров других индикаторов
и ожидаемое расчетное число баров
Если эти два значения не совпадают и получается, что буфер не заполняется.
Если я правильно понимаю, то индикаторы выполняются в одном потоке, и их приоритет выстраивается по времени их создания, т.е. получается, что индикатор к которому я обращаюсь из советника имеет больший приоритет и он свой расчет выполняет первым, а потом после окончания расчета отдает поток тем индикаторам, на основании которых (по данным буферов) должен происходить расчет.
В принте видно, что если поставить Sleep достаточного размера, то происходит перерасчет в индикаторе(пока не понимаю как), и почему только через 13 секунд?
В индикаторе таймера нет.
И, что же я должен сделать, что бы получить правильный расчет, попытка использовать while в советнике до ожидания значения в буфере не помогает - происходит зависание.
do { ... код заполнения буфера
}
while(эти два значения не совпадают)
короче получать значения до тех пор в цикле, пока они не совпадут, только после этого выполнять следующий кодdo { ... код заполнения буфера
}
while(эти два значения не совпадают)
короче получать значения до тех пор в цикле, пока они не совпадут, только после этого выполнять следующий кодТак дело в том, что пока не отработает один индикатор, данные (поток) не передаются другому, т.е. цикл в индикаторе без окончания работы OnCalculate этого индикатора не поможет. А как только OnCalculate заканчивается, то сразу отдаются данные советнику, а они ошибочны.
Или я не понял Вашу идею.