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

 

皆様にご挨拶申し上げます。そんな疑問があります。あるインディケータ(modified fractals)をチャート上にロードすると、すべてが正しく、あるべきように動作しますが、EAで使おうとすると、バッファが空だと言われます。同時に、Deinitでバッファを渡す際に、正しい値を格納します。

インジケーターのソースコードを添付します。何が間違っているのか、ヒントや提案に耳を傾ける準備はできています。

EAからのコード。

//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   if(Time[0] == prevtime) return;
   prevtime = Time[0];
   

   if(iCustom(NULL,0,"modify_Fractal",0,0) > 0) Print("x = ", 0, "  fractal Up: ", iCustom(NULL,0,"modify_Fractal",0,0));     
   if(iCustom(NULL,0,"modify_Fractal",0,2) > 0) Print("x = ", 2, "  fractal Up: ", iCustom(NULL,0,"modify_Fractal",0,2));
   if(iCustom(NULL,0,"modify_Fractal",0,3) > 0) Print("x = ", 3, "  fractal Up: ", iCustom(NULL,0,"modify_Fractal",0,3));   
   if(iCustom(NULL,0,"modify_Fractal",0,4) > 0) Print("x = ", 4, "  fractal Up: ", iCustom(NULL,0,"modify_Fractal",0,4));
   if(iCustom(NULL,0,"modify_Fractal",0,5) > 0) Print("x = ", 5, "  fractal Up: ", iCustom(NULL,0,"modify_Fractal",0,5)); 
   if(iCustom(NULL,0,"modify_Fractal",0,6) > 0) Print("x = ", 6, "  fractal Up: ", iCustom(NULL,0,"modify_Fractal",0,6));
   
  // тут везде 0
  }
//+------------------------------------------------------------------+

//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
      Print("Deinit Function");
      
      for (int x = 0; x < 100; x++ )
      {
         if(iCustom(NULL,0,"modify_Fractal",0,x) > 0) Print("x = ", x, "  fractal Up: ", iCustom(NULL,0,"modify_Fractal",0,x));
         if(iCustom(NULL,0,"modify_Fractal",1,x) > 0) Print("x = ", x, "  fractal Down: ", iCustom(NULL,0,"modify_Fractal",1,x));
      }
   // а здесь полный буфер правильных значений индикатора.
  }
ファイル:
 
Karputov Vladimir:

最後のifを置き換えると

(そんな簡単なことなら、、、:)

感謝

 
Maxim Dobrovolskii:

皆様にご挨拶申し上げます。そんな疑問があります。あるインディケータ(modified fractals)をチャート上にロードすると、すべてが正しく、あるべきように動作しますが、EAで使おうとすると、バッファが空だと言われます。同時に、Deinitでバッファを渡す際に、正しい値を格納します。

インジケーターのソースコードを添付します。何が間違っているのか、ヒントや提案に耳を傾ける準備はできています。

EAからのコード。

ざっと見た感じでは質問:ゼロ バーの上にフラクタルがあってもいいのですか?しかしOnDeinit()では、バーをループして自然にフラクタル(空のバッファ値ではない)を見つけるのです。
 
Artyom Trishkin:
非常にざっくりとした印象。質問:フラクタルはゼロ バーでもいいのですか?しかし、OnDeinit()では、バーをループして、自然にフラクタル(空のバッファ値ではない)を見つけます。
Deinitでは、4-6をループして、すべてが定位置にあり、価値を持っていることも確認しました。
 
Maxim Dobrovolskii:
Deinitでは、私も4-6を通過して、すべてがその場所にある。

OnDeinit()では、0から100のループで非ゼロのバーを探し、見つかった値を記録します。

OnTick()では、バッファ0の最後の6本だけを出力しようとしています。フラクタルが描かれていないかもしれない。

まず、フラクタルがあるバーを見つけて、そのバーの値を表示します。

 
Artyom Trishkin:

OnDeinit()では、0から100のループで非ゼロのバーを探し、見つかった値を記録します。

しかし、OnTick()では、バッファ0の最後の6本のバーだけを表示しようとしています。フラクタルは描かれていないかもしれません。まず、フラクタルがあるバーを見つけ、このバーの値を表示します。

6小節目にはフラクタルが入る予定です。

2015.11.01 13:19:11.023 2015.10.30 22:54 MoneyRobotics_Proboi! EURUSD,H1: x = 29 フラクタル 上: 1.09855
2015.11.01 13:19:11.023 2015.10.30 22:54 MoneyRobotics_Proboi! EURUSD,H1: x = 21 フラクタル アップ: 1.09976
2015.11.01 13:19:11.023 2015.10.30 22:54 MoneyRobotics_Proboi! EURUSD,H1: x = 16 フラクタル ダウン: 1.09652
2015.11.01 13:19:11.023 2015.10.30 22:54 MoneyRobotics_Proboi! EURUSD,H1: x = 6 フラクタル アップ: 1.10721
2015.11.01 13:19:10.577 2015.10.30 22:54 MoneyRobotics_Proboi! EURUSD,H1: Deinit Function.
2015.11.01 13:19:08.380 2015.10.01 00:00 MoneyRobotics_Proboi!テスト開始しました。

ログの冒頭部分です。 テストが始まり、Expert Advisorが動作し、Deinitがロードされ、6でfractalが見つかりました。インジケータバッファに どう対処すればいいのか分かりません。



https://charts.mql5.com/9/256/eurusd-h1-alpari-limited-3.png

イメージリプレイ

ファイル:
 
Maxim Dobrovolskii:

6小節目にはフラクタルが含まれているはずです。

2015.11.01 13:19:11.023 2015.10.30 22:54 MoneyRobotics_Proboi! EURUSD,H1: x = 29 フラクタル 上: 1.09855
2015.11.01 13:19:11.023 2015.10.30 22:54 MoneyRobotics_Proboi! EURUSD,H1: x = 21 フラクタル アップ: 1.09976
2015.11.01 13:19:11.023 2015.10.30 22:54 MoneyRobotics_Proboi! EURUSD,H1: x = 16 フラクタル ダウン: 1.09652
2015.11.01 13:19:11.023 2015.10.30 22:54 MoneyRobotics_Proboi! EURUSD,H1: x = 6 フラクタル アップ: 1.10721
2015.11.01 13:19:10.577 2015.10.30 22:54 MoneyRobotics_Proboi! EURUSD,H1: Deinit Function.
2015.11.01 13:19:08.380 2015.10.01 00:00 MoneyRobotics_Proboi!テスト開始しました。

テスト開始後、Expert Advisorが動作し、Deinitが開始され、すぐに6番目の位置でフラクタルが見つかりました。



https://charts.mql5.com/9/256/eurusd-h1-alpari-limited-3.png

インジケーターバッファのアドレスがわかりません。

これですね。

if(Time[0] == prevtime) return;
   prevtime = Time[0];

為さる

prevtime = Time[0];

揚げ句の果て

 
Artyom Trishkin:

これです。

為さる

を、最後の最後に。

残念ながら、何も変わっていません。

インジケータがロードされ、ティック/バーごとに 条件をチェックし始め、条件が満たされた場合、選択したバッファに値を入れ、次にEAがバッファ番号でインジケータを呼び出し、あるオフセットで値を取得する、というプロセスを想像しています。そうだろ?

 
Maxim Dobrovolskii:

残念ながら、何も変わっていないのです。

インジケータがロードされ、ティック/バーごとに条件チェックを開始し、条件を満たした場合、選択したバッファに値を格納し、EAがバッファ番号でインジケータを呼び出し、あるオフセットで値を取得するプロセスを想像しています。そうだろ?

また、インジケーターに新しいバーが 表示されているのはなぜですか?どうやら複雑な計算はしていないようです
 
Victor Nikolaev:
なぜ、インジケーターに新しいバー コントロールがあるのですか?どうやら複雑な計算はしていないようです
インジケータを使用するEAで新しいバーの制御を行います。
理由: