Fragen von Anfängern MQL5 MT5 MetaTrader 5 - Seite 1282

 
Vladimir Karputov:

Das Problem liegt beim EA. Übrigens verbieten die Regeln für Shared Hosting dlls.

Früher hat das gut funktioniert. Ich hätte es mit kostenlosem Hosting versuchen sollen. Jedenfalls gab methaquotes 15 Pfund )))

Vielen Dank für die Antwort!

 

Der EA eröffnet Marktaufträge und modifiziert sie dann, setzt TP und SL. Einchecken des Testers. Der erste Auftrag wird unter Verwendung der erforderlichen Parameter geändert. Die zweite Order wird in dieselbe Richtung wie die erste eröffnet, aber die erste Order wird entsprechend den Parametern der zweiten Order geändert, und die zweite Order bleibt mit SL und TP gleich Null. In diesem Fall lautet die Bedingung: Wenn SL == 0 und TP == 0, wird die andere Reihenfolge geändert, da sie Parameter ungleich Null hat. Und warum? Die Änderung der Suche von der ersten zur letzten ändert nichts.

Noch eine Sache. Im Tester zeigt die Gewinnspalte Aufträge mit zwei offenen Aufträgen an, aber umgekehrt: der Gewinn des zweiten Auftrags wird im ersten offenen Auftrag angezeigt und umgekehrt. Und warum?

Es gibt noch mehr. Wir müssen eine Trendlinie zeichnen, die zwei Extrema folgt. Die Linie ist gezogen, aber sie ist ein Stummel von Takt zu Takt. Es handelt sich nicht um eine Trendlinie, sondern nur um ein Segment, während wir gerne eine Linie sehen würden.

void PositionModifiSell()
{
   int    i;
   double sl    = 0; 
   double tp    = 0;  
   int    total = PositionsTotal();
   
   for(i = total-1; i >= 0; i--)
   {
      if(m_position.SelectByIndex(i))                            
      {
         if(m_position.Symbol() == Symbol() && m_position.Magic() == Magic)
         {
            if(m_position.PositionType() == POSITION_TYPE_SELL)
            {
               if(m_position.StopLoss() == 0 && m_position.TakeProfit() == 0)
               {
                  sl = NormalizeDouble(iHigh(NULL, 0, ExtrimUp()) + VS*_Point, _Digits);                
                                    
                  if(PriceCurrentDw1() - PriceDwHigh() < LastPriceOpenOrder() - (sp+PW)*_Point)
                  {
                     tp = NormalizeDouble(PriceCurrentDw1() - PriceDwHigh(), _Digits);
                  }
                  else
                     tp = NormalizeDouble(bid - TP*_Point, _Digits);
                  
                  if(!m_trade.PositionModify(_Symbol, sl, tp))
                  {
                     Print("Метод PositionModify() потерпел поражение. Код возврата = ", m_trade.ResultRetcode(),
                           ". Описание кода: ", m_trade.ResultRetcodeDescription());
                  }
                  else
                  {
                     Print("Метод PositionModify() исполнен успешно. Код возврата = ", m_trade.ResultRetcode(),
                           " (", m_trade.ResultRetcodeDescription(),")");
                  }
               }
            }
         }
      }
   }
}
 
Youri Lazurenko:

Der EA eröffnet Marktaufträge und modifiziert sie dann, setzt TP und SL. Einchecken des Testers. Der erste Auftrag wird unter Verwendung der erforderlichen Parameter geändert. Die zweite Order wird in dieselbe Richtung wie die erste eröffnet, aber die erste Order wird entsprechend den Parametern der zweiten Order geändert, und die zweite Order bleibt mit SL und TP gleich Null. In diesem Fall lautet die Bedingung: Wenn SL == 0 und TP == 0, wird die andere Reihenfolge geändert, da sie Parameter ungleich Null hat. Warum? Die Änderung der Suche von der ersten zur letzten ändert nichts.

Noch eine Sache. Werden im Tester zwei Orders eröffnet, wird der Ordergewinn in der Spalte Gewinn angezeigt, d.h. der Gewinn der zweiten Order wird in der ersten offenen Order angezeigt und umgekehrt. Warum?

Es gibt noch mehr. Wir müssen eine Trendlinie zeichnen, die zwei Extrema folgt. Die Linie ist gezogen, aber sie ist ein Stummel von Takt zu Takt. Es handelt sich nicht um eine Trendlinie, sondern nur um ein Segment, während wir gerne eine Linie sehen würden.

1. Nicht ORDERS, sondern POSITIONS.

2. Formulieren Sie Ihre Frage - bisher habe ich eine Erzählung gesehen, aber keine Frage oder einen Algorithmus dafür, "wie man es gerne hätte".

 
Vladimir Karputov:

1. Nicht ORDERERS, sondern POSITIONS

2. Formulieren Sie Ihre Frage - bisher habe ich eine Erzählung gesehen, aber nicht die Frage und den Algorithmus, "wie Sie wollen, dass es funktioniert".

Sie wissen, dass es sich um Positionen handelt, da sie in mql5 enthalten sind. Und es gibt eine Stelle im Kodex. Die Frage ist, warum die erste Position geändert wird und nicht die letzte, obwohl sie in der Bedingung angegeben ist:

if(m_position.StopLoss() == 0 && m_position.TakeProfit() == 0)
 
Youri Lazurenko:

Es ist klar, dass die Positionen vorhanden sind, da sie in mql5 enthalten sind. Und im Code ist es die Position. Die Frage ist, warum die erste Position geändert wird und nicht die letzte, obwohl sie in der Bedingung angegeben ist:

Die Frage ist nur, wo. Beschreiben Sie den Algorithmus "Ich möchte, dass der Algorithmus so aussieht ...".

 
Vladimir Karputov:

Die Frage ist nur, wo? Beschreiben Sie den Algorithmus: "Ich möchte, dass der Algorithmus wie folgt aussieht ...".

Wenn die Trendlinie durchbrochen wird und der Balken über/unter ihr schließt, eröffnen wir eine Position mit SL und TP Null. Unmittelbar nach der Eröffnung werden die erforderlichen TP und SL gesetzt (die Position wird geändert). Denn es ist nicht die letzte Position, die geändert wird, sondern die vorherige, während die Bedingung verletzt wird:

if(m_position.StopLoss() == 0 && m_position.TakeProfit() == 0)

Ist es jetzt klar? Auch wenn wir den Zeitpunkt der Positionseröffnung in die Bedingung aufnehmen, ändert sich nichts. Es gibt keine Begrenzung der Anzahl der Stellen.

Документация по MQL5: Константы, перечисления и структуры / Торговые константы / Свойства позиций
Документация по MQL5: Константы, перечисления и структуры / Торговые константы / Свойства позиций
  • www.mql5.com
Свойства позиций - Торговые константы - Константы, перечисления и структуры - Справочник MQL5 - Справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
Youri Lazurenko:

Wenn die Trendlinie durchbrochen wird und der Balken über/unter ihr schließt, wird eine Position mit SL und TP Null eröffnet. Unmittelbar nach der Eröffnung werden die erforderlichen TP und SL gesetzt (die Position wird geändert). Denn es ist nicht die letzte Position, die geändert wird, sondern die vorherige, während die Bedingung verletzt wird:

Ist es jetzt klar? Auch wenn wir den Zeitpunkt der Positionseröffnung in die Bedingung aufnehmen, ändert sich nichts. Es gibt keine Begrenzung der Anzahl der Stellen.

Sind Sie sicher, dass zum Zeitpunkt der Änderung bereits eine neue Position existiert? (Das Absenden eines Handelsauftrags ist keine Garantie dafür, dass die Position existiert).

Bei Eingabe der Bedingung (SL == 0.0 und TP == 0.0) drucken Sie das Positionsticket.

 
Vladimir Karputov:

Sind Sie sicher, dass die neue Stelle zum Zeitpunkt der Änderung bereits verfügbar ist? (Das Absenden eines Handelsauftrags ist keine Garantie dafür, dass eine Position existiert).

Wenn Sie die Bedingung (SL == 0.0 und TP == 0.0) eingeben, drucken Sie das Positionsticket.

Ja, die zweite Position ist bereits vorhanden. Ich lese gerade das Protokoll. Die Methode Verkaufen war erfolgreich, Code 10009. (Ticket #3). Und dann folgt eine Änderung, nur der Position mit Ticket #2, die auch erfolgreich ausgeführt wird (Änderung, obwohl, ich betone, nach den Bedingungen nicht passieren sollte, SL ist nicht mehr 0!).

Ich habe bereits geschrieben, dass ich es sowohl mit dem Zeitpunkt der Öffnung als auch mit dem Ticket versucht habe, ohne Erfolg. Zum Beispiel:

void PositionModifiSell()
{
   int      i;
   datetime Time;
   double   sl    = 0; 
   double   tp    = 0;  
   datetime time  = 0;
   int      total = PositionsTotal();
   
   for(i = total-1; i >= 0; i--)
   {
      if(m_position.SelectByIndex(i))                            
      {
         if(m_position.Symbol() == Symbol() && m_position.Magic() == Magic)
         {
            if(m_position.PositionType() == POSITION_TYPE_SELL)
            {
               Time = m_position.Time();
               
               if(Time > time)
               {
                  sl = NormalizeDouble(iHigh(NULL, 0, ExtrimUp()) + VS*_Point, _Digits);
                  
                  if(PriceCurrentDw1() - PriceDwHigh() < LastPriceOpenOrder() - (sp+PW)*_Point)
                  {
                     tp = NormalizeDouble(PriceCurrentDw1() - PriceDwHigh(), _Digits);
                  }
                  else
                     tp = NormalizeDouble(bid - TP*_Point, _Digits);
                  
                  if(!m_trade.PositionModify(_Symbol, sl, tp))
                  {
                     Print("Метод PositionModify() потерпел поражение. Код возврата = ", m_trade.ResultRetcode(),
                           ". Описание кода: ", m_trade.ResultRetcodeDescription());
                  }
                  else
                  {
                     Print("Метод PositionModify() исполнен успешно. Код возврата = ", m_trade.ResultRetcode(),
                           " (", m_trade.ResultRetcodeDescription(),")");
                  }
                  time = Time;
               }
            }
         }
      }
   }
}
//------------ или
void PositionModifiSell()
{
   int      i;
   ulong  Ticket;
   double sl     = 0; 
   double tp     = 0;  
   ulong  ticket = 0;
   int    total  = PositionsTotal();
   
   for(i = total-1; i >= 0; i--)
   {
      if(m_position.SelectByIndex(i))                            
      {
         if(m_position.Symbol() == Symbol() && m_position.Magic() == Magic)
         {
            if(m_position.PositionType() == POSITION_TYPE_SELL)
            {
               Tiсket = m_position.Ticket();
               
               if(ticket != Ticket)
               {
                  sl = NormalizeDouble(iHigh(NULL, 0, ExtrimUp()) + VS*_Point, _Digits);
                  
                  if(PriceCurrentDw1() - PriceDwHigh() < LastPriceOpenOrder() - (sp+PW)*_Point)
                  {
                     tp = NormalizeDouble(PriceCurrentDw1() - PriceDwHigh(), _Digits);
                  }
                  else
                     tp = NormalizeDouble(bid - TP*_Point, _Digits);
                  
                  if(!m_trade.PositionModify(_Symbol, sl, tp))
                  {
                     Print("Метод PositionModify() потерпел поражение. Код возврата = ", m_trade.ResultRetcode(),
                           ". Описание кодa: ", m_trade.ResultRetcodeDescription());
                  }
                  else
                  {
                     Print("Метод PositionModify() исполнен успешно. Код возврата = ", m_trade.ResultRetcode(),
                           " (", m_trade.ResultRetcodeDescription(),")");
                  }
                  ticket = Ticket;
               }
            }
         }
      }
   }
}
Документация по MQL5: Константы, перечисления и структуры / Торговые константы / Свойства позиций
Документация по MQL5: Константы, перечисления и структуры / Торговые константы / Свойства позиций
  • www.mql5.com
Свойства позиций - Торговые константы - Константы, перечисления и структуры - Справочник MQL5 - Справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
Youri Lazurenko:

Ja, die zweite Position ist bereits vorhanden. Ich lese gerade das Protokoll. Die Methode Verkaufen war erfolgreich, Code 10009. (Ticket #3). Und dann folgt die Änderung, nur die Position mit Ticket #2, die auch erfolgreich durchgeführt wird.

Ich habe bereits geschrieben, dass ich es sowohl mit der Öffnungszeit als auch mit dem Ticket versucht habe, aber das ändert nichts an der vorherigen Position. Zum Beispiel:


Das heißt: Sie prüfen das Ergebnis der Position nicht und wollen das Ticket auch nicht ausdrucken. Wenn dies der Fall ist, fügen Sie den vollständigen Code an (fügen Sie ihn über die Schaltfläche Datei anhängen an).

 
Vladimir Karputov:

Das heißt: Sie prüfen das Ergebnis der Position nicht und wollen das Ticket auch nicht ausdrucken. In diesem Fall fügen Sie den vollständigen Code an (fügen Sie ihn über die Schaltfläche an)

Sie wollen das Ticket nicht einmal ausdrucken - ich verstehe das nicht. Hier ist ein Auszug aus dem Protokoll.

2021.02.01 12:54:55.338 2018.01.02 17:00:00 Markt verkaufen 0,01 EURUSD (1,20384 / 1,20402)

2021.02.01 12:54:55.338 2018.01.02 17:00:00 deal #2 sell 0.01 EURUSD at 1.20384 done (based on order #2)

2021.02.01 12:54:55.338 2018.01.02 17:00:00 deal done [#2 sell 0.01 EURUSD at 1.20384]

2021.02.01 12:54:55.338 2018.01.02 17:00:00 Auftrag ausgeführt Verkauf 0,01 zu 1,20384 [#2 Verkauf 0,01 EURUSD zu 1,20384]

2021.02.01 12:54:55.344 2018.01.02 17:00:00 CTrade::OrderSend: market sell 0.01 EURUSD [done at 1.20384]

2021.02.01 12:54:55.344 2018.01.02 17:00:00 Methode Sell() erfolgreich abgeschlossen. Rückgabecode = 10009 (abgeschlossen bei 1,20384)

2021.02.01 12:54:55.344 2018.01.02 17:00:00 position modified [#2 sell 0.01 EURUSD 1.20384 sl: 1.20813 tp: 1.20013]

2021.02.01 12:54:55.346 2018.01.02 17:00:00 CTrade::OrderSend: modify position #2 EURUSD (sl: 1.20813, tp: 1.20013) [done]

2021.02.01 12:54:55.346 2018.01.02 17:00:00 PositionModify() Methode erfolgreich ausgeführt. Rückgabecode = 10009 (erledigt).

============================================================================================================== разделил, появление второй позиции

2021.02.01 12:55:48.819 2018.01.03 09:00:00 Markt verkaufen 0,01 EURUSD (1,20442 / 1,20460)

2021.02.01 12:55:48.819 2018.01.03 09:00:00 deal #3 sell 0.01 EURUSD at 1.20442 done (based on order #3)

2021.02.01 12:55:48.819 2018.01.03 09:00:00 deal done [#3 sell 0.01 EURUSD at 1.20442]

2021.02.01 12:55:48.819 2018.01.03 09:00:00 Auftrag ausgeführt Verkauf 0,01 zu 1,20442 [#3 Verkauf 0,01 EURUSD zu 1,20442]

2021.02.01 12:55:48.821 2018.01.03 09:00:00 CTrade::OrderSend: market sell 0.01 EURUSD [done at 1.20442]

2021.02.01 12:55:48.821 2018.01.03 09:00:00 Sell() Methode erfolgreich ausgeführt. Rückgabecode = 10009 (abgeschlossen bei 1,20442)

====================================================================================================================== nach erfolgreicher Positionseröffnung, Änderung, aber vorheriger Auftrag

2021.02.01 12:55:48.821 2018.01.03 09:00:00 position modified [#2 sell 0.01 EURUSD 1.20384 sl: 1.20663 tp: 1.20154]

2021.02.01 12:55:48.823 2018.01.03 09:00:00 CTrade::OrderSend: Position #2 EURUSD ändern (sl: 1.20663, tp: 1.20154) [done]

2021.02.01 12:55:48.823 2018.01.03 09:00:00 PositionModify() Methode erfolgreich ausgeführt. Rückgabecode = 10009 (erledigt)


Ich habe den vollständigen Code für die Änderung der Position auf Sell gepostet, mit Optionen.

Совершение сделок - Торговые операции - Справка по MetaTrader 5
Совершение сделок - Торговые операции - Справка по MetaTrader 5
  • www.metatrader5.com
Торговая деятельность в платформе связана с формированием и отсылкой рыночных и отложенных ордеров для исполнения брокером, а также с управлением...