Это логично, если индикатор пережат, поэтому, если хай или лоу был достигнут на времени открытия бара - будет совпадение, остальные варианты будут мимо кассы.
CurAT = CurA*CurBar; PreAT = PreA*CurBar; CurChlTop2[i] = CurChlTop[i]; CurChlTop[i] = CurAT + CurBt; CurChlBot[i] = CurAT + CurBb; PreChlTop[i] = PreAT + PreBt; PreChlBot[i] = PreAT + PreBb;
Соответственно, изменён эксперт
int start() { CurChlTop = iCustom(NULL,0,"TwoChannels1",377,987,1,1); CurChlBot = iCustom(NULL,0,"TwoChannels1",377,987,2,1); PreChlTop = iCustom(NULL,0,"TwoChannels1",377,987,3,1); PreChlBot = iCustom(NULL,0,"TwoChannels1",377,987,4,1); CurChlTop2 = iCustom(NULL,0,"TwoChannels1",377,987,6,1); cnt++; // if (cnt%600 == 0) { Print("Значения индикатора Дно1: ",CurChlBot," Верх1: ",CurChlTop," Дно2: ",PreChlBot," Верх2: ",PreChlTop); Print("Буфер для Верх1 перед расчётом: ",CurChlTop2); // } return(0); }
Вот фрагмент real time журнала
2006.02.06 23:22:33 TestChannels1 EURUSD,M1: Буфер для Верх1 перед расчётом: 2147483647 2006.02.06 23:22:33 TestChannels1 EURUSD,M1: Значения индикатора Дно1: 1.1944 Верх1: 1.2049 Дно2: 1.2 Верх2: 1.2138 2006.02.06 23:22:32 TestChannels1 EURUSD,M1: Буфер для Верх1 перед расчётом: 2147483647 2006.02.06 23:22:32 TestChannels1 EURUSD,M1: Значения индикатора Дно1: 1.1944 Верх1: 1.2049 Дно2: 1.2 Верх2: 1.2138 2006.02.06 23:21:43 TestChannels1 EURUSD,M1: Буфер для Верх1 перед расчётом: 2147483647 2006.02.06 23:21:43 TestChannels1 EURUSD,M1: Значения индикатора Дно1: 1.1944 Верх1: 1.205 Дно2: 1.2 Верх2: 1.2138 2006.02.06 23:20:57 TestChannels1 EURUSD,M1: Буфер для Верх1 перед расчётом: 2147483647 2006.02.06 23:20:57 TestChannels1 EURUSD,M1: Значения индикатора Дно1: 1.1944 Верх1: 1.205 Дно2: 1.2 Верх2: 1.2138
Если я правильно трактую, это означает, что предпоследнее значение исследуемого буфера считется 1 раз при открытии нового бара и потом не пересчитывается(как раз то, что нужно для экономии ресурсов). Правильно ли я трактую?
Следующая проверка. Возвращаемся к первоначальному коду индикатора и эксперта. Чтобы не включать в испытание весь код, берём типичную ситуацию, когда пересечения средних нет и коэффициенты вообще не пересчитываются. То есть меняется только величина CurBar и фактически работает только участок
CurAT = CurA*CurBar; PreAT = PreA*CurBar; CurChlTop[i] = CurAT + CurBt; CurChlBot[i] = CurAT + CurBb; PreChlTop[i] = PreAT + PreBt; PreChlBot[i] = PreAT + PreBb;
Вот картинка индикатора в реальном времени (включение в 20:40 по времени графика)
А это тот же интервал из тестера
Значения индикатора совпадают (то есть он как будто одинаково работает на и на истории и в реальном времени и правильно обрабатывает момент включения). Тем не менее в 21:28 принт печатает
Дно1: 1.2003 Верх1: 1.2049 Дно2: 1.2 Верх2: 1.2015
, хотя картинка показывет
Дно1: 1.1944 Верх1: 1.2049 Дно2: 1.2 Верх2: 1.2138
Даже если бы значения индикатора пересчитывались, они не должны меняться, потому что CurBar = Bars-i, то есть отсчёт ведётся от начала графика и с появлением нового бара CurBar для конкретного бара не меняется.
Новая неприятность - на real-time графике видна звёздочка, показывающая экстремум там, где его нет. Но каналы при этом не переключаются и не пересчитываются - а по коду видно, что это происходит всегда при фиксации экстремума. Поэтому (да простят меня разработчики) пока я склонен видеть в этом глюк терминала. Момент появления уследить не удалось, но при прикреплении индикатора её не было. Возможно это связано с переключением масштабов и таймфреймов, однако утверждать не берусь. Да и с проблемами лучше разбираться по порядку.
counted_bars=0;
И после прогона тестера все принты с точностью совпали.
Это говорит о том, что в Вашем алгоритме эффективного расчёта есть ошибка. Вы можете самостоятельно это проверить.
Открыть график, кинуть на него индикатор и подождать несколько новых баров.
Потом открыть такой же график и опять кинуть на него индикатор.
Сравнить результаты на последних барах.
Теперь про экстремум там, где его не было.
Необходимо учитывать тот факт, что при открытии тестового графика на него подгружаются текущие исторические данные. Которые вполне могут не совпадать с данными, на которых Вы тестировались. Для исключения несоответствия нажимайте галку "Пересчёт".
counted_bars=0;
И после прогона тестера все принты с точностью совпали.
Это говорит о том, что в Вашем алгоритме эффективного расчёта есть ошибка. Вы можете самостоятельно это проверить.
Открыть график, кинуть на него индикатор и подождать несколько новых баров.
Потом открыть такой же график и опять кинуть на него индикатор.
Сравнить результаты на последних барах.
Необходимо учитывать тот факт, что при открытии тестового графика на него подгружаются текущие исторические данные. Которые вполне могут не совпадать с данными, на которых Вы тестировались. Для исключения несоответствия нажимайте галку "Пересчёт".
И еще - "Снова про индикаторы в Экспертах - вопрос к разработчикам"
И еще - "Снова про индикаторы в Экспертах - вопрос к разработчикам"
Открыть график, кинуть на него индикатор и подождать несколько новых баров.
Потом открыть такой же график и опять кинуть на него индикатор.
Сравнить результаты на последних барах.
Кстати, при написании mql4-аналогов некоторых наших встроенных индикаторов (например, Parabolic SAR) у нас возникала проблема "эффективного пересчёта". И решить её не очень просто - надо очень хорошо представлять алгоритм расчёта.
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
После тестера имею картинку
Из картинки следует, что в журнале должно печататься
На самом деле печатается
Общая закономерность - на графике и в принте всегда совпадают две пары значений, но иногда это дно, а иногда - верх. То есть одни и те же строчки кода в индикаторе иногда дают одинаковый результат в тестере и на графике, а иногда разный. Код индикатора прилагается