Скачать MetaTrader 5

О вызове пользовательского индикатора из эксперта

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Forex Trader
114280
Forex Trader  
Всем привет! При попытке вызвать довольно тяжелый индикатор из эксперта начинаются странности. В связи с этим возник философский вопрос: срабатывает ли процедуры init() и deinit() индикатора при вызове его из эксперта? Подозреваю, что именно из-за этого сегодня уже 2 раза рухнул МТ, один раз с крешлогом, другой без. Была только системная диагностика о неправильном обращении к рантайм-библиотеке С++, после чего МТ закрылся без каких-либо последствий. Раньше, до написания этого эксперта, все билды МТ падали считанное число раз, можно пересчитать по пальцам одной руки.
Forex Trader
114280
Forex Trader  
подобную ошибку (возможно, эту самую) исправили в начале сентября. скачайте последний билд и попробуйте снова
Forex Trader
114280
Forex Trader  
Подскажите, в чем м.б. проблема?
Написан индикатор на основе ATR....рисуется все нормально.
Но при запуске эксперта на основе этого индикатора выдаются сообщения в логах деление на 0.
При выводе значений индикатора в файл.....пишется все нормально, кроме последних двух недель истории.
Forex Trader
114280
Forex Trader  
код эксперта и индикатора + описание ошибки (уже есть) = решение вопроса ;)
Forex Trader
114280
Forex Trader  
Вот оно :) называется адаптивный ренко, т.е. на основе 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);
Forex Trader
114280
Forex Trader  
При модели Опен Прайс (как я писал или хотел написать на Альпари), у тебя brick (кирпич) получится нулевой, при Контрол Пойнт на первом смоделированном тике та же самая ситуация будет. Поэтому, не используй в кастомном вызлве нулевок смещение.
Forex Trader
114280
Forex Trader  
При модели Опен Прайс (как я писал или хотел написать на Альпари), у тебя brick (кирпич) получится нулевой, при Контрол Пойнт на первом смоделированном тике та же самая ситуация будет. Поэтому, не используй в кастомном вызлве нулевок смещение.

Не очень понял....поподробней пожалуйста.
Forex Trader
114280
Forex Trader  
Вставь вывод в лог
Brick=Stap*(High[i]-Low[i]);
Forex Trader
114280
Forex Trader  
хорошо....
А как это обойти?
Forex Trader
114280
Forex Trader  
Не пользуй индикатор в нулевом баре.
Forex Trader
114280
Forex Trader  
Не пользуй индикатор в нулевом баре.

Т.е. я не могу знать значение индикатора в текущий момент?

значит надо так писать? но в логе все равно фигурирует деление на 0.
iCustom(NULL, 0, "Renko",1,10,0,1)
12
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий