iBarShiftのアナログ - ページ 11

 
Nikolai Semko:

ええ、まあ、実際、標準的な関数としては奇妙な動作です。結局のところ、私たちはまさにその「ベンチマーク」に値を当てはめることを扱っているのです。

MQL4の標準関数iBarShiftは、要求された時刻が穴に落ちると、左の小節番号(つまりこの場合は土曜日)を返し、iBarShift3は穴から右の小節番号(つまり月曜日)を返すので、より理にかなっていると言えるでしょう。

穴の中にいるのであれば、最後に判明した値である左バーを返すのは論理的だが、未来は返さないのである。

 
Vitaly Muzichenko:

穴の中にいるのであれば、最後に判明した値である左バーを返すのは論理的だが、未来は返さない。

そうなんですね、意味不明です。過去と未来を混同してしまった)おそらく、1(過去)>0(未来)だからでしょう。プログラムされています。
 
Alain Verleyen:


ほとんどの場合、この関数は間違った結果を返します

追記:英語版を掲載する必要があるのか、それともロシア語訳が正しいのか?

はい、訳は合っています。

このスクリプトを実行すると、関数が まったく同じ結果を生むことがわかる。

これらの関数の値が異なる時間軸と時間帯の例を教えてください。

ちなみに、あなたの機能はよく間違われます。値-1 を返します。

2018.04.04 22:51:05.666 TestBarShift2 AUDUSD,M5: BarShiftX  PERIOD_M1   0   -1    2018.04.05 05:45:00
2018.04.04 22:50:46.867 TestBarShift2 AUDUSD,M5: BarShiftX  PERIOD_M1   0   -1    2018.04.05 05:46:00
2018.04.04 22:50:41.255 TestBarShift2 AUDUSD,M5: BarShiftX  PERIOD_M1   0   -1    2018.04.05 05:47:00
2018.04.04 22:50:23.496 TestBarShift2 AUDUSD,M5: BarShiftX  PERIOD_M1   0   -1    2018.04.05 05:45:00
2018.04.04 22:50:05.596 TestBarShift2 AUDUSD,M5: BarShiftX  PERIOD_M1   0   -1    2018.04.05 05:47:00
2018.04.04 22:48:38.638 TestBarShift2 AUDUSD,M5: BarShiftX  PERIOD_M1   0   -1    2018.04.05 05:47:00
ファイル:
 
Alain Verleyen:

要件は、mql4のバージョンとしてONLYを持つことである


exact=trueパラメータを指定した場合、関数が正しく動作しません。

これは、このスクリプトで確認することができます。

また、iBarShift関数の 完全な動作アナログを正確なパラメータで紹介します。

int iBarShift1(const string Symb,const ENUM_TIMEFRAMES TimeFrame,datetime time,bool exact=false)
  {
   int Res=Bars(Symb,TimeFrame,time+1,UINT_MAX);
   if(exact) if((TimeFrame!=PERIOD_MN1 || time>TimeCurrent()) && Res==Bars(Symb,TimeFrame,time-PeriodSeconds(TimeFrame)+1,UINT_MAX)) return(-1);
   return(Res);
  }

このパラメータがない場合は、次のような形に簡略化されます。

Bars(Symb,TimeFrame,time+1,UINT_MAX);
ファイル:
 
Nikolai Semko:

はい、訳は合っています。

このスクリプトを実行すると、関数が まったく同じ結果を生むことがわかる。

これらの関数の値が異なる時間軸と時間帯の例を教えてください。

ちなみに、あなたの機能はよく間違われます。値-1 を返します。

真面目にお願いします。私のコードはmql5用です。

MT4ではBars()関数が信頼できないため、-1が返されます。

...   
   int shift=Bars(symbol,timeframe,time,LastBAR);

   datetime checkcandle[1];

   if(CopyTime(symbol,timeframe,time,1,checkcandle)==1)
     {
      if(checkcandle[0]==time)
         return(shift-1);
      else if(exact && time>checkcandle[0]+PeriodSeconds(timeframe))
         return(-1);
      else
         return(shift);
     }
...

AUDUSD、M5チャートでスクリプトを実行します。

MT5ではこの現象は起こりません。

 
Alain Verleyen:

真面目にお願いします。私のコードはmql5用です。

MT4ではBars()関数が信頼できないため、-1が返されます。

AUDUSD、M5チャートでスクリプトを実行します。

MT5ではこの現象は起こりません。

MQL4と同じように 動作するようにとのことですが。

しかし、このスクリプトはMQL5上でも実行可能です。

2018.04.05 09:52:40.760 TestBarShift2 (EURUSD,M12)      PERIOD_M3  BarShift1 = -1  BarShift2 = 0    2018.08.10 18:39:49   exact = true
2018.04.05 09:52:40.760 TestBarShift2 (EURUSD,M12)      PERIOD_M10  BarShift1 = -1  BarShift2 = 0    2018.04.15 00:25:08   exact = true
2018.04.05 09:52:40.761 TestBarShift2 (EURUSD,M12)      PERIOD_M6  BarShift1 = -1  BarShift2 = 0    2018.04.21 04:26:03   exact = true
2018.04.05 09:52:40.761 TestBarShift2 (EURUSD,M12)      PERIOD_M15  BarShift1 = -1  BarShift2 = 0    2018.05.29 17:10:52   exact = true
2018.04.05 09:52:40.761 TestBarShift2 (EURUSD,M12)      PERIOD_M12  BarShift1 = -1  BarShift2 = 0    2018.09.16 13:10:33   exact = true
2018.04.05 09:52:40.762 TestBarShift2 (EURUSD,M12)      PERIOD_M10  BarShift1 = -1  BarShift2 = 0    2018.09.25 21:24:50   exact = true
2018.04.05 09:52:40.762 TestBarShift2 (EURUSD,M12)      PERIOD_M10  BarShift1 = -1  BarShift2 = 0    2018.05.30 20:04:10   exact = true
2018.04.05 09:52:40.762 TestBarShift2 (EURUSD,M12)      PERIOD_M5  BarShift1 = -1  BarShift2 = 0    2018.04.29 16:12:16   exact = true

exact=Trueで未来時間なら-1を返さなければならない。

また、私のスクリプトは奇妙なエラーを発見しました。

このエラーは、このチェックで確認できます。

Print (iBarShift2(_Symbol,PERIOD_MN1,D'2015.12.31 21:03:54',true)); // -1
Print (iBarShift1(_Symbol,PERIOD_MN1,D'2015.12.31 21:03:54',true)); // 28
ということは、結局のところ、あなたのアルゴリズムにイレギュラーが存在 するというのは正しかったということですね。
ファイル:
 

私が行ったすべての分析から、このiBarShiftの完全なアナログであると結論付けることができます。

int iBarShift(const string Symb,const ENUM_TIMEFRAMES TimeFrame,datetime time,bool exact=false)
  {
   int Res=Bars(Symb,TimeFrame,time+1,UINT_MAX);
   if(exact) if((TimeFrame!=PERIOD_MN1 || time>TimeCurrent()) && Res==Bars(Symb,TimeFrame,time-PeriodSeconds(TimeFrame)+1,UINT_MAX)) return(-1);
   return(Res);
  }

が圧倒的に正しく、同時に最も高速で、最も単純で短いアルゴリズムで実行されます。

正確なパラメータが必要ない場合は、簡易版を使用することができます。

int iBarShift(const string Symb,const ENUM_TIMEFRAMES TimeFrame,datetime time)
  {
   return(Bars(Symb,TimeFrame,time+1,UINT_MAX));
  }

または、関数を呼び出さずに この同等バージョンを使用するだけです。

Bars(Symb,TimeFrame,time+1,UINT_MAX);
それとも私が間違っているのでしょうか?
 
沈黙は同意の証です。
 
Nikolai Semko:
沈黙は同意の証です。

MEでCTRL+SHIFT+Fで "BarShift "を検索しました。似たような機能を使ってないことが判明。どうやら自分には必要ないようだ。

かつて、MT4のEAを1行でMT5に変換するバリアントを書いたことがあります。それしか書く理由がないように思える。

私はバーで仕事をしないので、なぜみんなが同じようにしないのか理解できません。

あなたのコードに入りませんでした。でも、すぐに解決したときはいつも嬉しいですね。

 
fxsaber:

MEでCTRL+SHIFT+Fで "BarShift "を検索しました。似たような機能を使ってないことが判明。どうやら自分には必要ないようだ。

かつて、MT4のEAを1行でMT5に変換するバリアントを書いたことがあります。それしか書く理由がないように思える。

私はバーで仕事をしないので、なぜみんなが同じようにしないのか理解できません。

あなたのコードに入りませんでした。でも、すぐに解決したときはいつも嬉しいですね。

おっしゃることはよくわかるのですが、やはりバーを使った作業は私にとっては急務です。いつか自分も初歩の初歩になるかもしれない。