Fragen von Neueinsteigern zu MQL4 und MQL5, Hilfe und Diskussion über Algorithmen und Codes - Seite 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("Ошибка модификации  ордера на продажу");
                           }             
                        }
                    }
                }
               } 
             }   
           }     
 }      

Hilfe zum Verständnis. Der Sinn dieser Funktion besteht darin, dass bei offenen Verkaufsaufträgen und offenen Kaufaufträgen der TP des Verkaufsauftrags geändert wird. Aber Änderung geschieht nur eine erste Bestellung, und dann gibt es Fehler OrderModify ERROR 1

 
Snajper007 Verkaufsaufträgen und offenen Kaufaufträgen der TP des Verkaufsauftrags geändert wird. Aber die Änderung erfolgt nur bei der ersten Bestellung, und dann gibt es den Fehler OrderModify ERROR 1

In diesem Fall wird TakeProfit einfach gelöscht

ERROR 1 - ERR_NO_RESULT Kein Fehler, aber Ergebnis unbekannt

 
MakarFX #:

In diesem Fall wird der TakeProfit einfach gelöscht

ERROR 1 - ERR_NO_RESULT Kein Fehler, aber Ergebnis unbekannt

Warum wird sie bei einer der beiden Anordnungen entfernt und bei der anderen nicht?
 
Snajper007 #:
Warum wird sie bei einem der beiden Aufträge gestrichen und bei dem anderen nicht?

Gelöscht nur, wenn OrderTakeProfit() > 0

d.h. der Handel ist aufwärtsgerichtet

 
MakarFX #:

Gelöscht nur, wenn OrderTakeProfit() > 0

d.h. der Handel ist aufwärtsgerichtet

Der Code wurde überarbeitet.

// Функция модификации ордеров 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("Ошибка модификации  ордера на продажу");
                                       
                        }
                    
                }
               } 
             }   
           }     
 }      
Das ist dasselbe. Es liegen 2 Verkaufsaufträge mit einem durchschnittlichen TP vor. Wenn wir einen Kaufauftrag in beiden Aufträgen eröffnen, sollte der TP gelöscht werden. Sie wird jedoch nur an der ersten Stelle gestrichen, und an der zweiten Stelle verbleibt der gemittelte TP.
 
MakarFX #:

Gelöscht nur, wenn OrderTakeProfit() > 0

d.h. der Handel ist aufwärtsgerichtet

Wenn der OrderTakeProfit()>0 ist, bedeutet das nicht, dass der Handel im Plus ist... Es bedeutet nur, dass die Position einen TakeProfit hat...

 
Snajper007 #:

Der Code wurde überarbeitet.

Das ist dasselbe. Es liegen 2 Verkaufsaufträge mit einem durchschnittlichen TP vor. Wenn wir einen Kaufauftrag in beiden Aufträgen eröffnen, sollte der TP gelöscht werden. Sie wird jedoch nur an der ersten Stelle gestrichen, und an der zweiten Stelle verbleibt der gemittelte TP.

Du bringst einfach alles durcheinander.

Zuerst markieren Sie den Auftrag

if(OrderSelect(pos, SELECT_BY_POS, MODE_TRADES))

Aber dann rufen Sie eine Funktion auf

CountBuy1()

Das ändert wahrscheinlich die Auswahl... Und das ist nicht in Ordnung. Trennen Sie die Fliegen von den Koteletts und alles wird gut...

 
Nikolay Ivanov #:

Du bringst alles durcheinander...

Zuerst markieren Sie einen Auftrag

Aber dann ruft man die Funktion

Das ändert wahrscheinlich die Auswahl... Und dann gibt es ein Durcheinander... Trennen Sie die Fliegen von den Koteletts und alles wird gut...

Ich danke Ihnen! Ich habe die Funktion entfernt, und sie funktioniert jetzt einwandfrei.
 
Nikolay Ivanov #:

Wenn OrderTakeProfit()>0 ist, bedeutet das nicht, dass der Handel im Plus ist... Es bedeutet nur, dass die Position einen TakeProfit hat...

Sie haben Recht, ich bin mit OrderProfit() durcheinander gekommen.
 

Eine weitere Frage ist aufgetaucht. Hier ist die Funktion zur Berechnung des Durchschnittspreises:

//Средний тейкпрофит для ордеров 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);
 }
Aus irgendeinem Grund wird es jedes Mal neu berechnet. D.h. der 2. Verkaufsauftrag wird eröffnet, die Funktion berechnet den Durchschnittspreis. Wenn jedoch der dritte Auftrag geöffnet wird, zeigt diese Funktion den vorherigen und den neuen Wert an (ich habe dies im Druckjournal überprüft), aber im Ergebnis bleibt der vorherige Wert erhalten. Was habe ich falsch gemacht?