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

 
MakarFX:

Versuchen Sie es (ich habe es nicht getestet)

Danke, ich werde später nachsehen.

 
Eugen8519:



Bitte helfen Sie mir, die Funktion richtig zu positionieren

...

Aber wie und wo einfügen

Um eine Nachricht zu senden, wenn ein Stop-Loss oderTake-Profit erreicht wird?


MakarFX:

Sprechen wir über dieselbe Sache?

Ich habe ein Beispiel gefunden, das den SL-Exit mitOnTradeTransaction verfolgt:https://www.mql5.com/ru/code/21147.

Candle shadows v1
Candle shadows v1
  • www.mql5.com
Анализ размера свечи и тени свечи. В OnTradeTransaction отлавливаем открытие (DEAL_ENTRY_IN) и закрытие позиций (DEAL_ENTRY_OUT), а также закрытие по Stop loss (DEAL_REASON_SL).
 

Derselbe EA auf zwei verschiedenen Instrumenten

Hallo! Könnten Sie mir bitte helfen?

Ich habe einen EA, der auf dem Diagramm arbeitet, auf das er gezogen wurde (der Symbol()-Wert wird als Name des Symbols verwendet).

Aber dieser EA hat auch eine ticket_exist-Variable, die ein Ticket eines erteilten Auftrags enthält, und der EA versteht, dass, wenn ticket_exist ungleich Null ist,der Auftrag hier erteilt wird.

Frage: Wenn ich einen solchen EA auf zwei verschiedenen Instrumenten öffne und die Variable ticket_exist auf einem Instrument nicht gleich Null ist, bleibt dann die Variable mit demselben Namen auf dem anderen Instrument gleich Null?

SU.

 
Mihail Nefedov:

Derselbe EA auf zwei verschiedenen Instrumenten

Hallo! Könnten Sie mir bitte helfen?

Ich habe einen EA, der auf dem Diagramm arbeitet, auf das er gezogen wurde (der Symbol()-Wert wird als Name des Symbols verwendet).

Aber dieser EA hat auch eine ticket_exist-Variable, die ein Ticket der eingestellten Bestellung enthält, und der EA versteht, dass, wenn ticket_exist ungleich Null ist,die Bestellung hier eingestellt wird.

Frage: Wenn ich einen solchen EA auf zwei verschiedenen Instrumenten öffne und die Variable ticket_exist auf einem Instrument nicht gleich Null ist, bleibt dann die Variable mit demselben Namen auf dem anderen Instrument gleich Null?

SU.

Der Wert der Variablen in einem EA ist für einen anderen EA nicht verfügbar. Die Hauptsache ist, dass entweder die Symbole oder die Magie oder beides unterschiedlich sind.

 

Können Sie mir sagen, wie spät es in Ticks ist? Serverzeit oder UTC?

Ich erinnere mich, irgendwo gelesen zu haben, aber ich weiß nicht mehr, wo...

 
Alexey Viktorov:

Der Wert einer Variablen in einem EA ist für einen anderen EA nicht verfügbar. Die Hauptsache ist, dass entweder die Symbole oder die Magie oder beides unterschiedlich sein sollte.

Wennich richtig verstanden habe, dann, um einen Konflikt von EAs (zwei absolut identische) arbeiten mit verschiedenen Symbolen zu bekommen, sollten ihre Variablen als global (für das gesamte Terminal) oder, zum Beispiel, eine Bestellung sollte durch seine Sequenznummer oder einfach durch die Tatsache seiner Existenz zugegriffen werden?

 
MakarFX:

Versuchen Sie dies (ich habe es nicht getestet)

Es funktioniert nicht, es gibt Kompilierfehler.


Ich habe es auf diese Weise versucht und es kompiliert ohne Probleme, aber ich kann es nicht testen, wenn die Eisbahn geschlossen ist

Ich werde morgen wieder an die Arbeit gehen.

  void OnTradeTransaction(const MqlTradeTransaction &trans,
                          const MqlTradeRequest &request,
                          const MqlTradeResult &result)
  {
//--- get transaction type as enumeration value
   ENUM_TRADE_TRANSACTION_TYPE type=trans.type;
//--- if transaction is result of addition of the transaction in history
   if(type==TRADE_TRANSACTION_DEAL_ADD)
     {
      long     deal_entry        =0;
      string   deal_symbol       ="";
      long     deal_magic        =0;
      long     deal_reason       =-1;
      if(HistoryDealSelect(trans.deal))
        {
         deal_entry=HistoryDealGetInteger(trans.deal,DEAL_ENTRY);
         deal_symbol=HistoryDealGetString(trans.deal,DEAL_SYMBOL);
         deal_magic=HistoryDealGetInteger(trans.deal,DEAL_MAGIC);
         deal_reason=HistoryDealGetInteger(trans.deal,DEAL_REASON);
        }
      else
         return;

      if(deal_symbol==m_symbol.Name() && deal_magic==m_magic)
         if(deal_entry==DEAL_ENTRY_OUT)
           {
            if(deal_reason==DEAL_REASON_SL)
               SendNotification ("Закрыл  позицию > StopLoss");

            if(deal_reason==DEAL_REASON_TP)
               SendNotification ("Закрыл  позицию > TakeProfit");
           }
       }
  }
Dateien:
x4.PNG  11 kb
 
Eugen8519:

es funktioniert nicht, es gibt Kompilierfehler


Ich habe es auf diese Weise versucht, es kompiliert ohne Probleme, aber wenn die Eisbahn geschlossen ist, kann ich es nicht testen

Ich werde es morgen fertigstellen.

Sie haben den Code nicht richtig eingegeben!

Ich habe es ein wenig korrigiert und es funktioniert.

  datetime lastclouse; 
//+------------------------------------------------------------------+
int OnInit()
  {
   lastclouse=TimeCurrent();
   .....
  }
//+------------------------------------------------------------------+
void OnTick()
  {
   if(LastClouseProfit()!=EMPTY_VALUE)
     {
      SendNotification (LastClouseProfit()); lastclouse=TimeCurrent();
     }
   .....   
  }
//+------------------------------------------------------------------+
double LastClouseProfit()
  {
   ulong ticket=0;
   double profit=EMPTY_VALUE;
   HistorySelect(lastclouse,TimeCurrent());
   uint total=HistoryDealsTotal(); 
   for(uint i=0;i<total;i++) 
     { 
      if((ticket=HistoryDealGetTicket(i))>0) 
        { 
         profit+=HistoryDealGetDouble(ticket,DEAL_PROFIT); 
        }
     } 
   return(profit);
  }
//+------------------------------------------------------------------+
 
MakarFX:

Sie haben den Code nicht richtig eingegeben!

Ich habe es ein wenig korrigiert, es funktioniert (ich habe es überprüft).

Hier müssen wir nachweisen, dass das Geschäft genau von SL oder TP abgeschlossen wurde. Und mitOnTradeTransaction erhalten wir sofort nach Abschluss des Geschäfts die fertigen Daten.

double LastClouseProfit()
  {
   ulong ticket=0;
   double profit=EMPTY_VALUE;
   HistorySelect(lastclouse,TimeCurrent());
   uint total=HistoryDealsTotal(); 
   for(uint i=0;i<total;i++) 
     { 
      if((ticket=HistoryDealGetTicket(i))>0) 
        { 
         profit=HistoryDealGetDouble(ticket,DEAL_PROFIT); 
        }
     } 
   return(profit);
  }

Welches Ergebnis sollte zurückgegeben werden, wenn mehr als ein Geschäft zum Zeitpunkt TimeCurrent abgeschlossen ist? Und das Vorhandensein eines Gewinns bedeutet nicht, dass der Handel durch den SL oder TP geschlossen wurde. Dies muss, wie ich bereits sagte, verfolgt werden. Die Verwendung vonOnTradeTransaction ist also die einfachste Lösung!

 
Mihail Matkovskij:

Hier müssen wir auch verfolgen, dass der Handel genau am SL oder TP geschlossen wurde.

Ich habe es als Mitteilung über den Abschluss eines Geschäfts verstanden, vielleicht habe ich es falsch verstanden...

Mihail Matkovskij:

Welches Ergebnis sollte ich erhalten, wenn mehr als ein Geschäft zum Zeitpunkt TimeCurrent geschlossen wird?

weiß nicht, muss überprüft werden