初心者の方からの質問 MQL5 MT5 MetaTrader 5 - ページ 890

 

Expert Advisorがあり、保留中の注文が いつトリガーされたかを判断することができます。

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

SELL_STOP注文のチケットを取得するために使用しています

というコードに変更しました。

//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   if(bln_find_order) // true -> you should look for a order
     {
      static long counter=0;
      Print("Attempt number ",counter);
      ResetLastError();
      if(HistoryOrderSelect(ul_find_order))
        {
         long type_order=HistoryOrderGetInteger(ul_find_order,ORDER_TYPE);
         if(type_order==ORDER_TYPE_SELL_STOP)
           {
            Print("The pending order ",ul_find_order," is found! Type of order is ",
                  EnumToString((ENUM_ORDER_TYPE)HistoryOrderGetInteger(ul_find_order,ORDER_TYPE)));
            bln_find_order=false;         // true -> you should look for a order
            counter=0;
            return;
           }
         else
           {
            Print("The order ",ul_find_order," is not pending");
            bln_find_order=false;         // true -> you should look for a order
            return;
           }
        }
      else
        {
         Print("Order ",ul_find_order," is not find, error#",GetLastError());
        }
      counter++;
     }
  }

ある瞬間までは、すべてがうまくいっている。履歴に別の注文タイプが表示されるまで。

例えば、SELL_LIMIT。

実施例

履歴にSELL_LIMITが表示されると同時に、前回のSELL_STOPのチケットが取れなくなりました。

Expert Advisorがエラーを投げる。

命令9は保留されない

履歴にSELL_STOPがありますが

7番のチケットが必要なのに、なぜ9番の注文を受けなければならないのですか?

Expert Advisor が必要な注文を履歴のすべてではなく、最後の1つだけを検索しているように感じられる。
TypePendingOrderTriggered
TypePendingOrderTriggered
  • 投票: 21
  • 2017.02.14
  • Vladimir Karputov
  • www.mql5.com
()   {    (bln_find_order)      {        counter=;       (,counter);       ();         {          (type_order== || type_order== ||             type_order== ||type_order==)            {             (,ul_find_order,,                   (()(ul_find_order,)));             bln_find_order=;                     counter=;             ;            }...
 

こんにちは。StopLoss_= 0の場合、エラーが発生します。

修正失敗 #2 sell 3.00 Si-9.18 sl: 0, tp: 62749 -> sl: 0, tp: 62774 [無効なストップ].


 if(m_position.PositionType()==POSITION_TYPE_SELL)
                 {
                  if(m_symbol.NormalizePrice(m_position.PriceOpen()-ExtTakeProfit)!=m_position.TakeProfit())
                    {
                     if(StopLoss_<=0)
                       {
                        m_trade.PositionModify(m_position.Ticket(),
                                               m_position.StopLoss(),
                                               m_symbol.NormalizePrice(m_position.PriceOpen()-ExtTakeProfit)
                                               );
                        Sleep(200);
                       }

                     if(StopLoss_>0)
                       {
                        m_trade.PositionModify(m_position.Ticket(),
                                               m_symbol.NormalizePrice(m_position.PriceOpen()+StopLoss_*m_adjusted_point),
                                               m_symbol.NormalizePrice(m_position.PriceOpen()-ExtTakeProfit)
                                               );
                        Sleep(200);
                       }
                    }
                 }
m_position.StopLoss() の代わりに0を入れると、同じエラーが 発生します。どうしたんですか?
 
Sile Si:

こんにちは。StopLoss_= 0の場合、エラーが発生します。

修正失敗 #2 sell 3.00 Si-9.18 sl: 0, tp: 62749 -> sl: 0, tp: 62774 [無効なストップ].

   if(m_position.PositionType()==POSITION_TYPE_SELL)
     {
      if(m_symbol.NormalizePrice(m_position.PriceOpen()-ExtTakeProfit)!=m_position.TakeProfit())
        {
         if(StopLoss_<=0)
           {
            m_trade.PositionModify(m_position.Ticket(),
                                   m_position.StopLoss(),
                                   m_symbol.NormalizePrice(m_position.PriceOpen()-ExtTakeProfit)
                                   );
            Sleep(200);
           }

         if(StopLoss_>0)
           {
            m_trade.PositionModify(m_position.Ticket(),
                                   m_symbol.NormalizePrice(m_position.PriceOpen()+StopLoss_*m_adjusted_point),
                                   m_symbol.NormalizePrice(m_position.PriceOpen()-ExtTakeProfit)
                                   );
            Sleep(200);
           }
        }
     }

m_position.StopLoss() の代わりに0を入れると、同じエラーに なります。何ですか?

プログラムを書く際の ロジックが正しくない。

StopLoss_0になると、上の条件、つまりTakeProfitを変更しようとする試みが発生します。この場合、TakeProfitレベルはCURRENT PRICEより高くなる可能性があり、これはエラーとなります。

あなたの場合、RIGHT PRICE(m_position.PriceCurrent)から引きます。

 
Vladimir Karputov:

売りポジションが開設さ れ、selllimitが有効になったので、現在の価格ではなく、新しいポジションの価格に相対的にTPを移動させる必要があります。

無効な価格に変更しようとしないためには、どのようなチェックをすればよいのでしょうか?

 
Sile Si:

売りポジションが開設さ れ、selllimitが有効化されました。私は、現在の価格に対してではなく、ポジションの新しい価格に対してTPを移動する必要があります。

無効な価格に変更しようとしないためには、どのようなチェックをすればよいのでしょうか?

チェックする。

if(m_position.PriceOpen()-ExtTakeProfit<m_position.PriceCurrent()
   {
    m_trade.PositionModify(m_position.Ticket(),
                           m_position.StopLoss(),
                           m_symbol.NormalizePrice(m_position.PriceOpen()-ExtTakeProfit)
                           );
...
 
Vladimir Karputov:

チェックする。

ありがとうございます。しかし、エラーは残っています。

アーカー

現在の価格と容認できないほど近いかもしれない。どうすれば確認できますか?

 
Sile Si:

ありがとうございます。しかし、エラーは残っています。

現在の価格と容認できないほど近いかもしれない。どのように確認するのですか?

取引所を利用できないので、自分でやるか、FXの金融商品に取り組むか、どちらかです。すみません。


追加:別のチェックを導入 - 売りポジションの新しいTakeProfit(計算値)は、ポジションの現在のTakeProfitより高くないか等しくなければなりません。

 
Vladimir Karputov:

取引所を利用できないので、自分でやるか、FXの金融商品に取り組むか、どちらかです。すみません。


追加:別のチェックを導入 - 売りポジションの新しいTakeProfit(計算値)は、ポジションの現在のTakeProfitより高くないか等しくなければなりません。

おそらく始値(POSITON_PRICE_OPEN)?

 
Sergey Savinkin:

おそらく始値(POSITON_PRICE_OPEN)?

このオプションは上記の通りでした。上の書き込みをご覧ください。話の途中で答えましたね。

 
Vladimir Karputov:...別のチェックを入力します - 売りポジションの場合、新しいTakeProfit(計算値)は、そのポジションの現在のTakeProfitとHIGHまたはEQUALであってはなりません。

Does not fit, modify by ATR このエラーに対して、他にどのようなチェックが可能でしょうか?すべて可能です。mt4ではSTOPLEVELがありますが、ここでは何ですか?

理由: