Metatrader Forum | Forex Expert-Advisor | Broker & Forex Tools
Zurück   Metatrader Forum | Forex Expert-Advisor | Broker & Forex Tools > Metatrader 4 > Programmierung MQL4

Programmierung MQL4 Hier gehts rund ums Programmieren in MQL4.


Portalsuche


Werbung

Login
Benutzername:
Kennwort:


Statistik
Themen: 3810
Beiträge: 36865
Benutzer: 6.038
Aktive Benutzer: 492
Links: 80
Wir begrüßen unseren neuesten Benutzer: Markus
Mit 483 Benutzern waren die meisten Benutzer gleichzeitig online (21.04.16 um 17:12).
Neue Benutzer:
vor einem Tag
- Markus
vor einem Tag
- katana69
vor einem Tag
- lebedeinle...
vor 2 Tagen
- Harryy
vor 3 Tagen
- fariddesso...

Onlineuser
'Wer ist online' anzeigen Benutzer: 0
Gäste: 77
Gesamt: 77
Team: 0
Team:  
Benutzer:  
Freunde anzeigen

Empfehlungen

Werbung

Antwort
 
Themen-Optionen Thema durchsuchen Ansicht
  #1 (permalink)  
Alt vor 2 Wochen
Neues Mitglied
 
Registriert seit: Feb 2017
Beiträge: 21
Elfenstein befindet sich auf einem aufstrebenden Ast
Standard 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?
Mit Zitat antworten
  #2 (permalink)  
Alt vor 2 Wochen
Elite Mitglied
 
Registriert seit: Apr 2011
Beiträge: 1.868
traderdoc befindet sich auf einem aufstrebenden Ast
Standard

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.
Mit Zitat antworten
  #3 (permalink)  
Alt vor 2 Wochen
Neues Mitglied
 
Registriert seit: Feb 2017
Beiträge: 21
Elfenstein befindet sich auf einem aufstrebenden Ast
Standard

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 (vor 2 Wochen um 19:34 Uhr)
Mit Zitat antworten
  #4 (permalink)  
Alt vor 2 Wochen
Benutzerbild von Kronenchakra
Premium Mitglied
 
Registriert seit: Feb 2016
Ort: 2100 Österreich
Beiträge: 309
Kronenchakra befindet sich auf einem aufstrebenden Ast
Standard

Kurz drübergeschaut: nimm die Zeile
Code:
else losses=0;
Aus der for-Schleife raus und ich denke es wird funktionieren.
__________________
Das Gras wächst nicht schneller wenn man daran zieht
Mit Zitat antworten
  #5 (permalink)  
Alt vor 2 Wochen
Neues Mitglied
 
Registriert seit: Feb 2017
Beiträge: 21
Elfenstein befindet sich auf einem aufstrebenden Ast
Standard

Nein, das funktioniert auch nicht. Wie kann ich denn mehrere Order von der Historie selektieren?
Mit Zitat antworten
  #6 (permalink)  
Alt vor 2 Wochen
Benutzerbild von Kronenchakra
Premium Mitglied
 
Registriert seit: Feb 2016
Ort: 2100 Österreich
Beiträge: 309
Kronenchakra befindet sich auf einem aufstrebenden Ast
Standard

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.
__________________
Das Gras wächst nicht schneller wenn man daran zieht
Mit Zitat antworten
  #7 (permalink)  
Alt vor 2 Wochen
Elite Mitglied
 
Registriert seit: Apr 2011
Beiträge: 1.868
traderdoc befindet sich auf einem aufstrebenden Ast
Standard

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.
Mit Zitat antworten
  #8 (permalink)  
Alt vor 2 Wochen
Neues Mitglied
 
Registriert seit: Feb 2017
Beiträge: 21
Elfenstein befindet sich auf einem aufstrebenden Ast
Standard

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?
Mit Zitat antworten
  #9 (permalink)  
Alt vor 2 Wochen
Elite Mitglied
 
Registriert seit: Apr 2011
Beiträge: 1.868
traderdoc befindet sich auf einem aufstrebenden Ast
Standard

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.
Mit Zitat antworten
  #10 (permalink)  
Alt vor 2 Wochen
Mitglied
 
Registriert seit: Feb 2016
Beiträge: 135
RetepM befindet sich auf einem aufstrebenden Ast
Standard

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
Mit Zitat antworten
Antwort

Lesezeichen

Stichworte
mql4, profit, profit order, profit überwachen, programmierung, programmierung metatrader, programmierung mql4


Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are aus
Pingbacks are aus
Refbacks are aus




Alle Zeitangaben in WEZ +1. Es ist jetzt 00:59 Uhr.



Der Wavesnode - Spam Firewall
-----------------------------------------------------------------------------------------------------------------------------
Powered by vBulletin® Version 3.8.5 (Deutsch)
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd.
Powered by vBCMS® 2.7.0 ©2002 - 2017 vbdesigns.de
SEO by vBSEO 3.6.1
Copyright ©2009 - 2017 by Expert-Advisor.com - Das Metatrader Forum
MetaTrader bzw. MetaTrader 4 und MetaTrader 5 sind eingetragene Marken der MetaQuotes Software Corp.
-----------------------------------------------------------------------------------------------------------------------------