|
Startseite | Registrieren | Hilfe | Benutzerliste | Kalender | Suchen | Heutige Beiträge | Alle Foren als gelesen markieren |
Programmierung MQL4 Hier gehts rund ums Programmieren in MQL4. |
|
Themen-Optionen | Thema durchsuchen | Ansicht |
|
|||
Wie die letzten Trades auslesen?
Hallo,
mit welchem Code kann ich denn die letzten Orderergebnisse die schon geschlossen sind auslesen? Sozusagen EA Zugriff auf die Tradehistory. Will den Gewinn bzw Verlust der letzten x Orders verwenden. LG Ca$hDigger |
|
|||
Zitat:
versuch es mal so: Code:
... int nTickets = GetHistoryOrderByCloseTime(); if (nTickets == 0) int nInARow = 0; else{ nInARow = 0; OrderSelect(nTickets, SELECT_BY_TICKET); double lastProfit = OrderProfit() + OrderSwap() + OrderCommission(); for (int iPos = 1; iPos < nTickets; iPos++){ OrderSelect(iPos, SELECT_BY_TICKET); double prevProfit = OrderProfit() + OrderSwap() + OrderCommission(); if (prevProfit * lastProfit < 0) break; nInARow++; } } if (lastProfit < 0) string last="Verluste"; else { Print("Letzter Gewinn",lastProfit); last = "Gewinne"; } Print("G/V:",last,"in Zeile:",nInARow); ... //entscheidende Methode int GetHistoryOrderByCloseTime( int asc=1){ // Rückwärts int nTickets = 0; int tickets[100]; for(int iPos=OrdersHistoryTotal()-1; iPos >= 0; iPos--) if ( OrderSelect(iPos, SELECT_BY_POS, MODE_HISTORY) && OrderMagicNumber() == Magic && OrderSymbol() == Symbol() ){ int nextTicket = OrderTicket(); datetime nextOCT = OrderCloseTime(); ArrayResize(tickets, nTickets+1); for (int iTicket = nTickets; iTicket > 0; iTicket--){ int prevTicket = tickets[iTicket-1]; OrderSelect(prevTicket, SELECT_BY_TICKET); datetime prevOCT = OrderCloseTime(); if ((prevOCT - nextOCT) * asc <= 0) break; tickets[iTicket] = prevTicket; } nTickets++; tickets[iTicket] = nextTicket; } return(nTickets); } |
|
|||
Vielen Dank schon mal! Ich kann noch nicht ganz alles nachvollziehen mein MQL-Skill ist dafür noch nicht ausreichend...
Als Beispiel man hat 10 Variablen in denen als Betrag immer die aktuellen letzten 10 Tradeergebnisse stehen sollen. Wie kann ich konkret dafür den Code nutzen? Habe noch nicht ganz verstanden, ob mit dem Code nur der letzte Trade oder mehrere ausgewählt werden können... LG |
|
|||
Zitat:
Hier mal ein CodeSnippet. Code:
int hstTotal = 10; // Nur Beispiel von 10 Trades in der Historie int HistoryOrderType; int HistoryOrderTicket; int HistoryOrderCloseTime; double HistoryOrderClosePrice; int HistoryOrderOpenTime; double HistoryOrderOpenPrice; double HistoryOrderOpenProfit; double HistoryOrderOpenStopLoss; string OrderName; for(i=0;i<hstTotal;i++) { //---- check selection result if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)==false) { Print("Access to history failed with error (",GetLastError(),")"); break; } HistoryOrderType = OrderType(); if (OrderSymbol() == Symbol()) { HistoryOrderCloseTime=OrderCloseTime(); HistoryOrderClosePrice=OrderClosePrice(); HistoryOrderOpenTime=OrderOpenTime(); HistoryOrderOpenPrice=OrderOpenPrice(); HistoryOrderOpenProfit=OrderProfit(); HistoryOrderOpenStopLoss=OrderStopLoss(); HistoryOrderTicket=OrderTicket(); OrderName=DoubleToStr(HistoryOrderTicket,0)+" "+TimeToStr(HistoryOrderOpenTime)+" "+DoubleToStr(HistoryOrderOpenPrice,4); if(!ObjectCreate(DoubleToStr(HistoryOrderTicket,0), OBJ_TEXT, 0, HistoryOrderOpenTime, (HistoryOrderOpenPrice+HistoryOrderOpenStopLoss)/2)) { Print("error: can't create text_object! code #",GetLastError()); return(0); } ObjectSetText(DoubleToStr(HistoryOrderTicket,0),OrderName,10,"Times New Roman", Yellow); if (HistoryOrderType == OP_BUY) { Print("Order ",OrderName,": BUY t/p ",HistoryOrderOpenProfit," s/l ",HistoryOrderOpenStopLoss); SetArrow(HistoryOrderOpenTime,HistoryOrderOpenPrice,233,Blue); SetArrow(HistoryOrderOpenTime,HistoryOrderOpenPrice + HistoryOrderOpenProfit * Point,177,Blue); SetArrow(HistoryOrderOpenTime,HistoryOrderOpenStopLoss,251,Yellow); if (HistoryOrderClosePrice >= HistoryOrderOpenProfit) SetArrow(HistoryOrderCloseTime,HistoryOrderClosePrice,252,Blue); if (HistoryOrderClosePrice <= HistoryOrderOpenStopLoss) { if (HistoryOrderClosePrice <= HistoryOrderOpenPrice) SetArrow(HistoryOrderCloseTime,HistoryOrderClosePrice,78,Yellow); if (HistoryOrderClosePrice > HistoryOrderOpenPrice) SetArrow(HistoryOrderCloseTime,HistoryOrderClosePrice,254,Blue); } } if (HistoryOrderType == OP_BUYSTOP) { Print("Order ",OrderName,": BUYSTOP t/p ",HistoryOrderOpenProfit," s/l ",HistoryOrderOpenStopLoss); SetArrow(HistoryOrderOpenTime,HistoryOrderOpenPrice,228,Blue); SetArrow(HistoryOrderOpenTime,HistoryOrderOpenPrice + HistoryOrderOpenProfit * Point,177,Blue); SetArrow(HistoryOrderOpenTime,HistoryOrderOpenStopLoss,251,Yellow); if (HistoryOrderClosePrice >= HistoryOrderOpenProfit) SetArrow(HistoryOrderCloseTime,HistoryOrderClosePrice,252,Blue); if (HistoryOrderClosePrice <= HistoryOrderOpenStopLoss) { if (HistoryOrderClosePrice <= HistoryOrderOpenPrice) SetArrow(HistoryOrderCloseTime,HistoryOrderClosePrice,78,Yellow); if (HistoryOrderClosePrice > HistoryOrderOpenPrice) SetArrow(HistoryOrderCloseTime,HistoryOrderClosePrice,254,Blue); } } if (HistoryOrderType == OP_BUYLIMIT) { Print("Order ",OrderName,": BUYLIMIT t/p ",HistoryOrderOpenProfit," s/l ",HistoryOrderOpenStopLoss); SetArrow(HistoryOrderOpenTime,HistoryOrderOpenPrice,200,Blue); SetArrow(HistoryOrderOpenTime,HistoryOrderOpenPrice + HistoryOrderOpenProfit * Point,177,Blue); SetArrow(HistoryOrderOpenTime,HistoryOrderOpenStopLoss,251,Yellow); if (HistoryOrderClosePrice >= HistoryOrderOpenProfit) SetArrow(HistoryOrderCloseTime,HistoryOrderClosePrice,252,Blue); if (HistoryOrderClosePrice <= HistoryOrderOpenStopLoss) { if (HistoryOrderClosePrice <= HistoryOrderOpenPrice) SetArrow(HistoryOrderCloseTime,HistoryOrderClosePrice,78,Yellow); if (HistoryOrderClosePrice > HistoryOrderOpenPrice) SetArrow(HistoryOrderCloseTime,HistoryOrderClosePrice,254,Blue); } } if (HistoryOrderType == OP_SELL) { Print("Order ",OrderName,": SELL t/p ",HistoryOrderOpenProfit," s/l ",HistoryOrderOpenStopLoss); SetArrow(HistoryOrderOpenTime,HistoryOrderOpenPrice,234,Red); SetArrow(HistoryOrderOpenTime,HistoryOrderOpenPrice - HistoryOrderOpenProfit * Point,177,Red); SetArrow(HistoryOrderOpenTime,HistoryOrderOpenStopLoss,251,Yellow); if (HistoryOrderClosePrice <= HistoryOrderOpenProfit) SetArrow(HistoryOrderCloseTime,HistoryOrderClosePrice,252,Red); if (HistoryOrderClosePrice >= HistoryOrderOpenStopLoss) { if (HistoryOrderClosePrice >= HistoryOrderOpenPrice) SetArrow(HistoryOrderCloseTime,HistoryOrderClosePrice,78,Yellow); if (HistoryOrderClosePrice < HistoryOrderOpenPrice) SetArrow(HistoryOrderCloseTime,HistoryOrderClosePrice,254,Red); } } if (HistoryOrderType == OP_SELLSTOP) { Print("Order ",OrderName,": SELLSTOP t/p ",HistoryOrderOpenProfit," s/l ",HistoryOrderOpenStopLoss); SetArrow(HistoryOrderOpenTime,HistoryOrderOpenPrice,230,Red); SetArrow(HistoryOrderOpenTime,HistoryOrderOpenPrice - HistoryOrderOpenProfit * Point,177,Red); SetArrow(HistoryOrderOpenTime,HistoryOrderOpenStopLoss,251,Yellow); if (HistoryOrderClosePrice <= HistoryOrderOpenProfit) SetArrow(HistoryOrderCloseTime,HistoryOrderClosePrice,252,Red); if (HistoryOrderClosePrice >= HistoryOrderOpenStopLoss) { if (HistoryOrderClosePrice >= HistoryOrderOpenPrice) SetArrow(HistoryOrderCloseTime,HistoryOrderClosePrice,78,Yellow); if (HistoryOrderClosePrice < HistoryOrderOpenPrice) SetArrow(HistoryOrderCloseTime,HistoryOrderClosePrice,254,Red); } } if (HistoryOrderType == OP_SELLLIMIT) { Print("Order ",OrderName,": SELLIMIT t/p ",HistoryOrderOpenProfit," s/l ",HistoryOrderOpenStopLoss); SetArrow(HistoryOrderOpenTime,HistoryOrderOpenPrice,202,Red); SetArrow(HistoryOrderOpenTime,HistoryOrderOpenPrice - HistoryOrderOpenProfit * Point,177,Red); SetArrow(HistoryOrderOpenTime,HistoryOrderOpenStopLoss,251,Yellow); if (HistoryOrderClosePrice <= HistoryOrderOpenProfit) SetArrow(HistoryOrderCloseTime,HistoryOrderClosePrice,252,Red); if (HistoryOrderClosePrice >= HistoryOrderOpenStopLoss) { if (HistoryOrderClosePrice >= HistoryOrderOpenPrice) SetArrow(HistoryOrderCloseTime,HistoryOrderClosePrice,78,Yellow); if (HistoryOrderClosePrice < HistoryOrderOpenPrice) SetArrow(HistoryOrderCloseTime,HistoryOrderClosePrice,254,Red); } } } { } } Hoschie |
|
|||
@Ca$hDigger
"Will den Gewinn bzw Verlust der letzten x Orders verwenden." Der arme Mensch will doch nur den Gewinn bzw. Verlust von einer bestimmten Anzahl geschlossener Trades wissen, also gebt ihm doch nicht solche riesigen Brocken. Der Code reicht doch völlig aus und funktioniert dazu auch noch sofort. Code:
//ein Beispiel für die letzten 10 Trades in der Historie double Profit = 0; double Verlust = 0; double x; for (i = 0; i < 10; i++) { OrderSelect(i, SELECT_BY_POS, MODE_HISTORY); x = OrderProfit() + OrderSwap() + OrderCommission(); if (x >= 0) Profit += x; else Verlust += x; } traderdoc |
|
|||
@traderdoc
Habe ein Problem. Hab zum Code noch Variable i hinzugefügt weil sonst variable nicht definiert war und definiere statt Profit und Verlust einfach nur die Summe also noch vereinfachter. Will den Code nun folgendermaßen nutzen: Code:
double summe = 0; //als globale variable if(test) { double x; double i; for (i = 0; i < 10; i++) { OrderSelect(i, SELECT_BY_POS, MODE_HISTORY); x = OrderProfit() + OrderSwap() + OrderCommission(); summe += x; Print("summe=", summe); } LG C$D |
|
|||
verstehe nicht woher diese riesen negativen Werte kommen. Lotgröße usw hab ich alles überprüft beim Gewinn kommen maximale Werte zwischen -13€ bis 13€ raus also das x10 dann höchstens +-130€. Wo liegt der Fehler
|
|
|||
Gut, jetzt hatte ich vorausgesetzt, dass Du die Variable i vorher!!
mit int i; deklarierst und nicht mit double!!! Das geht natürlich auch in for (int i;...........) traderdoc |
|
|||
Danke das Problem war double
Jetzt noch eine wichtige Sache: Es werden immer dieselben ersten 10 Werte des Tradeverlaufs ausgelesen und nicht die letzten 10. Also sprich die ersten 10 Orders die geöffnet wurden werden ausnahmslos ausgelesen, zB. nach 100 Orders werden immer nur die ersten 10 (1,2,3,4,5,6,7,8,9,10) ausgelesen statt die letzten 10 Orders (99, 98, 97, 96, 95, 94 ,93, 92, 91, 90) Wie kann ich das noch fixen? Danke und Gruß C$D |
|
|||
Code:
double summe = 0; //als globale variable if(test) { double x; int i; for (i = OrdersHistoryTotal() - 1 ; i > OrdersHistoryTotal() - 10; i--) { OrderSelect(i, SELECT_BY_POS, MODE_HISTORY); x = OrderProfit() + OrderSwap() + OrderCommission(); summe += x; Print("summe=", summe); } |
Lesezeichen |
Stichworte |
mql4, programmierung, programmierung metatrader, tradehistory, trades auslesen |
Themen-Optionen | Thema durchsuchen |
Ansicht | |
|
|