[ARCHIVE]フォーラムを乱立させないために、どんなルーキーの質問でも。プロフェッショナルの皆さん、通り過ぎないでください。あなたなしではどこにも行けない - 5. - ページ 346

 
hoz Vadim、ObjectSet()を使っているのに、なぜオブジェクトを再作成するのですか?

なぜ、アドバイスを求め、それに挑戦するのか?これが主流なのでしょうか?
 
FAQ:

これ以上、議論しても仕方がないと思います。

どのような議論ができるのか。価格の乖離が最大になるように注文をクローズする必要があります。ということは、値段も気になる...。つまり、(最大または最小の建値で)極端な保留中の注文を見つける必要があります。納得がいかなければ、反論すればいい。そうでなければ、やはり私が正しいのでしょうか!よくわかるんです。
 

STとTPを削除するコードです。 選択的に削除するための条件を追加しています。

何が正しく書かれていないのか?すべて削除してしまう :(

 #property show_inputs
extern bool   StopLoss     = True;    // Удалить только StopLoss
extern bool   TakeProfit   = True;    // Удалить только TakeProfit
extern bool   ALL          = True;    // Удалить все
void start()
   {
   bool   fm;
   int     i;
   double SL=OrderStopLoss();
   double TP=OrderTakeProfit();

      if (StopLoss)   SL=0;
      if (TakeProfit) TP=0;
      if (ALL)       {SL=0; TP=0;}
     
      for (i=0; i<OrdersTotal(); i++)
         {
           if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
               {
                  if (OrderType()==OP_BUY)
                     {
                        fm=OrderModify(OrderTicket(),OrderOpenPrice(),SL,TP,CLR_NONE);
                     }
                  if (OrderType()==OP_SELL)
                     {
                        fm=OrderModify(OrderTicket(),OrderOpenPrice(),SL,TP,CLR_NONE);
                     }
               }
         }
   }

それとも、他に解決策がなく、条件ごとに削除コードを書かなければならないのでしょうか?

#property show_inputs
#include <WinUser32.mqh>
extern bool   StopLoss     = False;    // Удалить только StopLoss
extern bool   TakeProfit   = False;    // Удалить только TakeProfit
extern bool   ALL          = False;    // Удалить все
void start()
   {
   bool   fm;
   int     i;

    if (StopLoss)
         {
            for (i=0; i<OrdersTotal(); i++)
               {
                 if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
                     {
                        if (OrderType()==OP_BUY)
                           {
                              fm=OrderModify(OrderTicket(),OrderOpenPrice(),0,OrderTakeProfit(),CLR_NONE);
                           }
                        if (OrderType()==OP_SELL)
                           {
                              fm=OrderModify(OrderTicket(),OrderOpenPrice(),0,OrderTakeProfit(),CLR_NONE);
                           }
                     }
               }
           return(0);
         }
      if (TakeProfit)
         {
            for (i=0; i<OrdersTotal(); i++)
               {
                 if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
                     {
                        if (OrderType()==OP_BUY)
                           {
                              fm=OrderModify(OrderTicket(),OrderOpenPrice(),OrderStopLoss(),0,CLR_NONE);
                           }
                        if (OrderType()==OP_SELL)
                           {
                              fm=OrderModify(OrderTicket(),OrderOpenPrice(),OrderStopLoss(),0,CLR_NONE);
                           }
                     }
               }
           return(0);
         }
      if (ALL)
         {
            for (i=0; i<OrdersTotal(); i++)
               {
                 if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
                     {
                        if (OrderType()==OP_BUY)
                           {
                              fm=OrderModify(OrderTicket(),OrderOpenPrice(),0,0,CLR_NONE);
                           }
                        if (OrderType()==OP_SELL)
                           {
                              fm=OrderModify(OrderTicket(),OrderOpenPrice(),0,0,CLR_NONE);
                           }
                     }
               }
           return(0);
         }
   }             

 
hoz:


Vadim、ObjectSet() を使っているのに、なぜもう一度オブジェクトを作るのですか?

その際、グラフィカルなオブジェクトを完全に作成し、設定する機能があった。その中で、作成機能を最適化しています。オブジェクトが既に存在する場合は、作成されない。自分で確認するオブジェクトを作成し、次にプロパティを変更する時間を測定します。2回目の通話はもっと短くなります。つまり、何も再現されないのです。

その結果、オブジェクトを作成するだけでなく、オブジェクトのプロパティを 変更することでカスタマイズすることも、それほど時間をかけずにできる万能機能ができました。

 
市場のトレンドを判断するEAにスクリプトを提案することはできますか?
 

最安値の売り注文を 削除する関数を書きました。 終了するショート注文の数は、トリガーされた、つまり成行注文になった買い 注文の数と同じです。

つまり、1つの買い注文がトリガーされたら、1つの売り注文を決済し、2つの買い注文がトリガーされたら、2つの売り注文を決済するのです。

以下はそのコードです。

//+-------------------------------------------------------------------------------------+
//| Удаление несработанных отложеннык шортов                                            |
//+-------------------------------------------------------------------------------------+
void DeletePendingSells(int& amountOfCurrPending)
{
   int total = OrdersTotal() - 1,
       ordersToDelete = level - amountOfCurrPending,
       s_ticket;
   amountOfCurrPendingBuys = 0;
   amountOfCurrPendingSells = 0;
   Print("DeletePendingSells: level = ", level);
   Print("ordersToDelete = level - amountOfCurrPending ; ", level, " - ", amountOfCurrPending);
   int n = 0;
   double OOP = 2.0;
   Print("функция сноса отложек DeletePendingSells");
   for (int i=total; i>=0; i--)
   {
      if (!OrderSelect(i,SELECT_BY_POS)) continue;
      if (OrderSymbol() != Symbol()) continue;
      if (OrderMagicNumber() != i_magic) continue;
      if(OrderType() != OP_SELLSTOP) continue;
      
      while (n < ordersToDelete)
      {
         if (OOP > OrderOpenPrice())
         {
             Print("OOP > OrderOpenPrice() ; ", OOP, " > ", OrderOpenPrice());
             OOP = OrderOpenPrice();
             s_ticket = OrderTicket();
             ordersToDelete--;
         }
      }
   }
}

amountOfCurrPending-保留の 買い注文の 量。

レベル- 各サイドに最初に送信される保留中の注文の数です。

OOP- 保留注文の建値、私は到達できない任意の値を取っています。

条件は以下の通りです。カウンタがordersToDeleteより 低ければ、最安値で保留中の注文を削除します。ただし、ショートポジションはすべて削除されます。どうしちゃったんだろう?

 
hoz:

最安値の売り注文を 削除する関数を書きました。 終了するショート注文の数は、トリガーされた、つまり成行注文になった買い 注文の数と同じです。

つまり、1つの買い注文がトリガーされたら、1つの売り注文を決済し、2つの買い注文がトリガーされたら、2つの売り注文を決済するのです。

以下はそのコードです。

amountOfCurrPending- 保留の買い注文の量。

レベル- 各サイドに最初に送信される保留中の注文の数です。

OOP- 保留注文の開始価格、私は任意の到達不可能な値を取っています。

条件は以下の通りです。カウンタがordersToDeleteよりも 低い場合、最も低い価格を持つ保留中の注文を削除するのです。ただし、ショートポジションはすべて削除されます。どうしちゃったんだろう?

あなたの論理が理解できない。なぜかというと、その注文はマーケットポジションに変換され、最も遠い反対側の保留中の注文が削除されたからです。
以上です。それとも、1つの値段で何度も注文しているのでしょうか?
 
artmedia70:

以上です。それとも、ワンプライスで注文できるパックがあるのでしょうか?


いいえ、注文は1回単位で...
artmedia70:
あなたの理屈は理解できない...。理由:注文が成行ポジションに変換された - 最も遠い反対側の保留中の注文が削除された。

そうやって一番遠い反対側のポジションを削除する、つまりショートポジションなので、始値が 一番低いポジションを意味します。ここでは、この関数を書き直しましたが、ここですべてが明らかになるはずです。プリントを削除して、余分な変数を削除しました。

変数amountOfCurrPending は、買いの残りの取引数を転送する。すなわち、イニシャル金額をレベルamountOfCurrPendingを 現在の注文金額とすると、現在の注文金額からイニシャル金額を引くと、その差が得られ、これがショートを消すのに必要な金額となるのです。わかりますか?

//+-------------------------------------------------------------------------------------+
//| Удаление несработанных отложеннык шортов                                            |
//+-------------------------------------------------------------------------------------+
void DeletePendingSells(int& amountOfCurrPending)
{
   int total = OrdersTotal() - 1,
       ordersToDelete = level - amountOfCurrPending,  // Количество отложек, которые требуется удалить
       s_ticket;
   amountOfCurrPendingBuys = 0;                       // Количество текущих отложек на покупку
   amountOfCurrPendingSells = 0;                      // Количество текущих отложек на продажу
   Print("DeletePendingSells: level = ", level);
   Print("ordersToDelete = level - amountOfCurrPending ; ", level, " - ", amountOfCurrPending);

   double OOP = 2.0;
   Print("функция сноса отложек DeletePendingSells");
   for (int i=total; i>=0; i--)
   {
      if (!OrderSelect(i,SELECT_BY_POS)) continue;
      if (OrderSymbol() != Symbol()) continue;
      if (OrderMagicNumber() != i_magic) continue;
      if(OrderType() != OP_SELLSTOP) continue;
      
      while (ordersToDelete > 0)                      // Если есть ордера, которые требуется удалить..
      {
         if (OOP > OrderOpenPrice())
         {
             Print("OOP > OrderOpenPrice() ; ", OOP, " > ", OrderOpenPrice());
             OOP = OrderOpenPrice();                  // Ищется ордер, с минимальной ценой открытия
             s_ticket = OrderTicket();                // Получаем тикет ордера с минимальной ценой открытия

             Print("DeletePendingSells: s_ticket = ", s_ticket);
             Print("DeletePendingSells: OOP = ", OOP);
             OrderDelete(s_ticket,Black); // Тут нужно закрыть найденный ордер, и видимо проверить, что он закрыт. И счётчик уменьшить!
             ordersToDelete--;                        // Уменьшаем количество требуемых ордеров для удаления
         }
      }
   }
   Print("DeletePendingSells: ordersToDelete = ", ordersToDelete);
}
赤でマークしたところに間違いはないでしょうか?どうすれば解決するのか?
 
hoz:

いいえ、注文は1回単位です。

こうして一番遠いポジション、つまりショートポジションなので、始値が一番低いポジションを外すということです。ここでは、この関数を書き換えてみました。プリントを削除して、余分な変数を削除しました。

変数amountOfCurrPending は、買いの残りの取引数を転送する。すなわち、イニシャル金額をレベルamountOfCurrPendingを 現在の注文金額とすると、現在の注文金額からイニシャル金額を引くと、その差が得られ、これがショートを消すのに必要な金額となるのです。わかりますか?

赤でマークしたところに間違いはないでしょうか?どうすればよりよく解けるか?
 Ищется ордер, с минимальной ценой открытия

保留中の注文のコメントにその注文番号をグリッドで指定し、対応する反対側の保留中の注文に同じ番号を書きますね。そして、マーケットポジションが見つかったら、そのコメントの数字を読んだ後、対応する反対側のポジションを、そのコメントにある同じ数字で見つけることができるのです。マジコンは別のことに使うので。

ZS.あなたのコードを読む/解析する時間はまだありません。

 
artmedia70:

私は、保留位置のコメントにそのグリッドでのシーケンス番号を書き、対応する反対側の保留位置にも同じ番号を書きます。そして、マーケットポジションが見つかると、そのコメントの数字を読んだ後、対応する反対の保留中の注文が、そのコメントの同じ数字によって問題なく見つかるのです。マジックを別のことに使うので。

ZS.あなたのコードを読む/解析する時間はまだありません。



各方向の保留中の注文の数が同じであれば、その方法で対応する保留中の注文を見つけることは問題ないですね。そして、もし違うのであれば、私の理解するところでは、これはうまくいかないでしょう。