サイクルオペレーター「for」の質問 - ページ 4

 

Simonです。

OK、念のためEAにストップレベルも追加してみます。

あはは!USDJPYのフリーズ レベルは0、ストップレベルは30です。

ブローカーが5桁なので、30は3を表しているのだと思います。MODE_SPREADで試したところ、20が表示されました。明らかにUSDJPYのスプレッドは20ではないですが ;)2.0.2pipsが20ポイントに相当するとも言えます。

ありがとうございました。

 

あなたへのヒント .. . .

 

サイモン

これは、再び注文を選択する問題であるように思われます。

OrderClose()関数は注文を閉じようとしています(USDJPYの注文ではありません)。EURUSDのチャート 上で注文を閉じようとしています。

OrderPrint()関数は以前、実行前に選択されており、明らかに意図された目的に類似しています。

無効な価格を囲む赤色は、WRONGを示さなければなりません。

USDJPYを囲む緑色はrightを示すに違いない。

もしそうなら、私は赤い丸に注目し、OrderClose()関数が実行される前に注文を選択しなければなりません。

ありがとうございました。

 
WhooDoo22:


BidとAskとは何ですか?

アスクとは、現在のシンボルの最新の既知の売り手側の価格(アスク価格)です。

ビッドは、現在のシンボルの最新の既知の買い手の価格(オファー価格、ビッド価格)です。

クローズが失敗した理由はもうお分かりですね ... ... 少しだけ注意深く考えてみてください。


あなたのコードを見てください、注文を閉じるためにどのような価格を使用していますか?

 

サイモン

Ask/Bid は、現在のシンボルに対する最新の既知の売り手/買い手価格です。

EAが注文を成立させたい価格はEURUSDシンボル価格です。

なぜEAは注文を閉じるためにUSDJPYのチャートに配置されることに依存しているのですか?OrderSelect()関 数はチケット番号を選択するためのもので、チケット番号が選択されると、EAは次に選択することができました。

どうやら、EAがUSDJPYシンボルのチャート上にいなければ、その上で注文を閉じることはできないようです。


今言ったことをすべて掻い摘んでください。

これが解決策です。エラーは3番目のパラメータにあります。シンボルを指定して、そのパラメータ(OrderClose()関数の第3パラメータ位置)にask/bid変数を配置することを検討しています。これによって、思考から不明瞭な部分を取り除くことができるはずです。

ありがとうございました。

 
WhooDoo22:.

これが解決策です。エラーは第3パラメータにあります。私は、シンボルを指定して、そのパラメータ(OrderClose()関数の第3パラメータ位置)内にask/bid変数を配置することを検討しています。これは、思考から任意の不明瞭さを削除する必要があります。

ありがとうございました。

Bidと Askは 定義済み変数で、EAが現在いるチャートにのみ 関連します。 EAがいるチャートと異なるシンボルのBidやAskが欲しい場合、定義済み変数のBidとAskは使用できません。 MarketInfo()は使用できますが ;-)です。
 

Simonです。

エラーはOrderClose()関数の 3番目のパラメータにあります。)アスク/ビッドは、現在のシンボルに対する 最新の既知の売り手/買い手の価格です。もし「現在のシンボル」が EAが置かれている現在のチャートを意味するのであれば、これは少し紛らわしいかもしれません。MQL4は長い歴史があり、独自の図解と表現方法を持っていることを忘れてはいけません。

解決策としては、Ask/Bidの定義済み変数の代わりに、次のようなものを使用することです。

// solution 1.

MarketInfo("USDJPY",MODE_BID);

// solution 2.

MarketInfo("USDJPY",MODE_ASK);

いかがでしょうか?


このEAに、USDJPY注文の情報を印刷し、どのチャートに置かれても決済できる機能を追加しました。USDJPY注文のSLとTPが変更されているかはまだ確認していませんが、検証次第確認します。このEAが最終的に出すエラーは、解決するのが難しいものではありません。現在作業中です。エラーの読み取りのスナップショットはこちらです。

無効チケットエラー

ありがとうございます。

ファイル:
 
WhooDoo22:

Simonです。

エラーはOrderClose()関数の3番目のパラメータにあります ;)アスク/ビッドは、現在のシンボルに対する 最新の既知の売り手/買い手の価格です。もし"for the current symbol " がEAが置かれている現在のチャートを意味するならば、これは少し紛らわしいかもしれません。MQL4は以前からあるもので、独特の図解や表現方法があることを忘れてはいけませんね。

解決策は、Ask/Bidの定義済み変数を、次のような代替品に置き換えることです。

どうでしょうか?


このEAには、USDJPY注文の情報を印刷し、どのチャートに置かれても決済できる機能を追加しました。USDJPY注文のSLとTPが変更されているかはまだ確認していませんが、検証次第確認します。このEAが最終的に出すエラーは、解決するのが難しいものではありません。このエラーの読み取りをスナップショットでご覧ください。


ありがとうございました。

そして今、あなたは自分のコードの限界を見たのです。... USDJPYの注文がないため、whileはポジション0の注文を見つけ、それはUSDJPYではなく、次に1の注文を見つけ、それはUSDJPYではなく、ポジション2を見て、OrderSelect()が失敗し、whileは終了しますが、残りのコードが実行され、これはOrderModify()、OrderPrint()の失敗、OrderType()、OrderClose()を失敗させたことを意味します .... GetLastError()はそれ自体で何をしているのでしょうか?
 

サイモン

サイクル「while」演算子は、このように実行されます。式が真であれば、式が偽になるまで演算子が実行されます。式がfalseの場合、制御は次の演算子に渡されます。

下のSRCボックスのコードの目的は、次のようなものです。

変数 'i' (OrderSelect() 関数に 含まれる) が USDJPY チケットポジション番号でなく、注文シンボルが USDJPY でない間、変数 'i' は変数 'i' が USDJPY チケットポジション番号で注文シンボルが USDJPY となるまで増加 します。while'サイクルが偽になると、制御は次のコードの行に渡されます。

視覚的な補助のために、'while'ヘッダーとボディを提供しました。

while(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true && OrderSymbol()!="USDJPY")

i++;

USDJPYの通貨ペアにチケットがなくても、'while'サイクルがどのようにチケットを見つけるか理解していると思いますが、;)残念ながら、私は理解していません。

USDJPY チャート上に検索する注文がない場合、'while' サイクルはどのようにして USDJPY チャート上のチケットを検索するのでしょうか?

私はあなたが位置0に順序を見つけるという線に沿って何かを書いたと信じています。

ありがとうございました。

 
WhooDoo22:


私はあなたが'while'サイクルがUSDJPYの通貨ペアに現在チケットがなくても、チケットを見つける方法を理解していると信じています。)残念ながら、私はそうではありません。

USDJPYのチャート上に注文がない場合、'while'サイクルはどのようにしてUSDJPYのチャート上のチケットを見つけることができるのでしょうか?

私は、あなたがポジション0に注文を見つけるという線に沿って何かを書いたと信じています。

もしあなたが自分自身のためにコードを書きたいのであれば、3人、いや4人分の仕事をこなす必要があります。要件定義書を作成する人、ソフトウェア技術者、テスト技術者。構文を逆から知っていて、コードを書けるだけでは十分ではありません。解決しようとしている問題とその解決方法を理解し、コードが要件を満たしていることを確認するためのテスト 方法を知っている必要があります。

基本的なレベルでは、これはあなたのコードを一行ずつ調べて、それがあなたがやりたかったことを行うことを確認することを意味します。一般的にこれは、各変数の値の範囲を最小値から標準値を通って最大値まで行くことです。


これをwhileループでやってみましょう ... ...

int 変数を宣言し、その値を設定しない場合、それは0から 始まる値を持っています。そのため、OrderSelect()は位置0の 注文を選択しようとします。それがうまくいくと、OrderSymbol()は位置0の注文の正しいシンボル名を返し、もしそれが「USDJPY」でなければ、式(OrderSymbol() != もしOrderSelect()が真で シンボルチェックが なら真と 真=真と なり、次のコード行(これはwhileループの中です)が実行さ れるでしょう

ここでi は 1 であり、OrderSelect() はポジション 1 の注文を選択するので、結果はtrue
となり、シンボルチェックでは USDJPY のシンボルが見つからなかったので、true が返されます。シンボルチェックではUSDJPYの シンボルが見つからないので trueを 返し、再びtrueと true = true なのでi++が再び実行されます

さて、iは
2ですが、OrderSelect()はポジション2のオーダーを選択しようとしますが失敗します ....... 開いている注文は0と1の2つだけなので、OrderSelect()はfalseを 返し、OrderSymbol()は何をするのでしょうか? 有効な注文は選択されていません .しかし、たとえそれが奇妙な理由で真を 返したとしても、OrderSelect()はすでに真 = 偽を返して います ... while ループは終了し、i は 2 に設定されます。

さて、i2 という値であることを念頭に置いて、残りのコードに取り組んでください ... ...