新人对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。但修改只发生在第一个订单上,然后就出现了订单修改的错误 ERROR 1

 
Snajper007 卖单 和未平仓的买单,修改卖单的TP。但修改只发生在第一个订单上,然后出现错误OrderModify ERROR 1。

在这种情况下,TakeProfit被简单地删除

ERROR 1 -ERR_NO_RESULT 没有错误,但结果不明

 
MakarFX #:

在这种情况下,TakeProfit被简单地删除。

ERROR 1 -ERR_NO_RESULT 没有错误,但结果不明

为什么在这两个命令中,它在一个命令中被删除,而在另一个命令中没有?
 
Snajper007 #:
为什么在两个命令中,一个被删除,而另一个没有?

只有当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("Ошибка модификации  ордера на продажу");
                                       
                        }
                    
                }
               } 
             }   
           }     
 }      
同样的事情。有2个卖单,平均TP。当我们在这两个订单中打开一个买入订单时,TP应该被删除。但它只在第一阶时被删除,第二阶仍是平均的TP。
 
MakarFX #:

只有当OrderTakeProfit()>0 时才会被删除

即交易是在上升期

如果OrderTakeProfit()>0,这并不意味着该交易处于加仓 状态...这只是意味着该位置有一个TakeProfit...

 
Snajper007 #:

重写了代码。

同样的事情。有2个卖单,平均TP。当我们在这两个订单中打开一个买入订单时,TP应该被删除。但它只在第一阶时被删除,第二阶仍是平均的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个卖单 被打开,该函数计算出平均价格。然而,当第三个订单被打开时,这个函数显示了前一个和新的值(我在打印日记中检查了这一点),但结果是前一个值仍然存在。我做错了什么?
原因: