初心者の方からの質問 MQL5 MT5 MetaTrader 5 - ページ 987

 

こんにちは、MT5の機能を理解するために私を助けてくれるすべての人に大きな敬意を表します。あなたなしでは、とても無理です...。昏倒、しゃっくり、ぐるぐる回る。だから、RESPECTとKudos to you。


質問です。rates_totalとhistory bar limitを 連携させる方法は?コードに正しくリンクされていましたか? ヒント、ヒントとお返事ありがとうございます。

//--- Проверка количества доступных баров
   if(rates_total<24) return 0;
//--- Проверка и расчёт количества просчитываемых баров
   int limit=rates_total-prev_calculated;
   if(limit>1)
     
      limit=rates_total-1;

//Показать историю за CountPeriods недель барах по Н1

int bars=PeriodSeconds(PERIOD_W1)/PeriodSeconds(PERIOD_H1)*CountPeriods;  //  CountPeriods=4; В глобальных переменных

//РЕШИЛ ТАК НО ПО-МОЕМУ ЧУШЬ...

int lm=iBarShift(NULL,PERIOD_H1,iTime(NULL,PERIOD_CURRENT,limit));      //rates_total-1 в днях
int start=lm-(lm-bars);

Comment(start,"    bars    ",bars);  //Равенство значений есть

ちょうど新しい時間帯を見ていたところです。はすべて正常に動作しているようです。

それから質問ですが、rate_totalに関して、私のコードは正しかったですか?

 

Bars関数のヘルプをよく読むこと。

"

start_time と stop_time パラメータが指定された場合、この関数は日付範囲内のバーの 数を返します。これらのパラメータが指定されない場合、この関数はバーの総数を返す。

"

ヘルプには開始日や終了日を含めるかどうかが書かれていないので、結果的にこの関数に何を期待すればいいのかがわからない。

驚くべきは、その機能の仕組みです。

   datetime         StartDt=StringToTime("2018.01.04 10:00");
   datetime         StopDt=StringToTime("2018.01.03 23:49");
//datetime         StopDt=StringToTime("2018.01.04 10:00");
//datetime         StopDt=StringToTime("2018.01.04 10:01");
   int              BarsGo=Bars(Symbol(),PERIOD_CURRENT,StartDt,StopDt);
   Print("BarsGo=",BarsGo);

コメントされているものも含め、どのオプションでもStopDtは2という値を取得します

特に驚くのは、2番目の式で開始日(2018.01.04 10:00)が終了日(2018.01.03 23:49)より時間的に遅い場合の選択肢ですが、なぜエラーにならないのか、少なくとも1が出るのか。

もし、開始日と終了日が同じなら、1を出して、また2を出さないのは理にかなっているのです

FORTSの1分足チャートでSiインストゥルメントを確認しています。

 

インジケーターの一部、助けてください

//+------------------------------------------------------------------+
//|  OnCalculate 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(time,true);

   datetime Fp=0,Ep=0,pFp=0,pEp=0,Arr[];
   int Count=0,bars=0,dt=0;

   int limit;
   if(prev_calculated==0 || prev_calculated<0 || prev_calculated>rates_total)
      limit=Nbar;
   else
      limit=rates_total-prev_calculated;

   for(int i=limit;i>=0;i--)
     {

      if(CopyTime(NULL,TimeFrame,time[i],1,Arr)>0)Ep=Arr[0]-1*PeriodSeconds(PERIOD_CURRENT);
      else return(0);

市場が閉 じた夜間など、time[i]配列がオーバーフローすることがあります。

2019.01.25 00:06:35.191 i-Regr4_05i (Si Splice,H1)      array out of range in 'i-Regr4_05i.mq5' (134,38)

この問題を解決するにはどうすればいいのか。

 

こんな宣言の後にヒントが。

double Price[]; 

配列のサイズは 常に0ですか?

 
pivomoe:

こんな宣言の後にヒントが。

配列のサイズは常に0ですか?

はい。

 
Artyom Trishkin 、プロフェッショナルで責任あるモデレーターとして、私は非常にあなたから、特にマニュアルを参照して、推測ではなく、Bars機能の動作の正当性を聞いてみたい!
 
Aleksey Vyazmikin:

インジケーターの一部、助けてください

市場が閉 じた夜間など、time[i]配列がオーバーフローすることがあります。

この問題を解決するにはどうすればいいのか。

例えば、Nbarパラメータを正しく計算するために

   if(prev_calculated==0 || prev_calculated<0 || prev_calculated>rates_total)
      limit=Nbar;
 
Aleksey Vyazmikin:

Bars関数のヘルプをよく読むこと。

"

start_time と stop_time パラメータが指定された場合、この関数は日付範囲内のバーの 数を返します。これらのパラメータが指定されない場合、この関数はバーの総数を返す。

"

ヘルプには開始日や終了日を含めるかどうかが書かれていないので、結果的にこの関数に何を期待すればいいのかがわからない。

驚くべきは、その機能の仕組みです。

コメントされているものも含め、どのオプションでもStopDtは2という値を取得します

特に驚くのは、2番目の式で開始日(2018.01.04 10:00)が終了日(2018.01.03 23:49)よりも時間的に遅い場合の選択肢ですが、なぜエラーが出ない、あるいは少なくとも1が出ないのでしょうか。

もし、開始日と終了日が同じなら、1を出して、また2を出さないのは理にかなっているのです

FORTSでSiインストゥルメントを確認すると、分足チャートになっています。

不整合について議論する前に、関数が返す棒グラフよりも多くの棒グラフがあることを示す必要があります。

私はこの機能をかなり多く使っていますが、特に問題はありません。なぜ、iBarShiftやそれに類する機能がmql5に搭載されたのか、とても不思議に思っています。

プログラマーが突然間違えた場合、この関数が「from」と「to」の時間を入れ替えることも、「Foolproof」の概念に含まれる。

また、アドバイスとして、関数をより速く動作させるには、バーの開始時間を入れてください。2~3行の追加でスピードが確保できます。特にテスターにとっては重要なことです。

 
Vladimir Karputov:

例えば、Nbarパラメータを正しく計算 する

自分でも既にチェックはしていますが、このチェックはこの関数のエラーを回避するためのもので、ヘルプにはチェックの必要性については全く書かれていないので、内蔵されているはずです。

それから、インジケーターのチェックの話ですが、iBarShiftは私の中ではBarsを使って正しいバー開始時間を計算しているので、クリアランスや取引セッションが 丸一日ないために履歴で頻繁に失敗しないFXにのみ適していると思います。

 
Alexey Viktorov:

矛盾を語る前に、関数が返す以上の棒グラフがあることを示すべきでしょう。

私はこの機能をかなり多く使っていますが、特に問題はありません。なぜ、iBarShiftやそれに類する機能をmql5に搭載したのか、とても驚きました。

プログラマーが突然、時間の「from」と「to」を間違えてしまっても、この機能が所々で変えてくれることも、「Foolproof」という概念の一部になっています。

また、この機能をより高速に動作させるために、バーの開始時刻を入力することをお勧めします。2~3行の追加でスピードが出ます。特にテスターにとっては重要なことです。

これは保護ではなく、コードのエラーを検出するための障害なのです

しかも、日付が同じなら2番を返すというのは全く論理的ではないのですが、ここの根拠は何でしょうか?

FORTSのバーの開始時刻が一致しないことがあり、14:00ではなく14:05にバーが開くなど、計算の間違いに悩まされました。

理由: