MQL4、MQL5に関する初心者からの質問、アルゴリズムやコードに関するヘルプ、ディスカッションなど。 - ページ 1718

 
// Функция модификации ордеров Sell при локировании
void Modif_Count_Lok_Sell()
{
double   Price;

      for(int pos=0; pos < OrdersTotal(); pos++)
      {
          if(OrderSelect(pos, SELECT_BY_POS, MODE_TRADES))
          {
             if(OrderSymbol()== Symbol())
             {
                if(OrderType() == OP_SELL)
                {
                   if(OrderTakeProfit() > 0)
                   {
                       if(CountBuy1() > 0) // функция для пересчёта ордеров Buy
                       {
                             Price = OrderOpenPrice();
                        double     TP3 = NormalizeDouble( 0*Point, Digits);
                          if(OrderTakeProfit() > TP3)
                          {
                         
                             if(!OrderModify( OrderTicket(), OrderOpenPrice(), 0, TP3, 0, 0))
                                        Print("Ошибка модификации  ордера на продажу");
                           }             
                        }
                    }
                }
               } 
             }   
           }     
 }      

理解を助ける。この関数のポイントは、未決済の売り注文と 未決済の買い注文がある場合、売り注文のTPを修正することです。しかし、修正は最初の1回だけ行われ、その後、OrderModify ERROR 1というエラーが発生します。

 
Snajper007 売り注文と 未決済の買い注文がある場合、売り注文のTPを修正することです。しかし、修正が発生するのは最初の1オーダーだけで、その後はOrderModify ERROR 1というエラーが出ます。

この場合、TakeProfitは単に削除されます。

ERROR 1 -ERR_NO_RESULT エラーはないが、結果は不明

 
MakarFX #:

この場合、TakeProfitは単に削除されます。

ERROR 1 -ERR_NO_RESULT エラーはないが、結果は不明

なぜ、2つの命令のうち、一方では削除され、他方では削除されないのですか?
 
Snajper007 #:
なぜ、2つの命令のうち、一方では削除され、もう一方では削除されないのでしょうか?

OrderTakeProfit() >0 の場合のみ削除されます。

あげそうば

 
MakarFX #:

OrderTakeProfit() >0 の場合のみ削除されます。

あげそうば

コードを作り直した。

// Функция модификации ордеров Sell при локировании
void Modif_Count_Lok_Sell()
{
double   Price;

      for(int pos=0; pos < OrdersTotal(); pos++)
      {
          if(OrderSelect(pos, SELECT_BY_POS, MODE_TRADES))
          {
             if(OrderSymbol()== Symbol())
             {
                if(OrderType() == OP_SELL)
                {
                   
                   
                       if(CountBuy1() > 0) // функция для пересчёта ордеров Buy
                       {
                             Price = OrderOpenPrice();
                        double     TP3 = NormalizeDouble( 0*Point, Digits);
                          
                         
                             if(!OrderModify( OrderTicket(), OrderOpenPrice(), 0, TP3, 0, 0))
                                        Print("Ошибка модификации  ордера на продажу");
                                       
                        }
                    
                }
               } 
             }   
           }     
 }      
同じことです。平均的なTPを持つ売り注文が2つあります。この両建てで買い注文を出すと,TPが削除されるはずです。しかし、削除されるのは1次だけで、2次は平均化されたTPのままです。
 
MakarFX #:

OrderTakeProfit() >0 の場合のみ削除されます。

あげそうば

OrderTakeProfit()>0 の場合、取引がプラスになって いるわけではないのですが...。ただ、そのポジションがTakeProfitを持っていることを意味し...

 
Snajper007 #:

コードを作り直した。

同じことです。平均的なTPを持つ売り注文が2つあります。この両建てで買い注文を出すと,TPが削除されるはずです。しかし、削除されるのは1次だけで、2次は平均化されたTPのままです。

ごっちゃになってるだけだろ。

まず、注文をハイライト表示します。

if(OrderSelect(pos, SELECT_BY_POS, MODE_TRADES))

しかし、その後、関数を呼び出すと

CountBuy1()

ということは、おそらくセレクションも変わってくるのでしょう...。それがメチャクチャなんです。フライとカツを切り離せば、すべてがうまくいく...。

 
Nikolay Ivanov #:

ごっちゃになってるだけだろ...。

まず、注文をハイライト表示します。

しかし、その後、関数を呼び出すと

ということは、おそらくセレクションも変わってくるのでしょう...。そして、ごちゃごちゃになる...。フライとカツを切り離せば、すべてがうまくいく...。

ありがとうございました。機能を削除したら、正常に動作するようになりました。
 
Nikolay Ivanov #:

OrderTakeProfit()>0 ならば、そのトレードが黒字 であることを意味しない...。ただ、そのポジションがTakeProfitを持っていることを意味し...

確かに、OrderProfit()と混同していましたね。
 

もうひとつ、疑問が湧いてきました。ここでは、平均価格計算機能を紹介します。

//Средний тейкпрофит для ордеров Sell
double SR_CENA_SELL()
{
double     sr_cena_sell = 0;
if(CountSell() > 1)
      {
   double     lot_price_Sell = 0;
   double     sum_lot_Sell_1  = 0;
         for (int pos=0; pos < OrdersTotal(); pos++)
           if( OrderSelect(pos, SELECT_BY_POS, MODE_TRADES))
           {
            if(OrderMagicNumber() == MN || OrderMagicNumber() == 0)
              {
                if(OrderSymbol() == Symbol() && OrderType() == OP_SELL)
                  {
                    lot_price_Sell += NormalizeDouble(OrderOpenPrice()* OrderLots(), Digits);
                    sum_lot_Sell_1   += OrderLots();
                    sr_cena_sell = NormalizeDouble(lot_price_Sell/sum_lot_Sell_1, Digits);
                    
                  }
              }
           }
           
      }
   return(sr_cena_sell);
 }
なぜか毎回再計算される。すなわち、2回目の売り注文が 出されたとき、この関数は平均価格を計算します。しかし、3つ目の注文を開くと、この機能は前の値と新しい値を表示しますが(印刷ジャーナルで確認しました)、結果的に前の値のままになってしまいます。私は何か悪いことをしたのだろうか?