MQL4、MQL5に関する初心者からの質問、アルゴリズムやコードに関するヘルプ、ディスカッションなど。 - ページ 1750

 
Aleksei Stepanenko MqlDateTime構造 体を用いてバーの時間まで順番にチェックしながら、各バーを列挙する。しかし、この場合、存在しないはずのバーを見逃すという信号が発生します。

例えば、こんな感じです。

水曜日の1小節を逃し、00:30にこのシンボルで開始、すなわち00:00に失う。

M30時間帯、48ではなく1日で47になることが判明。これこそ、私たちが見極めなければならないことです


 
Vitaly Muzichenko #:

以下はその一例です。

水曜日の1小節を逃し、00:30にこのシンボルで開始、すなわち00:00に失う。

M30時間帯、48ではなく47を1日で取得。これこそ、私たちが見極めなければならないことです。


正しい方法はわからないが、私ならこの方向で考える。

      datetime tt=Time[Bars-1];
      //--- 
      if(Time[i]==tt){tt+=PeriodSeconds(PERIOD_CURRENT);}
      else
      {Print(TimeToString(tt,TIME_DATE|TIME_MINUTES));tt+=PeriodSeconds(PERIOD_CURRENT);}
 
Vitaly Muzichenko #:

以下はその一例です。

水曜日の1小節を逃し、00:30にこのシンボルで開始、すなわち00:00に失う。

M30時間帯、48ではなく47を1日で取得。これこそ、私たちが見極めなければならないことです


int  Bars( 
   string           symbol_name,     // имя символа 
   ENUM_TIMEFRAMES  timeframe,       // период 
   datetime         start_time,      // с какой даты 
   datetime         stop_time        // по какую дату 
   );
もし47
 

Vitaly Muzichenko #:

それこそ、見極めが必要なのです。

なるほど、問題は誤報ですが、これはたくさんあるでしょう。

//дата последней свечи
 curr_time=iTime(symbol,frame,0);
//ограничение на торговлю вне начала бара
if(last_time==curr_time) return;

if((iBarShift(eSymbol,eFrame,last_time)-iBarShift(eSymbol,eFrame,curr_time))>PeriodSeconds(eFrame)) printf("а-я-яй");
last_time=curr_time;
 
Alexey Viktorov #:
もし47

これは、CopyOpen()でも可能です。

全編を通してのループで、どのように整理していくか決めかねています

 

をさらにシンプルにしました。

for(int i=TotalBars-1; .....
   {
   if((iBarShift(eSymbol,eFrame,last_time)-i)>PeriodSeconds(eFrame)) printf("а-я-яй");
   last_time=iTime(symbol,frame,i);
 
Vitaly Muzichenko #:

これは、CopyOpen()でも可能です。

全編を通してのループで、どのように整理していくか決めかねています

ゼロデイバーの開始時間から1秒を引いた時間が、ファーストデイバーの開始時間になります。そして、最初の日足バーから1秒を引いたところから2番目の日足バーの開始まで、といった具合です。
 
Vitaly Muzichenko #:

これは、CopyOpen()でも可能です。

全歴史をループしてアレンジする方法が決められない

その通り(例えばM30) - 隣のバーのオープン間の時間(モジュロ%24時間)がM30より長い場合、それらの間に欠けているバーがあることを意味します。

int nbars = ( ( iTime(_Symbol,PERIOD_M30,N) - iTime(_Symbol,PERIOD_M30,N+1) ) ) / PeriodSeconds(PERIOD_M30) ) % 48; // сколько баров должно быть между ссоедними отметками

if (nbars>1) PrintFormat("Пропущено баров: %d",nbars-1);

 

皆さん、ありがとうございます。原理は明確で、問題は形式化されました。

---

さて、質問です。すべての文字が同じ値になっていますが、何が間違っているのでしょうか?

#property strict

//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
   Print( DoubleToString(SymbolInfoDouble(_Symbol,SYMBOL_POINT),8) );
  }
//+------------------------------------------------------------------+
0       14:39:38.965    sc GBPCHF,M30: 0.00001000
0       14:46:44.478    sc NZDCHF,M30: 0.00001000
0       14:44:54.709    sc EURUSD,M30: 0.00001000

---

追伸:ターミナルMT4、異なる証券会社の2つのターミナルで確認しました。

P.SS.MT5で確認しましたが、結果は同じです

2021.11.20 15:05:34.881 sc (EURCHF,M30)  0.00001000
2021.11.20 15:05:39.203 sc (AUDUSD,M30)  0.00001000
2021.11.20 15:05:51.985 sc (EURAUD,M30)  0.00001000

---

私はきっと何か間違っている!

"ポイント値 "を取得したい

 
Vitaly Muzichenko #:

皆さん、ありがとうございます。原理は明確で、問題は形式化されました。

---

さて、質問です。すべての文字が同じ値になっていますが、何が間違っているのでしょうか?

Vitalyさん、ここで必要なのは、開発者をバグらせるか、あるいは