Всем привет! При попытке вызвать довольно тяжелый индикатор из эксперта начинаются странности. В связи с этим возник философский вопрос: срабатывает ли процедуры init() и deinit() индикатора при вызове его из эксперта? Подозреваю, что именно из-за этого сегодня уже 2 раза рухнул МТ, один раз с крешлогом, другой без. Была только системная диагностика о неправильном обращении к рантайм-библиотеке С++, после чего МТ закрылся без каких-либо последствий. Раньше, до написания этого эксперта, все билды МТ падали считанное число раз, можно пересчитать по пальцам одной руки.
- Особенности тестирования - Алгоритмический трейдинг, торговые роботы
- Торговые советники и собственные индикаторы - Алгоритмический трейдинг, торговые роботы
- Отладка кода - Разработка программ
подобную ошибку (возможно, эту самую) исправили в начале сентября. скачайте последний билд и попробуйте снова
Подскажите, в чем м.б. проблема?
Написан индикатор на основе ATR....рисуется все нормально.
Но при запуске эксперта на основе этого индикатора выдаются сообщения в логах деление на 0.
При выводе значений индикатора в файл.....пишется все нормально, кроме последних двух недель истории.
Написан индикатор на основе ATR....рисуется все нормально.
Но при запуске эксперта на основе этого индикатора выдаются сообщения в логах деление на 0.
При выводе значений индикатора в файл.....пишется все нормально, кроме последних двух недель истории.
код эксперта и индикатора + описание ошибки (уже есть) = решение вопроса ;)
Вот оно :) называется адаптивный ренко, т.е. на основе ATR
int start() { int i,counted_bars=IndicatorCounted(); double Brick=0,DN=0,UP=0,BricksUp=0,BricksDn=0,Value1=0; //---- if (Bars<=Smooth) return(0); i=Bars-Smooth-1; if(counted_bars>=Smooth) i=Bars-counted_bars-1; //---- while(i>=0) { if(i==Bars-Smooth-1) // Первый бар { UP=High[i]; DN=Low[i]; Brick=Stap*(High[i]-Low[i]); } else { if (Close[i]>UP+Brick) { BricksUp=MathFloor((Close[i]-UP)/Brick)*Brick; UP=UP+BricksUp; Value1=iATR(NULL,0,Smooth,i); Brick=Stap*Value1; DN=UP-Brick; BricksDn=0; } if (Close[i]<DN-Brick) { BricksDn=MathFloor((DN-Close[i])/Brick)*Brick; DN=DN-BricksDn; Value1=iATR(NULL,0,Smooth,i); Brick=Stap*Value1; UP=DN+Brick; BricksUp=0; } } ExtMapBuffer1[i]=UP; ExtMapBuffer2[i]=DN; i--; } //---- return(0); }
в эксерте использую такой вызов
renco_current_up=iCustom(NULL, 0, "Renko",1,10,0,0); renco_previos_up=iCustom(NULL, 0, "Renko",1,10,0,1);
При модели Опен Прайс (как я писал или хотел написать на Альпари), у тебя brick (кирпич) получится нулевой, при Контрол Пойнт на первом смоделированном тике та же самая ситуация будет. Поэтому, не используй в кастомном вызлве нулевок смещение.
При модели Опен Прайс (как я писал или хотел написать на Альпари), у тебя brick (кирпич) получится нулевой, при Контрол Пойнт на первом смоделированном тике та же самая ситуация будет. Поэтому, не используй в кастомном вызлве нулевок смещение.
Не очень понял....поподробней пожалуйста.
Вставь вывод в лог
Brick=Stap*(High[i]-Low[i]);
Brick=Stap*(High[i]-Low[i]);
хорошо....
А как это обойти?
А как это обойти?
Не пользуй индикатор в нулевом баре.
Не пользуй индикатор в нулевом баре.
Т.е. я не могу знать значение индикатора в текущий момент?
значит надо так писать? но в логе все равно фигурирует деление на 0.
iCustom(NULL, 0, "Renko",1,10,0,1)
Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь