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)
-   -   Profit von mehreren zur gleichen Zeit geschlossenen Orders überwachen (http://www.expert-advisor.com/forum/showthread.php?t=5919)

Elfenstein 06.11.17 18:13

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

Jetzt habe ich das Problem, dass mit diesem Code nur der Profit vom letzten geschlossenen Order überwacht wird, doch ich brauche das Ergebnis von dem Order-Haufen, der eben geschlossen wurde. Doch ich brauche das korrekte Ergebnis, denn anhand "if(checkforlosses())" kann ich dann wunderbar weitere Befehle ausführen oder eben nicht ausführen lassen. Z.B.:

Code:

if(checkforlosses())
      {
      if (lots < 2.20) lots += 0.10;
      }
      else
      {
      if (lots > 0.05) lots -= 0.05;
      }

Was kann man denn da machen?

traderdoc 06.11.17 18:40

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

Elfenstein 06.11.17 19:16

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?

Kronenchakra 06.11.17 21:34

Kurz drübergeschaut: nimm die Zeile
Code:

else losses=0;
Aus der for-Schleife raus und ich denke es wird funktionieren.

Elfenstein 06.11.17 22:22

Nein, das funktioniert auch nicht. Wie kann ich denn mehrere Order von der Historie selektieren?

Kronenchakra 06.11.17 23:06

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.

traderdoc 06.11.17 23:21

Ich kann Dir nur schreiben, versuche das mit den genannten Zeiten umzusetzen oder formuliere Dein Anliegen evtl. nochmals, aber diesmal eineindeutig.

traderdoc

Elfenstein 07.11.17 01:26

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?

traderdoc 07.11.17 10:14

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

RetepM 07.11.17 15:25

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


Alle Zeitangaben in WEZ +2. Es ist jetzt 23: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