EAが買い注文と売り注文を混在させる - ページ 3

 
WHRoeder:

int OrderType = OrderType() はOKではなく、一方が他方を隠している可能性があります(ローカル宣言はエラーなしでグローバルを隠します。) Try

int orderType = OrderType()

元のコードは、... ... ... ...

int orderType;
   for(cnt = total-1; cnt >= 0; cnt--)
   {
      while (!OrderSelect(cnt, SELECT_BY_POS)) {Sleep(500);}
      orderType = OrderType();

.これは事実上、あなたが提案しているものと同じですね?

私はdvarrinが 彼の問題は彼のチケット番号にあると言って いると思います。

 

ということはありません。

ループの外側で宣言したOrderTypeは、効果的に次のCycleに転送され、たとえエラーが発生しても、その値は次の条件に入ることになります。

ループ内で宣言し、OrderType()の値を即座に設定すれば、このようなエラーは発生しないでしょう。

(OPさんの問題ではないかもしれませんが、他の問題を防ぐことができるかもしれません) 試さずにどうするのでしょうか?

また、スリープで0.5秒はちょっとやりすぎです。whileループは10ミリ秒のスリープタイマーで問題ないはずで、CPU負荷に何ら影響を与えません(まあ、ほとんど:P)。

 
forexCoder:

ということはありません。

ループの外側で宣言したOrderTypeは、次のCycleに効率的に転送され、たとえエラーが発生しても、その値は次の条件に入ることになります。

ループ内で宣言し、OrderType()の値を即座に設定すれば、このようなエラーは発生しないでしょう。

(OPさんの問題ではないかもしれませんが、他の問題を防ぐことができるかもしれません) 試さずにどうするのでしょうか?

また、スリープで0.5秒はちょっとやりすぎです。whileループは10ミリ秒のスリープタイマーで問題ないはずで、CPU負荷に何の影響もありません(まあ、ほとんど:P)。


EAのフォワードテスト時に「手動で確認する」を使っているのが問題なのではないかと思っているのですが、具体的にどうなっているのかがわかりません。

ただ、OrderTypeという変数が同名のメソッドに干渉することはありえないということと、宣言の位置は私の問題とは関係ない、ということだけは分かっています。

問題は、OrderSelect()を使用した 後、OrderTicket()、OrderStoploss()、・・・が同じ注文のデータを与えないことです。

ローカル変数を使用し、OrderSelect()を呼び出した後にそれらを設定すると動作しますが、OrderTicket()やOrderStoploss()を直接使用すると、間違った値を与えてしまうのです。


なぜ私のコードでは、OrderStopLoss() が "for" ループの同じ反復の中で他の注文のストップロスを返しているのですか?

 

以下は、EAの完全なコードです。

問題はupdateFbOrders()メソッドの最初の "for "ループにあります。

テストするために、私はチャート上にアリゲーターとフラクタルインジケーターを追加し、最後の上昇フラクタルがアリゲーターラインの上にあり、最後の下降フラクタルがアリゲーターラインの下にあるチャートを探します。

そうすると、保留中の買い注文と売り注文が作成されるはずです。もし、いずれかのフラクタルがブレイクアウトしたならば、即座に注文を出す。

そして、フラクタルが変化するたびに各注文のストップロスを修正しますが、間違った注文のストップロスをセットしてしまいます。

アラートウィンドウを確認し、以下のようなメッセージを探してみてください。Count:1 買い注文のストップロス1.41008000。46454014 orderType:そして、46454014という注文を確認すると、それは実際には「売り」注文であることがわかります。そして、ストップロスが変化しなくても注文を修正し続けるのですが、これはストップロスのレベルを間違えて いるためです。
ファイル:
 

これはバカだ。コード全体を貼り付けているわけではないんですね。

あなたが持っているのは

areBuyOrdersInProfitAt

関数が ありますが、これは内部には見えませんので、それを貼り付けてください。今までのところ、どこかでミスをしている可能性が高いです。OrderSelect関数を他の場所で使っていませんか?

また、longSLとshortSLの変数はどこに設定されていますか?その部分のコードも貼り付けてください。

EDIT: 私がタイプしている間に貼り付けてくれたので、今新しい投稿を見ています。

 
forexCoder:

これはバカだ。コード全体を貼り付けているわけではないんですね。

あなたが持っているのは

areBuyOrdersInProfitAt

関数がありますが、これは内部には見えませんので、それを貼り付けてください。今までのところ、どこかでミスをしている可能性が高いです。OrderSelect関数を他の場所で使っていませんか?

また、longSLとshortSLの変数はどこに設定されていますか?その部分のコードも貼り付けてください。

EDIT: 私がタイプしている間に貼り付けてくれたので、今新しい投稿を見ます。

こんにちは、forexCoderさん

前の投稿にEAを追加しました。


しかし、あなたが問題を指摘したと思います:私は "areBuyOrdersInProfitAt "メソッドでOrderSelect()を使って います :-)))))))))))))))))))))))))))))))))))))))))。

 

はい、思ったとおりです。

areBuyOrdersInProfitAtには別のOrderSelect関数が入っていて、元のスニペットのものがやっていることを上書きしているのです。このareBuyOrdersInProfitAt関数が戻ってくると、OrderSelectが変更され、チケットも変更されます。この場合、常にリストの最後のオーダーをここで取得する必要があります。

 

いったんOrderSelectを forループで使い 始めると、すべての注文を通過するため、その中に別のOrderSelect forループを作らない方がよいでしょう。

あなたはかなり長いコードを持っているので、私はそれを修正する気があまりありません(sry:P)しかし、あなたは今、正しい方向へのポインタを得ました。

 
dvarrin:

しかし、あなたが問題を指摘したと思います:私は "areBuyOrdersInProfitAt "メソッドでOrderSelect()を使っています :-))))))))))))))))))))))))))))))))))))))。

解決に近づいているようでよかったです :-)
 
RaptorUK:
解決に向かっているようでなによりです :-)
皆さん、本当にありがとうございました。本当に私がしたことは愚かなミスでした :-(