Kann Jemand die korrekte Verwendung von OnTradeTransaction erklären?

Einloggen oder registrieren, um einen Kommentar zu schreiben
Bayne
1010
Bayne  

Trotz der sehr umfassenden Doku, verstehe ich immernoch nicht sie korrekt anzuwenden: Hat jemand evtl. ein korrektes Beispiel?

Christian
3159
Christian  

OnTradeTransactions sind eigentlich eher was für die Vortgeschrittenen.

Und ich finde die Artikel dazu sehr detailiert und gute formuliert.

Was ist dir denn nicht klarr ? Grundlage soll der Artikel sein:

https://www.mql5.com/de/articles/1111

Hier ist ein EA wo es implementiert ist.

https://www.mql5.com/de/code/19951


Beispiel aus der Doku:

//+------------------------------------------------------------------+
//|                                    OnTradeTransaction_Sample.mq5 |
//|                        Copyright 2018, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2018, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property description "Sample listener of TradeTransaction events"
//+------------------------------------------------------------------+
//| Expert Initialisierungsfunktion                                  |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   PrintFormat("LAST PING=%.f ms",
               TerminalInfoInteger(TERMINAL_PING_LAST)/1000.);
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Tick-Funktion des Experten                                       |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
 
  }
//+------------------------------------------------------------------+
//| TradeTransaction Funktion                                        |
//+------------------------------------------------------------------+
void OnTradeTransaction(const MqlTradeTransaction &trans,
                        const MqlTradeRequest &request,
                        const MqlTradeResult &result)
  {
//---
   static int counter=0;   // Zähler der Aufrufe von OnTradeTransaction()
   static uint lasttime=0; // Zeitpunkt des letzten Aufrufs von OnTradeTransaction()
//---
   uint time=GetTickCount();
//--- wenn die letzte Transaktion vor mehr als 1 Sekunde war
   if(time-lasttime>1000)
     {
      counter=0; // das ist jetzt eine neue Handelsoperation und der Zähler kann zurückgesetzt werden
      if(IS_DEBUG_MODE)
         Print(" New trade operation");
     }
   lasttime=time;
   counter++;
   Print(counter,". ",__FUNCTION__);
//--- Ergebnis der Ausführungsanfrage eines Handels
   ulong            lastOrderID   =trans.order;
   ENUM_ORDER_TYPE  lastOrderType =trans.order_type;
   ENUM_ORDER_STATE lastOrderState=trans.order_state;
//--- Name des Symbols der Transaktion
   string trans_symbol=trans.symbol;
//--- Typ der Transaktion
   ENUM_TRADE_TRANSACTION_TYPE  trans_type=trans.type;
   switch(trans.type)
     {
      case  TRADE_TRANSACTION_POSITION:   // Positionsänderung
        {
         ulong pos_ID=trans.position;
         PrintFormat("MqlTradeTransaction: Position  #%d %s modified: SL=%.5f TP=%.5f",
                     pos_ID,trans_symbol,trans.price_sl,trans.price_tp);
        }
      break;
      case TRADE_TRANSACTION_REQUEST:     // Senden einer Handelsanfrage
         PrintFormat("MqlTradeTransaction: TRADE_TRANSACTION_REQUEST");
         break;
      case TRADE_TRANSACTION_DEAL_ADD:    // Hinzufügen eines Deals
        {
         ulong          lastDealID   =trans.deal;
         ENUM_DEAL_TYPE lastDealType =trans.deal_type;
         double        lastDealVolume=trans.volume;
         //--- ID des Deals im internen System - eine Ticketnummer wird vom Börsenplatz zugewiesen
         string Exchange_ticket="";
         if(HistoryDealSelect(lastDealID))
            Exchange_ticket=HistoryDealGetString(lastDealID,DEAL_EXTERNAL_ID);
         if(Exchange_ticket!="")
            Exchange_ticket=StringFormat("(Exchange deal=%s)",Exchange_ticket);
 
         PrintFormat("MqlTradeTransaction: %s deal #%d %s %s %.2f lot   %s",EnumToString(trans_type),
                     lastDealID,EnumToString(lastDealType),trans_symbol,lastDealVolume,Exchange_ticket);
        }
      break;
      case TRADE_TRANSACTION_HISTORY_ADD: // Hinzufügen eines Auftrages zur Historie
        {
         //--- Auftrags-ID im internen System - eine Ticketnummer wird vom Börsenplatz zugewiesen
         string Exchange_ticket="";
         if(lastOrderState==ORDER_STATE_FILLED)
           {
            if(HistoryOrderSelect(lastOrderID))
               Exchange_ticket=HistoryOrderGetString(lastOrderID,ORDER_EXTERNAL_ID);
            if(Exchange_ticket!="")
               Exchange_ticket=StringFormat("(Exchange ticket=%s)",Exchange_ticket);
           }
         PrintFormat("MqlTradeTransaction: %s order #%d %s %s %s   %s",EnumToString(trans_type),
                     lastOrderID,EnumToString(lastOrderType),trans_symbol,EnumToString(lastOrderState),Exchange_ticket);
        }
      break;
      default: // andere Transaktionen
        {
         //--- Auftrags-ID im internen System - eine Ticketnummer wird vom Börsenplatz zugewiesen
         string Exchange_ticket="";
         if(lastOrderState==ORDER_STATE_PLACED)
           {
            if(OrderSelect(lastOrderID))
               Exchange_ticket=OrderGetString(ORDER_EXTERNAL_ID);
            if(Exchange_ticket!="")
               Exchange_ticket=StringFormat("Exchange ticket=%s",Exchange_ticket);
           }
         PrintFormat("MqlTradeTransaction: %s order #%d %s %s   %s",EnumToString(trans_type),
                     lastOrderID,EnumToString(lastOrderType),EnumToString(lastOrderState),Exchange_ticket);
        }
      break;
     }
//--- Ticketnummer des Auftrags    
   ulong orderID_result=result.order;
   string retcode_result=GetRetcodeID(result.retcode);
   if(orderID_result!=0)
      PrintFormat("MqlTradeResult: order #%d retcode=%s ",orderID_result,retcode_result);
//---   
  }
//+------------------------------------------------------------------+
//| Konvertieren eines numerischen Codes in eine Textbeschreibung    |
//+------------------------------------------------------------------+
string GetRetcodeID(int retcode)
  {
   switch(retcode)
     {
      case 10004: return("TRADE_RETCODE_REQUOTE");             break;
      case 10006: return("TRADE_RETCODE_REJECT");              break;
      case 10007: return("TRADE_RETCODE_CANCEL");              break;
      case 10008: return("TRADE_RETCODE_PLACED");              break;
      case 10009: return("TRADE_RETCODE_DONE");                break;
      case 10010: return("TRADE_RETCODE_DONE_PARTIAL");        break;
      case 10011: return("TRADE_RETCODE_ERROR");               break;
      case 10012: return("TRADE_RETCODE_TIMEOUT");             break;
      case 10013: return("TRADE_RETCODE_INVALID");             break;
      case 10014: return("TRADE_RETCODE_INVALID_VOLUME");      break;
      case 10015: return("TRADE_RETCODE_INVALID_PRICE");       break;
      case 10016: return("TRADE_RETCODE_INVALID_STOPS");       break;
      case 10017: return("TRADE_RETCODE_TRADE_DISABLED");      break;
      case 10018: return("TRADE_RETCODE_MARKET_CLOSED");       break;
      case 10019: return("TRADE_RETCODE_NO_MONEY");            break;
      case 10020: return("TRADE_RETCODE_PRICE_CHANGED");       break;
      case 10021: return("TRADE_RETCODE_PRICE_OFF");           break;
      case 10022: return("TRADE_RETCODE_INVALID_EXPIRATION");  break;
      case 10023: return("TRADE_RETCODE_ORDER_CHANGED");       break;
      case 10024: return("TRADE_RETCODE_TOO_MANY_REQUESTS");   break;
      case 10025: return("TRADE_RETCODE_NO_CHANGES");          break;
      case 10026: return("TRADE_RETCODE_SERVER_DISABLES_AT");  break;
      case 10027: return("TRADE_RETCODE_CLIENT_DISABLES_AT");  break;
      case 10028: return("TRADE_RETCODE_LOCKED");              break;
      case 10029: return("TRADE_RETCODE_FROZEN");              break;
      case 10030: return("TRADE_RETCODE_INVALID_FILL");        break;
      case 10031: return("TRADE_RETCODE_CONNECTION");          break;
      case 10032: return("TRADE_RETCODE_ONLY_REAL");           break;
      case 10033: return("TRADE_RETCODE_LIMIT_ORDERS");        break;
      case 10034: return("TRADE_RETCODE_LIMIT_VOLUME");        break;
      case 10035: return("TRADE_RETCODE_INVALID_ORDER");       break;
      case 10036: return("TRADE_RETCODE_POSITION_CLOSED");     break;
      default:
         return("TRADE_RETCODE_UNKNOWN="+IntegerToString(retcode));
         break;
     }
//---
  }
MQL5-Kochbuch: Verarbeitung des TradeTransaction-Ereignisses
MQL5-Kochbuch: Verarbeitung des TradeTransaction-Ereignisses
  • www.mql5.com
In diesem Artikel würde ich sehr gerne eine der beiden Möglichkeiten ansprechen, Handelsereignisse mittels der Instrumente und Tools von MQL5 zu kontrollieren. Es sei vorsorglich erwähnt, dass bereits einige wenige Artikel zu diesem Thema existieren. „Handelsereignisse im Expert-Advisor mit Hilfe der OnTrade()-Funktion bearbeiten“ ist einer von...
Bayne
1010
Bayne  
Christian:

OnTradeTransactions sind eigentlich eher was für die Vortgeschrittenen.

Und ich finde die Artikel dazu sehr detailiert und gute formuliert.

Was ist dir denn nicht klarr ? Grundlage soll der Artikel sein:

https://www.mql5.com/de/articles/1111

Hier ist ein EA wo es implementiert ist.

https://www.mql5.com/de/code/19951


Beispiel aus der Doku:

Ich finde ihn leider ... zu detailliert.  Finde leider keinen Überblich im code dort oben :(

Ich dachte OnTradeTransaction() ist eine funktion die sich aufruft, wenn irgendeins der genannten ereignisse im chart ausgelöst wird... aber stattdessen muss ich erstmal alle möglichen Infos zur Order angeben (keinen Überblick was genau).

In meinen Scripts habe ich bisher MqlTraderequests und results in eine Funktion gepackt-> sie dann wohl irgendwie in OnTradeTransaction zu bekommen scheint mir unmöglich...

Ausserdem weiss ich nicht wie ich damit umgehen soll, dass erstmal das hier abgefragt wird:

  ulong                         deal;             // Ticket of the deal
   ulong                         order;            // Ticket of the order
   string                        symbol;           // Trade symbol
   ENUM_TRADE_TRANSACTION_TYPE   type;             // Type of the trade transaction
   ENUM_ORDER_TYPE               order_type;       // Type of the order
   ENUM_ORDER_STATE              order_state;      // Status of the order
   ENUM_DEAL_TYPE                deal_type;        // Type of the deal
   ENUM_ORDER_TYPE_TIME          time_type;        // Order expiration type
   datetime                      time_expiration;  // Order expiration time
   double                        price;            // Price 
   double                        price_trigger;    // Price that triggers the Stop Limit order
   double                        price_sl;         // Level of Stop Loss
   double                        price_tp;         // Level of Take Profit
   double                        volume;           // Volume in lots



Ich will sie primär dazu nutzen, ein signal zu bekommen, wenn eine Position geschlossen wurde, um dann zu checken ob sie in den SL oder in den TP gelaufen ist...

gibt es dazu eine Alternative?

Christian
3159
Christian  
Bayne:

Ich finde ihn leider ... zu detailliert.  Finde leider keinen Überblich im code dort oben :(

Ich dachte OnTradeTransaction() ist eine funktion die sich aufruft, wenn irgendeins der genannten ereignisse im chart ausgelöst wird... aber stattdessen muss ich erstmal alle möglichen Infos zur Order angeben (keinen Überblick was genau).

In meinen Scripts habe ich bisher MqlTraderequests und results in eine Funktion gepackt-> sie dann wohl irgendwie in OnTradeTransaction zu bekommen scheint mir unmöglich...

Ausserdem weiss ich nicht wie ich damit umgehen soll, dass erstmal das hier abgefragt wird:



Ich will sie primär dazu nutzen, ein signal zu bekommen, wenn eine Position geschlossen wurde, um dann zu checken ob sie in den SL oder in den TP gelaufen ist...

gibt es dazu eine Alternative?

Für dich reicht die einfache ausführung OnTrade()

In dem Ereigniss kommen die wichtigsten Infos für dich.

https://www.mql5.com/de/docs/event_handlers/ontrade


OnTradeTransaction ist was für die die mit großen Konten hantieren.

 

Wo es wichtig wird was wann wie gesendet wurde. Und ob alles richtig verarbeitet wurde.

Hauptsachlich braucht man das Ereigniss wenn man OrderSend im async mode nutzt. (für 97% der üblichen Eas unwichtig)


Also nutze OnTrade

//+------------------------------------------------------------------+
//|                                               OnTrade_Sample.mq5 |
//|                        Copyright 2018, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2018, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
 
input    int days=7;            // Umfang der Handelshistorie in Tagen
//--- Setzen der Grenzen für die Handelshistorie in globaler Umgebung
datetime     start;             // Anfangsdatum der Handelshistorie im Cache
datetime     end;               // Enddatum der Handelshistorie im Cache
//--- Globale Zähler
int          orders;            // Anzahl der aktiven Aufträge
int          positions;         // Anzahl der offenen Positionen
int          deals;             // Anzahl der Deals in der Handelshistorie im Cache
int          history_orders;    // Anzahl der Aufträge in der Handelshistorie
bool         started=false;     // Flag der Relevanz des Zählers
 
//+------------------------------------------------------------------+
//| Expert Initialisierungsfunktion                                  |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   end=TimeCurrent();
   start=end-days*PeriodSeconds(PERIOD_D1);
   PrintFormat("Limits of the history to be loaded: start - %s, end - %s",
               TimeToString(start),TimeToString(end));
   InitCounters();
//---
   return(0);
  }
//+------------------------------------------------------------------+
//|  Initialisierung Zähler von Position, Auftrag und Deals          |
//+------------------------------------------------------------------+
void InitCounters()
  {
   ResetLastError();
//--- Laden der Historie
   bool selected=HistorySelect(start,end);
   if(!selected)
     {
      PrintFormat("%s. Failed to load history from %s to %s to cache. Error code: %d",
                  __FUNCTION__,TimeToString(start),TimeToString(end),GetLastError());
      return;
     }
//--- Abfrage des aktuellen Wert
   orders=OrdersTotal();
   positions=PositionsTotal();
   deals=HistoryDealsTotal();
   history_orders=HistoryOrdersTotal();
   started=true;
   Print("Counters of orders, positions and deals successfully initialized");
  }  
//+------------------------------------------------------------------+
//| Tick-Funktion des Experten                                       |
//+------------------------------------------------------------------+
void OnTick()
  {
   if(started) SimpleTradeProcessor();
   else InitCounters();
  }
//+------------------------------------------------------------------+
//| Aufruf wenn ein Handelsereignis eintritt                         |
//+------------------------------------------------------------------+
void OnTrade()
  {
   if(started) SimpleTradeProcessor();
   else InitCounters();
  }
//+------------------------------------------------------------------+
//| Beispiel für das Bearbeiten der Änderungen im Handel und Historie|
//+------------------------------------------------------------------+
void SimpleTradeProcessor()
  {
   end=TimeCurrent();
   ResetLastError();
//--- Laden der Handelshistorie des bestimmten Intervalls in den Cache des Programms
   bool selected=HistorySelect(start,end);
   if(!selected)
     {
      PrintFormat("%s. Failed to load history from %s to %s to cache. Error code: %d",
                  __FUNCTION__,TimeToString(start),TimeToString(end),GetLastError());
      return;
     }
//--- Abfrage der aktuellen Wert
   int curr_orders=OrdersTotal();
   int curr_positions=PositionsTotal();
   int curr_deals=HistoryDealsTotal();
   int curr_history_orders=HistoryOrdersTotal();
//--- Prüfen, ob sich die Zahl der aktiven Aufträge verändert hat
   if(curr_orders!=orders)
     {
      //--- Anzahl der aktiven Aufträge hat sich geändert
      PrintFormat("Number of orders has been changed. Previous value is %d, current value is %d",
                  orders,curr_orders);
      //--- Aktualisieren des Wertes
      orders=curr_orders;
     }
//--- Ändern der Anzahl der offenen Position
   if(curr_positions!=positions)
     {
      //--- Anzahl der offenen Positionen hat sich geändert
      PrintFormat("Number of positions has been changed. Previous value is %d, current value is %d",
                  positions,curr_positions);
      //--- Aktualisieren des Wertes
      positions=curr_positions;
     }
//--- Veränderung der Anzahl der Deals im Cache der Handelshistorie
   if(curr_deals!=deals)
     {
      //--- Anzahl der Deals in der Handelshistorie wurde geändert
      PrintFormat("Number of deals has been changed. Previous value is %d, current value is %d",
                  deals,curr_deals);
      //--- Aktualisieren des Wertes
      deals=curr_deals;
     }
//--- Veränderung der Anzahl der historischen Orders im Cache der Handelshistorie
   if(curr_history_orders!=history_orders)
     {
      //--- Anzahl der historischen Aufträge der Handelshistorie im Cache wurde geändert
      PrintFormat("Number of orders in history has been changed. Previous value is %d, current value is %d",
                  history_orders,curr_history_orders);
     //--- Aktualisieren des Wertes
     history_orders=curr_history_orders;
     }
//--- Prüfen, ob es notwendig ist die Grenzen der Handelshistorie im Cache zu verändern
   CheckStartDateInTradeHistory();
  }
//+------------------------------------------------------------------+
//|  Ändern des Anfangsdatum zur Anforderung der Handelshistorie     |
//+------------------------------------------------------------------+
void CheckStartDateInTradeHistory()
  {
//--- erstes Intervall, falls jetzt mit der Arbeit begonnen werden soll
   datetime curr_start=TimeCurrent()-days*PeriodSeconds(PERIOD_D1);
//--- Sicherstellen, dass die Anfangsdatum der Handelshistorie nicht mehr als
//--- ein Tag über dem intendierten liegt
   if(curr_start-start>PeriodSeconds(PERIOD_D1))
     {
      //--- Korrektes Anfangsdatum der Historie für den Cache
      start=curr_start;
      PrintFormat("New start limit of the trade history to be loaded: start => %s",
                  TimeToString(start));
      //--- jetzt die Handel neu laden, um das Intervall zu aktualisieren
      HistorySelect(start,end);
      //--- Korrigieren der Zähler der Deals und der Aufträge in der Historie für spätere Vergleiche
      history_orders=HistoryOrdersTotal();
      deals=HistoryDealsTotal();
     }
  }
//+------------------------------------------------------------------+
/* Sample output:
  Limits of the history to be loaded: start - 2018.07.16 18:11, end - 2018.07.23 18:11
  The counters of orders, positions and deals are successfully initialized
  Number of orders has been changed. Previous value 0, current value 1
  Number of orders has been changed. Previous value 1, current value 0
  Number of positions has been changed. Previous value 0, current value 1
  Number of deals has been changed. Previous value 0, current value 1
  Number of orders in the history has been changed. Previous value 0, current value 1
*/
Dokumentation zu MQL5: Ereignisbehandlung / OnTrade
Dokumentation zu MQL5: Ereignisbehandlung / OnTrade
  • www.mql5.com
//|                                               OnTrade_Sample.mq5 | //|                        Copyright 2018, MetaQuotes Software Corp. | //|                                             https://www.mql5.com | //| Expert Initialisierungsfunktion                                  |...
Bayne
1010
Bayne  
Christian:

Für dich reicht die einfache ausführung OnTrade()

In dem Ereigniss kommen die wichtigsten Infos für dich.

https://www.mql5.com/de/docs/event_handlers/ontrade


OnTradeTransaction ist was für die die mit großen Konten hantieren.

 

Wo es wichtig wird was wann wie gesendet wurde. Und ob alles richtig verarbeitet wurde.

Hauptsachlich braucht man das Ereigniss wenn man OrderSend im async mode nutzt. (für 97% der üblichen Eas unwichtig)


Also nutze OnTrade

ist das ein Beispiel oder OnTrade in seine Bestandteile zerlegt :/ ...
Christian
3159
Christian  

Das ist ein Beispiel wie man OnTrade nutzt.


Aber du musst schon was tun.....lernen..lernen..lernen.

Dir fehlen immernoch essentielle Grundlagen .


Hast du jemals meine Tipps mit C++ Tutorials ernstgenommen ?

Christian
3159
Christian  
Bayne:
ist das ein Beispiel oder OnTrade in seine Bestandteile zerlegt :/ ...

So ist er vielleicht für dich besser verständlich. Keine Ahnung wer bei MQ diesen gresslichen Code-Style durchgesetzt hat. Viel zu eng geschrieben. Kommentare die bald länger als der Code dazu *kopfkratz*. Das Screen-Format erinnert an die Zeiten wo 640KB RAM ausreichend waren :-)

//+------------------------------------------------------------------+
//|                                               OnTrade_Sample.mq5 |
//|                        Copyright 2018, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2018, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
 
input    int days=7;                                                        // Umfang der Handelshistorie in Tagen

datetime     start;                                                         // Anfangsdatum der Handelshistorie im Cache
datetime     end;                                                           // Enddatum der Handelshistorie im Cache
 
int          orders;                                                        // Anzahl der aktiven Aufträge
int          positions;                                                     // Anzahl der offenen Positionen
int          deals;                                                         // Anzahl der Deals in der Handelshistorie im Cache
int          history_orders;                                                // Anzahl der Aufträge in der Handelshistorie
bool         started=false;                                                 // Flag der Relevanz des Zählers
 
//+------------------------------------------------------------------+
//| Expert Initialisierungsfunktion                                  |
//+------------------------------------------------------------------+
int OnInit()
  {

   end = TimeCurrent();
   start = end-days * PeriodSeconds(PERIOD_D1);
   PrintFormat("Limits of the history to be loaded: start - %s, end - %s",TimeToString(start),TimeToString(end));
   InitCounters();

   return(0);
  }
//+------------------------------------------------------------------+
//|  Initialisierung Zähler von Position, Auftrag und Deals          |
//+------------------------------------------------------------------+
void InitCounters()
  {
   ResetLastError();

   bool selected = HistorySelect(start,end);
   if(!selected)
     {
      PrintFormat("%s. Failed to load history from %s to %s to cache. Error code: %d",__FUNCTION__,TimeToString(start),TimeToString(end),GetLastError());
      return;
     }

   orders    = OrdersTotal();
   positions = PositionsTotal();
   deals     = HistoryDealsTotal();
   history_orders = HistoryOrdersTotal();
   started = true;
   Print("Counters of orders, positions and deals successfully initialized");
  }  
//+------------------------------------------------------------------+
//| Tick-Funktion des Experten                                       |
//+------------------------------------------------------------------+
void OnTick()
  {
   if(started) SimpleTradeProcessor();
   else InitCounters();
  }
//+------------------------------------------------------------------+
//| Aufruf wenn ein Handelsereignis eintritt                         |
//+------------------------------------------------------------------+
void OnTrade()
  {
   if(started) SimpleTradeProcessor();
   else InitCounters();
  }
//+------------------------------------------------------------------+
//| Beispiel für das Bearbeiten der Änderungen im Handel und Historie|
//+------------------------------------------------------------------+
void SimpleTradeProcessor()
  {
   end = TimeCurrent();
   ResetLastError();
                                                                                    
   bool selected = HistorySelect(start,end);
   if(!selected)
     {
      PrintFormat("%s. Failed to load history from %s to %s to cache. Error code: %d",__FUNCTION__,TimeToString(start),TimeToString(end),GetLastError());
      return;
     }

   int curr_orders         = OrdersTotal();
   int curr_positions      = PositionsTotal();
   int curr_deals          = HistoryDealsTotal();
   int curr_history_orders = HistoryOrdersTotal();

   if(curr_orders != orders)
     {
      PrintFormat("Number of orders has been changed. Previous value is %d, current value is %d",orders,curr_orders);
      orders = curr_orders;
     }

   if(curr_positions != positions)
     {
      PrintFormat("Number of positions has been changed. Previous value is %d, current value is %d",positions,curr_positions);
      positions = curr_positions;
     }

   if(curr_deals != deals)
     {
      PrintFormat("Number of deals has been changed. Previous value is %d, current value is %d",deals,curr_deals);
      deals = curr_deals;
     }

   if(curr_history_orders != history_orders)
     {
      
      PrintFormat("Number of orders in history has been changed. Previous value is %d, current value is %d",history_orders,curr_history_orders);
     
     history_orders = curr_history_orders;
     }

   CheckStartDateInTradeHistory();
  }
//+------------------------------------------------------------------+
//|  Ändern des Anfangsdatum zur Anforderung der Handelshistorie     |
//+------------------------------------------------------------------+
void CheckStartDateInTradeHistory()
  {

   datetime curr_start = TimeCurrent()-days*PeriodSeconds(PERIOD_D1);


   if(curr_start-start > PeriodSeconds(PERIOD_D1))
     {
      
      start = curr_start;
      PrintFormat("New start limit of the trade history to be loaded: start => %s",TimeToString(start));
     
      HistorySelect(start,end);
      
      history_orders = HistoryOrdersTotal();
      deals = HistoryDealsTotal();
     }
  }
/
Otto Pauser
2161
Otto Pauser  
Christian:

Keine Ahnung wer bei MQ diesen gresslichen Code-Style durchgesetzt hat. Viel zu eng geschrieben. Kommentare die bald länger als der Code dazu *kopfkratz*.

Da hast du ja so recht!

@Bayne

Wofür brauchst du das überhaupt. Willst du wissen ob die letzte Position Profit gemacht hat? Schau in der History nach:

double LastDealsProfit(string _symbol, int back=3600)
{
   datetime limit=TimeCurrent();
   datetime start=limit-back;                   // 3600=seconds of 1 hour, 86400=seconds of 1 day

   if(!HistorySelect(start,limit))              // select history
      return(NULL);                             // no history available

   uint     idx, 
            idxMax=HistoryDealsTotal()-1;
   ulong    deal_ticket;
   string   deal_symbol;
   long     deal_entry;
   long     deal_reason;
   
   double   deal_commiss;
   double   deal_swap;
   double   deal_profit;
   double   deal_result;

   for(idx=idxMax; idx>0; idx--)
      {
         deal_ticket = HistoryDealGetTicket(idx);                       // get ticket
         deal_symbol = HistoryDealGetString(deal_ticket,DEAL_SYMBOL);   // get symbol
         if(deal_symbol==_symbol)                                       // check symbol
            {
               deal_entry  = (ENUM_DEAL_ENTRY )HistoryDealGetInteger(deal_ticket,DEAL_ENTRY);
               deal_reason = (ENUM_DEAL_REASON)HistoryDealGetInteger(deal_ticket,DEAL_REASON);
               if(deal_entry==DEAL_ENTRY_OUT)                           // check entrytype
                //if(deal_reason==DEAL_REASON_SL)                       // check reason
                     {
                        deal_commiss = HistoryDealGetDouble (deal_ticket,DEAL_COMMISSION);
                        deal_swap    = HistoryDealGetDouble (deal_ticket,DEAL_SWAP);
                        deal_profit  = HistoryDealGetDouble (deal_ticket,DEAL_PROFIT);
                        deal_result  = deal_commiss+deal_swap+deal_profit;
                        return(deal_result);
                     }
            }
      }
   return(NULL);
}
Bayne
1010
Bayne  

Habs mittlerweile verstanden (habe es zuvor wei MqlTradeRequest versucht zu behandeln, wobei es doch ganz simpel wie OnTick() oder OnInit() ist, oh mann manchmal sieht man den wald vor lauter Bäumen nicht mehr)

Mein Code muss anscheinend nochmals debuggt werden, wirds wohl an OnTrade nicht liegen.

Selbstverständlich habe ich schon vor meinen MQL4-Zeiten angefangen C++ zu lernen und erweitere habs langsam mehr oder weniger drinnen mit  dem objektorientierten Part (bin aber immernoch zu bequem weitere .mqhs anzulegen.    Danke nochmals.

Lange Rede kurzer Sinn:


Ich will das hier machen:

1 : ->Signal
2 : opening a Position (remembering its SL Level)
3 : setting an opposite pending order with x2 the initial lot size and 10 pips TP and finally setting SL Below/Above your initial trade SL + 5 pips
4 : if your initial trade hit the TP (or Trailingstop) then cancel the pending order


Ich scheitere am 4. Teil, einfach aus dem Grund, weil ich nicht genau weiss, wie ich diese Position, nachdem sie geschlossen ist behandeln soll.

Ist ja wohl ein Deal, dennoch scheitere ich schon alleine beim Versuch nur eine:

void OnTrade(){
if (OrdersTotal()>0)
     {
       if (PositionsTotal()>0) 
            {
             long youngestPositiontime =0;
             int totalPositions =PositionsTotal();                
             for(int i=0;i<totalPositions;i++)
             
                 {ulong ticket=PositionGetTicket(i);
                  if (PositionGetInteger(POSITION_TYPE)==(POSITION_TYPE_BUY||POSITION_TYPE_SELL) && PositionGetInteger(POSITION_MAGIC)==MagicNummer && PositionGetInteger(POSITION_TIME) > youngestPositiontime)
                        {
                        PositionTicket=ticket;
                        //PositionID = PositionGetInteger(POSITION_IDENTIFIER);
                        youngestPositiontime = PositionGetInteger(POSITION_TIME);
                        }
                 }
            }
            else 
            {
            //PositionID =0;
            PositionTicket=0;
            
            if(HistoryDealGetInteger(PositionTicket,DEAL_REASON)==DEAL_REASON_SL && HistoryDealGetInteger(PositionTicket,DEAL_MAGIC)==MagicNummer)
                     {     

                         int totalOrders =OrdersTotal();        
                         for(int i=0;i<totalOrders;i++)
                             {ulong ticket=PositionGetTicket(i);
                              if (PositionGetInteger(POSITION_TYPE)==(ORDER_TYPE_BUY_STOP||ORDER_TYPE_SELL_STOP) && PositionGetInteger(POSITION_MAGIC)==MagicNummer)
                                    {
                                    OrderTicket=ticket;
                                          {
                                          DeletePending(ticket);
                                          }
                                    }
                              }
                              
                     }
              }       
                 
     }
}            
lippmaje
1190
lippmaje  
Nun ja, wie wäre es mal mit dem Code-Styler? Bei der Indentierung so wie es jetzt ist erkennt man ja fast nichts.
Bayne
1010
Bayne  
lippmaje:
Nun ja, wie wäre es mal mit dem Code-Styler? Bei der Indentierung so wie es jetzt ist erkennt man ja fast nichts.

Lange Rede kurzer Sinn:


Ich will das hier machen:

1 : ->Signal
2 : opening a Position (remembering its SL Level)
3 : setting an opposite pending order with x2 the initial lot size and 10 pips TP and finally setting SL Below/Above your initial trade SL + 5 pips
4 : if your initial trade hit the TP (or Trailingstop) then cancel the pending order


Ich scheitere am 4. Teil, einfach aus dem Grund, weil ich nicht genau weiss, wie ich diese Position, nachdem sie geschlossen ist behandeln soll. (als Deal ist mir schon klar, aber wie genau muss ich 

HistoryDealGetInteger(PositionTicket,DEAL_REASON)==DEAL_REASON_SL

anwenden, um an den schlusspreis zu kommen?)

12
Einloggen oder registrieren, um einen Kommentar zu schreiben