iBarShift'e benzer - sayfa 15

 
Alexey Kozitsyn :
Bu arada, Bars() işlevi hakkında. Belki de bu kliniğin nedenidir .
Bunu kontrol etmek kolaydır. Tüm Çubukları iBar'larım olarak değiştir. Klişe kaybolursa, sorun bu fonksiyondadır. Ayrıca bazı göstergelerimin donma nedenini de anlayamadım. Bu hata olduğu ortaya çıktı. Şimdi her şey uçuyor.
 
fxsaber :

Alıntılar, ilgilenilen biri hariç tüm sembolleri takip edebilir.

Tamam, yeni kaynağa baktım. Bahsedilen düzenlemelerin yapılmadığını gördüm. Ayrılıyorum.

SYMBOL_TIME kullanmak, yalnızca istenen sembol Piyasa İzleme penceresinde mevcut değilse mantıklıdır. O zaman TimeCurrent işini yapmaz. Ancak Barlar için bu kullanım durumu bana pek olası görünmüyor. Ancak SYMBOL_TIME aracılığıyla geçerli saati almanın maliyeti çok daha yüksektir, çünkü SymbolInfoInteger(symbol_name,SYMBOL_TIME) neredeyse bir büyüklük sırası daha uzun sürer. Tabii ki, Piyasa İzleme'de böyle bir sembol olup olmadığını öğrenebilir ve sonuca bağlı olarak TimeCurrent veya SYMBOL_TIME kullanabilirsiniz, ancak bu da ücretsiz değildir, özellikle yeni bir sembolün olup olmadığını her zaman izlemeniz gerektiğinden. Piyasa İzleme'ye eklendi veya kaldırıldı. Bu nedenle, iBar'ların doğru çalışması için rezervasyon yapmak daha kolaydır, talep edilen sembolün piyasaya genel bakışında olması tavsiye edilir.

SERIES_LASTBAR_DATE hakkında Sanırım yanılıyorsunuz. SymbolInfoInteger(symbol_name,SYMBOL_TIME) daha az kötüdür.

SeriesInfoInteger işlevi, geçmişin sayfalanmasına neden olmaz. Buna sebep olan bir şey varsa, bu mantıklı olan Bars isteğidir. Ve çalıştırırsanız, bu kısa komut dosyasından frenlerin kaynağı görülebilir.

 void OnStart ()
  {
   Print ( "1" );
   Print ( Bars ( _Symbol , PERIOD_W1 , D'2020.01.01 00:00' , UINT_MAX ));
   Print ( "2" );
  }
 

Aslında çok garip bir bug. İndirme geçmişinin üzerindeki etkisini kontrol ettim, bugün aniden EURUSD sembolünde görünmediğini keşfettiğimde.

Tüm geçmişin zorla indirilmesi. Ve bug tekrar ortaya çıktı.

Belki indirme geçmişi bu hatayı etkilemez.

Bu hatanın neden yüzdüğünü anlamıyorum.

Bu komut dosyasını test etmek için kullandı:

Dosyalar:
TestiBars.mq5  11 kb
 
Nikolai Semko :

Bu hatanın neden yüzdüğünü anlamıyorum.

SD tüm bu konunun farkında mı?

 
Genel olarak veri yüklemenin/yüklemenin terminalin zayıf noktası olduğunu düşünüyorum.
 
Alexey Kozitsyn :

SD tüm bu konunun farkında mı?

Evet, 30/03/2018 tarihinde orada zaten yazdım - şimdiye kadar sessizlik.

Alexey Kozitsyn :
Genel olarak veri yüklemenin/yüklemenin terminalin zayıf noktası olduğunu düşünüyorum.

Katılıyorum, ama aynı zamanda en zor görevlerden biri.

 
Nikolai Semko :

iBars işlevinin çok hantal olduğu ortaya çıkmış olsa da, MQ içindeki takılma hatasını düzeltene kadar normal Barlar yerine onu kullanmanızı tavsiye ederim.

Mantıksal olarak 0 döndürmesi gerektiğinde iBar askıda kalıyor. Genellikle 10 saniyeden fazla döndürür. MQL4'te böyle bir hata yok.

Çoğu görevde, iBar'lar normal Çubuklardan daha hızlı çalışır, çünkü yalnızca hatayı atlamakla kalmaz, aynı zamanda önceki değerleri koruma algoritması sayesinde Çubuklar ve SeriesInfoInteger işlevlerini mümkün olduğunca kullanmamaya çalışır.

Bu işlevi hem yukarı hem de aşağı test etti. Barları tamamen tekrarlıyor gibi görünüyor.

Belki daha zarif bir şekilde yapılabilir. Kimin arzusu var - rica ederim. Hatalar bulursanız, onları düzelteceğiz.

Böyle...

Ardından iBarsShift işlevinin tam analogu şöyle görünecektir:

Ve çoğu durumda kullanılan son kesin parametre olmayan seçenek şöyle görünecektir:

iBarsShift+iBars (ve diğer iBarsShift) kodunuzu kullanıyorum ve iBarsShift öğesinden 0 alıyorum, ancak TF grafiği H1 ve H1 hatası için hesaplama yapıldığında

2018.04.21 14:38:01.059 SVA_LinearRegression_test (Si Splice,H1)        zero divide in 'SVA_LinearRegression_test.mq5' (176,44)

bu kod satırına karşılık gelen

   if (timeframe< PERIOD_W1 ) TimeCur-=TimeCur % PerSec;

İşte tam gösterge kodu

 #property version    "1.00"
#property indicator_chart_window
#property indicator_buffers 3
#property indicator_plots    3

//--- plot Label1
#property indicator_label1    "LR_line"
#property indicator_type1    DRAW_LINE
#property indicator_color1    clrGold
#property indicator_style1    STYLE_DOT
#property indicator_width1    1
//--- plot Label2
#property indicator_label2    "Sup_line"
#property indicator_type2    DRAW_LINE
#property indicator_color2    clrAquamarine
#property indicator_style2    STYLE_DOT
#property indicator_width2    1
//--- plot Label3
#property indicator_label3    "Res_line"
#property indicator_type3    DRAW_LINE
#property indicator_color3    clrOrangeRed
#property indicator_style3    STYLE_DOT
#property indicator_width3    1


//--- input parameters
input ENUM_TIMEFRAMES TF= PERIOD_D1 ;
input int Bar= 3 ;
input bool UseClose = true ;


//--- indicator buffers
double LR_line_Ind[];
double Sup_line_Ind[];
double Res_line_Ind[];

//---
int limit,start;

//Список переменных:
static datetime TimeN= 0 ;
int   barsToCount= 0 ;

int InpChannelPeriod= 1000 ;
double OpenI[];
double HighI[];
double LowI[];
double CloseI[];
double arr[];

double Calc_LR_line= 0.0 ;
double Calc_Sup_line= 0.0 ;
double Calc_Res_line= 0.0 ;


//////////////////////////////////////////////////////////////////////

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit ()
  {
//--- indicator buffers mapping
   SetIndexBuffer ( 0 ,LR_line_Ind, INDICATOR_DATA );
   SetIndexBuffer ( 1 ,Sup_line_Ind, INDICATOR_DATA );
   SetIndexBuffer ( 2 ,Res_line_Ind, INDICATOR_DATA );   
//--- set accuracy
   IndicatorSetInteger ( INDICATOR_DIGITS , _Digits );
//--- set first bar from what index will be drawn
   PlotIndexSetInteger ( 0 , PLOT_DRAW_BEGIN ,InpChannelPeriod);
   PlotIndexSetInteger ( 1 , PLOT_DRAW_BEGIN ,InpChannelPeriod);
   PlotIndexSetInteger ( 2 , PLOT_DRAW_BEGIN ,InpChannelPeriod);   
//---
   return ( 0 );
  }
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                         |
//+------------------------------------------------------------------+
void OnDeinit ( const int reason)
{


}
//+------------------------------------------------------------------+
//| 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[])
  {
   ArraySetAsSeries (LR_line_Ind, true ); 
   ArraySetAsSeries (Sup_line_Ind, true ); 
   ArraySetAsSeries (Res_line_Ind, true ); 
   ArraySetAsSeries (time, true ); 

//--- check for rates
   if (rates_total<InpChannelPeriod) return ( 0 );
//--- preliminary calculations
   if (prev_calculated== 0 ) limit=InpChannelPeriod;
   else limit=prev_calculated;
//--- the main loop of calculations
   for ( int C=limit;C<rates_total && ! IsStopped ();C++)
     {
       LRegrf(C);
       LR_line_Ind[C]=Calc_LR_line;
       Sup_line_Ind[C]=Calc_Sup_line;
       Res_line_Ind[C]=Calc_Res_line;    
     }
//--- return value of prev_calculated for next call
   return (rates_total);
  }
  
//+------------------------------------------------------------------+
double LRegrf( int index)
{
int Day_Shift= iBarShift ( _Symbol ,TF, iTime ( _Symbol , PERIOD_CURRENT ,index), false );

Print ( iTime ( _Symbol , PERIOD_CURRENT ,index));
Print (Day_Shift);

return ( 0 );
}
//-------------------------------------------------------------------
//==MQL4toMQL5
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
datetime iTime ( string symbol, ENUM_TIMEFRAMES tf, int index)
  {
   if (index < 0 ) return (- 1 );
//   ENUM_TIMEFRAMES timeframe=TFMigrate(tf);
   //ENUM_TIMEFRAMES timeframe=PERIOD_CURRENT;
   datetime Arr[];
   if ( CopyTime (symbol,tf,index, 1 ,Arr)> 0 )
       return (Arr[ 0 ]);
   else return (- 1 );
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int iBarShift ( const string Symb, const ENUM_TIMEFRAMES TimeFrame, datetime time, bool exact= false )
  {
   int Res= iBars (Symb,TimeFrame,time+ 1 , UINT_MAX );
   if (exact) if ((TimeFrame!= PERIOD_MN1 || time> TimeCurrent ()) && Res== iBars (Symb,TimeFrame,time- PeriodSeconds (TimeFrame)+ 1 , UINT_MAX )) return (- 1 );
   return (Res);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int iBars ( string symbol_name, ENUM_TIMEFRAMES   timeframe, datetime start_time, datetime stop_time)
  {
   static string LastSymb= NULL ;
   static ENUM_TIMEFRAMES LastTimeFrame= 0 ;
   static datetime LastTime= 0 ;
   static datetime LastTime0= 0 ;
   static int PerSec= 0 ;
   static int PreBars= 0 ;
   static datetime LastBAR= 0 ;
   static datetime LastTimeCur= 0 ;
   datetime TimeCur;
   if (stop_time<start_time) {TimeCur=stop_time; stop_time=start_time; start_time=TimeCur; }
   TimeCur= TimeCurrent ();
   if (LastTimeFrame!=timeframe) if (timeframe== PERIOD_MN1 ) PerSec= 2419200 ; else PerSec=:: PeriodSeconds (timeframe);
   if (timeframe< PERIOD_W1 ) TimeCur-=TimeCur%PerSec;
   if (start_time>TimeCur) {LastSymb= NULL ; return ( 0 );}
   if (LastTimeFrame!=timeframe || LastSymb!=symbol_name || ((TimeCur-LastBAR)> 0 && TimeCur!=LastTimeCur))
      LastBAR=( datetime ) SeriesInfoInteger (symbol_name,timeframe, SERIES_LASTBAR_DATE );

   LastTimeCur=TimeCur;
   if (PerSec== 0 ) return ( 0 );
   if (start_time>LastBAR)
     {LastTimeFrame=timeframe; LastSymb=symbol_name; return ( 0 );}

   datetime tS,tF= 0 ;
   bool check= true ;
   if (timeframe< PERIOD_W1 ) tS=start_time-(start_time- 1 )%PerSec- 1 ;
   else if (timeframe== PERIOD_W1 ) tS=start_time-(start_time- 259201 )%PerSec- 1 ;
   else
     {
      PerSec= 2678400 ;
       MqlDateTime dt;
       TimeToStruct (start_time- 1 ,dt);
      tS=dt.year* 12 +dt.mon;
     }
   if (stop_time<=LastBAR)
     {
       if (timeframe< PERIOD_W1 ) tF=stop_time-(stop_time)%PerSec;
       else if (timeframe== PERIOD_W1 ) tF=stop_time-(stop_time- 259200 )%PerSec;
       else
        {
         MqlDateTime dt0;
         TimeToStruct (stop_time,dt0);
         tF=dt0.year* 12 +dt0.mon;
        }
       if (tS==tF) {PreBars= 0 ; check= false ;}
     }
   if ((LastTimeFrame!=timeframe || LastSymb!=symbol_name || tS!=LastTime || tF!=LastTime0) && check)
      PreBars= Bars (symbol_name,timeframe,start_time,stop_time);
   LastTime=tS; LastTime0=( datetime )tF;
   LastTimeFrame=timeframe;
   LastSymb=symbol_name;
   return (PreBars);
  }

Yazdır (Day_Shift) neden saat ve tarih doğru olduğunda her zaman sıfır döndürür?

Görünüşe göre bu hafta sonunun etkisi, çünkü geçen gün her şey doğru çalıştı (farklı bir işlevle de olsa, ancak bugün de çalışmıyor).

 
Aleksey Vyazmikin :

iBarsShift+iBars (ve diğer iBarsShift) kodunuzu kullanıyorum ve iBarsShift öğesinden 0 alıyorum, ancak TF grafiği H1 ve H1 hatası için hesaplama yapıldığında

bu kod satırına karşılık gelen

İşte tam gösterge kodu

Yazdır (Day_Shift) neden saat ve tarih doğru olduğunda her zaman sıfır döndürür?

Görünüşe göre bu hafta sonunun etkisi, çünkü geçen gün her şey doğru çalıştı (farklı bir işlevle de olsa, ancak bugün de çalışmıyor).

Kodu yanlış şekilde bıraktığım için özür dilerim.

O zaman bile yanlış çalışma fark ettim ve neredeyse düzelttim, ancak kolayca düzeltilebilecek küçük bir sorun vardı.
Şimdi çalıştığım ve sınavların zamanı geldiği ve zamanım olmadığı için kodu bıraktım. Son sınav 24 Nisan.
Ondan sonra her şeyi düzelteceğim ve CB'de yayınlayacağım.

Yayınlamaya başladım ama erteledim.


 
Nikolai Semko :

Kodu yanlış şekilde bıraktığım için özür dilerim.

O zaman bile yanlış çalışma fark ettim ve neredeyse düzelttim, ancak kolayca düzeltilebilecek küçük bir sorun vardı.
Şimdi çalıştığım ve sınavların zamanı geldiği ve zamanım olmadığı için kodu bıraktım. Son sınav 24 Nisan.
Ondan sonra her şeyi düzelteceğim ve CB'de yayınlayacağım.

Yayınlamaya başladım ama erteledim.


Son haliyle düzeltmeleri bekleyeceğim, cevapladığınız için teşekkürler.

Sınavlarında iyi şanslar dilerim!

 
Aleksey Vyazmikin :

Son haliyle düzeltmeleri bekleyeceğim, cevapladığınız için teşekkürler.

Sınavlarında iyi şanslar dilerim!

Teşekkürler))
Neden: