|
Startseite | Registrieren | Hilfe | Benutzerliste | Kalender | Suchen | Heutige Beiträge | Alle Foren als gelesen markieren |
Programmierung MQL4 Hier gehts rund ums Programmieren in MQL4. |
|
Themen-Optionen | Thema durchsuchen | Ansicht |
|
|||
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 |
|
|||
Tja, eine allgemeine Lösung dafür gibt es wohl nicht.
Da wirst du deinen Code schon posten müssen. Gruß naranjoe |
|
|||
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 |
|
|||
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) { ;} |
|
|||
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; 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); } Code:
if (fOrdersCount() < MaxTrades) { if (!ExistPositions()) { if (diClose0<diMA1) { OpenBuy(); return(0); } if (diClose2>diMA3) { OpenSell(); return(0); } } } 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); } } } |
|
|||
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 |
|
|||
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 ;-) |
|
||||
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 |
|
|||
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 |
|
|||
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); } } 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); } } 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()) Zitat:
Code:
if(total>0 && total <= MaxTrades) { ;} Gruß naranjoe |
Lesezeichen |
Stichworte |
ea, expert-advisor, maximale orders, maximale trades, metatrader programmierung, mql4, orders, programmierung, trades |
Themen-Optionen | Thema durchsuchen |
Ansicht | |
|
|