どんな新人の質問でも、フォーラムを乱雑にしないように。プロフェッショナルは、通り過ぎないでください。Nowhere without you - 6. - ページ 408

 
khorosh:
コードの正しさを評価するには、作者が何を得ようとしたのかを正確に知る必要があります。あなたの情報は不十分です。何を手に入れたかったのかが、よくわからない。グリッド閉鎖後に反対注文を出し、価格が最後の注文の方向に何ポイントか通過することを期待して損失を補填したい場合、この注文のロットと価格が有利な方向に通過する距離の両方によって補填プロセスが決まります。つまり、ロットを計算するときに、損失を補填するために価格が通過しなければならない距離も定義する必要があるのです。でも、もしかしたら別の意味かもしれませんね。


そうですね、もっと正確に書くべきでした。ただ、この機能が何をするものなのか、すでに2回ほど全文を並べたのですが、誰も答えてくれません。もう一度、この関数がすべきことを説明します。例えば、注文のグリッドがあるとします。同じステップで開くかどうかは問題ではありません。ある注文は早く、別の注文は遅く、つまりすべてのポジションは異なるロットで異なる量のポイントを通過しています。ある条件によってグリッドが閉鎖され、そのグリッドから発生する損失をカバーするために必要なLOTをTPポイントで計算する必要があります。ミラー関数を2つ書くのを避けるために、関数にtypeパラメータを導入しています。

しかし、どこかで間違えてしまった。修正にご協力ください。

double FindRightLot (int otype) // функция поиска лота, необходимого для выхода из просадки после 
                               //закрытия сетки ордеров
{
  double Lot=0; double TotalLot=0;
  for (int i = OrdersTotal()-1; i>0; i--)
  {
    if (OrderSelect(i, SELECT_BY_POS,MODE_TRADES))
    {
       if (OrderSymbol()==Symbol() && OrderMagicNumber()==Magic && OrderType() == otype)
       {
         if (otype == OP_BUY)
         {
           Lot = NormalizeDouble (((OrderOpenPrice()-Bid)*Point)*OrderLots()/TP,2); 
           if (Lot>0)
           {
              TotalLot= TotalLot+Lot;
           }
         }
           
       
         else if (otype == OP_SELL)
         {
           Lot = NormalizeDouble (((Ask-OrderOpenPrice())*Point)*OrderLots()/TP,2);
           if (Lot>0)
           {
            TotalLot= TotalLot+Lot;
           }
           
         }
       }
     }
   }
   return (TotalLot);
   
 }
 
BeerGod:

ゼロから始まるように正しく実装する方法はありますか?可能であれば、コードの一行をお願いします。
注文の)リスト全体を任意の方向に調べ、Ticketの値を配列に入れ、この配列をブルートフォースして注文を削除する。
 
BeerGod:

0から始まるクローズを正しく実装する方法はありますか?可能であれば、コードの一行をお願いします。


ただ、クイックフィックス。

//+------------------------------------------------------------------+
//|                 Закрыть все ордера                               |
//+------------------------------------------------------------------+


double ClossAllOrders ()

{
  for(int i=0; i<OrdersTotal(); )
  {
    if ( !OrderSelect(i, SELECT_BY_POS) )
      break;
    
    int type   = OrderType();

    bool result = false;
    
    switch(type)
    {
      //Close opened long positions
      case OP_BUY       : result = OrderClose( OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(), MODE_BID), Slippage, Lime );
                          break;
      
      //Close opened short positions
      case OP_SELL      : result = OrderClose( OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(), MODE_ASK), Slippage, Lime );
                          break;

      //Close pending orders
      case OP_BUYLIMIT  :
      case OP_BUYSTOP   :
      case OP_SELLLIMIT :
      case OP_SELLSTOP  : result = OrderDelete( OrderTicket() );
    }
    
    if(result == false)
    {
      Print("Order " , OrderTicket() , " failed to close. Error:" , GetLastError() );
      i++;
      Sleep(500);
    }  
  }
}

// End
 
Trader7777:

そうですね、もっと正確に書くべきでした。ただ、この機能が何をするものなのか、すでに2回ほど全文を並べたのですが、誰も答えてくれません。もう一度、この関数がすべきことを説明します。例えば、注文のグリッドがあるとします。同じステップで開くかどうかは問題ではありません。ある注文は早く、別の注文は遅く、つまりすべてのポジションは異なるロットで異なる量のポイントを通過しています。ある条件によってグリッドが閉鎖され、そのグリッドから発生する損失をカバーするために必要なLOTをTPポイントで計算する必要があります。2つのミラー関数を書かないために、関数にotypeパラメータを導入しました。

しかし、それでもどこかでエラーが出ている。修正にご協力ください。



私なら別ルートをとりますね。まず、グリッドを閉じたときの損失を計算します。といった具合にシンプルです。損失=次の注文による利益注文による利益をロットとTPで表し、式からロットを求めます。
 
Contender:


簡単な手仕事です。


ありがとうございました!すべて正常に動作しています!ご対応いただいた皆様、ありがとうございました。


 
khorosh:
私なら別ルートをとりますね。まず、グリッドを閉じたときの損失を計算します。といった具合にシンプルです。損失=次の注文による利益注文による利益をロットとTPで表し、式からロットを求めます。


グリッド終了時の損失は、マネーかピップスか?
 
Trader7777:

グリッドを閉じたときの損失は、マネーなのかピップスなのか?
預入通貨 で。
 
各ペアでポイント価格が違うというのはどうでしょうか?
 
Trader7777:
各ペアでポイント価格が違うというのはどうでしょうか?
なぜ、そんなことをしたいのですか?
 
Trader7777:
各ペアでポイント価格が違うというのはどうでしょうか?

ここでは、その実装の様子をご覧いただけます。


https://www.mql5.com/ru/code/7275

https://www.mql5.com/ru/forum/113937/page2

https://docs.mql4.com/ru/constants/marketinfo