|
Programmierung MQL4 Hier gehts rund ums Programmieren in MQL4. |
|
Themen-Optionen | Thema durchsuchen | Ansicht |
|
|||
...gut, danke für die Hausaufgaben ;-)
|
|
|||
Mach Dir keine Sorgen, Adlerauge, das wird schon!
Allein um die Sache mit den Indikatoren herauszufinden, habe ich Tage gebraucht! Das kommt davon, wenn alles nur in Englisch und weit verstreut dokumentiert ist. Als ich vor 20 Jahren das Programmieren mal mit dem vielgeschmähten Visual- bzw. Access-Basic angefangen habe, war das Alles viel einfacher! Da konnte man solche Sachen noch mit ein paar Mausklicks machen, da gab es einen Editor, in dem jede Unterfunktion in einem separaten Fenster angezeigt werden konnte usw. usf. Irgendwie sind wir wieder in der programmiertechnischen Steinzeit angekommen, aber was soll man machen? |
|
|||
Hi TLO,
ich habe früher mal ein bisschen HTML programmiert, mehr aber auch nicht. Letztendlich muss man ja die Logik der Programmiersprache verstehen, um damit arbeiten zu können..... Bei Deinem Code zu den wechselnden Trades ist mir noch nicht klar, welche der Parameter ich als Kriterium für die zu öffnenden Trades nehmen muss. Ich habe es nun nochmal mit (LastTradeLong==false && LastTradeShort==true) versucht, funktioniert aber nicht (macht gar keinen Trade auf). Wenn ich nur (LastTradeLong==false) als Kriterium nehme, scheint er sich um den Code zu den wechselnden Trades nicht weiter zu scheren und macht nach Belieben Buys hinter Buys und Sells hinter Sells auf. Hier ist der aktuelle Stand: extern double HandelsLots = 0.01; extern double StopLoss = 50; extern double TakeProfit = 50; int MagicNumber = 1500001; int Zaehler_History; bool LastTradeShort; bool LastTradeLong; bool LongShortWechsel; //+------------------------------------------------------------------+ //| Expert initialization function | //+------------------------------------------------------------------+ int init() { } //+------------------------------------------------------------------+ //| Expert tick function | //+------------------------------------------------------------------+ void OnTick () { double iMom=iMomentum(NULL,5,14,0,0); //Auf einen Long- folgt immer ein Short-Trade und umgekehrt if (LongShortWechsel==true) { for(Zaehler_History=OrdersHistoryTotal();Zaehler_H istory>=0;Zaehler_History--) { OrderSelect(Zaehler_History,SELECT_BY_POS,MODE_HIS TORY); // if(OrderSymbol()!=Symbol() || OrderMagicNumber()!=MagicNumber) // continue; if(OrderSymbol()==Symbol() && OrderMagicNumber()==MagicNumber) { if(OrderType()==OP_BUY) { LastTradeLong=true; LastTradeShort=false; break; } if(OrderType()==OP_SELL) { LastTradeLong=false; LastTradeShort=true; break; } } } } if (OrdersTotal() == 0 && iMom > 100 && LastTradeLong==false) { OrderSend(Symbol(),OP_BUY,HandelsLots,Ask,2,Ask-StopLoss*Point,Ask+TakeProfit*Point,NULL,0,0,Green ); } if (OrdersTotal() == 0 && iMom < 100 && LastTradeShort==false) { OrderSend(Symbol(),OP_SELL,HandelsLots,Bid,2,Bid+S topLoss*Point,Bid-TakeProfit*Point,NULL,0,0,Red); } } Was meinst Du? |
|
|||
Hi Adlerauge,
benutze für Code bitte den Button oben in der Leiste, wo "php" draufsteht, dann kann man das ganze besser lesen. Versuch mal folgendes, habs nur kurz zusammengeschrieben, nicht getestet und nicht compiliert: PHP-Code:
|
|
|||
Hi Adlerauge,
ich habe Deinen Code jetzt mal getestet, und ich muss sagen, ich weiss auch nicht, wo der Fehler liegt. MQL4 ist einfach programmiertechnischer Schrott, da musst Du in die Glaskugel schauen, ob das klappt oder nicht. Und glaub mir, ich weiss, wovon ich rede! Mein EA hat inzwischen 2500 Zeilen, und er läuft (meistens). Manchmal tut er auch wieder nicht, was gestern noch funktionierte. Darum bin ich auch bei jeder noch so kleinsten Änderung äusserst vorsichtig, mache jedesmal eine Sicherungskopie des alten Codes und teste erst wieder (was lange Zeit in Anspruch nimmt), ob das auch funktioniert. Z.B. die Funktion void OnTick() hat bei mir noch nie gemacht, was sie sollte, die ignoriert sämtliche Folgecodes. Ich empfehle Dir, nicht soviel Zeit in dieses MQL zu investieren, es ist unausgereift und im Grunde für Anwender völlig unzumutbar! |
|
|||
Hi GoS, hi TLO,
danke für Eure Antworten. Morgen teste ich weiter, dann kommt mein feedback. Irgendwie muss diese Geschichte ja zum Laufen zu kriegen sein......)) |
|
|||
Zitat:
In der Regel sitzt der Fehler vor dem Monitor. Auch ich habe manchmal schon lange gesucht, aber bisher immer!!! den Fehler gefunden, der durch mich induziert wurde. Deine Einschätzung über die Programmqualität ist maßlos übertrieben und ungerechtfertigt und reflektiert ein völlig falsches Bild. Sicherlich gibt es das Eine oder Andere zu verbessern. Aber wo ist das nicht der Fall. Und ich!! weiss ganz genau, wovon ich hier rede. traderdoc
__________________
Ich erfülle Euch gern Eure EA-, Indikator- und Script-Programmierungswünsche auf Honorarbasis. |
|
|||
Hi Adlerauge,
nachdem sich meine "Wut" wieder etwas gelegt hat, habe ich noch ein wenig probiert. Hier der lauffähige EA, ist nicht ausgefeilt und ich habe alle "Krücken" dringelassen, denn Du willst ja was lernen , aber er tut was er soll, immer einen Long- und dann einen Short-Trade eröffnen und umgekehrt. Der EA arbeitet übrigens ohne OnTick(), bin ich so gewohnt und funktioniert auch. Verbesserungsvorschläge sind aber gerne willkommen. P.S.: Ich habe festgestellt, dass hier beim Einfügen von Text manchmal Leerzeichen hinzugefügt werden, wo keine hingehören, da musst Du evtl. drauf achten. Diesmal scheint aber auf den ersten Blick alles o.k., wo ich die Funktion zum Codeeinfügen benutzt habe. Man ist ja lernfähig. Code:
//+------------------------------------------------------------------+ //| Test.mq4 | //| Copyright 2015, MetaQuotes Software Corp. | //| https://www.mql5.com | //+------------------------------------------------------------------+ #property copyright "Copyright 2015, MetaQuotes Software Corp." #property link "https://www.mql5.com" #property version "1.00" #property strict //+------------------------------------------------------------------+ //| Expert initialization function | //+------------------------------------------------------------------+ extern string EAName = "Test"; extern double HandelsLots=0.01; extern double StopLoss=50; extern double TakeProfit=50; bool LongShortWechsel=true; extern int MagicNumber=1234; int Zaehler_History; bool LastTradeShort= false; bool LastTradeLong = false; //+------------------------------------------------------------------+ //| Expert initialization function | //+------------------------------------------------------------------+ int Init() { return(0); } //+------------------------------------------------------------------+ //| Expert tick function | //+------------------------------------------------------------------+ int start() { double iMom=iMomentum(NULL,0,14,0,0); int OffeneTrades=CountTrades(); //Alert(iMom + " " + OffeneTrades); //Auf einen Long- folgt immer ein Short-Trade und umgekehrt if(LongShortWechsel==true) { for(Zaehler_History=OrdersHistoryTotal();Zaehler_History>=0;Zaehler_History--) { OrderSelect(Zaehler_History,SELECT_BY_POS,MODE_HISTORY); if(OrderSymbol()!=Symbol() || OrderMagicNumber()!=MagicNumber) continue; if(OrderSymbol()==Symbol() && OrderMagicNumber()==MagicNumber) { if(OrderType()==OP_BUY) { LastTradeLong=true; LastTradeShort=false; break; } else if(OrderType()==OP_SELL) { LastTradeLong=false; LastTradeShort=true; break; } } } //Alert("LastTradeLong " + LastTradeLong); //Alert("LastTradeShort " + LastTradeShort); } if(OffeneTrades==0 && iMom>100 && LastTradeLong==false) { Alert(OffeneTrades + " LastTradeLong " + LastTradeLong); OrderSend(Symbol(),OP_BUY,HandelsLots,Ask,2,Ask-StopLoss*Point,Ask+TakeProfit*Point,EAName,MagicNumber,0,Green); } if(OffeneTrades==0 && iMom<100 && LastTradeShort==false) { Alert(OffeneTrades + " LastTradeShort " + LastTradeShort); OrderSend(Symbol(),OP_SELL,HandelsLots,Bid,2,Bid+StopLoss*Point,Bid-TakeProfit*Point,EAName,MagicNumber,0,Red); } return(0); } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ int CountTrades() { int count=0; int trade; for(trade=OrdersTotal()-1;trade>=0;trade--) { OrderSelect(trade,SELECT_BY_POS,MODE_TRADES); if(OrderSymbol()!=Symbol() || OrderMagicNumber()!=MagicNumber) continue; if(OrderSymbol()==Symbol() && OrderMagicNumber()==MagicNumber) if(OrderType()==OP_SELL || OrderType()==OP_BUY) count++; }//for return(count); } //+------------------------------------------------------------------+ |
|
|||
Ja gut, dann hast Du die alte Struktur genommen mit start().
Diese Zeile sollte dann doch besser so lauten: for(Zaehler_History=OrdersHistoryTotal()-1;Zaehler_History>=0;Zaehler_History--) und hier steckt ein typisches Fehlerchen drin: OrderSend(Symbol(),OP_BUY,HandelsLots,Ask,2,Ask-StopLoss*Point,Ask+TakeProfit*Point,EAName,MagicNumber,0,Green); adäquat hier: OrderSend(Symbol(),OP_SELL,HandelsLots,Bid,2,Bid+StopLoss*Point,Bid-TakeProfit*Point,EAName,MagicNumber,0,Red); Wenn da nicht vorher unter init() entschieden wird, ob es sich um einen 4-oder 5-Digitbroker handelt, dann würden jetzt bei 5-Digitbroker aus den 50 Pips StopLoss in den Variablen plötzlich 5 Pips werden, was verdammt knapp sein kann. (und aus der Slippage 0,2 Pips) Daher sollte immer in init() stehen: Code:
Slippage = 2; M = 1; if (MarketInfo(Symbol(), MODE_PROFITCALCMODE) == 0) { // gilt nur für Währungspaare if (Digits == 3 || Digits == 5) M = 10; } Pt = M*Point; Slippage *= M; OrderSend(Symbol(),OP_BUY,HandelsLots,Ask,Slippage ,NormalizeDouble(Ask-StopLoss*Pt, Digits),NormalizeDouble(Ask+TakeProfit*Pt, Digits),EAName,MagicNumber,0,Green); Zusätzlich Slippage angepaßt und die SL- und TP-Werte zur Sicherheit auf entsprechende Kommastellen normiert (da kann sonst einiges in die Hose gehen und den berühmten Fehler 130 produzieren). traderdoc
__________________
Ich erfülle Euch gern Eure EA-, Indikator- und Script-Programmierungswünsche auf Honorarbasis. |
|
|||
Hi Gos, hi TLO,
eure Wechsel-Trade Codes funktionieren beide..... ich bin begeistert!!..))) Damit kann man arbeiten ;-) GoS, danke für den php - Tipp! TLO, ein bisschen über die "Maschine" zu fluchen ist schon ok.... wenn man nicht zwischendurch mal Dampf abläst, kommt es einem wahrscheinlich früher oder später zu den Ohren raus ;-)..... und dem Computer tut es ja nicht weh, wenn er mal beschipft wird ... hi traderdoc, danke für den wertvollen Tip. Ich legs mir mal in die (virtuelle) Schublade. Ich habe zwar keinen vier-stelligen Broker und habe auch nicht vor, einen zu haben.... aber man weiss ja nie ;-) |
Lesezeichen |
Stichworte |
2 verlust trades, bedingung verlust trades, mql4, programmierung, programmierung metatrader, verlust |
|
|