|
Programmierung MQL4 Hier gehts rund ums Programmieren in MQL4. |
|
Themen-Optionen | Thema durchsuchen | Ansicht |
|
|||
Ohhhhhh..., das ist die absolute Spitze - riesigen Dank dafür !!!
Das baut endlich `mal wieder auf und ist für heute der schönste Abschluss. Also nochmals recht, recht herzlichen Dank und ganz liebe Grüße (vom glücklichen) piptrade PS.: Werde das "Teil" morgen nochmals unter "die Lupe nehmen" und versuchen, jedes einzelne Detail nachzuvollziehen. Melde mich dann wieder. |
|
|||
Mein kleiner, erster EA ist so ausgelegt, dass er bestimmte Signale (vorerst nur cross MA`s) generiert.
Gleichzeitig wird hier eine "PeriodenStartZeit" abgefragt: int init() { //--- PeriodenStartZeit = Time[0]; return(0); } Belasse ich diese Abfrage so bestehen, funktionieren alle Signale, wie es sein sollte. 1. Integriere ich jetzt den ZeitZonenFilter, der ja "void init()" beinhaltet, wird nach dem Kompellieren das "return(0)" der "PeriodenStartZeit" als "error" ermittelt. (Eine leere Funktion gibt einen Wert zurück) 2. Deaktiviere ich diese PeriodenStartzeit-Abfrage, werden mir keine Signale mehr angezeigt, - und ich kann ein Funktionieren der ZeitZonen nicht mehr kontrollieren ! und 3. Versuche ich beide Komponenten unter unter "void init()" zu integrieren wird das obige "return(0)" wieder moniert, integriere ich beides unter "int init()" - habe ich zwar keine "errors" mehr - gleichzeitig wird damit aber das Funktionieren des ZeitFilters ausgeschlossen ! Wat Nu ? Mittlerweile habe ich zwar sehr viel dazugelernt - Dank Eurer Hile - dennoch bin ich nicht so weit, eine eigenständige Lösung zu finden. Wie kann ich den o.a. Widerspruch auflösen? Gibt es für den ZeitZonenFilter ggf. eine Möglichkeit auf das "void init()" zu verzichten und hier statt dessen "int init()" zu integrieren ? Oder würde eine Negation in der Abfrage der "PeriodenStartZeit" etwas bringen ? LG. piptrade |
|
|||
Da ich nunmehr am vorliegenden Timer möglichst nichts oder aber nur das Geringste ändern wollte, habe ich einfach das "Grundgerüst" meines kleinen EA "umgestrickt", dann eine einzige, kleine Änderung im Timer vorgenommen - und siehe da ! - es scheint tatsächlich zu funktionieren !!!
Zumindest liefen die ersten Tests absolut optimal und auf die Minute genau ! Während weiterer, vorerst abschließender Tests, sind in das "Grundgerüst" noch MoneyManagement einzufügen sowie Entry- und Exit-Bedingungen zu verändern. Hier bin ich aber recht zuversichtlich. Vorerst ganz LG. an alle "Helferlein" - DANKE! piptrade PS.: 1. Ein endgültiges Statement kann ich vielleicht schon morgen geben. 2. Im Bereich Grafikdesign könnte ich ggf. vielleicht auch traderdoc oder Top-SecreT unterstützen. An diese beiden "Mitstreiter" aber so, wie so, ein ganz "dickes" Lob und nochmals Danke. |
|
|||
Glückseeligkeit und Hoffnung und die Zuversicht, dass nun alles passt - und dann doch der nächste "Nackenschlag" und die Gewissheit, dass es - SO - nicht geht !!!
24h - ein Test nach dem anderen - mit allen möglichen Varianten - und dennoch kein positives Resultat ! Fackt ist, irgend etwas stimmt hier nicht ! Wie kann ich den "tollen" Code von traderdoc integrieren ? Was ist mit der Anweisung: int start() { if(TradingTime() == false) return(0); } Hier entstehen ständig errors ! - egal, an welcher Stelle im PRG integriert. Ich zahle gern ein kleines Honorar für die Fertigstellung dieses Timers ! - und würde mich über ein entsprechendes Angebot freuen. MfG. piptrade |
|
|||
Na schreib doch wenigstens mal welche errors. Würde doch schon mal weiterhelfen statt einfach nur rumzuraten.
|
|
|||
Neben vielen weiteren Varianten sieht das ganze "Dingeling" jetzt - SO - aus:
MAsimple_TIMER_00c.mq4 #define MAGICMA 20131111 //--- Inputs input double Lots =0.1; input int MovingPeriod =12; input int MovingShift =6; //|=== 1. ERGÄNZUNG Timer ================================================== =====+ extern string TradeTime_1_Begin = "09:30"; extern string TradeTime_1_End = "11:30"; extern string TradeTime_2_Begin = "15:50"; extern string TradeTime_2_End = "17:30"; //+------------------------------------------ datetime Time_1_Begin, Time_1_End; datetime Time_2_Begin, Time_2_End; //+------------------------------------------ void init() { Time_1_Begin = StrToTime(TimeToStr(TimeCurrent(), TIME_DATE)+" "+TradeTime_1_Begin); Time_1_End = StrToTime(TimeToStr(TimeCurrent(), TIME_DATE)+" "+TradeTime_1_End); Time_2_Begin = StrToTime(TimeToStr(TimeCurrent(), TIME_DATE)+" "+TradeTime_2_Begin); Time_2_End = StrToTime(TimeToStr(TimeCurrent(), TIME_DATE)+" "+TradeTime_2_End); } //+------------------------------------------ bool TradingTime() { if ((Time_1_Begin < Time_1_End && (TimeCurrent() < Time_1_Begin || TimeCurrent() >= Time_1_End)) || (Time_2_Begin < Time_2_End && (TimeCurrent() < Time_2_Begin || TimeCurrent() >= Time_2_End))) return(false); return(true); } //|=== 2. ERGÄNZUNG Timer ================================================== ======+ int start() { if (TradingTime() == false) return(0); } // warning: not all control paths return a value ! <-------------------------+ //+------------------------------------------------------------------+ //| Calculate open positions | //+------------------------------------------------------------------+ int CalculateCurrentOrders(string symbol) ... and so on //+------------------------------------------------------------------+ //| Check for open order conditions | //+------------------------------------------------------------------+ void CheckForOpen() ... and so on //+------------------------------------------------------------------+ //| Check for close order conditions | //+------------------------------------------------------------------+ void CheckForClose() ... and so on //+------------------------------------------------------------------+ //| OnTick function | //+------------------------------------------------------------------+ void OnTick() { //--- check for history and trading if(Bars<100 || IsTradeAllowed()==false) return; //--- calculate open orders by current symbol if(CalculateCurrentOrders(Symbol())==0) CheckForOpen(); else CheckForClose(); //--- } //+------------------------------------------------------------------+ Alle Order werden ausgelöst und auch sauber wieder geschlossen, aber nach wie vor ohne jeglichen Time-Bezug. Sicher wird jetzt ein Schmunzeln über Eure Lippen gehen - und viele werden sich fragen: "Wie kann man nur solche Fehler machen?" Dennoch: Bisher habe ich gerade aus meinen Fehlern gelernt. Deshalb nehme ich gern dieses Schmunzeln in Kauf und hoffe auf Eure Unterstützung. LG. piptrade |
|
|||
An welcher Stelle wird denn start() ausgeführt?
Und der error kommt weil du bei start() nicht in jedem Fall einen int zurückgibst. Da fehlt ein return 1 wenn TradingTime() true liefert. |
|
|||
Bevor ich die Fragen möglichst präzise beantworte, hier erst noch einmal eine zweite Variante des EA mit Zuordnung des Timers:
//+--- globale externe Variable -----------------------+ extern int MA_lang = 20; extern int MA_kurz = 5; extern double HandelsLots = 0.1; extern double SL_prozent = 0.15; extern double TP_prozent = 0.1; extern int MagicNumber = 12345; //+--- interne Variable -------------------------------+ datetime PeriodenStartZeit; bool NeuePeriodeBegonnen,LongSignal,ShortSignal; int LongOrder,ShortOrder,OrderStoppLoss; //|=== 1. ERGÄNZUNG Timer ===========================================+ extern string TradeTime_1_Begin = "09:30"; extern string TradeTime_1_End = "11:30"; extern string TradeTime_2_Begin = "15:50"; extern string TradeTime_2_End = "17:30"; //+------------------------------------------ datetime Time_1_Begin, Time_1_End; datetime Time_2_Begin, Time_2_End; //+------------------------------------------ void init() { Time_1_Begin = StrToTime(TimeToStr(TimeCurrent(), TIME_DATE)+" "+TradeTime_1_Begin); Time_1_End = StrToTime(TimeToStr(TimeCurrent(), TIME_DATE)+" "+TradeTime_1_End); Time_2_Begin = StrToTime(TimeToStr(TimeCurrent(), TIME_DATE)+" "+TradeTime_2_Begin); Time_2_End = StrToTime(TimeToStr(TimeCurrent(), TIME_DATE)+" "+TradeTime_2_End); } //+------------------------------------------ int CurrentTime; bool TradingTime() { CurrentTime = TimeHour(TimeCurrent()); if ((Time_1_Begin < Time_1_End && (CurrentTime < Time_1_Begin || CurrentTime >= Time_1_End)) || (Time_2_Begin < End_Time_2 && (CurrentTime < Time_2_Begin || CurrentTime >= Time_2_End))) return(false); return(true); } //+------------------------------------------------------------------+ //| Expert initialization function | //+------------------------------------------------------------------+ int init() { PeriodenStartZeit = Time[0]; return(0); } //+------------------------------------------------------------------+ //| expert deinitialization function | //+------------------------------------------------------------------+ void deinit() { // return(0); // warning: -------> 'void' function returns a value <---------------+ } //+------------------------------------------------------------------+ //| expert start function | //+------------------------------------------------------------------+ int start() { //|=== 2. ERGÄNZUNG Timer ===========================================+ if (TradingTime() == false) return(0); //|================================================= ============+ //--- Überprüfen, ob neuer Periodenbeginn vorliegt if(PeriodenStartZeit != Time[0]) { NeuePeriodeBegonnen = true; } else NeuePeriodeBegonnen = false; //--- Marktdaten ermitteln ......... //--- Handelssignale ermitteln if(NeuePeriodeBegonnen == true) { //--- Bedingung für Buy-Signal if(MAkurz > MAlang && MAkurzVorperiode <= MAlangVorperiode) { LongSignal = true; } else LongSignal = false; //--- Bedingung für Sell-Signal if(MAkurz < MAlang && MAkurzVorperiode >= MAlangVorperiode) { ShortSignal = true; } else ShortSignal = false; } else { LongSignal = false; ShortSignal = false; } //+--------------------------------------------------+ //----> Long Signale umsetzen if (LongSignal == true) ......... //----> Short Signale umsetzen if (ShortSignal == true) ......... //SL für Long Deals setzen //SL für Short Deals setzen //TP für Long Deals setzen //TP für Short Deals setzen //+---------------------------------------------------+ //Ticketnummer nach Closing auf 0 zurücksetzen //+---------------------------------------------------+ Es wäre zu schön, wenn wir in der obigen oder in der hier dargestellten Version eine Timer-Lösung finden würden. So, jetzt werde ich versuchen, die gestellten Fragen zu verstehen - und so schnell wie möglich zu beantworten. LG. |
|
|||
Hä ich seh nicht durch.
Wieso denn start()? Hast du das selber geschrieben? Muss die Funktion nicht heißen OnTick()? |
|
|||
Die Struktur eines EAs sieht wie folgt aus:
int OnInit() ... void OnDeinit() ... void OnTick() Man aber auch viele grobe Fehler vermeiden, wenn man mal das Handbuch zu Rate zieht. Und bitte, den Code mittel Button # über dem Textfeld eingeben. Das kann doch keiner auf Dauer lesen. traderdoc
__________________
Ich erfülle Euch gern Eure EA-, Indikator- und Script-Programmierungswünsche auf Honorarbasis. |
Lesezeichen |
Stichworte |
mql4, programmierung, programmierung metatrader, timezone, tradezone, tradingtimezone, zeitzone, zeitzonen |
|
|