- Демонстрация кластерного подхода к рынку...
- Терминал не видит файл из маркета. Подскажите возможное решение.
- После перезапуска терминала на VPS, терминал не загрузил советники
Есть у меня несколько таких индикаторов. Это свойство им придано преднамеренно. При первичной инициализации они ничего не делают. Чтобы индикатор заработал нужна повторная инициализации.
У меня это два случая:
1. При старте терминала индикатор намертво вешает терминал. Как вариант, один из таких индикаторов у меня начинает отрисовку через 30 секунд после инициализации.
2. Я знаю, что индикатор имеет высокую вычислительную сложность. Поэтому, без необходимости, он ничего и не делает.
Есть у меня индикатор. Проверен уже и в торговле на реале и в тестах. Всё рисует как нужно и высчитывает. Но вот есть один нюанс. После перезапуска терминала нет вооще ничего того, что он нарисовал. С чем это может быть связано? Пока терминал не отключить всё показывается верно.
Правильный индикатор отрисовывает свои значения даже на выходных - когда нет котировок.
Пример: все индикаторы из поставки MetaTarder 5 (код индикаторов искать в редакторе MetaEditor в папке MQL5 - Indicators - Examples)
Правильный индикатор отрисовывает свои значения даже на выходных - когда нет котировок.
Пример: все индикаторы из поставки MetaTarder 5 (код индикаторов искать в редакторе MetaEditor в папке MQL5 - Indicators - Examples)
Не поможет мне стандартное.. У меня индикатор МТФ. С индикаторами, которые написаны для 1 ТФ таких косяков нет.
В общем, пришлось пришлось принтовать код. Я нашёл, где косяк возникает. И, именно, при запуске терминала.
Вот есть функция вычисляющая индекс бара, с которого будет происходить перерасчёт:
//+---------------------------------------------------------------------------------------------------------------------------------------------------------------+ //| Определение индекса бара, с которого необходимо производить перерасчет | //+---------------------------------------------------------------------------------------------------------------------------------------------------------------+ int getRecalcIndex(const int barsTotal, // Количество пришедших баров таймфрейма открытого графика const int countedBars) { // Количество уже обработанных баров таймфрейма открытого графика //--- if (countedBars != 0) { return barsTotal - countedBars; } else { int firstBarIndexOfCurTF = barsTotal() - 1; Print("firstBarIndexOfCurTF = ", firstBarIndexOfCurTF); Print("barOpenTime(firstBarIndexOfCurTF), i_tf = ", barOpenTime(firstBarIndexOfCurTF), i_tf); Print("barShift(barOpenTime(firstBarIndexOfCurTF), i_tf) = ", barShift(barOpenTime(firstBarIndexOfCurTF), i_tf)); return barShift(barOpenTime(firstBarIndexOfCurTF), i_tf) - 1; } }
Онавызывается в OnCalculate() так:
int limit = getRecalcIndex(rates_total, prev_calculated); // Определим первый расчетный бар
Параметры видны, какие в эту функцию приходят.
Здесь используются 3 библиотечные функции:
//================================================================================================================================================================================== // 1.1 Возвращает количество баров в окне торгового инструмента активного окна на заданном таймфрейме. ============================================================================= int barsTotal(ENUM_TIMEFRAMES tf = PERIOD_CURRENT) export { // ТФ, количество баров которого требуется получить //--- return Bars(_Symbol, tf); } //================================================================================================================================================================================== // 7.1 Возвращает значение времени открытия бара торгового инструмента активного окна, находящегося на shift баров от 0-го бара в историю. ========================================= datetime barOpenTime(int shift, // Индекс бара, время открытия которого требуется определить ENUM_TIMEFRAMES tf = PERIOD_CURRENT) export { // ТФ, на котором будет происходить поиск открытия баров функцией CopyTime() //--- return ((CopyTime(_Symbol, tf, shift, 1, barOpenTime) == 1) ? barOpenTime[0] : WRONG_VALUE); }
//================================================================================================================================================================================== // 2.1 Возвращает индекс бара торгового инструмента активного окна по его времени открытия на заданном таймфрейме. ================================================================= int barShift(datetime initialBarTime, // Время открытия бара, индекс коорого требуется найти ENUM_TIMEFRAMES tf = PERIOD_CURRENT) export { // ТФ, на котором будет происходить поиск открытия баров функцией CopyTime() //---- datetime barsOpenTime[], // Массив, в котором находится времени открытия баров открытого окна за указанный интервал времени lastBarTime = barOpenTime(0, tf); // Время до которого будет происходить поиск времени открытия баров функцией CopyTime() if (CopyTime(_Symbol, tf, initialBarTime, lastBarTime, barsOpenTime) == -1) return -1; //--- return (ArraySize(barsOpenTime) > 1) ? (ArraySize(barsOpenTime) - 1) : 0; }
При запуске терминала вижу такое:
MP 0 10:31:33.900 ZigZag_HightLow_MTF (AUDJPY,H1) firstBarIndexOfCurTF = -1 MJ 0 10:31:33.902 ZigZag_HightLow_MTF (AUDJPY,H1) barOpenTime(firstBarIndexOfCurTF), i_tf = wrong datetime16408 OP 0 10:31:33.902 ZigZag_HightLow_MTF (AUDJPY,H1) barShift(barOpenTime(firstBarIndexOfCurTF), i_tf) = 4999
- www.metatrader5.com
В общем, получается какая-то дичь. Со старта терминала стандартная функция:
int Bars( string symbol_name, // имя символа ENUM_TIMEFRAMES timeframe // периоду );
Возвращает -1.
Стабильностью от платформы так и прёт..
Изменил этот метод тестово:
//+---------------------------------------------------------------------------------------------------------------------------------------------------------------+ //| Определение индекса бара, с которого необходимо производить перерасчет | //+---------------------------------------------------------------------------------------------------------------------------------------------------------------+ int getRecalcIndex(const int barsTotal, // Количество пришедших баров таймфрейма открытого графика const int countedBars) { // Количество уже обработанных баров таймфрейма открытого графика //--- for (int i = (barsTotal - countedBars - 1); i >= 0; i--) g_ZZPriceBuf[i] = EMPTY_VALUE; if (countedBars != 0) { return barsTotal - countedBars; } else { int cnt = 0; while (Bars(_Symbol, PERIOD_CURRENT) == 0) { Print("cnt = ", cnt, " ; barsTotal = ", Bars(_Symbol, PERIOD_CURRENT)); cnt++; Sleep(12000); } int firstBarIndexOfCurTF = barsTotal() - 1; Print("firstBarIndexOfCurTF = ", firstBarIndexOfCurTF); Print("barOpenTime(firstBarIndexOfCurTF), i_tf = ", barOpenTime(firstBarIndexOfCurTF), i_tf); Print("barShift(barOpenTime(firstBarIndexOfCurTF), i_tf) = ", barShift(barOpenTime(firstBarIndexOfCurTF), i_tf)); return barShift(barOpenTime(firstBarIndexOfCurTF), i_tf) - 1; } }
В цикле бесконечно принтуется:
Print("cnt = ", cnt, " ; barsTotal = ", Bars(_Symbol, PERIOD_CURRENT));
Сервис деск погиб. Теперь кому писать о багах интересно?
Чтобы что-то кому-то писать для начала нужен минимальный код, который можно скомпилировать и запустить и описание действий. Нет минимального кода, который можно скомпилировать и запустить, нет описания - значит никто не сможет воспроизвести.
Щяс накидаю.. Просто если индюк слать, там нужно сдать инклюдники, библиотеки и тд. Это как-бы не так просто кому-то въехать.
Щяс накидаю.. Просто если индюк слать, там нужно сдать инклюдники, библиотеки и тд. Это как-бы не так просто кому-то въехать.
Вот-вот. Пример должен быть минималистическим. Максимально простым.
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования