|
Programmierung MQL4 Hier gehts rund ums Programmieren in MQL4. |
|
Themen-Optionen | Thema durchsuchen | Ansicht |
|
|||
Profit von mehreren zur gleichen Zeit geschlossenen Orders überwachen
Hallo, ich habe da eine kleine Programmierungsfrage:
Ich habe mir einen EA gebastelt. Ein EA der häufig mehrere Order zur gleichen Zeit schließt. Mal werden alle Order geschlossen, weil alle Order zusammengerechnet einen gewünschten TakeProfit erreicht haben und mal werden alle Order geschlossen, weil einer oder mehrere der laufenden Order in den StopLoss gelaufen sind. Und dieser Teil vom Code überwacht nach dem Schließen den Profit: Code:
bool checkforlosses() { int losses=0; int i; for(i=0; i<OrdersHistoryTotal(); i++) { OrderSelect(i,SELECT_BY_POS,MODE_HISTORY); if(OrderSymbol()!=Symbol() || OrderMagicNumber()!=MagicNumber) continue; if(OrderProfit()<0) losses++; else losses=0; } if(losses>0) return(true); return(false); } Code:
if(checkforlosses()) { if (lots < 2.20) lots += 0.10; } else { if (lots > 0.05) lots -= 0.05; } |
|
|||
Da muss sich Dein EA die Zeit merken, zu der alle Orders geschlossen wurden.
Und in der Funktion checkforlosses werden dann nur die geschlossenen Orders selektiert, welche zwischen dieser Zeit und der Zeit des Einsprunges in diese Funktion geschlossen wurden. traderdoc
__________________
Ich erfülle Euch gern Eure EA-, Indikator- und Script-Programmierungswünsche auf Honorarbasis. |
|
|||
Die laufenden Order werden sowieso mit einem Count gezählt und "o_count" ist die Ausgabe für die laufende Order und beim Schließen wird "o_count" immer wieder zurückgesetzt. Könnte ich "o_count" z.B. so nutzen: "OrderSelect(o_count,SELECT_BY_POS,MODE_HISTOR Y);" sodass immer exakt anhand der Zahl von "o_count" rückblickend zusammengerechnet wird. Doch mit "OrderSelect(o_count,SELECT_BY_POS,MODE_HISTOR Y);" würde ja trotzdem immer nur der eine beachtet werden. Wie müsste der Code aussehen, sodass mehrere beachtet und zusammengerechnet werden?
Geändert von Elfenstein (06.11.17 um 19:34 Uhr) |
|
|||
Kurz drübergeschaut: nimm die Zeile
Code:
else losses=0; |
|
|||
Nein, das funktioniert auch nicht. Wie kann ich denn mehrere Order von der Historie selektieren?
|
|
|||
Sorry ich versteh das ganze nicht wirklich.
Du zählst ja nur die Positionen die im Verlust waren und nicht den Verlust oder Profit. Weiters gibt dir diese Funktion nur wahr oder falsch zurück. Was willst du mit dem anfangen? Ich klink mich da mal aus. |
|
|||
Ich kann Dir nur schreiben, versuche das mit den genannten Zeiten umzusetzen oder formuliere Dein Anliegen evtl. nochmals, aber diesmal eineindeutig.
traderdoc
__________________
Ich erfülle Euch gern Eure EA-, Indikator- und Script-Programmierungswünsche auf Honorarbasis. |
|
|||
Nein Kronenchakra, klingt dich wieder ein
Ich erkläre es euch genauer. Der EA macht folgendes. Er öffnet einen Buy mit Lot 0.01 und SL 700, doch mit einer Range von 200. Das heisst wenn der Buy um 200 Pips runterfällt, dann wird ein Sell mit Lot 0.02 und SL 700 geöffnet. Wenn dieser Sell um 200 Pips steigt, dann wird wieder der nächste Order als Buy mit Lot 0.04 und SL 700 geöffnet und so weiter. Wieviel Order er maximal öffnet variiert auch nach der Startlot. Das ist also auch nicht immer gleich. Irgendeiner von denen könnte dann in den SL 700 laufen. Welcher es sein wird, ist auch unterschiedlich, doch wie lasse ich dann nach dem Schließen der Order alles zusammenrechnen, damit der EA weiß, ob das jetzt profitabel war oder nicht? |
|
|||
So jetzt schreibe ich es Dir das dritte Mal. Du brauchst eine Startzeit. Das kann die Zeit des Schließens aller Orders sein oder auch die Zeit des Öffnens der ersten Order. Beim Selektieren der historischen Orders ist diese Zeit nun das sog. linke Zeitmaß und die Zeit in der in die Funktion gesprungen wird, das rechte Zeitmaß. Und dazwischen müssen die geschlossenen Orders dieses! Währungspaares liegen. Beim OrderSend() sollte deshalb auch eine MagicNumber gesetzt werden, die für jeden EA jedes Charts eine andere ist. Bei der Selektion der historischen Orders wird dann also nach dem Symbol des Währungspaares und!! nach der Übereinstimmung der MagicNumber selektiert.
traderdoc
__________________
Ich erfülle Euch gern Eure EA-, Indikator- und Script-Programmierungswünsche auf Honorarbasis. |
|
|||
Hi, Ja, Ja, so ist das mir den kleinen Anfragen... das verwende ich für so was. Bei jedem Tick aufrufen. Davor guckst Du noch, ob Orders vorhanden sind. Die Variablen (CheckAmount und MagicNo) musst Du anpassen:
--------------------------------------------------------- void CheckOpenOrdersAll() { double profit = 0; for (int i=OrdersTotal()-1; i >= 0; i--) { if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) { if (OrderSymbol() == Symbol()) { profit += OrderProfit(); } } else { Print("OrderSelect() error - ", ErrorDescription(GetLastError())); } } if (profit > CheckAmount) { CloseOrders(); } } void CloseOrders(int type=-1) { bool select,close,del; for(int i=OrdersTotal()-1;i>=0;i--) { select=OrderSelect(i,SELECT_BY_POS,MODE_TRADES); if(OrdersTotal()>0&&OrderSymbol()==Symbol()&&Order MagicNumber()==MagicNo) { if(OrderType()==type||type==-1) { if(OrderType()==OP_BUY){close=OrderClose(OrderTick et(),OrderLots(),NormalizeDouble(Bid,Digits),4*Pip Value*Point);} if(OrderType()==OP_SELL){close=OrderClose(OrderTic ket(),OrderLots(),NormalizeDouble(Ask,Digits),4*Pi pValue*Point);} if(OrderType()>OP_SELL){del=OrderDelete(OrderTicke t());} } } } } --------------------------------------------------------- Grüße |
Lesezeichen |
Stichworte |
mql4, profit, profit order, profit überwachen, programmierung, programmierung metatrader, programmierung mql4 |
|
|