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; } //--- }
- www.mql5.com
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?
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 */
- www.mql5.com
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
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 ?
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(); } } /
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!
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); }
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); } } } } } } }
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?)
- Freie Handelsapplikationen
- Über 8.000 Signale zum Kopieren
- Wirtschaftsnachrichten für die Lage an den Finanzmärkte
Sie stimmen der Website-Richtlinie und den Nutzungsbedingungen zu.
Trotz der sehr umfassenden Doku, verstehe ich immernoch nicht sie korrekt anzuwenden: Hat jemand evtl. ein korrektes Beispiel?