エラー、バグ、質問 - ページ 2997

 
Alexey Viktorov:

スキー板が悪いのでは?


そして、RTS-6.21です。


これは別格です。お持ちのブローカーとMT5のバージョンを教えてください。

 
Alexey Viktorov:

スキー板が悪いのでは?


そして、RTS-6.21も。


ありがとうございました。図星だったんですね。異なるフォルダーから異なるバージョンのインジケータを接続。

 
Francuz:

はい、そうです。結果は変わっていません。

信じられない。
もう一度試してみてください。

datetime a = D'2021.04.08 10:00:00';
   int      handle;
   double   Buffer[];
   

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
{

   handle = iCustom(_Symbol, PERIOD_CURRENT, "Examples\\ATR.ex5", 14);
   ::Print(__FUNCTION__ + "| PERIOD_CURRENT = ", EnumToString(_Period));

   return(INIT_SUCCEEDED);
}

//+------------------------------------------------------------------+
//| 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[])
{

   if(prev_calculated>0 && handle != INVALID_HANDLE)
   {
      ::CopyBuffer(handle, 0, a, 1, Buffer);
      
      double BS = ::NormalizeDouble(Buffer[0], _Digits);
      
      ::Print(__FUNCTION__ + "| a = ", a);
      ::Print(__FUNCTION__ + "| BS ", BS);
      
      handle = INVALID_HANDLE;
   }
   
   // return value of prev_calculated for next call
   return(rates_total);
}
 
Nikolai Semko:

信じられない。
もう一度試してみてください。

私はそれを理解した。問題は、異なるフォルダーの2つのATRファイルが接続されていたことです。そのため、数値にズレが生じたのです。

よろしくお願いします。
 
Nikolai Semko:

信じられない。
もう一度試してみてください。

ニコライは、それとは別の問題を抱えていた。私もすぐにこの問題が理解できず、別のTFから値を取得する必要があると思いました。スキーに注油して、すべてがうまくいった。
 
Alexey Viktorov:
ニコライは、それとは別の問題を抱えていた。私も最初は質問の意味がわからず、他のTFから値を取得する必要があるのかと思いました。スキーにオイルを塗って、すべてがうまくいった。



まさに、OnCalculateの最初の実行で、prev_calculated == 0のときにCopyBufferの唯一の実行が行われ、バーがすでに生成されているという保証はなかったため この現象が起こりました。解決策は、この最初の実行を無視して、prev_calculated>0のときだけCopyBufferを実行することでした。

「異なるフォルダの2つのATRファイル」というのがよく分かりません。

 
Nikolai Semko:



まさに、OnCalculateの最初の実行で、prev_calculated == 0のときにCopyBufferの唯一の実行が行われ、バーがすでに生成されているという保証はなかったため この現象が起こりました。解決策は、この最初の呼び出しを無視して、prev_calculated>0 のときだけ CopyBuffer を1回実行することでした。 なぜ

「異なるフォルダから2種類のATRファイル」があったのか - 理解できない。

まあ、チャートを開いた時点で、現在のTF用のインジケータが作成されていれば、すでにデータはできているはずなんですけどね。そうでしょう?

 
Alexey Viktorov:

まあ、チャートを開いて、現在のTF用のインジケータを作成すれば、チャートを開いた時点ですでにデータはできているはずなのですが。そうでしょう?

ああ、どんなに素晴らしい発見が待っているのだろう・・・。も

 
Alexey Viktorov:

まあ、チャートを開いて、現在のTF用のインジケータを作成すれば、チャートを開いた時点ですでにデータはできているはずなのですが。そうでしょう?

正しく表現できていなかった。バーは、そうですねー、ほとんどの場合、できていますね。しかし、OnCalculateの最初の呼び出しで、prev_calculated == 0のとき、これらのすべてのバーについてインジケータが再計算されたという保証はありません。
それを確かめるために、そのようなインジケータを実行することができます。
しかし、それは相場が取引されるときに行う必要があります。マーケットが閉じていれば、ミスマッチを見ることはありません。
だから、動きのある暗号通貨で試すのは、週末にしたほうがいい。
バッファ配列のサイズ = -1 の場合、インジケータバッファがまだ再計算されていないことを意味し、BS 値は正しくありません。

   datetime a = D'2021.04.08 10:00:00';
   int      handle;
   double   Buffer[];
   

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
{

   handle = iCustom(_Symbol, PERIOD_CURRENT, "Examples\\ATR.ex5", 14);
   ::Print(__FUNCTION__ + "| PERIOD_CURRENT = ", EnumToString(_Period));

   return(INIT_SUCCEEDED);
}

//+------------------------------------------------------------------+
//| 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[])
{

   if(handle != INVALID_HANDLE)
   {
      ::CopyBuffer(handle, 0, a, 1, Buffer);
      
      double BS = ::NormalizeDouble(Buffer[0], _Digits);
      
      ::Print(__FUNCTION__ + "| a = ", a);
      ::Print(__FUNCTION__ + "| BS ", BS);
      int total_bars = iBars(NULL,PERIOD_CURRENT);
      int size = CopyBuffer(handle, 0, 0, total_bars, Buffer);
      Print("Total Bars = " + string(total_bars) + ", Size of Buffer array = " + string(size));
      
      handle = INVALID_HANDLE;
   }
   
   // return value of prev_calculated for next call
   return(rates_total);
}


OnCalculateの次の呼び出し(prev_calculated>0)で実行すれば、そのような問題は発生しません。

SOM コードに間違いがありましたので、修正しました。

 
Artyom Trishkin:

ああ、どんな不思議な発見が待っているのだろう...。も

インジケータを計算するためのデータという意味です。嫌味なこと言うなよ))))

理由: