Jump to content
Tom Next - Daytrading Community

Recommended Posts

Posted

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

Posted

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?

Posted (edited)

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
Posted

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?

Posted

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

Posted

AFAIR gibt MT da keinerlei Garantie wie die Orders geordnet sind.

:ot:

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

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

 

AFAIR

Posted

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:

Posted

@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.

Posted

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.

Posted

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
Posted

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

Please sign in to comment

You will be able to leave a comment after signing in



Sign In Now
×
×
  • Create New...