Metatrader Forum | Forex Expert-Advisor | Broker & Forex Tools

Metatrader Forum | Forex Expert-Advisor | Broker & Forex Tools (http://www.expert-advisor.com/forum/index.php)
-   Programmierung MQL4 (http://www.expert-advisor.com/forum/forumdisplay.php?f=220)
-   -   Wie die letzten Trades auslesen? (http://www.expert-advisor.com/forum/showthread.php?t=2980)

Ca$hDigger 02.06.13 19:37

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

Hoschie 02.06.13 20:07

Zitat:

Zitat von Ca$hDigger (Beitrag 21474)
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

Hoi,

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);
}


Ca$hDigger 02.06.13 22:35

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

Hoschie 03.06.13 16:58

Zitat:

Zitat von Ca$hDigger (Beitrag 21482)
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

Du musst in der OrderHistorie suchen:

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);                         
        } 
        }
   
    } 
    {
   
   
    }
    }

Carpe Diem,
Hoschie

traderdoc 03.06.13 17:50

@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;
  }

Sollen es mehr Trades sein, dann statt 10 eine andere Zahl oder als Variable deklarieren - fertig!

traderdoc

Ca$hDigger 01.08.13 14:20

@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);
  }

Das Problem ist nun das riesige negative Zahlen als Summe entstehen statt der korrekten Addierung der History. Im Print also im Journal sieht man das dann zB -173022.4788 oder ähnliche unkorrekte Werte

LG C$D

Ca$hDigger 01.08.13 17:11

:confused: 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 :confused:

traderdoc 01.08.13 18:16

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

Ca$hDigger 01.08.13 20:46

Danke das Problem war double :o

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

traderdoc 01.08.13 21:57

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);
  }

traderdoc


Alle Zeitangaben in WEZ +2. Es ist jetzt 12:43 Uhr.

Powered by vBulletin® Version 3.8.5 (Deutsch)
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
SEO by vBSEO 3.6.1
Powered by vBCMS® 2.7.0 ©2002 - 2024 vbdesigns.de
Copyright ©2009 - 2023 by Expert-Advisor.com - Das Metatrader Forum