iBarShiftのアナログ - ページ 15

 
Alexey Kozitsyn:
ところで、Bars()関数について。決め手と なる原因かもしれません。
これは簡単に確認できます。すべてのBarsを私のiBarsに変更します。ウェッジが消えるのであれば、その機能に問題があることになります。私も一部のインジケーターがフリーズする原因が分かりませんでした。この特定のバグであることが判明し、今はすべて飛んでいます。
 
fxsaber:

Cotypesは、興味のあるキャラクター以外のすべてのキャラクターに行くことができます。

OK、新しいソースコードを見てみました。議論されていた編集がされていないことを見た。退出する。

SYMBOL_TIME を使用するのは、要求されたシンボルがマーケットウォッチウィンドウにない場合のみ意味がある。そうすると、TimeCurrentは その機能を果たせません。しかし、このBarsの使い方のバリエーションは、私にはありえないように思えます。しかし、SymbolInfoInteger(symbol_name,SYMBOL_TIME)はほぼ一桁の時間がかかるので、SYMBOL_TIME経由で現在時刻を得ることの代償ははるかに大きいです。もちろん、そのシンボルがマーケットレポートにあるかどうかを確認し、その結果に応じてTimeCurrentや SYMBOL_TIMEを使うこともできますが、特に新しいシンボルがマーケットレポートから追加されたり削除されたりしたかどうかを常に確認しなければならないので、自由ではありません。したがって、iBarsの正しい動作のために、要求されたシンボルがマーケットレポートにあることが妥当であるという条項を設けることは容易である。

SERIES_LASTBAR_DATE については、間違って いると思います。SymbolInfoInteger(symbol_name,SYMBOL_TIME) の方が悪くは ないと思います。

SeriesInfoInteger関数は、ヒストリのページングを発生させません。原因となるものがあるとすれば、それはBarsへの要求であり、論理的なものです。そして、ブレーキの元は、この短いスクリプトを実行すれば、見ることができます。

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

一般的に非常に奇妙なバグです。EURUSDのシンボルで 今日突然ほとんど表示されなくなったのを発見して、ダウンロード履歴の影響を確認しました。

履歴を全てダウンロードすることを強要された。そして、再びバグが出現した。

ダウンロード履歴はこのバグに影響しないのでしょうね。

なぜこのバグが浮遊しているのか理解できない。

このスクリプトを使用してテストしました。

ファイル:
TestiBars.mq5  11 kb
 
Nikolai Semko:

なぜこのバグが浮遊しているのか理解できない。

SDはこの話題の全体像を把握しているのでしょうか?

 
一般的に、データのロード/アップロードは端末の弱点だと思います。
 
Alexey Kozitsyn:

SDはこの話題の全体像を把握しているのでしょうか?

はい、すでに2018.03.30にそこに書きました - これまでの沈黙。

アレクセイ・コジツィン
一般的に、データのロード/アップロードは端末の弱点だと思います。

同感ですが、最も難しい作業のひとつでもあります。

 
Nikolai Semko:

iBars機能はかなり面倒ですが、MQがハングアップのバグを修正するまでは、通常のBarsの代わりに使用することをお勧めします。

論理的には0を返すべきなのに、iBarがハングアップしてしまう。原則として10秒以上返します。MQL4にはそのようなバグはありません。

iBarsはバグを回避するだけでなく、以前の値を保存するアルゴリズムのため、可能な限りBars関数や SeriesInfoInteger関数を使用しないので、ほとんどのタスクで通常のBarsよりも高速に動作します。

私はこの機能をあちこちでテストしてきました。バーズをフルコピーしているようです。

もしかしたら、もっとエレガントな方法でできるかもしれません。願望があれば、大歓迎です。エラーを発見した場合は、修正します。

それで...

そうすると、iBarsShift関数の完全なアナログは、次のような形になります。

そして、大半のケースで使われる最後のパラメータを除いたバリアントは、次のようになります。

私はあなたのコードiBarsShift+iBars(および他のiBarsShift)を使用して、iBarsShiftから0を取得し、TFチャートH1とH1の計算時にエラーになります。

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

これは、次のコードに対応するものです。

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

以下は、インジケーター全体のコードです。

#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);
  }

日付と 時刻は正しいのに、なぜPrint(Day_Shift)はいつもゼロを返すのですか?

先日まではすべて正常に動作していたので、週末の影響と思われます(別の機能ですが、今日も動作しません)。

 
Aleksey Vyazmikin:

私はあなたのコードiBarsShift + iBars(および他のiBarsShift)を使用し、iBarsShiftから0を取得し、TFチャートH1とH1で計算すると、エラーが発生します。

これは、次のコードに対応するものです。

以下は、インジケーター全体のコードです。

日付と 時刻は正しいのに、なぜPrint(Day_Shift)はいつもゼロを返すのですか?

先日まではすべて正常に動作していたので、週末の影響と思われます(機能は違いますが、今日も動作しません)。

間違った形でコードを残してしまい、申し訳ありませんでした。

当時、精度の低さに気づき、ほぼ修正したのですが、まだ小さな、簡単に修正できる問題が残っていました。
ただ、今勉強中で試験が始まり、時間がないため、コードを放棄しました。最後の試験は4月24日です。
その後、すべてを修正してCBに掲載する予定です。

すでに出版に着手していますが、保留にしています。


 
Nikolai Semko:

間違った形でコードを残してしまい、申し訳ありませんでした。

当時、不正確な作業に気づき、ほぼ修正したのですが、まだ小さな簡単に修正できる問題が残っていました。
今勉強中で、試験時間が始まってしまい、時間がないので、コードを放棄しただけです。最後の試験は4月24日です。
その後、すべてを修正してCBに掲載する予定です。

すでに投稿を開始していますが、保留にしています。


最終形での修正を待ちたいと思います、ご対応ありがとうございました。

試験、頑張ってください。

 
Aleksey Vyazmikin:

最終形での修正を待ちます、ご返信ありがとうございました。

受験生の皆さん、頑張ってください。

ありがとうございました))