[警告は閉鎖されました!】フォーラムを乱雑にしないために、どんな初心者の質問でも。プロフェッショナルは、通り過ぎないでください。あなたなしでは、どこにも行けない。 - ページ 858

 

素朴な疑問なのですが、思いつきません。

ある時点では4つのポジションが空いて います。以下の方法ですべて閉じようとしています。

for (int i=0;i<OrdersTotal();i++)
  {
    if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
      {
        if(OrderType()==OP_BUY)
           OrderClose(OrderTicket(),OrderLots(),Bid,3,White);
        if(OrderType()==OP_SELL)
           OrderClose(OrderTicket(),OrderLots(),Ask,3,White);
      }
  }

しかし、それらはすべてではなく、一つを通して閉じられています。実際には、2,4,6,7という数字を持っています。そのため、2位と6位がクローズアップされています。

その仕掛けとは?

 
usver:

素朴な疑問なのですが、思いつきません。

ある時点では4つのポジションが空いています。以下の方法ですべて閉じようとしています。

しかし、それらはすべてではなく、一つを通して閉じられています。実際には、2,4,6,7という数字を持っています。そのため、2位と6位がクローズアップされています。

キャッチは何ですか?


仕掛けは、ポジションがクローズ された後、OrderSelect(i,SELECT_BY_POS,MODE_TRADES)で番号が変わり、同時に全てがクローズできないこと

SZY:FTS Iにとても助けられました。キム、余分なブラケットを削除し、1行に引き込むなど、少し変更しました。

//+------------------------------------------------------------------+
void CloseAllFirstProfit() {
   int i, k=OrdersTotal();
   for (i=k-1; i>=0; i--) if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) if (OrderType()==OP_BUY || OrderType()==OP_SELL) if (OrderProfit()+OrderSwap()>0) ClosePosBySelect();
   k=OrdersTotal();
   for (i=k-1; i>=0; i--) if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) if (OrderType()==OP_BUY || OrderType()==OP_SELL) ClosePosBySelect();
}
//+------------------------------------------------------------------+
void ClosePosBySelect() {
   if (OrderType()==OP_BUY)  OrderClose(OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(), MODE_BID), 10, CLR_NONE);
   if (OrderType()==OP_SELL) OrderClose(OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(), MODE_ASK), 10, CLR_NONE);
}
//+------------------------------------------------------------------+

フォーラムを検索すると、オリジナルが見つかります。

 
IgorM:


は、ポジションを閉じた後、OrderSelect(i,SELECT_BY_POS,MODE_TRADES)の番号が変わり、すべてを同時に閉じることができないことです

SZY:FTS Iにとても助けられました。キム、余分なブラケットを削除し、1行に引き込むなど、少し変更しました。

フォーラムを検索すると、オリジナルが見つかります。


ヒントと例をありがとうございました。調べてみます。

途中、もうひとつ質問させていただきます。

タスクは以下の通りです。私は、ストップロスによって引き起こされたどの注文タイプが閉じられたかを判断し、ストップロスによって閉じられた将来の注文を以前のものと比較する必要があります(つまり、それらのタイプを比較する)。ドキュメントに目を通しましたが、最後のイベントの処理に関連するものは見つかりませんでした。

この時、設定した境界線(Bid-OrderOpenPrice() >=TP*Point)に到達したら注文を閉じるという操作を実装しました。これにより、最後に決済された注文のタイプを変数に格納して、決済されたばかりの注文と比較することができました ( if(type==OrderType()))).テストでは問題なく動作しているのですが、逆指値を使って実装したいのです。

OrderSelect() とMODE_HISTORY引数を使って、ヒストリーからクローズドオーダーを選択しようとしました。注文を決済する条件がないため、OrdersTotal()変数の変化がストップロスのトリガーとなる可能性があります。しかし、最後に閉じた注文の番号がわからない(番号は常に変化しているため)、あるいはその方法がわからないという問題が発生しました。

問題は、逆指値を使ってどのように実行するかということです。もしかして、もっと簡単な方法があるのでは?さて、思考の方向性が正しいのであれば、最後のクローズド・オーダーはどうやって見つけるのでしょうか?

 
IgorM:


ポジションを閉じた後に OrderSelect(i,SELECT_BY_POS,MODE_TRADES) で番号が変更 され、すべてのポジションを同時に 閉じることができなくなりました。

SZS:I.Kimさんの機能にはとても助けられました。余分な括弧を取り除き、1行にまとめるなど、少し変更しました。

フォーラムを検索すると、オリジナルが見つかります。

もう十分だろう...。をひとまとめにしています。
https://docs.mql4.com/ru/trading/OrderSelect
 
usver:

素朴な疑問なのですが、思いつきません。

ある時点では4つのポジションが空いています。以下の方法ですべて閉じようとしています。

しかし、それらはすべてではなく、一つを通して閉じられています。実際には、2,4,6,7という数字を持って います。そのため、2位と6位がクローズアップされています。

何が問題なのか?

番号順なのか、チケット順なのか?

 
abolk:

番号順なのか、チケット順なのか?


私自身、すでに混乱しています。チケットですが、状況を明確にするために渡しました。一つずつ閉じていく。
 

やったー!うまくいったー!!!(笑)。


Victor ありがとうございます。

 
abolk:
さっきの話...一山
https://docs.mql4.com/ru/trading/OrderSelect


注文のグループ内で持ち帰りやストップを変更・削除してみる - 作業は単純ですが、注文の選択がOrderSelect(i,SELECT_BY_POS,MODE_TRADES)で行われたとき、ループ本体の中で注文番号が変わり、すでに変更した(持ち帰りなし)注文が何度も変更されたことがあります - エラー1、だからこそ私はeverが 同様の問題を持つことを提案しました。

例えば、5本ごとに再計算させたいのですが、どうすればいいですか?

 
IgorM:


インジケータを複数のバーの終値で再計算させる方法について教えてください。

プログラミングについて知っているんですね。

これは論理的な課題なので、あまり頭がよくなくても解ける。頭を使って考える。

さまざまなケースがあります。具体的にどこで、どのようなTFで、どのように再リンクを行うか、など。質問にどう答えるか。

小節の時間を記録し、5小節後にこの時間をリセットして再び記録します。ゼロ時刻の時に、再計算する条件を入れることができます。関数 iTime(NULL,0,0) を使用すると便利です。あとは、すべて理屈です。

 
IgorM:


インジケータを複数のバーの終値で再計算させる方法について教えてください。


この方法は、おそらく最も信頼できるものではありませんが、アイデア(例えば下書き)を試すだけでも効果があるでしょう。

Bars変数を使用し、その変化を把握する。5増加、記憶している、など。

理由: