Проблема передачи данных из индикатора в эксперт

Oldman_Evgeny  

Индикатор всё считает и рисует правильно.

При подключении к эксперту через хендл пересылает неверные данные.

В чем может быть проблема. Куда копать?

Индикатор пользовательский, т.е. подключается через iCustom.

Буферы в индикаторе установлены и обозначены правильно. Рисует-то индикатор все правильно!

Аргументы в хендле перепроверены сто раз! Всё правильно

Копирование в эксперте в динамический массив с помощью CopyBuffer.

Копирую три последних элемента из массива индикатора.

Все аргументы в CopyBuffer поставлены правильно! Сто раз проверенно!

Все необходимые массивы в эксперте - ArraySetAsSeries .

А при печати из эксперта, при отладке, печатает всякую чушь!

Да, понятное дело, и торговые  сигналы поэтому выдает неверно.

Единственно на что грешу - активных хендлов 19 шт, мне так удобно для конструирования, создания и исследования эксперта.

Но, вроде, ограничений по количеству хендлов нет....

Может заглючил МТ5? Может его переустановить? 


PS. На сколько в МТ4 всё было проще...(((((

Vladimir Karputov  
Oldman_Evgeny:


Без кода индикатора и советника - чтобы можно было воспроизвести пример, прямая дорога в Клуб Телепатов 

Alexey Viktorov  
Oldman_Evgeny:

Может заглючил МТ5? Может его переустановить?

Может лучше операционку переустановить? Может она заглючила, всякое бывает.

Oldman_Evgeny:

Аргументы в хендле перепроверены сто раз! Всё правильно

Копирование в эксперте в динамический массив с помощью CopyBuffer.

Копирую три последних элемента из массива индикатора.

Все аргументы в CopyBuffer поставлены правильно! Сто раз проверенно!

Ещё 100500 раз проверьте. Проверьте с какого индекса начинаете копирование и обратите внимание на направление индексации в массиве в который копировали значения буфера.
Oldman_Evgeny  
Vladimir Karputov:

Без кода индикатора и советника - чтобы можно было воспроизвести пример, прямая дорога в Клуб Телепатов 

Буду весьма благодарен, если меня тыкнете носом туда, где я накосячил!


Все лишнее постарался засунуть в комментарии.

Оставил 2 хендла одного индикатора (периоды у них разные) - st_RSI_Handle и st_RSI_Fast_Handle

Контрольные печати из трех мест оставил. Видно, что динамический массив, который печатается - черти-что...

Индикатор - Step_RSI_1 - "дискретный" RSI.  Дискретизация с шагом 5 или 10%

Код эксперта не влез... в размещаю в следующем посе

Код индикатора Step_RSI_1

//+------------------------------------------------------------------+
//|                                                     RSI_Step.mq5 |
//|                   Copyright 2019                                 |
//|                                                                  |
//+------------------------------------------------------------------+
#property copyright   "2019"
#property link        "home"
#property description "RSI_Step"
//--- indicator settings
#property indicator_separate_window
//#property indicator_minimum 0
//#property indicator_maximum 100
#property indicator_level1 20
#property indicator_level2 80
#property indicator_level3 50
#property indicator_buffers 4
#property indicator_plots   1
#property indicator_type1   DRAW_LINE
#property indicator_type2   DRAW_LINE
#property indicator_color1  DodgerBlue
#property indicator_color2  Blue
#property indicator_width1  2
#property indicator_width2  1
//--- input parameters
input int InpPeriodRSI=14; // Period RSI
input double Step_of_Rsi = 10; //Шаг по шкале RSI (только 5 или 10)

//--- indicator buffers
double    Step_RSIBuffer[];
double    ExtRSIBuffer[];
double    ExtPosBuffer[];
double    ExtNegBuffer[];
//--- global variable
int       ExtPeriodRSI;
double    ExtStep;
double    Steps_Val[101];
int k;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
void OnInit()
  {
//--- check for input
   if(InpPeriodRSI<1)
     {
      ExtPeriodRSI=12;
      Print("Incorrect value for input variable InpPeriodRSI =",InpPeriodRSI,
            "Indicator will use value =",ExtPeriodRSI,"for calculations.");
     }
   else ExtPeriodRSI=InpPeriodRSI;
   
    if(Step_of_Rsi <=0)
   {
   Print( "Incorrect value for input variable Step_of_Rsi= ",Step_of_Rsi);
   return;
   }
   else ExtStep = Step_of_Rsi;
   
// заплняем массив шагов значений RSI   
   for(k=0;k<=100;k++)
   {Steps_Val[k] = ExtStep*k - ExtStep/2 ;
  // Print(Steps_Val[k]);
   }
   
   //Print("Steps_Val[3]=   ",Steps_Val[3]);
   
//--- indicator buffers mapping
   SetIndexBuffer(0,Step_RSIBuffer,INDICATOR_DATA);
   SetIndexBuffer(1,ExtRSIBuffer,INDICATOR_DATA);
   SetIndexBuffer(2,ExtPosBuffer,INDICATOR_CALCULATIONS);
   SetIndexBuffer(3,ExtNegBuffer,INDICATOR_CALCULATIONS);
//--- set accuracy
   IndicatorSetInteger(INDICATOR_DIGITS,2);
//--- sets first bar from what index will be drawn
   PlotIndexSetInteger(0,PLOT_DRAW_BEGIN,ExtPeriodRSI);
//--- name for DataWindow and indicator subwindow label
   IndicatorSetString(INDICATOR_SHORTNAME,"RSI("+string(ExtPeriodRSI)+")");
//--- initialization done
  }
//+------------------------------------------------------------------+
//| Relative Strength Index                                          |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const int begin,
                const double &price[])
  {
  
  
   
   int    i;
   double diff;
//--- check for rates count
   if(rates_total<=ExtPeriodRSI)
      return(0);
//--- preliminary calculations
   int pos=prev_calculated-1;
   if(pos<=ExtPeriodRSI)
     {
      //--- first RSIPeriod values of the indicator are not calculated
      ExtRSIBuffer[0]=0.0;
      ExtPosBuffer[0]=0.0;
      ExtNegBuffer[0]=0.0;
      double SumP=0.0;
      double SumN=0.0;
      for(i=1;i<=ExtPeriodRSI;i++)
        {
         ExtRSIBuffer[i]=0.0;
         ExtPosBuffer[i]=0.0;
         ExtNegBuffer[i]=0.0;
         diff=price[i]-price[i-1];
         SumP+=(diff>0?diff:0);
         SumN+=(diff<0?-diff:0);
        }
      //--- calculate first visible value
      ExtPosBuffer[ExtPeriodRSI]=SumP/ExtPeriodRSI;
      ExtNegBuffer[ExtPeriodRSI]=SumN/ExtPeriodRSI;
      if(ExtNegBuffer[ExtPeriodRSI]!=0.0)
         ExtRSIBuffer[ExtPeriodRSI]=100.0-(100.0/(1.0+ExtPosBuffer[ExtPeriodRSI]/ExtNegBuffer[ExtPeriodRSI]));
      else
        {
         if(ExtPosBuffer[ExtPeriodRSI]!=0.0)
            ExtRSIBuffer[ExtPeriodRSI]=100.0;
         else
            ExtRSIBuffer[ExtPeriodRSI]=50.0;
        }
      //--- prepare the position value for main calculation
      pos=ExtPeriodRSI+1;
     }
//--- the main loop of calculations
   for(i=pos;i<rates_total && !IsStopped();i++)
     {
      diff=price[i]-price[i-1];
      ExtPosBuffer[i]=(ExtPosBuffer[i-1]*(ExtPeriodRSI-1)+(diff>0.0?diff:0.0))/ExtPeriodRSI;
      ExtNegBuffer[i]=(ExtNegBuffer[i-1]*(ExtPeriodRSI-1)+(diff<0.0?-diff:0.0))/ExtPeriodRSI;
      if(ExtNegBuffer[i]!=0.0)
         ExtRSIBuffer[i]=100.0-100.0/(1+ExtPosBuffer[i]/ExtNegBuffer[i]);
      else
        {
         if(ExtPosBuffer[i]!=0.0)
            ExtRSIBuffer[i]=100.0;
         else
            ExtRSIBuffer[i]=50.0;
        }
     }
     
 // Заполнение дискретного массива RSI    
  int  j;  
   for(i=pos;i<rates_total && !IsStopped();i++)
   {
      for(j=0;j<=99;j++)
      { 
         if(  Steps_Val[j] <= ExtRSIBuffer[i]&& ExtRSIBuffer[i] < Steps_Val[j+1])
         {
          Step_RSIBuffer[i] = Steps_Val[j] + ExtStep/2.;
//  Print(" j=",j,"  i=",i,"   ExtRSIBuffer[i]=", ExtRSIBuffer[i], "  Steps_Val[j]=",Steps_Val[j]," Step_RSIBuffer[i]=",Step_RSIBuffer[i] );
          break;
         }
      
      }   
   }  
     
//--- OnCalculate done. Return new prev_calculated.
   return(rates_total);
  }
//+------------------------------------------------------------------+

Vladimir Karputov  
Oldman_Evgeny:

Буду весьма благодарен, если меня тыкнете носом туда, где я накосячил!


Все лишнее постарался засунуть в комментарии.

Оставил 2 хендла одного индикатора (периоды у них разные) - st_RSI_Handle и st_RSI_Fast_Handle

Контрольные печати из трех мест оставил. Видно, что динамический массив, который печатается - черти-что...

Индикатор - Step_RSI_1 - "дискретный" RSI.  Дискретизация с шагом 5 или 10%

Код эксперта не влез... в размещаю в следующем посе

Код индикатора Step_RSI_1

Код вставляется так: начали НОВОЕ сообщение, в редакторе НАЖИМАЕТЕ КНОПКУ "Код", в открывшееся окошко ВСТАВЛЯЕТЕ код. (посмотрите, я исправил, и теперь код выглядит красиво, все функции подсвечены).

Vladimir Karputov  

Если код большой, то просто прикрепите файл к сообщению (кнопка Прикрепить файл).

Путь к файлу брать так: в редакторе MetaEditor правый клик на вкладке с файлом - 

Скопировать полный путь

Vladimir Karputov  

Прикрепил индикатор, как файл.

Работает в тестере, что-то там показывает:


Ожидаю советник.

Файлы:
RSI_Step.mq5  12 kb
Vladimir Karputov  

Ошибка в Вашем коде, которую сразу видно:

индикатор имеет имя "RSI_Step", а эксперт почему-то пытается создать "Step_RSI_1"

int OnInit()
  {
   st_RSI_Handle=iCustom(
                         NULL,                         // имя символа текущее
                         0,                            // период графика текущий
                         "Examples\\Step_RSI_1",// папка/имя_пользовательского индикатора 
                         RSI_Period_RSI,// список входных параметров индикатора 
                         inpStepSize_RSI
                         );

   st_RSI_Fast_Handle=iCustom(
                              NULL,                         // имя символа текущее
                              0,                            // период графика текущий
                              "Examples\\Step_RSI_1",// папка/имя_пользовательского индикатора 
                              RSI_Period_RSI_Fast,// список входных параметров индикатора 
                              inpStepSize_RSI_Fast
                              );
Vladimir Karputov  
Непонятка №2: Вообще не ясно какое имя у Вашего индикатора и ГДЕ и В КАКОЙ паке он расположен.
Oldman_Evgeny  
Vladimir Karputov:

Ошибка в Вашем коде, которую сразу видно:

индикатор имеет имя "RSI_Step", а эксперт почему-то пытается создать "Step_RSI_1"

#property description "RSI_Step" - я думал, что это исключительно информационное свойство.

Сейчас попробую исправить...

Индикатор имеет имя "Step_RSI_1", а #property,действительно стоит  "RSI_Step",