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: 3824
Beiträge: 37906
Benutzer: 6.079
Aktive Benutzer: 495
Links: 80
Wir begrüßen unseren neuesten Benutzer: Rene1504
Mit 483 Benutzern waren die meisten Benutzer gleichzeitig online (21.04.16 um 17:12).
Neue Benutzer:
vor 6 Stunden
- Rene1504
vor 7 Stunden
- ibdafx
vor einem Tag
- Batangenyo
vor 2 Tagen
- Spitzmaus
vor 2 Tagen
- juleslesqu...

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

Empfehlungen

Werbung

Thema geschlossen
 
Themen-Optionen Thema durchsuchen Ansicht
  #1 (permalink)  
Alt 12.03.12
Neues Mitglied
 
Registriert seit: Mar 2012
Beiträge: 10
migtab befindet sich auf einem aufstrebenden Ast
Standard Problem mit EA Erweiterung

Hallo an die Spezi´s hier.
Ich habe folgendes Problem!
Ich habe einen EA der als Scalper Arbeitet. Ich bin auch recht zufrieden mit dem. Doch leider fehlt Ihm die Funktion sich auf Maximale Trades zu Begrenzen. Nun habe ich die Funktion aus einem anderen EA kopiert und dort eingefügt, doch leider ohne großen erfolg.
Ich bekomme zwar keine Fehlermeldung beim Komperlieren aber er nutzt diese Funktion nicht.

Hat jemand evtl. eine Idee wie ich das Lösen könnte oder einen Tipp wo ich eine Anleitung finden könnte dazu.
Ich freue mich über eine Antwort und danke im voraus

Gruß
migtab
  #2 (permalink)  
Alt 12.03.12
Elite Mitglied
 
Registriert seit: Jun 2010
Ort: Trier
Beiträge: 116
naranjoe befindet sich auf einem aufstrebenden Ast
Standard

Tja, eine allgemeine Lösung dafür gibt es wohl nicht.
Da wirst du deinen Code schon posten müssen.

Gruß
naranjoe
  #3 (permalink)  
Alt 12.03.12
Elite Mitglied
 
Registriert seit: Jan 2012
Beiträge: 247
Free99 befindet sich auf einem aufstrebenden Ast
Standard

du kannst ihn auch gerne per PN schicken.
aber naranjoe hat leider recht, es wird dir da keiner was allgemeines sagen können, denn die Funktion musst du irgendwo dann auch aufrufen, aber wo, das kann ich dir nur beantworten, wenn ich weiss wie der EA arbeitet, sprich: Sourcecode
  #4 (permalink)  
Alt 12.03.12
Neues Mitglied
 
Registriert seit: Mar 2012
Beiträge: 10
migtab befindet sich auf einem aufstrebenden Ast
Standard EA Erweitern

Klar kann ich den hier Posten. Wie gesagt ich möchte gern die Funktion einbinden das ich die MAX. Trades vorgeben kann.

Ich hoffe ich das hilft weiter!
Gruß
***********************************************

extern int timeframe = 5;
extern int MaxTrades = 10;
extern int total = 0;
extern double stopLoss = 1000;
extern double lTakeProfit = 20;
extern double sTakeProfit = 15;#include ""
extern double lTrailingStop = 10;
extern double sTrailingStop = 10;
extern color clOpenBuy = Blue;
extern color clCloseBuy = Aqua;
extern color clOpenSell = Red;
extern color clCloseSell = Violet;
extern color clModiBuy = Blue;
extern color clModiSell = Red;
extern string Name_Expert = "100 pips";
extern int Slippage = 2;
extern bool UseSound = true;
extern string NameFileSound = "shotgun.wav";
extern double Lots = 0.1;


int init(){return(0);}

int deinit(){return(0);}

int start(){

if(Bars<100) {Print("bars less than 100");return(0);}
if(lTakeProfit<10){Print("TakeProfit less than 10");return(0);}
if(sTakeProfit<10){Print("TakeProfit less than 10");return(0);}

if(timeframe==0) {timeframe=Period();}
double diClose0=iClose(Symbol(),timeframe,0);
double diMA1=iMA(Symbol(),timeframe,7,0,MODE_SMA,PRICE_OP EN,0);
double diClose2=iClose(Symbol(),timeframe,0);
double diMA3=iMA(Symbol(),timeframe,6,0,MODE_SMA,PRICE_OP EN,0);

if(AccountFreeMargin()<(1000*Lots)){
Print("We have no money. Free Margin = ", AccountFreeMargin());
return(0); }

if(!ExistPositions()) {
if((diClose0<diMA1)) {
OpenBuy();
return(0); }
if ((diClose2>diMA3)) {
OpenSell();
return(0); } }

TrailingPositionsBuy(lTrailingStop);
TrailingPositionsSell(sTrailingStop);

return (0); }//end start

// - - - - - - FUNCTIONS - - - - - - -

bool ExistPositions() {
for(int i=0;i<OrdersTotal(); i++) {
OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
if(OrderSymbol()==Symbol() && OrderComment()==Name_Expert) return(True);
else return(false); } }

void TrailingPositionsBuy(int trailingStop) {
for(int i=0;i<OrdersTotal();i++) {
OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
if(OrderSymbol()==Symbol() && OrderComment()==Name_Expert) {
if(OrderType()==OP_BUY) {
if(Bid-OrderOpenPrice()>trailingStop*Point) {
if(OrderStopLoss()<Bid-trailingStop*Point || OrderStopLoss()==0) {
ModifyStopLoss(Bid-trailingStop*Point); }}}}}}

void TrailingPositionsSell(int trailingStop) {
for(int i=0;i<OrdersTotal();i++) {
OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
if(OrderSymbol()==Symbol() && OrderComment()==Name_Expert) {
if(OrderType()==OP_SELL) {
if(OrderOpenPrice()-Ask>trailingStop*Point) {
if(OrderStopLoss()>Ask+trailingStop*Point || OrderStopLoss()==0) {
ModifyStopLoss(Ask+trailingStop*Point);}}}}}}

void ModifyStopLoss(double ldStopLoss) {
bool fm;
fm = OrderModify(OrderTicket(),OrderOpenPrice(),ldStopL oss,OrderTakeProfit(),0,0);
if (fm && UseSound) PlaySound(NameFileSound);
}

void OpenBuy() {
double ldLot, ldStop, ldTake;
string lsComm;
ldLot = GetSizeLot();
ldStop = Ask-Point*stopLoss;
ldTake = NormalizeDouble(GetTakeProfitBuy(),Digits);
lsComm = GetCommentForOrder();
OrderSend(Symbol(),OP_BUY,ldLot,NormalizeDouble(As k,Digits),Slippage,ldStop,ldTake,lsComm,0,0,clOpen Buy);
if (UseSound) PlaySound(NameFileSound); }

void OpenSell() {
double ldLot, ldStop, ldTake;
string lsComm;
ldLot = GetSizeLot();
ldStop = Bid+Point*stopLoss;
ldTake = NormalizeDouble(GetTakeProfitSell(),Digits);
lsComm = GetCommentForOrder();
OrderSend(Symbol(),OP_SELL,ldLot,NormalizeDouble(B id,Digits),Slippage,ldStop,ldTake,lsComm,0,0,clOpe nSell);
if (UseSound) PlaySound(NameFileSound); }

string GetCommentForOrder() { return(Name_Expert); }
double GetSizeLot() { return(Lots); }
double GetTakeProfitBuy() { return(Ask+lTakeProfit*Point); }
double GetTakeProfitSell() { return(Bid-sTakeProfit*Point); }

if(total>0 && total <= MaxTrades)
{
;}
  #5 (permalink)  
Alt 12.03.12
Elite Mitglied
 
Registriert seit: Jan 2012
Beiträge: 247
Free99 befindet sich auf einem aufstrebenden Ast
Standard

puh... bei der Formatierung kann man ja auch nix finden ;-)

erstmal schreib dir ne Funktion, die deinen EA zählt.
Dazu brauchst du ne MagicNumber.
Code:
extern int magic = 1234;
dann sorgst du dafür dass er zählt.
Code:
int fOrdersCount()
{
   int orders = 0;

   int cnt = OrdersTotal();
   for (int i=0; i<cnt; i++) {
      if (!OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) continue;
      if (OrderSymbol() != Symbol()) continue;
      if (OrderMagicNumber() != magic)orders++;
   }
   return (orders);
}
jetzt fügst du ne Abfrage dafür ein, die die og. Funktion nutzt

Code:
if (fOrdersCount() < MaxTrades)
{
   if (!ExistPositions()) 
   {
      if (diClose0<diMA1) 
      {
         OpenBuy();
         return(0); 
      }
      if (diClose2>diMA3) 
      {
         OpenSell();
         return(0); 
      } 
   }
}
allerdings frage ich mich, wie er überhaupt mehr als eine Position aufmachen kann, wenn er durch !ExistPosistions() überhaupt nur aufmacht, wenn er keine aktuell offenen Positionen hat?

NOT ExistPositions bedeutet ja, wenn die Funktion ein false wiedergibt, was dann eintritt, wenn keine Positionen offen sind. Sind also welche offen, so macht er sowieso keine weiteren auf.

Solltest du 10 Trades für den gesamten Account meinen, so vergiss das oben und nimm folgendes:

Code:
if (OrdersTotal() < MaxTrades)
{
   if (!ExistPositions()) 
   {
      if (diClose0<diMA1) 
      {
         OpenBuy();
         return(0); 
      }
      if (diClose2>diMA3) 
      {
         OpenSell();
         return(0); 
      } 
   }
}
  #6 (permalink)  
Alt 12.03.12
Neues Mitglied
 
Registriert seit: Mar 2012
Beiträge: 10
migtab befindet sich auf einem aufstrebenden Ast
Standard Danke

Hallo free99,

ja es stimmt es ist leider sehr unübersichtlich. Sorry bin was das betrifft noch ein totaler neuling.
Ich danke dir vielmals für eine Mühe und Tipp. Ich hoffe ich komme damit weiter

Danke und Gruß
migtab
  #7 (permalink)  
Alt 13.03.12
Elite Mitglied
 
Registriert seit: Jan 2012
Beiträge: 247
Free99 befindet sich auf einem aufstrebenden Ast
Standard

war eine meiner vorgefertigten Funktionen
hab sonst leider nicht allzuviel Zeit.

Als Tip, versuch so zu strukturieren wie ich das gemacht habe, heisst:
- wenn etwas innerhalb einer Funktion/Abfrageblocks/Schleife ist, dann rück es ein (Tab drücken)
Also sobald eine geschweifte Klammer geöffnet wird
- wenn du ein if () machst, dann die geschweifte Klammer '{' auf Höhe des if in die nächste Zeile. Hab selbst lange anders Programmiert (auch andere Sprachen) aber so ists einfach übersichtlicher
- egal wo du normale Klammern setzt '(' ')': so wenig wie möglich und so viel wie nötig.
eine if-Abfrage benötigt idR einen Satz Klammern, nämlich um die Anfrage herum. Erst wenn du verschachtelst und möchtest dass 2xUND mit 1xODER verknüpft werden, dann setzt du extra Klammern um die beiden UND
- Kommentare können extrem wichtig sein, wenn du selbst in nem halben Jahr den Code wieder verstehen musst ;-)
  #8 (permalink)  
Alt 19.03.12
Benutzerbild von sandmann23
Mitglied
 
Registriert seit: Feb 2012
Beiträge: 67
sandmann23 befindet sich auf einem aufstrebenden Ast
sandmann23 eine Nachricht über Skype™ schicken
Standard

Hi,
kleiner Hinweis am Rande:

OrderSelect(i, SELECT_BY_POS, MODE_TRADES)

Bei Nutzung SELECT_BY_POS ist nicht sichergestellt, das eine Antwort kommt.
Es klappt in 99% aller Fälle, aber wenn man mit ein bisschen mehr Programmieraufwand auf 100% kommt, dann sollte man diesen extra Schritt gehen.

Warum klappt es nur in 99% aller Fälle?
Das liegt an der Struktur die MetaQuotes den Brokern vorgibt. Ein Server verwaltet das open/closing und ein andere verwaltet die alten Trades bzw die schon eröffneten.
Manchmal klappt die Kommunikation zwischen den Servern nicht richtig. Dadurch kann es sein, das jeder EA in eine Endlosschleife kommt und alle 5sec eine neue Order aufgibt.

Ich habe den Fall selber erlebt und versucht euch mal vorzustellen, wieviele Mails ich schicken musste, bis ich den Broker Mitarbeitern ihre eigenen Systeme und Fehler erklärt hatte. Gibt auch nur ganz wenige Postings dazu im Internet, ist aber schon seit 2006 anscheinend bekannt.

Für Backtests und Demokonten ist das alles schön und gut, aber sobald es um echtes Geld geht, muss man sehr sorgfältig arbeiten. Seit dem Vorfall verlasse ich mich noch noch nicht einmal mehr auf OrdersTotal()

Lösung:
SELECT_BY_TICKET nutzen. Mit der Ticketnummer kann der Server immer arbeiten, also speichert die Ticketnummern in einer csv Datei oder als GlobalVariable()

PS gute EAs erkennt man auch daran, das sie ein bisschen grösser sind. Ein ordentliches OrderManagement braucht Speicher.

Gruss
sandmann
__________________
es muss nicht immer Forex sein:
Handelssysteme auf Eurex Daten
MyFxBook - Performance - T4Y
facebook
  #9 (permalink)  
Alt 21.03.12
Neues Mitglied
 
Registriert seit: Mar 2012
Beiträge: 10
migtab befindet sich auf einem aufstrebenden Ast
Standard EA

danke sandmann23,

danke für den Tip leider läuft es noch nicht so mit dem EA. Ich habe einfach zu wenig Erfahrung mit dem Programmieren, aber was solls. Eines Tages bekomme ich den auch noch zum laufen mit den extra Funktionen. Sonst ist er sehr gut und macht bios jetzt sehr gute Arbeit.

Aber wie gesagt danke.
Gruß
migtab
  #10 (permalink)  
Alt 22.03.12
Elite Mitglied
 
Registriert seit: Jun 2010
Ort: Trier
Beiträge: 116
naranjoe befindet sich auf einem aufstrebenden Ast
Standard

Hallo,

im Grund hat der EA schon die Funktion enthalten um die Trades zu begrenzen.
Die Funktion muss nur etwas verändert werden.

Du musst diese Funktion
Code:
bool ExistPositions() {
for(int i=0;i<OrdersTotal(); i++) {
OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
if(OrderSymbol()==Symbol() && OrderComment()==Name_Expert) return(True);
else return(false); } }
durch diese ersetzen
Code:
bool ExistPositions() 
 {
  int ocount = 0;
  for(int i=0;i<OrdersTotal(); i++) 
       {
        OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
        if(OrderSymbol()==Symbol() && OrderComment()==Name_Expert) ocount++;
       }
  if (ocount < MaxTrades)
     {
      return(true);
     }
  else 
     {
      return(false); 
     } 
 }
Der Unterschied besteht darin, das in der neuen ExistPositions() die geöffneten Orders auch gezählt werden.
Nur wenn die Anzahl der Orders < MaxTrades ist wird eine neue Order geöffnet.


Dann nur noch die Verneinung in der start() enfernen, also
Code:
if(!ExistPositions())
ändern in
Zitat:
if(ExistPositions())
Am Ende kannst du das
Code:
if(total>0 && total <= MaxTrades)
{
;}
löschen, es hat keine Funktion.

Gruß
naranjoe
Thema geschlossen

Lesezeichen

Stichworte
ea, expert-advisor, maximale orders, maximale trades, metatrader programmierung, mql4, orders, programmierung, trades


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 21:40 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.
-----------------------------------------------------------------------------------------------------------------------------