Jump to content
Tom Next - Daytrading Community

OrdersHistoryTotal auslesen


Nelly1966

Recommended Posts

Hallo alle zusammen,

 

bin seit Tagen dabei eine Funktion zu meinem EA hinzuzufügen, aber ich kommen zu keinem vernünftigen Ergebnis.

 

Vielleicht findet der ein oder andere Profi-Coder die Zeit, einen kurzen Blick darauf zu werfen.

 

bool last_order_buy   = false,
bool last_order_sell  = false;

  int OHT=OrdersHistoryTotal()-1;
          
  for(int i=OHT; i>=0; i--)
     {
     if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)==false)
        { 
        Print("Zugriff auf historische Daten nicht möglich (",GetLastError(),")");
        break;
        } 
     if (OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)==true && OrderType()==OP_BUY)
        {
        Print("Letzte Order war ein Kauf");
        last_order_buy = true;
        }
     if (OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)==true && OrderType()==OP_SELL)   
        {
        Print("Letzte Order war ein Verkauf");
        last_order_sell = true;
        }
     }

 

Der EA soll nach einem abgeschlossenen Kauf nur einen Verkauf tätigen, danach wieder ein Kauf ... usw. Sell, Buy, Sell, Buy ...

 

Da der EA auch nicht immer arbeitet, soll zu Tagesbeginn die Richtung egal sein, also nicht die entgegengesetzte Richtung zum letzten Trade des vorherigen Tages. Hierzu ist mir noch gar nichts eingefallen. Hier könnte ich einen Tipp gut gebrauchen.

 

Vielen Dank allen im voraus.

 

MfG

Nelly

Link to comment
Share on other sites

Du durchläufst die Orderhistorie in der falschen Richtung. Die letzter Order deiner For-Schleife ist immer die erste "der Geschichte".

nebenbei: Wozu überhaupt die For-Schleife? Dich interessiert doch nur die jüngste Order der Historie?

Link to comment
Share on other sites

Du durchläufst die Orderhistorie in der falschen Richtung. Die letzter Order deiner For-Schleife ist immer die erste "der Geschichte".

nebenbei: Wozu überhaupt die For-Schleife? Dich interessiert doch nur die jüngste Order der Historie?

 

Hallo Phillipp,

 

wie wäre denn Dein Lösungsvorschlag?

 

so in etwa?


int  OHT  = OrdersHistoryTotal()-1;
bool Buy  = false;
bool Sell = false;

if(OHT == 0 || OrderType()==OP_SELL) Sell = true;

if(OHT == 0 || OrderType()==OP_BUY) Buy = true;

 

Dann wäre auch der tägliche "Neubeginn" gleich mit eingebaut, oder?

 

Muss ich mal ausprobieren ...

Edited by Nelly1966
Link to comment
Share on other sites

Hallo Phillipp,

 

wie wäre denn Dein Lösungsvorschlag?

 

so in etwa?


int  OHT  = OrdersHistoryTotal()-1;
bool Buy  = false;
bool Sell = false;

if(OHT == 0 || OrderType()==OP_SELL) Sell = true;

if(OHT == 0 || OrderType()==OP_BUY) Buy = true;

 

Dann wäre auch der tägliche "Neubeginn" gleich mit eingebaut, oder?

 

Muss ich mal ausprobieren ...

 

 

So funktioniert schon mal der beabsichtigte Wechsel zwischen Kauf & Verkauf,

aber bei Tagesbeginn fängt er nicht neutral an, sondern nimmt die letzte Order

des Vortages als Referenz.

 

Hm ... hat hierzu jemand ne Idee?

 

Muss da wahrscheinlich noch ne Zeitkomponente einbauen, oder?

Link to comment
Share on other sites

Du durchläufst die Orderhistorie in der falschen Richtung. Die letzter Order deiner For-Schleife ist immer die erste "der Geschichte".

 

Ist es garantiert das die "letzte" in der History auch die zuletzt geschlossene ist? AFAIR gibt MT da keinerlei Garantie wie die Orders geordnet sind.

 

 

@Nelly deine späteren Vorschläge können aus meiner Sicht gar nicht funktionieren (zumindest der Codeteil) weil du gar keine Order auswählst.

 

Um zu wissen welche Richtung die letzte geschlossene Order hatte müsstest du bei jeder Order die OrderCloseTime() überprüfen und die jüngste speichern.

 

Aber gänge es nicht einfacher, wenn du dir mit einer static Variable merkst welche Order du als letztes eröffnet hast? Hängt jetzt natürlich von der Gesamtlogik des EAs ab.

 

hth

Link to comment
Share on other sites

Da der EA auch nicht immer arbeitet, soll zu Tagesbeginn die Richtung egal sein, also nicht die entgegengesetzte Richtung zum letzten Trade des vorherigen Tages. Hierzu ist mir noch gar nichts eingefallen. Hier könnte ich einen Tipp gut gebrauchen.

Ich weiß jetzt auch nicht, ob du als ersten Eintrag in der Orderhistory immer die letzte Order bekommst, aber du könntest sowas in der Art vesuchen. Habs jetzt nicht ausprobiert, aber nur mal als Ansatz.

 

bool last_order_buy   = false,
bool last_order_sell  = false;
datetime latestorder=0;
bool alloworder=false;

  int OHT=OrdersHistoryTotal()-1;
          
  for(int i=0; i<=OHT; i++)
     {
     if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)==false)
        { 
        Print("Zugriff auf historische Daten nicht möglich (",GetLastError(),")");
        break;
        } 
     latestorder=MathMax(OrderCloseTime(),latestorder); 
     if (OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)==true && OrderType()==OP_BUY)
        {
        Print("Letzte Order war ein Kauf");
        last_order_buy = true;
        }
     if (OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)==true && OrderType()==OP_SELL)   
        {
        Print("Letzte Order war ein Verkauf");
        last_order_sell = true;
        }
     }
     if(TimeDayOfYear(latestorder)!=DayOfYear())
        alloworder=true;

Über alloworder siehst du dann, ob heute schon eine Order war und kannst abhängig davon entscheiden, ob du eine neue Position erlaubst.

 

EDIT: ähm, natürlich muss man in die richtige Richtung zählen ... :wub:

Link to comment
Share on other sites

@WOGO: Hmmm also das funktioniert sicher nicht (von den Syntaxerrors mal abgesehen).

 

Wenn WOGO Codeschnippsel gibt, geb ich auch ;)

 

  bool last_order_buy   = false,
  bool last_order_sell  = false;
  datetime latestorder=0;
  bool alloworder=false;

  int OHT=OrdersHistoryTotal()-1;
          
  for(int i=0; i<=OHT; i++)
  {
     if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)==false)
     { 
        Print("Zugriff auf historische Daten nicht möglich (",GetLastError(),")");
        break;
     } 

     if (OrderType()==OP_BUY && OrderCloseTime() > latestorder)
     {
        last_order_buy = true;
        last_order_sell = false;
     }

     if (OrderType()==OP_SELL && OrderCloseTime() > latestorder)   
     {
        last_order_buy = false;
        last_order_sell = true;
     }
     latestorder=MathMax(OrderCloseTime(),latestorder); 
     
 }
 if(TimeDayOfYear(latestorder)!=DayOfYear())
    alloworder=true;

 

Das sollte passen. Bei Bedarf nicht vergessen noch Abfragen obs überhaupt "deine" Order war dazupacken.

Link to comment
Share on other sites

Ist es garantiert das die "letzte" in der History auch die zuletzt geschlossene ist? AFAIR gibt MT da keinerlei Garantie wie die Orders geordnet sind.

IMHO entspricht die Reihenfolge und auch die Selektion der angezeigten Tabelle in der MT4-Oberfläche. Ist also fast willkürlich.

Link to comment
Share on other sites

Vielen Dank Euch allen!!! :chocala:

 

Ihr habt mir sehr geholfen, waren viele gute - für mich völlig neue :stars: - Ideen dabei!!!

 

Möge der Trend immer mit Euch sein ... http://smilies-world.de/smilies_pictures/2977.gif

 

Nelly http://www.clicksmilies.com/s1106/travesmilies/smilie_bayer1.gif

  • Upvote 1
Link to comment
Share on other sites

:ot:

Wenn ich das programmieren auch nicht kapiere, aber zumindest wird mein Abkürzungs Repertoire

dank Tom-Next immer größer :laugh:

 

 

 

Wie recht du hast, ich lese hier immer gerne mit, aber ich verstehe nur Bahnhof!:doink:

 

Aber ein Glück können das andere!:laugh:

 

Ich möchte mein Gehirn, auch nur noch ungern damit foltern!!!

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
×
×
  • Create New...