iBarShiftのアナログ - ページ 15 1...891011121314151617 新しいコメント Nikolai Semko 2018.04.10 11:17 #141 Alexey Kozitsyn: ところで、Bars()関数について。決め手と なる原因かもしれません。 これは簡単に確認できます。すべてのBarsを私のiBarsに変更します。ウェッジが消えるのであれば、その機能に問題があることになります。私も一部のインジケーターがフリーズする原因が分かりませんでした。この特定のバグであることが判明し、今はすべて飛んでいます。 Nikolai Semko 2018.04.10 13:41 #142 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"); } Nikolai Semko 2018.04.10 14:50 #143 一般的に非常に奇妙なバグです。EURUSDのシンボルで 今日突然ほとんど表示されなくなったのを発見して、ダウンロード履歴の影響を確認しました。 履歴を全てダウンロードすることを強要された。そして、再びバグが出現した。 ダウンロード履歴はこのバグに影響しないのでしょうね。 なぜこのバグが浮遊しているのか理解できない。 このスクリプトを使用してテストしました。 ファイル: TestiBars.mq5 11 kb 削除済み 2018.04.10 19:39 #144 Nikolai Semko:なぜこのバグが浮遊しているのか理解できない。SDはこの話題の全体像を把握しているのでしょうか? 削除済み 2018.04.10 19:39 #145 一般的に、データのロード/アップロードは端末の弱点だと思います。 Nikolai Semko 2018.04.10 19:44 #146 Alexey Kozitsyn:SDはこの話題の全体像を把握しているのでしょうか?はい、すでに2018.03.30にそこに書きました - これまでの沈黙。 アレクセイ・コジツィン 一般的に、データのロード/アップロードは端末の弱点だと思います。同感ですが、最も難しい作業のひとつでもあります。 Aleksey Vyazmikin 2018.04.21 11:44 #147 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)はいつもゼロを返すのですか? 先日まではすべて正常に動作していたので、週末の影響と思われます(別の機能ですが、今日も動作しません)。 Nikolai Semko 2018.04.22 00:16 #148 Aleksey Vyazmikin:私はあなたのコードiBarsShift + iBars(および他のiBarsShift)を使用し、iBarsShiftから0を取得し、TFチャートH1とH1で計算すると、エラーが発生します。 これは、次のコードに対応するものです。 以下は、インジケーター全体のコードです。 日付と 時刻は正しいのに、なぜPrint(Day_Shift)はいつもゼロを返すのですか? 先日まではすべて正常に動作していたので、週末の影響と思われます(機能は違いますが、今日も動作しません)。間違った形でコードを残してしまい、申し訳ありませんでした。 当時、精度の低さに気づき、ほぼ修正したのですが、まだ小さな、簡単に修正できる問題が残っていました。 ただ、今勉強中で試験が始まり、時間がないため、コードを放棄しました。最後の試験は4月24日です。 その後、すべてを修正してCBに掲載する予定です。 すでに出版に着手していますが、保留にしています。 Aleksey Vyazmikin 2018.04.22 00:22 #149 Nikolai Semko:間違った形でコードを残してしまい、申し訳ありませんでした。 当時、不正確な作業に気づき、ほぼ修正したのですが、まだ小さな簡単に修正できる問題が残っていました。 今勉強中で、試験時間が始まってしまい、時間がないので、コードを放棄しただけです。最後の試験は4月24日です。 その後、すべてを修正してCBに掲載する予定です。 すでに投稿を開始していますが、保留にしています。 最終形での修正を待ちたいと思います、ご対応ありがとうございました。 試験、頑張ってください。 Nikolai Semko 2018.04.22 00:25 #150 Aleksey Vyazmikin:最終形での修正を待ちます、ご返信ありがとうございました。 受験生の皆さん、頑張ってください。 ありがとうございました)) 1...891011121314151617 新しいコメント 取引の機会を逃しています。 無料取引アプリ 8千を超えるシグナルをコピー 金融ニュースで金融マーケットを探索 新規登録 ログイン スペースを含まないラテン文字 このメールにパスワードが送信されます エラーが発生しました Googleでログイン WebサイトポリシーおよびMQL5.COM利用規約に同意します。 新規登録 MQL5.com WebサイトへのログインにCookieの使用を許可します。 ログインするには、ブラウザで必要な設定を有効にしてください。 ログイン/パスワードをお忘れですか? Googleでログイン
ところで、Bars()関数について。決め手と なる原因かもしれません。
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への要求であり、論理的なものです。そして、ブレーキの元は、この短いスクリプトを実行すれば、見ることができます。
一般的に非常に奇妙なバグです。EURUSDのシンボルで 今日突然ほとんど表示されなくなったのを発見して、ダウンロード履歴の影響を確認しました。
履歴を全てダウンロードすることを強要された。そして、再びバグが出現した。
ダウンロード履歴はこのバグに影響しないのでしょうね。
なぜこのバグが浮遊しているのか理解できない。
このスクリプトを使用してテストしました。
なぜこのバグが浮遊しているのか理解できない。
SDはこの話題の全体像を把握しているのでしょうか?
SDはこの話題の全体像を把握しているのでしょうか?
はい、すでに2018.03.30にそこに書きました - これまでの沈黙。
一般的に、データのロード/アップロードは端末の弱点だと思います。
同感ですが、最も難しい作業のひとつでもあります。
iBars機能はかなり面倒ですが、MQがハングアップのバグを修正するまでは、通常のBarsの代わりに使用することをお勧めします。
論理的には0を返すべきなのに、iBarがハングアップしてしまう。原則として10秒以上返します。MQL4にはそのようなバグはありません。
iBarsはバグを回避するだけでなく、以前の値を保存するアルゴリズムのため、可能な限りBars関数や SeriesInfoInteger関数を使用しないので、ほとんどのタスクで通常のBarsよりも高速に動作します。
私はこの機能をあちこちでテストしてきました。バーズをフルコピーしているようです。
もしかしたら、もっとエレガントな方法でできるかもしれません。願望があれば、大歓迎です。エラーを発見した場合は、修正します。
それで...
そうすると、iBarsShift関数の完全なアナログは、次のような形になります。
そして、大半のケースで使われる最後のパラメータを除いたバリアントは、次のようになります。
私はあなたのコードiBarsShift+iBars(および他のiBarsShift)を使用して、iBarsShiftから0を取得し、TFチャートH1とH1の計算時にエラーになります。
これは、次のコードに対応するものです。
以下は、インジケーター全体のコードです。
日付と 時刻は正しいのに、なぜPrint(Day_Shift)はいつもゼロを返すのですか?
先日まではすべて正常に動作していたので、週末の影響と思われます(別の機能ですが、今日も動作しません)。
私はあなたのコードiBarsShift + iBars(および他のiBarsShift)を使用し、iBarsShiftから0を取得し、TFチャートH1とH1で計算すると、エラーが発生します。
これは、次のコードに対応するものです。
以下は、インジケーター全体のコードです。
日付と 時刻は正しいのに、なぜPrint(Day_Shift)はいつもゼロを返すのですか?
先日まではすべて正常に動作していたので、週末の影響と思われます(機能は違いますが、今日も動作しません)。
間違った形でコードを残してしまい、申し訳ありませんでした。
当時、精度の低さに気づき、ほぼ修正したのですが、まだ小さな、簡単に修正できる問題が残っていました。
ただ、今勉強中で試験が始まり、時間がないため、コードを放棄しました。最後の試験は4月24日です。
その後、すべてを修正してCBに掲載する予定です。
すでに出版に着手していますが、保留にしています。
間違った形でコードを残してしまい、申し訳ありませんでした。
当時、不正確な作業に気づき、ほぼ修正したのですが、まだ小さな簡単に修正できる問題が残っていました。
今勉強中で、試験時間が始まってしまい、時間がないので、コードを放棄しただけです。最後の試験は4月24日です。
その後、すべてを修正してCBに掲載する予定です。
すでに投稿を開始していますが、保留にしています。
最終形での修正を待ちたいと思います、ご対応ありがとうございました。
試験、頑張ってください。
最終形での修正を待ちます、ご返信ありがとうございました。
受験生の皆さん、頑張ってください。