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

 
Бахром Балтабаев eine Benachrichtigung an mein Telefon sendet, wenn der Kurs ein bestimmtes, von mir festgelegtes Niveau erreicht.

Ich habe vor kurzem eine Meldung geschrieben:. Sie kann jedoch durch Hinzufügen von SendNotification verbessert werden:

// использовать алерт
input bool alert = true;
// использовать push-уведомления
input bool notification = true;
// уровень срабатывания
input double trigLv = 0.0;
// отклонение от trigLv в пунктах
input int deviation = 30; 


// функция взята из https://www.mql5.com/ru/docs/basis/types/double
bool EqualDoubles(double d1,double d2,double epsilon)
  {
   if(epsilon<0) 
      epsilon=-epsilon;
//---
   if(d1-d2>epsilon) 
      return false;
   if(d1-d2<-epsilon) 
      return false;
//---
   return true;
  }

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit() {
  return(INIT_SUCCEEDED);
}

int OnCalculate(const int rates_total,
                 const int prev_calculated,
                 const datetime &time[],
                 const double &open[],
                 const double &high[],
                 const double &low[],
                 const double &close[],
                 const long &tick_volume[],
                 const long &volume[],
                 const int &spread[]
) {
  static bool triggered = false;
  static datetime time_ = 0;
  if (!alert && !notification)
    return rates_total;
  if (EqualDoubles(trigLv, close[rates_total - 1], deviation * SymbolInfoDouble(NULL, SYMBOL_POINT))) { // сравнение цены Close с trigLv
    if (time_ != time[rates_total - 1])
      time_ = time[rates_total - 1];
    else
      return rates_total;
    if (!triggered) {
      if (alert)
        Alert("Level ", NormalizeDouble(trigLv, (int)SymbolInfoInteger(NULL, SYMBOL_DIGITS)), " triggered!");
      if (notification)
        SendNotification("Level " + (string)NormalizeDouble(trigLv, (int)SymbolInfoInteger(NULL, SYMBOL_DIGITS)) + " triggered!");
    }
    triggered = true;
  }
  else
    triggered = false;
  
  return rates_total;
}

Fügen Sie die Zeilen, die ich hervorgehoben habe, zum Quellcode hinzu, legen Sie ihn im Ordner Indicators ab und kompilieren Sie ihn. Dieser Indikator kann beliebig oft in das Diagramm eingefügt werden und empfängt Signale, wenn verschiedene Niveaus überschritten werden. Der Code wurde online fertiggestellt. Das Ergebnis wird nicht überprüft.

Любые вопросы новичков по MQL4 и MQL5, помощь и обсуждение по алгоритмам и кодам
Любые вопросы новичков по MQL4 и MQL5, помощь и обсуждение по алгоритмам и кодам
  • www.mql5.com
В этой ветке я хочу начать свою помощь тем, кто действительно хочет разобраться и научиться программированию на новом MQL4 и желает легко перейти н...
 

Forum für Handel, automatisierte Handelssysteme und Strategietests

Alle Fragen von Neulingen zu MQL4 und MQL5, Hilfe und Diskussion über Algorithmen und Codes

GlaVredFX, 2022.01.17 18:59

Ich suche den Code, um Aufträge zu schließen, und wenn ich keinen sehe, werde ich einen neuen Auftrag eröffnen.

Aber aus irgendeinem Grund, schließt es nur 1 Auftrag und hält vor dem nächsten Signal.

2022.01.17 16:22:08.389 2022.01.04 08:00:00 e: Signal 1.1322 < Abschluss 1.1304 ExistPosSell 0
2022.01.17 16:22:08.389 2022.01.04 08:00:00 e: Signal 1.1322 > clos 1.1304 ExistPosBuy 1
2022.01.17 16:22:08.366 2022.01.04 08:00:00 e: Signal 1.1325 < clos 1.1306 ExistPosSell 0
2022.01.17 16:22:08.366 2022.01.04 04:00:00 e: Signal 1.1325 > clos 1.1306 ExistPosBuy 1
2022.01.17 16:22:08.327 2022.01.04 2022.01.04 00:00:00 e: Signal 1.1326 < clos 1.1296 ExistPosSell 0
2022.01.17 16:22:08.327 2022.01.04 00:00:00 e: Signal 1.1326 > clos 1.1296 ExistPosBuy 1
2022.01.17 16:22:08.298 2022.01.03 20:00:00 e: Signal 1.1328 < close 1.1283 ExistPosSell 0
2022.01.17 16:22:08.298 2022.01.03 20:00:00 e: close #1 buy 0.01 EURUSD at 1.13598 at price 1.12831

2022.01.17 16:22:08.298 2022.01.03 20:00:00 e: Signal 1.1328 > close 1.1283 ExistPosBuy 1
2022.01.17 16:22:08.190 2022.01.03 16:00:00 e: open #4 buy 0.01 EURUSD at 1.13512 ok
2022.01.17 16:22:08.190 2022.01.03 16:00:00 e: Signal 1.134 < Schluss 1.135 ExistPosSell 0
2022.01.17 16:22:08.190 2022.01.03 16:00:00 e: Signal 1.134 > Schluss 1.135 ExistPosBuy 1

if(isNewBar()==true) {  
if(Signal > clos ) {  //--------------------- МА выше цены закрытия предыдущего бара.
     if(ExistPositions( NULL, OP_BUY, Magic) == true) //---------------- Если есть позиция BUY то
ClosePosWithMaxProfitInCurrency(); //--------  закрытие одной позиции с максимальным профитом в валюте депозита.
         if(ExistPositions( NULL, OP_BUY, Magic) == False) //----------- если позиции BUY отсутствуют то
   ticket=OpenPosition(NULL,OP_SELL, NDLot(Lot),0,0, Magic, Com);} //------------ открываем позицию SELL

if(Signal < clos ) { //--------------------- МА ниже цены закрытия предыдущего бара.
    if(ExistPositions( NULL, OP_SELL, Magic) == true) //---------------- Если есть позиция SELL то
 ClosePosWithMaxProfitInCurrency(); //---------------------закрытие одной позиции с максимальным профитом в валюте депозита.
        if(ExistPositions( NULL, OP_SELL, Magic) == False)  //----------- если позиции SELL отсутствуют то
  ticket=OpenPosition(NULL,OP_BUY, NDLot(Lot),0,0, Magic, Com);} //------------ открываем позицию BUY

} return; 
Wenn Sie Ihrer Frage und Ihrem Code etwas mehr Aufmerksamkeit schenken, werden Sie selbst sehen, was das Problem ist.
 
Mihail Matkovskij #:

Wenn Sie Ihrer Frage und Ihrem Code etwas mehr Aufmerksamkeit schenken, werden Sie es selbst sehen.

Die Frage ist, dass die 1 profitabelste Order auf einem Balken geschlossen werden sollte und dann warten wir auf einen neuen Balken und schließen wieder 1 profitable Order. Wir sollten nicht alle von ihnen auf einmal schließen.

Das bedeutet, dass wir den ersten Balken schließen, aber auf dem nächsten Balken nichts passiert.

 
GlaVredFX #:

Das Problem dabei ist, dass die 1 profitabelste Order auf einem Balken schließen sollte, dann auf einen neuen Balken warten und wieder 1 profitable Order schließen. Sie sollten nicht alle auf einmal schließen.

Dann müssen Sie Ihre Fragen richtig formulieren. Sie haben nur 1 Signal. Sie erhalten nur 1 Signal bei der Eröffnung eines neuen Balkens. Wenn es nur 1 Signal gibt, wie viele Aufträge werden dann geschlossen? Und nur, wenn das Signal auf einem neuen Balken erscheint. Bleibt das Signal aus, werden die Aufträge in den nächsten Bars geschlossen. Wiederum, wenn es ein Signal gibt.

 
Mihail Matkovskij #:

Dann müssen Sie die Fragen richtig formulieren. Sie erhalten nur 1 Signal. Und es ist bei der Eröffnung einer neuen Bar. Und wenn es nur 1 Signal gibt, wie viele Aufträge werden dann geschlossen? Und nur, wenn das Signal auf einem neuen Balken erscheint. Bleibt das Signal aus, werden die Aufträge in den nächsten Bars geschlossen. Und wieder, wenn es ein Signal gibt.

In solchen Fällen hilft in der Regel ein Flussdiagramm. Oder wir müssen den Algorithmus im Detail Punkt für Punkt auf einem Blatt Papier oder in einer Textdatei beschreiben. Und erst dann werden Sie verstehen, wie Sie Ihren Code schreiben müssen.

 

Benötige Funktion, um 1 Auftrag zu schließen, der unter allen verfügbaren Aufträgen zuerst geöffnet wurde. wer kann teilen.

 
GlaVredFX #:

Wie Sie bemerkt haben, ist der Algorithmus im Code enthalten.

1) Neue Leiste erscheint

2) Wenn der MA höher ist als der Schlusskurs des vorherigen Balkens, gehen Sie zu Schritt 3, wenn der MA unter dem Schlusskurs liegt, gehen Sie zu Schritt 4.

3)Wenn wir eine KAUFEN-Position haben, schließen wir eine Position mit maximalem Gewinn in dem Währungspaar.

3.1)Wenn es keine offenen KAUF-Aufträge gibt, eröffnen Sie eine VERKAUF-Position.

4) Wenn wir eine KAUFEN-Position haben, schließen wir eine Position mit einem maximalen Gewinn in dem Währungspaar.

4.1) Wenn es keine offene SELL-Order gibt, eröffnen wir eine BUY-Position.


Jetzt habe ich wieder eine Frage, was in diesem Code des oben beschriebenen Algorithmus falsch ist:

Dieser Code enthält eine Reihe von Befehlen. Das Terminal weiß nicht, was Sie brauchen, es weiß nur, was im Code steht!

...

if(isNewBar()) {  
  if(Signal > clos ) {  //--------------------- МА выше цены закрытия предыдущего бара.
    if(ExistPositions( NULL, OP_BUY, Magic)) //---------------- Если есть позиция BUY то
      ClosePosWithMaxProfitInCurrency(); //--------  закрытие одной позиции с максимальным профитом в валюте депозита.
    if(!ExistPositions( NULL, OP_BUY, Magic)) //----------- если позиции BUY отсутствуют то
      sellSignal = true;
  } 

 // и аналогично для п.4.

} 
return; 

...

void OnTimer() {
  if (sellSignal) {
    ticket=OpenPosition(NULL,OP_SELL, NDLot(Lot),0,0, Magic, Com); //------------ открываем позицию SELL
    sellSignal = false;
  }
  // и аналогично для buy
}
Schreiben Sie die Variablen buySignal undsellSignal global.
 
Mihail Matkovskij #:

Im Code ist eine Reihe von Befehlen enthalten. Das Terminal weiß nicht, was Sie brauchen, es weiß nur, was im Code steht!

Ich habe diese Nachricht gelöscht, weil das Problem darin besteht, dass Aufträge nicht nach Gewinn, sondern nach Zeit abgeschlossen werden sollten.

Das liegt daran, dass wir nicht immer und nicht immer dort Gewinn machen, wo er sein sollte.

Daher benötigen wir die Funktion"Schließen Sie eine Position, die ganz am Anfang aller verfügbaren Positionen eröffnet wurde".

 
GlaVredFX #:

Ich habe diese Nachricht gelöscht, weil das Problem darin besteht, dass Aufträge nach Zeit und nicht nach Gewinn geschlossen werden sollten.

Denn der Gewinn ist nicht immer da und nicht immer dort, wo er sein sollte.

Daher benötigen wir die Funktion"Schließen Sie eine Position, die ganz am Anfang aller verfügbaren Positionen eröffnet wurde".

Ich habe ein Beispiel für die Positionseröffnung im Timer im vorherigen Beitrag hinzugefügt. Damit ist gewährleistet, dass die Position geöffnet wird. Sie können dort Ihre eigene Funktion ersetzen.

 
Mihail Matkovskij #:

Im vorherigen Beitrag wurde ein Beispiel für die Öffnung einer Timerposition hinzugefügt. Damit ist gewährleistet, dass die Stelle geöffnet wird. Sie können dort Ihre eigene Funktion ersetzen.

Aber nicht auf diese Weise. Sie müssen das Ergebnis der

ClosePosWithMaxProfitInCurrency

oder eine neue Funktion von Ihnen in OnTradeTransaction. Und wenn es keine Positionen gibt, wird er eintreten. Oder Sie schreiben das Signal in buySignal odersellSignal und verarbeiten es in OnTimer, wie ich im Beispiel gezeigt habe.

Grund der Beschwerde: