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

 
trader781:

コードをきれいにすれば、あなたのロジックを理解する必要がある他の人はもちろん、あなた自身にとっても読みやすくなります。そこにすべてのバグが見られることになります。

よし、これでいいのか?
次に、不要な中括弧を削除し、残りを普通にブロックに並べると、どこに論理的な欠陥があるのかがわかります。
 
Artyom Trishkin:
ここで、余分な中括弧を取り除き、残りを普通にブロックに並べると、あなたの論理のどこに欠陥があるかがわかります。
余分なものは何ですか?
 
trader781:
どれが冗長なのか?
あなたのコードには不要な括弧がたくさんあります。スタイリングツールを 使えば、不要な空のペアの中括弧をすぐに確認することができます。
 
Artyom Trishkin:
スタイラスでコードを処理 すると、すぐに余分な空白の中括弧を見つけることができます。
完了
ファイル:
 
trader781:
完了
後で見るから、最低でも4時間はかかるから...。
 
trader781:
メイド・バイ
1.count++; // プログラム開始からのティック数

よりよい方法: if(count<=20) count++; - 21までしか必要ないのに、なぜさらに数えるのか?

2.
   if(count>20) //  если количество тиков больше начинаем работу ... и дальше код эксперта
     {
      if(Bars<801 || (IsTradeAllowed()==false)) //--- Проверим достаточна ли в истории баров для анализа и разрешение торговли
         Print("Нет достаточного количества баров или торговля на текущем инструменте запрещена");
      return;
     }

そして、こちらがウィグワムです。 これはバーの数をチェックし、count>20のときのみ表示、残りのコードはcount<=20のときに動作 します

3.

if(OrderSymbol()==Symbol() && OrderType()<2)
            continue;

市場のものだけを考えればよいのであれば(そしてこれがさらなるコードに期待するものであれば)、continueは 全く必要ありません。

4.

         if(y==true && (OrderType()==0)) //+-----покупка
           {
            dummy=(OrderClose(OrderTicket(),OrderLots(),Bid,0,White));

              {
               if((dummy==true) && ((OrderSelect(i,SELECT_BY_POS,MODE_TRADES))==false))

                  PlaySound("music");
               Sleep(20000);
               PlaySound("music");
               Sleep(20000);
               PlaySound("music");
               Sleep(20000);
               dummy=false;
               ExpertRemove();
              }
           }

1つの注文を締め、自ら排除する?そして、もっとたくさんいたらどうでしょう?しかも、寝る時間は1分もない。

上のコードは見ていません、まだテストする場所がないのです。

 

1 ok, I'll fix it

2 それは大丈夫ではありません、以下のブロックはcount<20で 動作しないはずです。

3 OK、訂正します

4 はい、分足ですが、現在のシンボルに対する成行注文がなくなった場合のみ開始されるべきです。注文 選択の結果を否定することで実装しようとしたのですが、そのためにはどこかでreturnを設定する必要があるのですが、void OnTick()でのreturnはあまり良い感じではありませんね。そしてまた、すべてのシンボルに対して多くの注文がある場合、OrdersTotal()は間違った結果を出します。

 
trader781:

2 が OK でない場合、count<20 のときに以下のブロックは動作しないはずです。

そして、ブロックの後にelse returnを 追加する必要があります。

4 はい、分足ですが、現在のシンボルの成行注文がなくなった場合のみ開始されるはずです。注文 選択の結果を否定することで実装しようとしたのですが、そのためにはどこかでreturnを設定しなければならず、void OnTick()でのreturnはあまり良い印象を与えません。そしてまた、OrdersTotal()は、すべてのシンボルにわたって多くの注文がある場合、間違った結果を出します。

なぜ3つの音が必要なのか?

最初のループで注文を閉じ、次のループですべての成行注文を再計算して残りがあるかどうかを確認し、残りがなければファンファーレを鳴らすのです。

しかし、受注終了後の音楽の仕掛けがまだよくわからない。まあ、日記にプリントしたり、メールやスマートフォンに通知を送ることはできますが、なぜEAをオルゴールにしてしまうのでしょうか。
 
Vitalie Postolache:

そして、elseのreturn ブロックの後にreturnを 追加する必要があります。

なぜ3倍もの音が必要なのか?

最初のループで注文をクローズし、次のループですべての成行注文を再計算してクローズしていないものがあるかどうかをチェックし、ない場合はファンファーレを再生するのです。

注文が締め切られた時の音楽の仕掛けが未だに理解できない。さて、雑誌に印刷したり、メールにメッセージを送ったり、スマートフォンに通知したりすることはできますが、なぜEAをオルゴールにしなければならないのでしょうか?

サイクルの分け方は?

最後に決済された注文にサウンドをバインドするにはどうすればよいですか? 注文がない場合、Expert Advisor はサウンドをトリガしません。

そして最後にもう一つ、今のところ音楽には満足しています

 
trader781:

サイクルを分けるにはどうしたらいいですか?

最後に閉じた注文にサウンドをバインドする方法は? 注文がない場合、Expert Advisorは動作しませんので。

そして最後に、今のところ音楽には満足しています。

セパレートとはどういう意味ですか?ループは2つ必要ですが、1つはOrderClose()で、もう1つは注文のカウンターを持ちます。順番の選択 基準は同じです。カウンターが0であれば、全ての注文が終了しており、音楽を再生することができる。

という条件にも気づきました。

         if(Uslovie1==true) //Bid+ma6
           {
            if((Bid>=ma1-X*Point && Bid<ma1) || (Bid<=ma1+X*Point && Bid>ma1))
              {
                 {y=true;}
              }
           }

ある順番とは関係ないようですが、ループの中で何のためにあるのでしょうか?

クロージングループの前に確認します。