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

 
では、科学者諸君、なぜマジックは2で止まり、ユニークは止まらないのか、説明してください。ソースコードでは、10個のオーダーを開き、それぞれにユニークなマジックをインクリメントし、そのユニークさをネストしたループで比較(!=)することでチェックします。

ややこしいかもしれませんが、コードを見ていただくとわかりやすいと思います。
ファイル:
 
pribludilsa #:
つまり、フォームの便利なところは、項目をいくつも与えることで、ある配列を埋めることができることです。ArrayResizeはポジションの数に関連しているため、0が供給されるとすべてがクラッシュします。そのため、ポジション数が0以上の場合は、このループに入るという条件を追加しています。私もいつもそれで失敗しているので、今、改めて確認しました。そうしないと、フォルテは配列の0番目の要素を埋めることができないので、このアドバイスは正しいです。

そうなんです、これが原因でトラブルが絶えないんです。この明確化によって、バグフィックスに費やす時間が何倍にもなることを期待しています。

 
Nerd Trader #:
では、科学者の皆さん、なぜマジックは2で止まり、ユニークは止まらないのか、説明してください。ソースコードでは、10個のオーダーを開き、それぞれにユニークなマジックをインクリメントして割り当てます。そのユニークさは、入れ子ループで比較(!=)することでチェックします。複雑すぎてよくわかりませんが、コードを見ればわかりやすいと思います。

異なる魔導師で10個のオーダーを作るループが必要なら、それはそれでいいんじゃないでしょうか。

    for(int i = 0; i < 10; i ++)
    { 
    int order_send = OrderSend(Symbol(), OP_BUY, 0.01, Bid, 10,
    0, 0, "", i, 0, CLR_NONE);
    if(order_send == -1) ResetLastError();
    }

この場合、私はループをコントロールするだけでなく、オーダーのマジシャンという役割も担っています。


しかし、あなたの例では、多くのエラーがあり、一種のパズルのようなものが出来上がってしまっています。その理由は何なのか、徹底的に調べる人は少ないだろうが...。

まあ、少なくともオーダーループはおかしいんだけど...。しかも魔法の変数はローカルで常にリセットされるし...。(蓄積されない)

 
Nikolay Ivanov #:

異なる魔導師で10個のオーダーを作るループが必要なら、それはそれでいいんじゃないでしょうか。

この場合、私はループをコントロールするだけでなく、オーダーのマジシャンという役割も担っています。


しかし、あなたの例では、多くのエラーがあり、一種のパズルのようなものが出来上がってしまっています。その理由は何なのか、徹底的に調べる人は少ないだろうが...。

まあ、少なくともオーダーループはおかしいんだけど...。しかも魔法の変数はローカルで常にリセットされるし...。(蓄積されない)

このコードはテスト用で、EAがこのようなループで注文を作成することはありません。テストに含めるべきではないロジックがあります。魔法はクリアすべきものであり、蓄積される理由はない。そして、ここには理解すべきことは何もありません。2つのネストされたループがあり、その中には数行のコードがあるだけです。

 
Nerd Trader #:

そうなんです、これが原因でトラブルが絶えないんです。この明確化によって、バグフィックスに費やす時間が何倍にもなることを期待しています。

私も理解するのに時間がかかりました。皮肉なことに、他のユーザーがここに同じことを投稿しているのと同時に、私もそれを理解し始めたのです。正しいコピペをしてから整理して、ループの入力だけ確認して出力を忘れたので、間違って書いてしまったのです。チェック値を強制して、プリンターでコードを確認する。
 
Nerd Trader #:

このコードはテスト用で、EAがこのようなループで注文を作成することはなく、このためのロジックがありますが、テスト用に追加するべきではありません。なぜオーダーループがおかしいのか、魔法はリセットされるべきで、たまる理由がない。

1はありません。

for(int i = OrdersTotal()-1; i >= 0 ; i --)

もし魔法がそのように設計されているとしたら、論理(全体の設計)に誤りがあることがわかり、それを見つけるためにパズルを解かなければならない......。

 
Nikolay Ivanov #:

ノー・ワン

もし魔法がそのように設計されているのなら、論理(全体の設計)に誤りがあるのだから、パズルを解いてそれを見つけるしかない......。

これでなければね。しかし、そこでも-1では何も解決しない。なぜエラーになるのですか?magicがオーダー数と同じかそれ以上の場合に与えられる。マジックはゼロにする必要があります、そうでなければ我々はマジック5と6でいくつかの注文を閉じると、新しいものは、最後の注文のマジック、すなわち11から12などよりも高くなります。そして、このようにオーダーがゼロになると、ゼロから比較・反復され、その結果、閉じたもののマジックを持つ新しいオーダー、つまり5と6が生まれる......というわけです。

 
pribludilsa #:
私も理解するのに時間がかかりました。皮肉なことに、ここで他のユーザーが同じことを書き込んでいるのと同時に、私もそれを理解し始めたのです。正しいコピペをしてから整理して、ループの入力だけ確認して出力を忘れたので、間違って書いてしまったのです。チェック値を強制して、プリンターでコードを確認する。
mql4にはまともなデバッガがないのがとても困る。上記ソースの実データでも、デバッガがループに入らない。プリントでやりくりしていますが、深刻ではありません。
 

基本的にはシンプルで、あなたのユニークは、異なるマジシャン間のミスマッチな注文をすべてまとめる...というものです。

例えば、3つの注文がある場合

最初の反復でmagic=1unique=0、反復の終わりでunique=2に なる。

2回目の反復でmagik=2unique=2、反復終了時にuniqueは=3に なる

3>=全注文の数なので、whileループは壊れますが...。そして魔法=3は確認されなかった...。だから、魔法はまた2であり、すべてにおいてそうである。

 
pribludilsa #:
そうなんですか、ありがとうございます。しかし、それは松葉づえ であることがわかった。mqlの 件と同じですね。

より多くのすべてのプログラミング 言語を目指します。

単純なことです。プログラミング言語では、カウントはゼロから始まります。配列の最初のセルのインデックスは0になります。したがって、それを含むゼロの前に逆ループを行う必要があります。すなわち >=0

OrdersTotal()は、例えば10と出力します。そして、配列の最後のインデックスが9であるのに対して、10からループを開始します(ゼロから開始することをお忘れですか)。また、存在しない配列セルにアクセスした場合はどうなるのでしょうか?その通りです。配列の限界を超えて、メモリの未割り当て領域に入って しまったため、プログラムはクリティカルエラーでクラッシュします。

これは確かにしっかりした松葉杖 です。読めば、学べば、すべてが見えてくる。