Geri test sırasında bulunan sorunlar ve temel nedeni bulamıyor! - sayfa 5

 
jollydragon :

. Hala zirvelerin kayboluşunu göremiyorum. Nasıl "yeniden başlatılır"?

Zaman dilimlerini değiştirerek yeniden başlatabilirsiniz.

veya

gösterge giriş penceresini açın ve Tamam'a tıklayın

 

GumRai 2015.05.14 21:51 #

You can re-initialise by either changing timeframes

or

gösterge giriş penceresini açın ve Tamam'a tıklayın


Denedikten sonra, zirvelerin yer değişikliğini söylediğim anlamın aynı olduğunu anladım. Doğru?

Sevgili GumRai,

 
WHRoeder :

Her yineleme için (ilk hariç), Fish1 önceki arabellek öğesinin değeridir, ancak bunu ExtBuffer1[limit] olarak başlatmazsınız.

Bu nedenle, ilk yineleme için (limit == çubuk olduğunda) ExtBuffer1[0] = 1.1* ExtBuffer1[1] olarak ayarladınız .

Ancak sonraki onaylar için (sınır == 1 olduğunda) ExtBuffer1[0] = 1.1* 0.00001 olarak ayarlayın.

Sevgili WHRoeder,

Çok teşekkür ederim ve konuyu yönlendirmenizle biraz daha iyi görüyorum.

Bununla birlikte, daha fazla açıklığa kavuşturmak için yine de birkaç soruya daha ihtiyaç duyulabilir:

1. Tüm fonksiyonların başında ve dışında "double Fish1=0.00001" tanımlı olduğunu görebilirsiniz.

Bu yüzden global değişken olmalı ve yeni bir onay işareti gelse bile son ExBuffer1[0] ile atandığını anlıyorum.

Veya yeni bir tik geldiğinde her seferinde otomatik olarak "0.00001"e mi dönüyor?

2. Artık her çubuk tek bir işaretle veya sonraki birçok işaretle farklı şekilde boyandığına göre, neden canlı bir M1 grafiğinde .., bar[8], ... veya bar[1] öğesinin yeniden boyandığını görebiliyorum? hiç ara vermeden?

3. Yenilendikten sonra zirvelerin yerleri neden değişiyor?

4. Canlı M1 çizelgelerinde neden " BOŞ_DEĞER "den (2147483647) çok, çok daha az oluşan bazı tepe noktaları (yaklaşık 959870576) görebiliyorum?

5. Yeni bir çubuk çıkarsa, önceki ExtBuffer1[0] otomatik olarak ExtBuffer1[1] olarak değişecektir. Doğru?

6. Olası yeniden başlatma veya yeniden boyama nasıl önlenir?

Belki bazı kritik noktalarda hala kafam karıştı ve yardım etmek için büyük sabrınıza ihtiyacım var! Sorulara tek tek yardımcı olabilirseniz çok seviniriz!

 

Sayın WHRoeder, GumRai,

Yazılarınızı tekrar okuduktan sonra anladığım kadarıyla göstergemi aşağıdaki kod olarak güncelledim.

Geri test için kullandıktan sonra, sonuç gösterge ile çok daha tutarlıdır. Ancak hala 2 konu var. Lütfen aşağıdaki ekran görüntülerine bakın.

1. İşlem, ilk siparişten itibaren 4 gösterge sinyalinden sonra gerçekleşir.

2. Gösterge sinyalinden 4 bar önce gerçekleşen bir sıra değişikliği hala var.

Aşağıda güncellenen gösterge kodu bulunmaktadır.

 #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. Tüm fonksiyonların başında ve dışında "double Fish1=0.00001" tanımlı olduğunu görebilirsiniz.

Bu yüzden global değişken olmalı ve yeni bir onay işareti gelse bile son ExBuffer1[0] ile atandığını anlıyorum.

Yoksa yeni bir kene geldiğinde her seferinde otomatik olarak "0.00001"e mi dönüyor?

Hayır ve hayır. "Ama bunu ExtBuffer1[limit] olarak başlatmıyorsun" ifadesinin hangi kısmı belirsizdi?
 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 ;
  }

Şahsen, grafikler/tamponlar zaman serisi olduğundan ve bunu eski şekilde yapacağından, Rate_total/prev_calculated/OnCalculate argümanlarının iğrenç olduğunu düşünüyorum:
 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--)