TF değişikliği bir sorundur - sayfa 5

 

İşte gösterge:

 //+------------------------------------------------------------------+
//|                                                    Shabl_ind.mq4 |
//|                                      Copyright 2012, CompanyName |
//|                                       http://www.companyname.net |
//+------------------------------------------------------------------+
#property copyright "eevviill"
#property link        "http://alievtm.blogspot.com"
#property version    "1.42"
#property strict
#property indicator_chart_window
#property indicator_buffers 2
#property indicator_color1 clrLightBlue
#property indicator_color2 clrRed
#property indicator_width1 2
#property indicator_width2 2

input string    arr_set= "Arrow settings" ;
input int       arrow_indent= 22 ;
input int       up_arrow_code= 233 ;
input int       down_arrow_code= 234 ;

double          up_arr[];
double          down_arr[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit ()
  {
   SetIndexBuffer ( 0 ,up_arr);
   SetIndexStyle( 0 , DRAW_ARROW );
   SetIndexArrow( 0 ,up_arrow_code);
   SetIndexLabel( 0 , "UP arrow" );

   SetIndexBuffer ( 1 ,down_arr);
   SetIndexStyle( 1 , DRAW_ARROW );
   SetIndexArrow( 1 ,down_arrow_code);
   SetIndexLabel( 1 , "DOWN arrow" );

   return ( INIT_SUCCEEDED );
  }
//+------------------------------------------------------------------+
//| Shabl_ind                                                        |
//+------------------------------------------------------------------+
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[])
  {
   int i,limit= 0 ;
//---
   if (rates_total<= 20 )
       return ( 0 );
//--- last counted bar will be recounted
   if (prev_calculated== 0 )
      limit=rates_total- 1 ;
   if (prev_calculated> 0 )
      limit=rates_total-prev_calculated+ 1 ;
   Comment ( "rates_total=" ,rates_total, "; prev_calculated=" ,prev_calculated, "; limit=" ,limit);
//--- Shabl_ind counted in the 1-st buffer
   datetime temp;
   for (i= 0 ; i<limit; i++)
     {
      temp=time[i];
       if (close[i]>close[i+ 1 ])
         up_arr[i]=low[i]-arrow_indent* Point ; //up arrow
       if (close[i]<close[i+ 1 ])
         down_arr[i]=high[i]+arrow_indent* Point ; //down arrow
     }
   return (rates_total);
  }
//+------------------------------------------------------------------+

koşullarınıza göre göstergenin her iki arabelleği de sıfır çubuğuna çekebileceğini unutmayın.

Dosyalar:
 
Karputov Vladimir :

İşte gösterge:

koşullarınıza göre göstergenin her iki arabelleği de sıfır çubuğuna çekebileceğini unutmayın.

İki tamponun çekmemesi için bir tamponu doldururken diğerini sıfırlamak gerekir.

       if (close[i]>close[i+ 1 ])
       {
        down_arr[i] = EMPTY_VALUE ;
        up_arr[i]=low[i]-arrow_indent* Point ; //up arrow
       }
       if (close[i]<close[i+ 1 ])
       {
        up_arr[i] = EMPTY_VALUE ;
        down_arr[i]=high[i]+arrow_indent* Point ; //down arrow
       }
 
Vasyl Nosal :
Çözüm kodunuz var mı?

Diğerleri gibi, sorunuza birden fazla çözümüm var. Göstergeler nüanslarda farklı olabileceğinden (genel olarak birçok faktör için gerçekleştirdikleri görevler / kod / hesaplama aralıkları).

 
Karputov Vladimir :

İşte gösterge:

koşullarınıza göre göstergenin her iki arabelleği de sıfır çubuğuna çekebileceğini unutmayın.

Hepiniz beni mi takip ediyorsunuz yoksa gerçekten sorunun ne olduğunu anlayamıyor musunuz?

Yüklenmemiş bir geçmişte TF'yi değiştirirken göstergeniz.

:)))))))))))))))))))))))))))))))))))

 
Dina Paches :

Diğerleri gibi, sorunuza birden fazla çözümüm var. Göstergeler nüanslarda farklı olabileceğinden (genel olarak birçok faktör için gerçekleştirdikleri görevler / kod / hesaplama aralıkları).

Falan falan filan...
 
Vasyl Nosal :

Hepiniz beni mi takip ediyorsunuz yoksa gerçekten sorunun ne olduğunu anlayamıyor musunuz?

Yüklenmemiş bir geçmişte TF'yi değiştirirken göstergeniz.

:)))))))))))))))))))))))))))))))))))

Böyle ilginç bir resim elde etmek için hangi manipülasyonları kullandığınızı paylaşır mısınız? Ve umarım bundan böyle ifadelerde daha çekingen olursunuz.

Eklendi: Yukarıda, geçmişi değiştirirken, gösterge arabelleklerinin içeriğini düşünmeniz gerektiğini söyledim:

yükleme olayıyla eşitlemektir. gösterge .

ama nedense görmezden geldin ve değişiklik yapmak istemedin.

Genel olarak, işte 1.43 sürümü (İşte Alexey Viktorov'dan yaptığım düzeltmeler ve düzeltmeler):

Ticaret, otomatik ticaret sistemleri ve ticaret stratejilerinin test edilmesi hakkında forum

TF değişikliği bir sorundur

Alexey Viktorov , 2015.12.07 12:52

İki tamponun çekmemesi için bir tamponu doldururken diğerini sıfırlamak gerekir.

       if (close[i]>close[i+ 1 ])
       {
        down_arr[i] = EMPTY_VALUE ;
        up_arr[i]=low[i]-arrow_indent* Point ; //up arrow
       }
       if (close[i]<close[i+ 1 ])
       {
        up_arr[i] = EMPTY_VALUE ;
        down_arr[i]=high[i]+arrow_indent* Point ; //down arrow
       }

:

 //+------------------------------------------------------------------+
//|                                                    Shabl_ind.mq4 |
//|                                      Copyright 2012, CompanyName |
//|                                       http://www.companyname.net |
//+------------------------------------------------------------------+
#property copyright "eevviill"
#property link        "http://alievtm.blogspot.com"
#property version    "1.43"
#property strict
#property indicator_chart_window
#property indicator_buffers 2
#property indicator_color1 clrLightBlue
#property indicator_color2 clrRed
#property indicator_width1 2
#property indicator_width2 2

input string    arr_set= "Arrow settings" ;
input int       arrow_indent= 22 ;
input int       up_arrow_code= 233 ;
input int       down_arrow_code= 234 ;

double          up_arr[];
double          down_arr[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit ()
  {
   SetIndexBuffer ( 0 ,up_arr);
   SetIndexStyle( 0 , DRAW_ARROW );
   SetIndexArrow( 0 ,up_arrow_code);
   SetIndexLabel( 0 , "UP arrow" );

   SetIndexBuffer ( 1 ,down_arr);
   SetIndexStyle( 1 , DRAW_ARROW );
   SetIndexArrow( 1 ,down_arrow_code);
   SetIndexLabel( 1 , "DOWN arrow" );

   return ( INIT_SUCCEEDED );
  }
//+------------------------------------------------------------------+
//| Shabl_ind                                                        |
//+------------------------------------------------------------------+
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[])
  {
   int i,limit= 0 ;
//---
   if (rates_total<= 20 )
       return ( 0 );
//--- last counted bar will be recounted
   if (prev_calculated== 0 )
     {
      limit=rates_total- 1 ;
       ArrayInitialize (up_arr, EMPTY_VALUE );
       ArrayInitialize (down_arr, EMPTY_VALUE );
     }
   if (prev_calculated> 0 )
      limit=rates_total-prev_calculated+ 1 ;
   Comment ( "rates_total=" ,rates_total, "; prev_calculated=" ,prev_calculated, "; limit=" ,limit);
//--- Shabl_ind counted in the 1-st buffer
   for (i= 0 ; i<limit; i++)
     {
       if (close[i]>close[i+ 1 ])
        {
         down_arr[i]= EMPTY_VALUE ;
         up_arr[i]=low[i]-arrow_indent* Point ; //up arrow
        }
       if (close[i]<close[i+ 1 ])
        {
         up_arr[i]= EMPTY_VALUE ;
         down_arr[i]=high[i]+arrow_indent* Point ; //down arrow
        }
     }
   return (rates_total);
  }
//+------------------------------------------------------------------+
Dosyalar:
 
Karputov Vladimir :

Böyle ilginç bir resim elde etmek için hangi manipülasyonları kullandığınızı paylaşır mısınız? Ve umarım bundan böyle ifadelerde daha çekingen olursunuz.

Daha önce hiç açmadığım bir döviz çiftinin grafiğini açıyorum. Örneğin M1. Göstergenizi ekliyorum. M5'e geçin.

Yani, haklı mıydım? Ok arabelleklerini sıfırlamanız mı gerekiyor?

 
Vasyl Nosal :

mql4

Hayır. Tarihin olmadığı bir çift üzerinde tasarımınız ile burada.

Bu ne?

 if (i> Bars - 20 ) i= Bars - 20 ;

Beklediğim gibi, içerideki döngü kıvranıyor. Ek olarak, döngü gövdesinde bir önceki çubuğa ([i+1]) atıfta bulunduğunuz için, hesaplamayı geçmişteki ikinci çubuktan (soldan sayarak) daha erken başlatmanız gerekir. Ve her bir çubuktaki TÜM arabellekleri doldurmanız gerekir, bunlardan yalnızca birini değil. Peki, ya da onları önce OnInit() içinde başlatın.

 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[])
{
   int nStartBar = rates_total - MathMax (prev_calculated, 2 );

   for ( int i = nStartBar; i >= 0 ; i--)
   {
       if (Close[i] > Close[i+ 1 ])
      {
         up_arr[i] = Low[i] - arrow_indent * _Point ; //up arrow
         down_arr[i] = 0 ;
      }
         
       if (Close[i] < Close[i+ 1 ])
      {
         up_arr[i] = 0 ;
         down_arr[i] = High[i] + arrow_indent * _Point ; //down arrow
      }
   }

   return (rates_total);
}
 
Karputov Vladimir :

Genel olarak, işte 1.43 sürümü (İşte Alexey Viktorov'dan yaptığım düzeltmeler ve düzeltmeler):


:

Vladimir, bunu neden OnCalculate() içinde yapıyorsun? Son iki satırı kastediyorum - dizilerin yeniden başlatılması. Her çubukta hesaplanan iki arabelleğiniz var, bu gereksiz bir eylemdir.

 if (prev_calculated== 0 )
{
   limit=rates_total- 1 ;
   ArrayInitialize (up_arr, EMPTY_VALUE );
   ArrayInitialize (down_arr, EMPTY_VALUE );
}
 
Sergei Vladimirov :

Bu ne?

Beklediğim gibi, içerideki döngü kıvranıyor. Ek olarak, döngü gövdesindeki bir önceki çubuğa ([i+1]) atıfta bulunduğunuz için, hesaplamayı geçmişteki ikinci çubuktan (soldan sayarak) daha erken başlatmanız gerekir. Ve her bir çubuktaki TÜM arabellekleri doldurmanız gerekir, bunlardan yalnızca birini değil. Peki, ya da onları önce OnInit() içinde başlatın.

Her şey? Arıza olmayacak mı?