Проблемы, обнаруженные при обратном тестировании, и невозможность найти первопричину! - страница 5

 
jollydragon:

. Я все еще не вижу исчезновения пиков. Как "переинициализировать" его?

Вы можете повторно инициализировать, либо изменив таймфреймы

либо

открыть окно ввода индикатора и нажать OK

 

GumRai2015.05.14 21:51#

You can re-initialise by either changing timeframes

or

откройте окно ввода индикатора и нажмите ОК


После попытки я понимаю, что это тот же смысл, что я сказал, что расположение пиков меняется. Правильно?

УважаемыйGumRai,

 
WHRoeder:

Для каждой итерации (кроме первой) Fish1 - это значение предыдущего элемента буфера, но вы не инициализируете его в ExtBuffer1[limit].

Итак, для начальной итерации (когда limit == bars) вы устанавливаете ExtBuffer1[0] = 1.1*ExtBuffer1[1] .

Но для последующих тиков (когда limit == 1) вы устанавливаете ExtBuffer1[0] = 1.1*0.00001 .

Уважаемый WHRoeder,

Большое спасибо, и я вижу проблему немного лучше с вашим руководством.

Однако, возможно, все еще нужно задать еще несколько вопросов для дальнейшего прояснения:

1. Вы можете видеть "double Fish1=0.00001; " определена в начале и вне всех функций.

То есть это должна быть глобальная переменная и, как я понимаю, ей присвоен последний ExBuffer1[0], даже если наступает новый последующий тик.

Или она автоматически восстанавливается до "0.00001" каждый раз, если наступает новый тик?

2. Теперь, когда каждый бар окрашивается по-разному с одним или многими последующими тиками, почему я могу видеть повторное окрашивание ..., bar[8], ..., или bar[1], на живом графике M1 без каких-либо прерываний?

3. Почему расположение пиков меняется после обновления?

4. Почему я вижу, что некоторые пики (около 959870576) формируются намного, намного меньше, чем"EMPTY_VALUE" (2147483647) на живых графиках M1?

5. Если появляется новый бар, предыдущий ExtBuffer1[0] автоматически меняется на ExtBuffer1[1]. Правильно?

6. Как предотвратить возможную повторную инициализацию или перерисовку?

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

 

УважаемыеWHRoeder,GumRai,

Я обновил свой индикатор в виде приведенного ниже кода в соответствии с моим пониманием после повторного прочтения ваших сообщений.

После использования его для обратного тестирования, результат намного больше соответствует индикатору. Тем не менее, все еще есть 2 проблемы. Пожалуйста, обратитесь к скриншотам ниже.

1. Торговля происходит после 4 сигналов индикатора в начале от первого ордера.

2. По-прежнему происходит смена одного ордера на 4 бара раньше сигнала индикатора.

Ниже приведен обновленный код индикатора.

#property copyright "Copyright 2015, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.50"
#property strict
#property  indicator_separate_window
#property  indicator_buffers 2

extern int    period=35;
extern double smooth=0.3;

datetime       lastAlertTime;
double         ExtBuffer0[];
double         ExtBuffer1[];
double         ExtValue[];
double         Value1=0,Buffer0_1=0;
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int OnInit()
  {
   IndicatorBuffers(3);
   SetIndexBuffer(0,ExtBuffer0); SetIndexStyle(0,DRAW_LINE,STYLE_SOLID,1,clrWhiteSmoke);
   SetIndexBuffer(1,ExtBuffer1); SetIndexStyle(1,DRAW_LINE,STYLE_SOLID,1,clrGoldenrod);
   SetIndexBuffer(2,ExtValue);
   IndicatorShortName(" Solar Joy   ^v^  ");
   ArraySetAsSeries(ExtBuffer0,true);
   ArraySetAsSeries(ExtBuffer1,true);
   ArraySetAsSeries(ExtValue,true);

   SetIndexDrawBegin(1,period);
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int deinit()
  {
   return(0);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
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(rates_total<=period)    return(0);

   int    i,limit;
   double price,MinL,MaxH;

   if(prev_calculated<rates_total-1) limit=rates_total-period-1;
   else                              limit=1;

   for(i=limit-1; i>=0; i--)
     {
      MaxH = High[iHighest(NULL,0,MODE_HIGH,period,i)];
      MinL = Low[iLowest(NULL,0,MODE_LOW,period,i)];
      price=(High[i]+Low[i])/2;
      if(limit==1)
        {
         Value1=ExtValue[1];
         Buffer0_1=ExtBuffer0[1];
        }
      ExtValue[i]=(1-smooth)*(2*(price-MinL)/(MaxH-MinL)-1.0) + smooth*Value1;
      ExtValue[i]=MathMin(MathMax(ExtValue[i],-0.999),0.999); // Value=Value>0.999?0.999:Value<-0.999?-0.999:Value;
      ExtBuffer0[i]=(1-smooth)*MathLog((1+ExtValue[i])/(1-ExtValue[i]))+smooth*Buffer0_1;
      Value1=ExtValue[i];
      Buffer0_1=ExtBuffer0[i];
      if(ExtBuffer0[i]>0) ExtBuffer1[i]=3;
      else ExtBuffer1[i]=-3;
     }

   return(rates_total);
  }
//+------------------------------------------------------------------+

 
jollydragon:

1. Видно, что "double Fish1=0.00001; " определено в начале и вне всех функций.

То есть это должна быть глобальная переменная и, как я понимаю, ей присвоен последний ExBuffer1[0], даже если наступает новый последующий тик.

Или она автоматически восстанавливается до "0.00001" каждый раз, если наступает новый тик?

Нет и нет. Какая часть фразы " но вы не инициализируете его в ExtBuffer1[limit]" была непонятна?
if(prev_calculated<rates_total-1){ limit=rates_total-period-1; Fish1=0.00001;       }
else                             { limit=1;                    Fish1=ExtBuffer0[1]; }
for(i=limit-1; i>=0; i--)
  {
   ExtBuffer1[i]=1.1*Fish1;
   Fish1=ExtBuffer1[i];
   if(Fish1>=EMPTY_VALUE)
      Fish1=1;
  }

Лично я считаю аргументы rates_total/prev_calculated/OnCalculate отвратительными, поскольку графики/буферы - это временные ряды, и делал бы это по-старому:
int counted = IndicatorCounted();
limit = Bars - MathMax(counted, period-1); // Lookback period-1
Fish1 = counted == 0 ? 0.00001 : ExtBuffer0[limit];
for(i=limit-1; i>=0; i--)
Причина обращения: