Toute question des nouveaux arrivants sur MQL4 et MQL5, aide et discussion sur les algorithmes et les codes. - page 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("Ошибка модификации  ордера на продажу");
                           }             
                        }
                    }
                }
               } 
             }   
           }     
 }      

Aide à la compréhension. L'intérêt de cette fonction est que s'il y a des ordres de vente ouverts et des ordres d'achat ouverts, il faut modifier le TP de l'ordre de vente. Mais la modification ne se produit que pour un seul premier ordre, et ensuite il donne l'erreur OrderModify ERROR 1

 
Snajper007 ordres de vente ouverts et des ordres d'achat ouverts, il faut modifier le TP de l'ordre de vente. Mais la modification ne se produit qu'au premier ordre, et donne alors l'erreur OrderModify ERROR 1

Dans ce cas, TakeProfit est simplement supprimé

ERROR 1 - ERR_NO_RESULT Pas d'erreur, mais résultat inconnu

 
MakarFX #:

Dans ce cas, le TakeProfit est simplement supprimé.

ERROR 1 - ERR_NO_RESULT Aucune erreur, mais résultat inconnu

Pourquoi, des deux ordres, est-il supprimé sur l'un et pas sur l'autre ?
 
Snajper007 #:
Pourquoi des deux ordres, il est supprimé sur l'un et pas sur l'autre ?

Supprimé uniquement si OrderTakeProfit() > 0

c'est-à-dire que la transaction est à la hausse.

 
MakarFX #:

Supprimé uniquement si OrderTakeProfit() > 0

c'est-à-dire que la transaction est à la hausse.

J'ai retravaillé le code.

// Функция модификации ордеров 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("Ошибка модификации  ордера на продажу");
                                       
                        }
                    
                }
               } 
             }   
           }     
 }      
C'est la même chose. Il y a 2 ordres de vente avec un TP moyen. Lorsque nous ouvrons un ordre d'achat dans ces deux ordres, le TP doit être supprimé. Mais il n'est supprimé qu'au premier ordre, et le second ordre reste avec le TP moyenné.
 
MakarFX #:

Supprimé uniquement si OrderTakeProfit() > 0

c'est-à-dire que la transaction est à la hausse.

si l'OrderTakeProfit()>0, cela ne signifie pas que le trade est en positionplus... Cela signifie simplement que la position a un TakeProfit...

 
Snajper007 #:

J'ai retravaillé le code.

C'est la même chose. Il y a 2 ordres de vente avec un TP moyen. Lorsque nous ouvrons un ordre d'achat dans ces deux ordres, le TP doit être supprimé. Mais il n'est supprimé qu'au premier ordre, et le second ordre reste avec le TP moyenné.

Vous avez juste tout mélangé.

D'abord, vous mettez en évidence l'ordre

if(OrderSelect(pos, SELECT_BY_POS, MODE_TRADES))

Mais ensuite vous appelez une fonction

CountBuy1()

Ce qui change probablement la sélection... Et ça, c'est le bordel. Séparez les mouches des escalopes et tout ira bien...

 
Nikolay Ivanov #:

Vous avez juste tout mélangé...

D'abord, vous mettez en évidence une commande

Mais ensuite vous appelez la fonction

Ce qui change probablement la sélection... Et puis vous avez un désordre... Séparez les mouches des escalopes et tout ira bien...

Merci ! J'ai supprimé la fonction et ça marche bien.
 
Nikolay Ivanov #:

Si OrderTakeProfit()>0, cela ne signifie pas que la transaction est dans le noir... Cela signifie simplement que la position a un TakeProfit...

Vous avez raison, j'ai confondu avec OrderProfit()
 

Une autre question s'est posée. Voici la fonction de calcul du prix moyen :

//Средний тейкпрофит для ордеров 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);
 }
Pour une raison quelconque, il recalcule à chaque fois. C'est-à-dire que le 2ème ordre de vente est ouvert, la fonction calcule le prix moyen. Cependant, lorsque le troisième ordre est ouvert, cette fonction affiche la valeur précédente et la nouvelle valeur (je l'ai vérifié dans le journal imprimé) mais, en conséquence, la valeur précédente reste. Qu'est-ce que j'ai fait de mal ?
Raison: