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

 
Artyom Trishkin:

どんな計算を?

Last_Arrow_Buy_volume = Buf_Arrow_Buy[n];
Last_Arrow_Buy_index  = n;

了解しました、質問を削除します。あなたから聞いて、OnTick()領域で変数を宣言する のは悪いことで、計算はループ内でもできることに気がつきました。

完了、すべてうまくいきました、ありがとうございます、あとは値段を決めるだけです。ありがとうございました。

void OnTick()
  {
   if (CopyBuffer(CrossAD, 1, 0, period_find, Buf_Arrow_Buy) != period_find)
      {  
         Print("НЕ удалось правильно скопировать данные из 1-го буфера индикатора iCrossAD, error code %d",GetLastError());
         return;
      }
         for(int n=0; n<(int)period_find; n++)
            {
               if(Buf_Arrow_Buy[n]!=EMPTY_VALUE)
               {
                  Last_Arrow_Buy_volume = Buf_Arrow_Buy[n];
                  Last_Arrow_Buy_index  = n;
                  Print("Last_Arrow_Buy_volume = ",Last_Arrow_Buy_volume,", Last_Arrow_Buy_index = ",Last_Arrow_Buy_index);
                  break;
               }   
            }
         
   if (CopyBuffer(CrossAD, 2, 0, period_find, Buf_Arrow_Sell) != period_find)
      {  
         Print("НЕ удалось правильно скопировать данные из 2-го буфера индикатора iCrossAD, error code %d",GetLastError());
         return;
      }
         for(int n=0; n<(int)period_find; n++)
            {
               if(Buf_Arrow_Sell[n]!=EMPTY_VALUE)
               {
                  Last_Arrow_Sell_volume = Buf_Arrow_Sell[n];
                  Last_Arrow_Sell_index  = n;
                  Print("Last_Arrow_Sell_volume = ",Last_Arrow_Sell_volume,", Last_Arrow_Sell_index = ",Last_Arrow_Sell_index);
                  break;
               }
            }
      
Comment("-------------------------", 
         "\n Last_Arrow_Buy_volume     = ",Last_Arrow_Buy_volume,
         "\n Last_Arrow_Buy_index        = ",Last_Arrow_Buy_index,
         "\n ---------------------- ",
         "\n Last_Arrow_Sell_volume     = ",Last_Arrow_Sell_volume,
         "\n Last_Arrow_Sell_index        = ",Last_Arrow_Sell_index
         ); 
  }
 
Sergey Voytsekhovsky:

了解しました、質問を削除します。あなたから聞いて、OnTick()領域で変数を宣言する のは悪いことで、計算はループ内でもできることに気がつきました。

完了、すべてうまくいきました、ありがとうございます、あとは値段を決めるだけです。ありがとうございました。

ループの中で計算をしているのではなく、必要なデータを取得している、それがこのループの設計です。

しかし、ループ内の計算は避けるべきです。

むしろ、すぐにでも考え直した方がいい。ループでデータを取得していますね。最初のデータに遭遇した後にループを中断する。これらはすべて、要求された結果を返すという、関数のコンセプトの範囲内にある。

ループ全体を関数にして、バーが見つかればその番号を、見つからなければ WRONG_VALUE - を返すようにします。

then:n=Func();

を計算し、WRONG_VALUEと等しくなければnを 本来の用途に使用する。関数に "しゃべる "名前をつける。そして、OnTick()のコードは短くなり、ロジックも明確になります。不要なものをオーバーロードすることはありません。

 
Artyom Trishkin:

ループ全体を関数化し、見つかれば小節番号を、見つからなければ WRONG_VALUE を返します。

次に:n=Func() です。

を計算し、WRONG_VALUEと等しくなければ、意図したとおりにnを 使用します。関数の名前を「伝える」名前にする。そして、OnTick()のコードは短くなり、ロジックはより明確になります。不要なものでオーバーロードされることはありません。

生きて、学ぶのです。とても興味深いです、夜にでも試してみます。一応、報告として、そして感謝の気持ちを込めて、価格を......から出してもらいました。良い一日でした :-))

void OnTick()
  {
   if (CopyBuffer(CrossAD, 1, 0, period_find, Buf_Arrow_Buy) != period_find)
      {  
         Print("НЕ удалось правильно скопировать данные из 1-го буфера индикатора iCrossAD, error code %d",GetLastError());
         return;
      }
         for(int n=0; n<(int)period_find; n++)
            {
               if(Buf_Arrow_Buy[n]!=EMPTY_VALUE)
               {
                  Last_Arrow_Buy_volume = iOpen(_Symbol,_Period,n);
                  Last_Arrow_Buy_index  = n;
                  Print("Last_Arrow_Buy_volume = ",Last_Arrow_Buy_volume,", Last_Arrow_Buy_index = ",Last_Arrow_Buy_index);
                  break;
               }   
            }
         
   if (CopyBuffer(CrossAD, 2, 0, period_find, Buf_Arrow_Sell) != period_find)
      {  
         Print("НЕ удалось правильно скопировать данные из 2-го буфера индикатора iCrossAD, error code %d",GetLastError());
         return;
      }
         for(int n=0; n<(int)period_find; n++)
            {
               if(Buf_Arrow_Sell[n]!=EMPTY_VALUE)
               {
                  Last_Arrow_Sell_volume = iOpen(_Symbol,_Period,n);
                  Last_Arrow_Sell_index  = n;
                  Print("Last_Arrow_Sell_volume = ",Last_Arrow_Sell_volume,", Last_Arrow_Sell_index = ",Last_Arrow_Sell_index);
                  break;
               }
            }
      
Comment("-------------------------", 
         "\n Last_Arrow_Buy_volume     = ",Last_Arrow_Buy_volume,
         "\n Last_Arrow_Buy_index        = ",Last_Arrow_Buy_index,
         "\n ---------------------- ",
         "\n Last_Arrow_Sell_volume     = ",Last_Arrow_Sell_volume,
         "\n Last_Arrow_Sell_index        = ",Last_Arrow_Sell_index
         ); 
  }
 

この質問に協力できるみんなhttps://www.mql5.com/ru/forum/160683/page845#comment_11741857- コメントはすでに遠くに行ってしまったのでしょうか?また、インクリメンタルを実行する必要がある場合、デクリメンタルを実行する必要がある場合、どちらの方向でも動作するループをどのように作成するのかという疑問もあります。ここでは、その仕組みの一例をご紹介します。

もし(何かが起こった){変数への値の割り当て}なら、ループが呼び出され、ループの値に依存した計算を行うボディを含むことになる

for( 上の変数によって増減)

本体

条件を重複して指定する方法はなく、ループ内で一度だけ指定する必要があります。可能なのでしょうか。

 

またまたこんばんは。まだ関数にはしていませんが、新しい質問があります。添付の画像では、新しいシグナル(矢印)があることがわかりますが、コメントでは、EAがそれを受け入れず、11キャンドル前のものを究極の上矢印としてまだ考えていることがわかります。

https://www.mql5.com/ru/charts/10181812/eurusd-h1-alpari-international

График EURUSD, H1, 2019.05.20 18:00 UTC, Alpari International, MetaTrader 5, Real
График EURUSD, H1, 2019.05.20 18:00 UTC, Alpari International, MetaTrader 5, Real
  • www.mql5.com
Символ: EURUSD. Период графика: H1. Брокер: Alpari International. Торговая платформа: MetaTrader 5. Режим торговли: Real. Дата: 2019.05.20 18:00 UTC.
 
Sergey Voytsekhovsky:

11ろうそく前。

インジケータはすでに新しいシグナルを出しており(チャート上ではEAと並行して動いている)、EAにはOnTick以外のイベントはなく、EAにはシグナルが見えていないことが判明しました。

 
Sergey Voytsekhovsky:

またまたこんばんは。まだ関数にはしていませんが、新しい質問があります。添付の画像では、新しいシグナル(矢印)があることがわかりますが、コメントでは、EAがそれを受け入れず、11キャンドル前のものを究極の上矢印としてまだ考えていることがわかります。

https://www.mql5.com/ru/charts/10181812/eurusd-h1-alpari-international

空でないバッファ値を見つけた場合、バーnに対応する時間をログに出力する。どのバーを見つけるかがわかります。バッファを逆から読んでいる可能性もあります。

 

EAがなぜ矢印を見ないのか、それはすでにインジケータバッファにあり、データウィンドウから判断すると、EAはOnTickを照会し、他に何が必要ですか?上記のフルコード。


 
Artyom Trishkin:

空でないバッファ値を見つけた場合、バーnに対応する時間をログに出力する。どのバーを見つけたかが表示されます。バッファを逆から読んでいる可能性もあります。

OK、完了です。時刻は、矢印が設定されているローソクの始点時刻が正しく表示されます。コード添付、画像添付

void OnTick()
  {
   if (CopyBuffer(CrossAD, 1, 0, period_find, Buf_Arrow_Buy) != period_find)
      {  
         Print("НЕ удалось правильно скопировать данные из 1-го буфера индикатора iCrossAD, error code %d",GetLastError());
         return;
      }
         for(int n=0; n<(int)period_find; n++)
            {
               if(Buf_Arrow_Buy[n]!=EMPTY_VALUE)
               {
                  Last_Arrow_Buy_volume = iOpen(_Symbol,_Period,n);
                  Last_Arrow_Buy_time   = iTime(_Symbol,0,n);
                  Last_Arrow_Buy_index  = n;
                  Print("Last_Arrow_Buy_volume = ",Last_Arrow_Buy_volume,", Last_Arrow_Buy_index = ",Last_Arrow_Buy_index,", Last_Arrow_Buy_time = ",Last_Arrow_Buy_time);
                  break;
               }   
            }
         
   if (CopyBuffer(CrossAD, 2, 0, period_find, Buf_Arrow_Sell) != period_find)
      {  
         Print("НЕ удалось правильно скопировать данные из 2-го буфера индикатора iCrossAD, error code %d",GetLastError());
         return;
      }
         for(int n=0; n<(int)period_find; n++)
            {
               if(Buf_Arrow_Sell[n]!=EMPTY_VALUE)
               {
                  Last_Arrow_Sell_volume = iOpen(_Symbol,_Period,n);
                  Last_Arrow_Sell_time   = iTime(_Symbol,0,n);
                  Last_Arrow_Sell_index  = n;
                  Print("Last_Arrow_Sell_volume = ",Last_Arrow_Sell_volume,", Last_Arrow_Sell_index = ",Last_Arrow_Sell_index,", Last_Arrow_Buy_time = ",Last_Arrow_Buy_time);
                  break;
               }
            }
      
Comment("-------------------------", 
         "\n Last_Arrow_Buy_volume     = ",Last_Arrow_Buy_volume,
         "\n Last_Arrow_Buy_index        = ",Last_Arrow_Buy_index,
         "\n ---------------------- ",
         "\n Last_Arrow_Sell_volume     = ",Last_Arrow_Sell_volume,
         "\n Last_Arrow_Sell_index        = ",Last_Arrow_Sell_index
         ); 
  }


 

写真でログが見えない場合は、極端なエントリーをご紹介します。


2019.05.20 21:42:52.601 Test_iCustom (EURUSD,H1) Last_Arrow_Sell_volume = 1.12112, Last_Arrow_Sell_index = 56.0, Last_Arrow_Buy_time = 2019.05.20 10:00:00

2019.05.20 21:42:53.824 Test_iCustom (EURUSD,H1) Last_Arrow_Buy_volume = 1.11544、Last_Arrow_Buy_index = 11.0、Last_Arrow_Buy_time = 2019.05.20 10:00:00

2019.05.20 21:42:53.824 Test_iCustom (EURUSD,H1) Last_Arrow_Sell_volume = 1.12112, Last_Arrow_Sell_index = 56.0, Last_Arrow_Buy_time = 2019.05.20 10:00:00

2019.05.20 21:43:00.819 Test_iCustom (EURUSD,H1) Last_Arrow_Buy_volume = 1.11544,Last_Arrow_Buy_index = 11.0,Last_Arrow_Buy_time=2019.05.20十時00分:00秒

2019.05.20 21:43:00.819 Test_iCustom (EURUSD,H1) Last_Arrow_Sell_volume = 1.12112, Last_Arrow_Sell_index = 56.0, Last_Arrow_Buy_time = 2019.05.20 10:00:00

2019.05.20 21:43:03.021 Test_iCustom (EURUSD,H1) Last_Arrow_Buy_volume = 1.11544, Last_Arrow_Buy_index = 11.0, Last_Arrow_Buy_time = 2019.05.20 10:00:00

2019.05.20 21:43:03.021 Test_iCustom (EURUSD,H1) Last_Arrow_Sell_volume = 1.12112, Last_Arrow_Sell_index = 56.0, Last_Arrow_Buy_time = 2019.05.20 10:00:00

2019.05.20 21:43:03.621 Test_iCustom (EURUSD,H1) Last_Arrow_Buy_volume = 1.11544、Last_Arrow_Buy_index = 11.0、Last_Arrow_Buy_time = 2019.05.20 10:00:00

2019.05.20 21:43:03.622 Test_iCustom (EURUSD,H1) Last_Arrow_Sell_volume = 1.12112, Last_Arrow_Sell_index = 56.0, Last_Arrow_Buy_time = 2019.05.20 10:00:00

2019.05.20 21:43:10.696 Test_iCustom (EURUSD,H1) Last_Arrow_Buy_volume = 1.11544、Last_Arrow_Buy_index = 11.0, Last_Arrow_Buy_time = 2019.05.20 10:00:00

2019.05.20 21:43:10.696 Test_iCustom (EURUSD,H1) Last_Arrow_Sell_volume = 1.12112, Last_Arrow_Sell_index = 56.0, Last_Arrow_Buy_time = 2019.05.20 10:00:00