Fragen von Neueinsteigern zu MQL4 und MQL5, Hilfe und Diskussion über Algorithmen und Codes - Seite 30

 
yaaarik777:
Ich lerne gerade, ich versuche, den Leitfaden zu benutzen, aber ich merke, dass ich Unsinn bekomme, ich würde gerne ein Beispiel sehen, wie man es macht.
Lesen Sie diesen Artikel, er wird Ihnen nützlich seinhttps://www.mql5.com/ru/articles/1399
События в МetaТrader 4
События в МetaТrader 4
  • 2006.05.29
  • Andrey Khatimlianskii
  • www.mql5.com
Статья посвящена программному отслеживанию событий в терминале МetaТrader 4, таких как открытие, закрытие и модификация ордеров, и рассчитана на пользователя, обладающего базовыми навыками работы с терминалом и программирования на MQL 4.
 
yaaarik777:

Guten Tag zusammen! Können Sie mir bitte sagen, wie man die Löschung eines Auftrags in einem EA einstellen kann?

Die Situation stellt sich wie folgt dar:

Wir platzieren 2schwebende Aufträge in verschiedenen Richtungen, sobald einer von ihnen ausgelöst wird, wird der andere entfernt und nicht mehr ausgestellt.

Ich wäre für jede Hilfe sehr dankbar.

Ich danke Ihnen.

Etwa so

   for(int pos=OrdersTotal()-1,ticket=0,trade=0;pos!=-1;pos--)
     {
      if(OrderSelect(pos,SELECT_BY_POS,MODE_TRADES) && OrderType()>1)//Если найденный ордер отложенный
        {
         ticket=OrderTicket();//Запомним его тикет
        }
      else//Если ордер не отложенный
        {
         trade=1;//Запомним,что есть открытая позиция
        }
      if(ticket!=0 && trade==1)//И если известен отложенный и открыта позиция
        {
         int OD=OrderDelete(ticket);//Удаляем отложенный
        }
     }
 
Nikolay Gaylis:
Die Aufforderung "Lasst uns weitersuchen" muss gestrichen werden!
Sie können Ihre eigenen Beiträge im Forum bearbeiten. Alles, was Sie in den einzelnen Beiträgen oben geschrieben haben, lässt sich in einem einzigen Beitrag zusammenfassen.
 
Vitalie Postolache:
Sie können Ihre eigenen Beiträge im Forum bearbeiten. Alles, was Sie in den einzelnen Beiträgen oben geschrieben haben, lässt sich in einem einzigen Beitrag zusammenfassen.
Ich danke Ihnen!
 

Hallo! Ich habe ein gewinnorientiertes Schleppnetz mit folgendem Algorithmus eingeführt:

if(gesamt>0)
{for (int i=BestellungenSumme()-1; i>=0; i--)
if(OrderSelect(i,SELECT_BY_POS)==true)
{
if(OrderMagicNumber()==magic && OrderSymbol()==asset& OrderType()==OP_BUY)
{
RefreshRates();
if(ZeitAktuell()>OrderOpenTime() && TimeCurrent()<=(OrderOpenTime()+3600))
{
GEWINNMITNAHMEBEDINGUNG;
ÄNDERUNG DES AUFTRAGS AUF EINEN NEUEN GEWINN;
}
}
}
}

Aber das Zeitlimit funktioniert aus irgendeinem Grund nicht, und es kommt vor, dass eine Position, die nicht im aktuellen Zeitrahmen geschlossen wird, auch im nächsten Zeitrahmen gehandelt wird, wenn die Bedingungen erfüllt sind.

Was ist mit meinem letzten if() falsch?

 
владимир:

Hallo! Ich habe ein gewinnorientiertes Schleppnetz mit folgendem Algorithmus eingeführt:

if(gesamt>0)
{for (int i=OrdersTotal()-1; i>=0; i--)
if(OrderSelect(i,SELECT_BY_POS)==true)
{
if(OrderMagicNumber()==magic && OrderSymbol()==asset && OrderType()==OP_BUY)
{
RefreshRates();
if(TimeCurrent()>OrderOpenTime() && TimeCurrent()<=(OrderOpenTime()+3600))
{
BEDINGUNG FÜR DAS "TRAILING TP";
{ ÄNDERUNG DES AUFTRAGES AN DEN NEUEN TAKE-PROFIT;
}
}
}
}

Aber aus irgendeinem Grund funktioniert das Zeitlimit nicht, und es passiert, dass die Position, wenn sie nicht im aktuellen Zeitrahmen geschlossen wird, auch im nächsten Zeitrahmen weiterläuft, wenn die Bedingungen erfüllt sind.

Was ist mit meinem letzten if() falsch?

Nun, ich weiß nicht, ich habe dort noch nichts Falsches gesehen. Ich habe die überflüssige Prüfung der Anzahl der Aufträge entfernt (sie ist bereits in den Schleifenbedingungen enthalten) und eine Prüfung für beide Arten von Positionen (Kauf und Verkauf) hinzugefügt

//+------------------------------------------------------------------+
for(int i=OrdersTotal()-1; i>=0; i--) {
   if(OrderSelect(i,SELECT_BY_POS)) {
      if(OrderType()>OP_SELL) continue;
      if(OrderMagicNumber()==magic && OrderSymbol()==asset) {
         if(TimeCurrent()>OrderOpenTime() && TimeCurrent()<=OrderOpenTime()+PeriodSeconds(PERIOD_H1)) {
            // УСЛОВИЕ ТРАЛА ТЭЙКПРОФИТА;
            // МОДИФИКАЦИЯ ОРДЕРА НА НОВЫЙ ТЭЙКПРОФИТ;
            }
         }
      }
   }
//+------------------------------------------------------------------+

Wo // die Schleppnetz- und Änderungsbedingungen, fügen Sie Print() mit den Werten der Zeitvariablen ein und sehen Sie, was das Protokoll sagt.

 
Artyom Trishkin:

Ich weiß nicht, ich sehe auf den ersten Blick noch nicht, was daran falsch ist. Ich habe die unnötige Prüfung auf die Anzahl der Aufträge entfernt (sie ist bereits in den Zyklusbedingungen enthalten) und eine Prüfung auf beide Arten von Positionen (Kauf und Verkauf) hinzugefügt.

//+------------------------------------------------------------------+
for(int i=OrdersTotal()-1; i>=0; i--) {
   if(OrderSelect(i,SELECT_BY_POS)) {
      if(OrderType()>OP_SELL) continue;
      if(OrderMagicNumber()==magic && OrderSymbol()==asset) {
         if(TimeCurrent()>OrderOpenTime() && TimeCurrent()<=OrderOpenTime()+PeriodSeconds(PERIOD_H1)) {
            // УСЛОВИЕ ТРАЛА ТЭЙКПРОФИТА;
            // МОДИФИКАЦИЯ ОРДЕРА НА НОВЫЙ ТЭЙКПРОФИТ;
            }
         }
      }
   }
//+------------------------------------------------------------------+

Wo // Schleppnetz und Änderungsbedingungen, Print() mit Werten der Zeitvariablen einfügen und sehen, was das Protokoll sagt.

Ich habe andere Bedingungen für Verkaufen, daher habe ich nur KAUFEN angezeigt.

" mit Zeitvariablen" - meinen Sie TimeCurrent()? Tut mir leid, wenn Sie das überrascht - ich bin eine Nullnummer im Programmieren.

Und ich verstehe das nicht -OrderType()>OP_SELL. Warum >? OrderType OP_SELL hat den Wert = 1 undOP_BUY = 0. Daher muss es <= sein? Ich danke Ihnen.

 
владимир:

Ich habe andere Schleppnetzbedingungen für SELL, daher habe ich nur BAI angezeigt.

" mit Zeitvariablenwerten" - meinen Sie TimeCurrent()? Tut mir leid, wenn Sie das überrascht - ich bin eine Nullnummer im Programmieren.

Und ich verstehe das nicht -OrderType()>OP_SELL. Warum >? OrderType OP_SELL hat den Wert = 1 undOP_BUY = 0. Daher muss es <= sein? Ich danke Ihnen.

Wenn der Typ größer als 1 ist, wird mit der nächsten Iteration der Schleife fortgefahren.
 

Grüße. Können Sie mir bitte sagen, warum im Falle des folgenden Eintrags

if (x!=maxpr1){x=maxpr1; OrderDelete(ticketD);}

if (z!=minpr1){z=minpr1; OrderDelete(ticketUP);}

Das System erzeugt ständig Fehler

: ungültiges Ticket für OrderDelete-Funktion

OrderDelete-Fehler 4051

Dem Nachschlagewerk zufolge ist es

Ungültiger Wert des Funktionsparameters

Die Parameter scheinen jedoch dieselben zu sein.

Wenn Sie jedoch die Bedingung entfernen und nur noch

OrderDelete(ticketD);

OrderDelete(ticketUP);

es wird erfolgreich gelöscht (aber ich brauche es nach Bedingung). Was mache ich falsch?

 
spoiltboy:

Grüße. Können Sie mir bitte sagen, warum im Falle des folgenden Eintrags

if (x!=maxpr1){x=maxpr1; OrderDelete(ticketD);}

if (z!=minpr1){z=minpr1; OrderDelete(ticketUP);}

Das System erzeugt ständig Fehler

: ungültiges Ticket für OrderDelete-Funktion

OrderDelete-Fehler 4051

Laut dem Nachschlagewerk ist es

Ungültiger Wert des Funktionsparameters

Die Parameter scheinen jedoch dieselben zu sein.

Wenn Sie jedoch die Bedingung entfernen und nur noch

OrderDelete(ticketD);

OrderDelete(ticketUP);

es wird erfolgreich gelöscht (aber ich brauche es nach Bedingung). Was mache ich falsch?

Der Fehler befindet sich irgendwo oberhalb des Codes, im Bereich der Bestellauswahl.