Индикатор от индикатора - страница 4

 
Mihail Marchukajtes:

Спасибо! Попробую рассмотреть чуть позже Ваш вариант...


Пожалуйста. Что б понять окончательно, надо будет дождаться понедельника запустить индикатор на чарт... и через сутки сравнить данные с тестером.

 
Mihail Marchukajtes:
//+------------------------------------------------------------------+
//|                                                           AD.mq5 |
//|                   Copyright 2009-2017, MetaQuotes Software Corp. |
//|                                              http://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright   "2009-2017, MetaQuotes Software Corp."
#property link        "http://www.mql5.com"
#property description "Accumulation/Distribution"

#property indicator_separate_window
#property indicator_buffers 1
#property indicator_plots   1
#property indicator_type1   DRAW_LINE
#property indicator_color1  LightSeaGreen
#property indicator_label1  "A/D"
//--- input params
input ENUM_APPLIED_VOLUME InpVolumeType=VOLUME_TICK; // Volume type
//---- buffers
double ExtADbuffer[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
void OnInit()
  {
//--- indicator digits
   IndicatorSetInteger(INDICATOR_DIGITS,0);
//--- indicator short name
   IndicatorSetString(INDICATOR_SHORTNAME,"A/D");
//---- index buffer
   SetIndexBuffer(0,ExtADbuffer);
//--- set index draw begin
   PlotIndexSetInteger(0,PLOT_DRAW_BEGIN,1);
//---- OnInit done
  }
//+------------------------------------------------------------------+
//| Accumulation/Distribution                                        |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
//--- check for bars count
   if(rates_total<2)
      return(0); //exit with zero result
//--- get current position
   int pos=prev_calculated-1;
   if(pos<0) pos=0;
//--- calculate with appropriate volumes
   if(InpVolumeType==VOLUME_TICK)
      Calculate(rates_total,pos,high,low,close,tick_volume);
   else
      Calculate(rates_total,pos,high,low,close,volume);
   //---
   if( rates_total > prev_calculated )
        Print( "AD_1 value = "+DoubleToString( ExtADbuffer[ rates_total-1 ], 5 );
//----
   return(rates_total);
  }
//+------------------------------------------------------------------+
//| Calculating with selected volume                                 |
//+------------------------------------------------------------------+
void Calculate(const int rates_total,const int pos,
               const double &high[],
               const double &low[],
               const double &close[],
               const long &volume[])
  {
   double hi,lo,cl;
//--- main cycle
   for(int i=pos;i<rates_total && !IsStopped();i++)
     {
      //--- get some data from arrays
      hi=high[i];
      lo=low[i];
      cl=close[i];
      //--- calculate new AD
      double sum=(cl-lo)-(hi-cl);
      if(hi==lo) sum=0.0;
      else       sum=(sum/(hi-lo))*volume[i];
      if(i>0) sum+=ExtADbuffer[i-1];
      ExtADbuffer[i]=sum;
     }
//----
  }
//+------------------------------------------------------------------+

Зависимый от верхнего:

//+------------------------------------------------------------------+
//|                                                    ChekParam.mq5 |
//|                                                       nikelodeon |
//|                         https://www.mql5.com/ru/users/nikelodeon |
//+------------------------------------------------------------------+
#property copyright "nikelodeon"
#property link      "https://www.mql5.com/ru/users/nikelodeon"
#property version   "1.00"
#property indicator_chart_window;
#property indicator_plots   0
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int AD13_H;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
   AD13_H=iCustom(_Symbol,_Period,"AD_1",VOLUME_REAL);

   if(AD13_H==INVALID_HANDLE)
     {
      PrintFormat("Failed to create handle of the MA_handle indicator for the symbol %s/%s, error code %d",
                  Symbol(),EnumToString(Period()),GetLastError());
      return(INIT_FAILED);
     }

//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {

   if(prev_calculated!=rates_total)
     {
      Print("ЗАВИСИМЫЙ:   "+DoubleToString(AD13(0),5));
     }
   return(rates_total);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
double AD13(int index)
  {
   double MA[1];
   ResetLastError();
   if(CopyBuffer(AD13_H,0,index,1,MA)<0)
     {
      PrintFormat("Failed to copy data from the iMA indicator, error code %d",GetLastError());
      return(0.0);
     }
   return( MA[ 0 ] );
  }
//+------------------------------------------------------------------+

Результат (правда, в тестере, режим: каждый тик на основе реальных тиков):

2017.12.09 21:50:55.424 2017.12.07 10:08:00   AD_1 value = 180050.97400
2017.12.09 21:50:55.424 2017.12.07 10:08:00   ЗАВИСИМЫЙ:   180050.97400
2017.12.09 21:50:56.872 2017.12.07 10:09:00   AD_1 value = 180962.64067
2017.12.09 21:50:56.872 2017.12.07 10:09:00   ЗАВИСИМЫЙ:   180962.64067
2017.12.09 21:50:57.520 2017.12.07 10:10:00   AD_1 value = 180461.21209
2017.12.09 21:50:57.520 2017.12.07 10:10:00   ЗАВИСИМЫЙ:   180461.21209
2017.12.09 21:50:58.224 2017.12.07 10:11:00   AD_1 value = 180921.21209
2017.12.09 21:50:58.224 2017.12.07 10:11:00   ЗАВИСИМЫЙ:   180921.21209
2017.12.09 21:50:58.904 2017.12.07 10:12:00   AD_1 value = 181165.92638
2017.12.09 21:50:58.904 2017.12.07 10:12:00   ЗАВИСИМЫЙ:   181165.92638
2017.12.09 21:50:59.900 2017.12.07 10:13:00   AD_1 value = 181836.59305
2017.12.09 21:50:59.900 2017.12.07 10:13:00   ЗАВИСИМЫЙ:   181836.59305
2017.12.09 21:51:00.865 2017.12.07 10:14:00   AD_1 value = 181568.84305
2017.12.09 21:51:00.865 2017.12.07 10:14:00   ЗАВИСИМЫЙ:   181568.84305
2017.12.09 21:51:02.374 2017.12.07 10:15:00   AD_1 value = 182272.34305
2017.12.09 21:51:02.374 2017.12.07 10:15:00   ЗАВИСИМЫЙ:   182272.34305
Код первого индикатора поместить в файл AD_1.
 

Мимо!!!! Хендл AD13_H  создаётся для текущего символа, а нужно для другого. Я подготовил новые файлы, где использую стандартный АД. Проблема то не в том что он вызывается неправильно, проблема что он вызывается неправильно в определённый момент, когда происходит событие от третьего индикатора. Вот снова выкладываю индикаторы, дабы не путать. В них, можно исправить ошибку?

Буфер первого рпикрепленного индикатора выдает значения -1 0 1. Вернее всегда 0, а вот -1 и 1 на опредлённых барах. И когда приходит значение отличное от нуля, тогда происходит запрос на индикатор АД с других инструментов. Повторюсь. При компиляции в принте одни значения, при тестировании в принт поступают другие значения АД. Даже если учесть что начало расчёта АД разное при компиляции и теста, то разница между дувумя барами должна быть одинаковой и не зависить от начала расчёта АД.

Расчитываются три переменные v0,v1,v2. Заметил что v1 единственная которая расчитывается и при компиле и в тестере одинакомо. Думаю это связанно с месторасполождением функции в коде. Она стоит самая первая. А вот остальные считаются с ошибкой.

Итак первый индюк "Секвента" формирует сигнал или момент.

Когда сигнал поступил в индикатор Si_FORTS этот индикатор запрашивает данные АД с других символов.

Причём без сигналов от "Секвенты" всё вроде работает правильно.....

Файлы:
 
Mihail Marchukajtes:

Мимо!!!! Хендл AD13_H  создаётся для текущего символа, а нужно для другого. Я подготовил новые файлы, где использую стандартный АД. Проблема то не в том что он вызывается неправильно, проблема что он вызывается неправильно в определённый момент, когда происходит событие от третьего индикатора. Вот снова выкладываю индикаторы, дабы не путать. В них, можно исправить ошибку?

Буфер первого рпикрепленного индикатора выдает значения -1 0 1. Вернее всегда 0, а вот -1 и 1 на опредлённых барах. И когда приходит значение отличное от нуля, тогда происходит запрос на индикатор АД с других инструментов. Повторюсь. При компиляции в принте одни значения, при тестировании в принт поступают другие значения АД. Даже если учесть что начало расчёта АД разное при компиляции и теста, то разница между дувумя барами должна быть одинаковой и не зависить от начала расчёта АД.

Расчитываются три переменные v0,v1,v2. Заметил что v1 единственная которая расчитывается и при компиле и в тестере одинакомо. Думаю это связанно с месторасполождением функции в коде. Она стоит самая первая. А вот остальные считаются с ошибкой.

Итак первый индюк "Секвента" формирует сигнал или момент.

Когда сигнал поступил в индикатор Si_FORTS этот индикатор запрашивает данные АД с других символов.

Причём без сигналов от "Секвенты" всё вроде работает правильно.....

А какая проблема заменить _Symbol на "Si-12.17"

Я вчера проверял и вот что получилось при работе индикатора в отладчике.

int handle;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
 handle = iAD("Si-12.17", PERIOD_M1, VOLUME_REAL);
   
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
//---
   double ad[];
   datetime start_time = D'2017.12.08 19:30', stop_time = D'2017.12.08 19:00';
   int copy = CopyBuffer(handle, 0, start_time, stop_time, ad);
   int ad0 = (int)round(ad[0]), ad1 = (int)round(ad[copy-1]);
   Comment(ad0, "\n"
         , ad1, "\n"
         , ad0-ad1);
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+


Здесь видно что тест проходит на символе EURUSD и в комментарии графика выведены значения AD символа "Si-12.17"


Это показания индикатора на графике "Si-12.17" по правой вертикальной линии, 06.12.2017


А здесь в окне данных показание индикатор на "Si-12.17" по левой линии 05.12.2017

Значения индикатора полностью совпадают.

зы. Извиняюсь, я после того как сделал скрины ещё экспериментировал на минутках и поэтому в коде время не совпадает с временем на скринах. Править не имеет смысла.
 
Alexey Viktorov:

А какая проблема заменить _Symbol на "Si-12.17"

Я вчера проверял и вот что получилось при работе индикатора в отладчике.


Здесь видно что тест проходит на символе EURUSD и в комментарии графика выведены значения AD символа "Si-12.17"


Это показания индикатора на графике "Si-12.17" по правой вертикальной линии, 06.12.2017


А здесь в окне данных показание индикатор на "Si-12.17" по левой линии 05.12.2017

Значения индикатора полностью совпадают.

зы. Извиняюсь, я после того как сделал скрины ещё экспериментировал на минутках и поэтому в коде время не совпадает с временем на скринах. Править не имеет смысла.

В вашем примере не используется сигнальный индикатор. Попробуйте скачать последние выложенные мною файли и прогнать у себя. Можно поменять инструменты на форовские, главное чтоб они отличались от текущих...

 
Mihail Marchukajtes:

Мимо!!!!

Ну... мимо, дак мимо.

Просто учитывайте, что может быть такая ситуация:

1. Пришел тик по Си (сформировался бар 10:01 - распринтовался - значение 10050);

2. Пришел снова тик по Си (снова за бар 10:01 - без принта - значение 10047);

3. Пришел тик по РТС (сформировался бар 10:01, запрос данных с Си, значение 10047);

В итоге имеет разные значения.

Немного модифицировал OnInit() зависимого (добавил входной параметр используемого инструмента):

int OnInit()
  {
   //---
   if( inpSymbol == _Symbol )
        {
         Print( __FUNCTION__,": ОШИБКА! Символы не должны совпадать!" );
         return( INIT_PARAMETERS_INCORRECT );
        }
   //---
   AD13_H=iCustom(inpSymbol,_Period,"AD_1",VOLUME_REAL);

   if(AD13_H==INVALID_HANDLE)
     {
      PrintFormat("Failed to create handle of the MA_handle indicator for the symbol %s/%s, error code %d",
                  Symbol(),EnumToString(Period()),GetLastError());
      return(INIT_FAILED);
     }

//---
   return(INIT_SUCCEEDED);
  }

Лог стал таким:

2017.12.10 20:23:40.681 2017.12.07 10:09:00   ЗАВИСИМЫЙ:   -986821.63452
2017.12.10 20:23:40.685 2017.12.07 10:09:00   AD_1 value = -986821.63452
2017.12.10 20:23:41.338 2017.12.07 10:10:00   AD_1 value = -985365.34881
2017.12.10 20:23:41.340 2017.12.07 10:10:00   ЗАВИСИМЫЙ:   -985354.34881
2017.12.10 20:23:42.046 2017.12.07 10:11:00   AD_1 value = -988738.82881
2017.12.10 20:23:42.048 2017.12.07 10:11:00   ЗАВИСИМЫЙ:   -988749.82881
2017.12.10 20:23:42.734 2017.12.07 10:12:00   ЗАВИСИМЫЙ:   -990243.13650
2017.12.10 20:23:42.738 2017.12.07 10:12:00   AD_1 value = -990243.13650
2017.12.10 20:25:05.912 2017.12.07 10:13:00   AD_1 value = -992969.53650
2017.12.10 20:25:05.917 2017.12.07 10:13:00   ЗАВИСИМЫЙ:   -992969.53650
2017.12.10 20:25:06.889 2017.12.07 10:14:00   AD_1 value = -994720.83062
2017.12.10 20:25:06.891 2017.12.07 10:14:00   ЗАВИСИМЫЙ:   -994720.83062
2017.12.10 20:25:12.099 2017.12.07 10:15:00   AD_1 value = -1002815.94173
2017.12.10 20:25:12.101 2017.12.07 10:15:00   ЗАВИСИМЫЙ:   -1002815.94173
2017.12.10 20:25:13.200 2017.12.07 10:16:00   AD_1 value = -997768.68366
2017.12.10 20:25:13.202 2017.12.07 10:16:00   ЗАВИСИМЫЙ:   -997768.68366

Как видите, по разным символам свечи формируются не в один момент времени. Иногда свеча формируется раньше по одному символу, иногда - по другому. Соответственно и значения могут различаться, а могут и совпадать (почему, написал выше).

 
Alexey Kozitsyn:

Ну... мимо, дак мимо.

Просто учитывайте, что может быть такая ситуация:

1. Пришел тик по Си (сформировался бар 10:01 - распринтовался - значение 10050);

2. Пришел снова тик по Си (снова за бар 10:01 - без принта - значение 10047);

3. Пришел тик по РТС (сформировался бар 10:01, запрос данных с Си, значение 10047);

В итоге имеет разные значения.

Немного модифицировал OnInit() зависимого (добавил входной параметр используемого инструмента):

Лог стал таким:

Как видите, по разным символам свечи формируются не в один момент времени. Иногда свеча формируется раньше по одному символу, иногда - по другому. Соответственно и значения могут различаться, а могут и совпадать (почему, написал выше).


Хм.... Ещё раз... У вас  в ваших индикаторах всё работает потому как вы не пользуетесь сигнальным. Посмотрите пожалуйста те индикаторы что я выложил недавно. Их можно исправит????

В реальной торговле ваша ситуация понятна. При тестировании все символы подгружены это же история. НО не работает... :-(

 
Mihail Marchukajtes:

Хм.... Ещё раз... У вас  в ваших индикаторах всё работает потому как вы не пользуетесь сигнальным. Посмотрите пожалуйста те индикаторы что я выложил недавно. Их можно исправит????

В реальной торговле ваша ситуация понятна. При тестировании все символы подгружены это же история. НО не работает... :-(

Изначально вопрос стоял так:

Ребята, ктонить может объяснить внятно, почему, когда вызываю индикатор из индикатора, получаю совсем другое значени... Не то что показывает сам индикатор. Я понять не могу, там кода всего три строчки и он не работает, Ктонить может объяснить почему????

В принты выводятся значения первого бара, но они отличаются. Хотя индекс бара одинаковый. Это вообще как такое может быть???

Принт стоит в Основном и вызываемом индикатора. НО как видно на картинке в одном и томже индикатое с одинаковым индексом значения абсалютно разные.

Вызывал индикатор из индикатора. Вам не понравилось. Теперь вызов индикатора должен быть с символа другого индикатора. Хорошо, сделал. Индексы баров одинаковые, значения одинаковые. Теперь Вы говорите про какой-то сигнальный индикатор...?

Разбирать Ваши индикаторы у меня нет никакого желания. И Вам я рекомендую убрать все лишнее, и только потом искать ошибки. Удачи.

 
Mihail Marchukajtes:

При тестировании все символы подгружены это же история. НО не работает... :-(

По поводу этого. Тики (в режиме тестирования по реальным тикам) появляются в соответствии с тиками реального времени (с точностью до миллисекунд).
 
Alexey Kozitsyn:
По поводу этого. Тики (в режиме тестирования по реальным тикам) появляются в соответствии с тиками реального времени (с точностью до миллисекунд).

То что Вы вызвали индикатор от индикатора ничего нового. У меня тоже всё выводит правильно и одинакого, какой смысл было это повторять?? Я привёл конкретный пример с конкретными индикаторами которые не работают, хотя по логике всё записано верно отсюда и возник вопрос, как такое может быть???? Может сигнальный индюк что косячит??? Однако сами сигналы появляются в нужном месте и не скачут, с ними проблем нет.. а вот дальше....