Forex1+ Posted October 1, 2011 Report Share Posted October 1, 2011 Hallo liebes Forum, ich hab ein Test-EA der eine Buy-Order öffnet wenn "Stochastik < 20" und "Kurs > MA". Den EA als Strategie bitte ignorieren :-) es geht mir nämlich um Folgendes: Die Bedingungen sollen hintereinander und nicht gleichzeitig den Trade auslösen. Also erst "Stochastik < 20" und dann soll danach zeitlich unabhängig davon "Kurs > MA" den Trade auslösen (auch wenn zu dem Zeitpunkt die Stochastikbedingung nicht mehr gültig ist). Habe theroretisch gelernt das dies zB mit einer Bool-Variablen zu machen wäre aber im Detail hab ich das nicht ansatzweise hinbekommen. Wie müsste der Code aussehen sodass die Bedingungen hintereinander und nicht nur gleichzeitig funktionieren? Würde mich riesig über ein bisschen Hilfe freuen !Lieben Gruß Anbei der Code: #property copyright "123" #property link "" #include <stdlib.mqh> #include <WinUser32.mqh> extern double BuyLots4 = 0.01; extern int BuyStoploss4 = 20; extern int BuyTakeprofit4 = 20; double PipValue=1; bool Terminated = false; string LF = "\n"; int NDigits = 4; int ObjCount = 0; int current = 0; int init() { NDigits = Digits; if (false) ObjectsDeleteAll(); Comment(""); } int start() { if (Bars < 10) { Comment("Not enough bars"); return (0); } if (Terminated == true) { Comment("EA Terminated."); return (0); } OnEveryTick1(); } void OnEveryTick1() { if (true == false && false) PipValue = 10; if (true && (NDigits == 3 || NDigits == 5)) PipValue = 10; indikator1(); } void indikator1() { if (iStochastic(NULL, NULL,5,3,3,MODE_SMA,0,MODE_MAIN,0) < 20) { indikator2(); } } void indikator2() { if (Close[0] > iMA(NULL, NULL,14,0,0,0,0)) { IfOrderDoesNotExist(); } } void IfOrderDoesNotExist() { bool exists = false; for (int i=OrdersTotal()-1; i >= 0; i--) if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) { if (OrderType() == OP_BUY && OrderSymbol() == Symbol() && OrderMagicNumber() == 1) { exists = true; } } else { Print("OrderSelect() error - ", ErrorDescription(GetLastError())); } if (exists == false) { BuyOrder(); } } void BuyOrder() { double SL = Ask - BuyStoploss4*PipValue*Point; if (BuyStoploss4 == 0) SL = 0; double TP = Ask + BuyTakeprofit4*PipValue*Point; if (BuyTakeprofit4 == 0) TP = 0; int ticket = -1; if (true) ticket = OrderSend(Symbol(), OP_BUY, BuyLots4, Ask, 4, 0, 0, "My Expert", 1, 0, Blue); else ticket = OrderSend(Symbol(), OP_BUY, BuyLots4, Ask, 4, SL, TP, "My Expert", 1, 0, Blue); if (ticket > -1) { if (true) { OrderSelect(ticket, SELECT_BY_TICKET); bool ret = OrderModify(OrderTicket(), OrderOpenPrice(), SL, TP, 0, Blue); if (ret == false) Print("OrderModify() error - ", ErrorDescription(GetLastError())); } } else { Print("OrderSend() error - ", ErrorDescription(GetLastError())); } } int deinit() { if (false) ObjectsDeleteAll(); } Quote Link to comment Share on other sites More sharing options...
WOGO Posted October 1, 2011 Report Share Posted October 1, 2011 Wie müsste der Code aussehen sodass die Bedingungen hintereinander und nicht nur gleichzeitig funktionieren? Würde mich riesig über ein bisschen Hilfe freuen !Da gibt's mehrere Möglichkeiten.Ich würd's vielleicht so machen.Wenn die Stochastik Danach frägst du ab, ob diese datetime-Variable != EMPTY_VALUE ist und ist dies erfüllt, dann frägst du die MA-Bedingung ab.Nach einer bestimmten Zeit, die du am Besten als Parameter übergibst, setzt du die datetime-Variable dann wieder auf EMPTY_VALUE.Also vom Prinzip her so: if(Stochastik<20) { datetime SignalZeit=TimeCurrent(); } if(SignalZeit!=EMPTY_VALUE) //kontrolliere MA-Kriterium if(TimeCurrent>=SignalZeit+SignalzeitAblaufParameter) SignalZeit=EMPTY_VALUE; 2 Quote Link to comment Share on other sites More sharing options...
Bull68 Posted October 1, 2011 Report Share Posted October 1, 2011 Hi Forex1+, also ich würde es so machen: wenn der Stochastik unter 20 ist, setzt Du ein Flag. Dann checkst Du bei jedem Tick oder jeden neuen Kerze, ob der Kurs über MA notiert.Sind jetzt beide Bedingen erfüllt -> Buy.Zu beachten hierbei: Flag bei Buy sofort zurücksetzen, sonst bleibt es weiter aktiv.Weiterhin macht es Sinn das Flag nach X Kerzen zurückzusetzen, es sei denn für Dich ist das Signal auch nach zb. 10000 Kerzen noch gültig. 1 Quote Link to comment Share on other sites More sharing options...
askerix Posted October 1, 2011 Report Share Posted October 1, 2011 Hi, hier mal ein Beispiel mit gobalem Flag für deinen ersten Indiktor. Grüsse,askerix bool bIndi1Allowtrading = false; void OnEveryTick1() { // wenn Stoch noch kein Trade-Signal geliefert hat -> prüfen if ( bIndi1Allowtrading == false ) indikator1(); // wenn Stoch Trade Signal getriggert wurde prüfen von Indi 2 if ( bIndi1Allowtrading ) indikator2(); } void indikator1() { if (iStochastic(NULL, NULL,5,3,3,MODE_SMA,0,MODE_MAIN,0) < 20) { bIndi1Allowtrading = true; } } void indikator2() { if (Close[0] > iMA(NULL, NULL,14,0,0,0,0)) { IfOrderDoesNotExist(); // reset für neuen Entry-Trigger bIndi1Allowtrading = false; } } 2 Quote Link to comment Share on other sites More sharing options...
Forex1+ Posted October 1, 2011 Author Report Share Posted October 1, 2011 Vielen Dank für die schnelle Hilfe ! Hat auf Anhieb funktioniert Quote Link to comment Share on other sites More sharing options...
conglom-o Posted October 1, 2011 Report Share Posted October 1, 2011 Verdammt ging das wieder fix hier - genießt doch mal die Sonne . Quote Link to comment Share on other sites More sharing options...
Forex1+ Posted October 1, 2011 Author Report Share Posted October 1, 2011 Hi ihr Lieben, danke nochmal für die Hilfe das hat mich richtig weitergebracht. Ich hab noch eine kleine Sache die ich auch alleine nicht so hinbekomme und zwar würde ich gerne wenn der 1. Indikator ein Signal auslöst den derzeitigen Kurs speichern (globalen Variable...?). Wenn dann ein weiterer Indikator ein Signal auslößt soll gleichzeitig der aktuelle Kurs größer bzw kleiner als der gespeicherte Kurs sein um die Bedingung zu erfüllen Lieben Gruß Quote Link to comment Share on other sites More sharing options...
Kleinerbroker Posted October 1, 2011 Report Share Posted October 1, 2011 double StochaPreis ; // wenn global, dann bitte an entsprechender Stelle in Deinem EA platzieren (also zusammen mit den anderen Var-Defin) void indikator1() { if (iStochastic(NULL, NULL,5,3,3,MODE_SMA,0,MODE_MAIN,0) < 20) { bIndi1Allowtrading = true; StochaPreis = Ask[0];// Ask ...der aktuelle Preis } } void indikator2() { if (Close[0] > iMA(NULL, NULL,14,0,0,0,0) && ( StochaPreis > Ask[0]) ) // der Preis ist kleiner als zum Stocha-Signal-Zeitpunkt .. { IfOrderDoesNotExist(); // reset für neuen Entry-Trigger bIndi1Allowtrading = false; } Hoffe hilft KB 2 Quote Link to comment Share on other sites More sharing options...
Forex1+ Posted October 2, 2011 Author Report Share Posted October 2, 2011 StochaPreis = Ask[0];// Ask ...der aktuelle Preis dazu noch eine Frage: geht es eigentlich auch das die Variable statt dem aktuellen Kurs zB. den höchsten Kurs der letzten 8 Bars speichert? Liebe Grüße Quote Link to comment Share on other sites More sharing options...
Kleinerbroker Posted October 3, 2011 Report Share Posted October 3, 2011 dazu noch eine Frage: geht es eigentlich auch das die Variable statt dem aktuellen Kurs zB. den höchsten Kurs der letzten 8 Bars speichert? Liebe Grüße Ja , dass geht => So sieht das zum Beispiel in "Ernten 4.1." aus => //+-----------------------------------------------------------------------------------------------+ //| | //| function : Berechnung des Maximum (Highest High) einer Gruppe von Bars innerhalb eines TF | //| | //+-----------------------------------------------------------------------------------------------+ double MaxPreis( int TF , int BarZahl ,int Start)// | { // | bool PRT = (Bars > bb && hilfe) ;// | int a = iHighest(Markt,TF,MODE_HIGH,BarZahl,Start) ;// | double b = NormalizeDouble(iHigh(Markt,TF,a),Digits) ;// | if (PRT) Print(" MaxPreis : Am ",TimeToStr(iTime( Markt,TF,a),TIME_DATE|TIME_MINUTES) ,// | " im TF = ",TF," Minuten = ",b," in ",BarZahl," Kerzen,Shift= ",Start," @ HighestBar = ",a) ;//| //+-----------------------------------------------------------------------------------------------+ return (b) ;// | } // | //------------------------------------------------------------------------------------------------+ //+-----------------------------------------------------------------------------------------------+ //| | //| function : Berechnung des Minimum (Lowest Low ) einer Gruppe von Bars innerhalb eines TF | //| | //+-----------------------------------------------------------------------------------------------+ double MinPreis( int TF , int BarZahl ,int Start)// | { // | bool PRT = (Bars > bb && hilfe) ;// | int a = iLowest(Markt,TF,MODE_LOW,BarZahl,Start) ;// | double b = NormalizeDouble(iLow(Markt,TF,a),Digits) ;// | if (PRT) Print(" MinPreis : Am ",TimeToStr(iTime( Markt,TF,a),TIME_DATE|TIME_MINUTES) ,// | " im TF = ",TF," Minuten = ",b," in ",BarZahl," Kerzen,Shift= ",Start," @ LowestBar = ",a) ;//| //+-----------------------------------------------------------------------------------------------+ return (b) ;// | } // | //------------------------------------------------------------------------------------------------+ Du müßtest also diese Funktion mit BarZahl == 8 und Start == 0 aufrufen, wenn Du die letzten 8 Bars inklusive des Aktuellen prüfen willst . "b" ist das Ergebnis,der Kurs. "a" die Position des Bars mit dem Extrem ("a" wird aber nicht zurückgegeben) . bb ist die int-Zahl der Bars AB DER der "Print"-Befehl auszuführen ist und bool "Hilfe" die Option die lokale boolsche Variable "PRT" auf "Wahr" zu setzen .Diese Option habe ich in fast allen Funktionen vorgesehen um ggfs mir aus der jeweiligen Funktion bestimmte interessante Werte (z Bsp deren Ergebnis) ab einerbestimmten Stelle (bb) ausgeben zu lassen, wenn ich das will (hilfe ? ) . Hilft´s ? KB PS: @ Amin´s/Mod´s => ich habe irgendein Prob mit der Darstellung von Code . Mit STRG & C kopiere ich aus dem MT4-Editor Fenster , den ich vorher mit STRG & A markiert habe . Der Text wird dabei mit genau den 100 Zeichen angezeigt, die ich auch im Editor bei der Code-Erstellung eingegeben habe . Aber hier werden dann offensichtlich leere Stellen hinzugefügt/" | " wird verschoben ...scheinbar um TAB-Stellen ? Was mache ich da verkehrt ? Danke für Hilfe . Quote Link to comment Share on other sites More sharing options...
whipsaw Posted October 3, 2011 Report Share Posted October 3, 2011 PS: @ Amin´s/Mod´s => ich habe irgendein Prob mit der Darstellung von Code . Mit STRG & C kopiere ich aus dem MT4-Editor Fenster , den ich vorher mit STRG & A markiert habe . Der Text wird dabei mit genau den 100 Zeichen angezeigt, die ich auch im Editor bei der Code-Erstellung eingegeben habe . Aber hier werden dann offensichtlich leere Stellen hinzugefügt/" | " wird verschoben ...scheinbar um TAB-Stellen ? Was mache ich da verkehrt ? Danke für Hilfe . Ich lasse das mal prüfen.Frage: Tritt das Problem auch auf, wenn Du über die Optionen im Kontextmenü kopierst? Quote Link to comment Share on other sites More sharing options...
Kleinerbroker Posted October 3, 2011 Report Share Posted October 3, 2011 Dank @ Whipsaw : es lag an meiner RTE, die ich in http://www.tom-next.com/community/index.php?app=core&module=usercp aktiviert hatte . Nachdem ich diese deaktiviert habe, hat es gut funktioniert . KB PS.:@Forex1+ => sorry , dass ich Deinen Thread missbrauchte . Hoffentlich siehst Du darüber hinweg und wir diskutieren weiter Deinen Code .... klappt es denn mit meinem Schnipsel ??? Quote Link to comment Share on other sites More sharing options...
Forex1+ Posted October 3, 2011 Author Report Share Posted October 3, 2011 @ Kleinerbroker: Vielen Dank für dein Beispiel ! Also ich hab versucht den Code zu integrieren aber ich hab nicht ganz verstanden wie ich den Höchstkurs "b" in der globalen Variable double StochaPreis ; speichere. Kann das "b" einfach durch "StochaPreis" ersetzt werden? Und das andere war das ich nicht wusste wo ich generell die Funktion von dir einzufügen habe also zwischen welche Klammern es kommt...? Sorry bin noch ziemlich unerfahren im MQL :-) double StochaPreis ; { if (iStochastic(NULL, NULL,5,3,3,MODE_SMA,0,MODE_MAIN,0) < 20) { bIndi1Allowtrading = true; StochaPreis = Ask[0];// Ask ...der aktuelle Preis } } Quote Link to comment Share on other sites More sharing options...
Kleinerbroker Posted October 3, 2011 Report Share Posted October 3, 2011 Forex1+ , ich habe es mir etwas zu einfach gemacht . Bedauerlich, dass Du nochmals nachfragen mußt : 1.) Die globale Variable StochaPreis definierst Du dort , wo Du alle Deine Variablen definierst ...ich mache das am Anfang meines EA . Dort reicht die einfache Nennung bzw Zuordnung , zum Beispiel eben double StochaPreis ; 2.) Um b zuzuordnen rufe ich die Funktion double MinPreis( int TF , int BarZahl ,int Start) aus dem übergeordneten Program wie folgt auf : Achtung : Dies ist ein übergeordnetes Programm, es ruft zwei Funktionen auf, MaxPreis und MinPreis . Diese beiden sind also diesem übergeordneten Codeschnipsel untergeordnet . Die untergeordneten Funktionen finden sich in Post #10 . //------------------------------------------------------------------------------------------------+ double a = MaxPreis(TF,Barzahl,Start) ;// Hoch der letzten beiden Tage | int b = iHighest(Markt,TF,MODE_HIGH,Barzahl,Start);// Position des Hoch | double c = MinPreis(TF,Barzahl,Start) ;// Tief der letzten beiden Tage | int d = iLowest (Markt,TF,MODE_LOW,Barzahl,Start) ;// Position des Tief | if (Long == 0) ip_dSL_raw = a + Stopp * Point ;// SL Zuweisung im Shorttrend | else ip_dSL_raw = c - Stopp * Point ;// SL Zuweisung im Longtrend | if (PRT ) Print(" StopLoss :W/S am ",TimeToStr(iTime( Markt,TF,Start),TIME_DATE|TIME_MINUTES),// | " ist im Short ",a," & im Long ",c," und der Stopp Loss = ",ip_dSL_raw) ;}// | //------------------------------------------------------------------------------------------------+ Da es sich bei a,b,c,d um lokale Variablen handelt , hat das eine "b" nichts mit dem anderen gemeinsam . Tatsächlich geschieht also folgendes :Der Code direkt über diesen Zeilen hier ruft in der dritten CodeZeile die Funktion Minpreis auf . Dazu muss diese Zeile Daten übergeben, die die Fkt Minpreis benötigt, nämlich "TF,Barzahl & Start" . Das Ergebnis dieser Fkt MinPreis soll dann der lokalen Variablen c zugeordnet werden . Aus "b" in MinPreis wird also "c" in der übergeordneten Fkt . Das "c" wird übrigens in der gleichen Zeile gleich mit definiert mit "double", denn dies ist die erste Stelle in der "c" genannt wurde . Bitte scheue Dich nicht vor weiteren Fragen, damit ich lerne mich verständlicher auszudrücken . KB 1 Quote Link to comment Share on other sites More sharing options...
Forex1+ Posted October 3, 2011 Author Report Share Posted October 3, 2011 Bitte scheue Dich nicht vor weiteren FragenDanke KB das ist sehr nett denn ich verstehe leider noch nicht alle Zusammenhänge besonders was es angeht wie die Codes in das EA Grundgerüst zu integrieren sind. Also Ziel für mich wäre an diesem Beispiel das die Variable "StochaPreis" statt dem aktuellen Kurs (Ask) den höchsten Kurs der letzten 8 Bars speichert wenn der Stochastik-Indi das Singal auslöst: double StochaPreis ; { if (iStochastic(NULL, NULL,5,3,3,MODE_SMA,0,MODE_MAIN,0) < 20) { bIndi1Allowtrading = true; StochaPreis = Ask[0]; // WAS MÜSSTE HIER VERÄNDERT WERDEN ? } } Das mit der Definierung der StochaPreis-Variable hab ich verstanden und auch ungefähr den Zusammenhang von übergeordneter und untergeordneter Funktion und das mit den lokalen Variablen auch. Aber was ich gar nicht weiss ist wo ich jetzt genau im EA den übergeordneten und untergeordneten Code einfügen muss, sodass am Ende die globale StochaPreis-Variable den Höchstkurs der letzten 8 Bars speichert wenn der Stochastik-Indi sein Singal ausgelößt hat ? Lieben Gruß Quote Link to comment Share on other sites More sharing options...
Kleinerbroker Posted October 5, 2011 Report Share Posted October 5, 2011 // Bereich am Anfang Deines EA, wo Du Deine Variablen definierst, die überall im Prg zur Verfügung stehen sollen == globale Variablen variable "xy";// == irgendeine Variable Deines EA, hier nur als Beispiel variable "abc";// == irgendeine Variable Deines EA, hier nur als Beispiel // jetzt geht´s los => double StochaPreis ;// Dein Ergebnis extern int Barzahl = 8 ;// die 8 Bars extern int TF = 0;// der aktuelle TF extern int Start = 1;// beginnend mit dem jüngsten aber vollendeten Bar extern bool fleissigerCoder = true;// wollen wir doch sehr hoffen xD // nun vielleicht noch weitere Variablen // // INIT() , DEINIT() , nun Start() und dann der Code des Haupt-EA // // // dann geht´s los if (Forex1+ == fleissigerCoder) // nun rufst Du Deine Bedingungen auf , zuerst kommt die Stoch, die Wahr ist wenn < 20 { if (iStochastic(NULL, NULL,5,3,3,MODE_SMA,0,MODE_MAIN,0) < 20) { bIndi1Allowtrading = true; StochaPreis = MaxPreis(TF,Barzahl,Start);// Hoch der letzten beiden Tage ; // WAS MÜSSTE HIER VERÄNDERT WERDEN ? } } // // weiterer Code des Haupt-EA return;// ende des Haupt-EA } // // nun kommt die Fkt "Maxpreis" wie in Posts weiter oben ... // // //+-----------------------------------------------------------------------------------------------+ //| | //| function : Berechnung des Maximum (Highest High) einer Gruppe von Bars innerhalb eines TF | //| | //+-----------------------------------------------------------------------------------------------+ double MaxPreis( int TF , int BarZahl ,int Start)// | { // | bool PRT = (Bars > bb && hilfe) ;// | int a = iHighest(Markt,TF,MODE_HIGH,BarZahl,Start) ;// | double b = NormalizeDouble(iHigh(Markt,TF,a),Digits) ;// | if (PRT) Print(" MaxPreis : Am ",TimeToStr(iTime( Markt,TF,a),TIME_DATE|TIME_MINUTES) ,// | " im TF = ",TF," Minuten = ",b," in ",BarZahl," Kerzen,Shift= ",Start," @ HighestBar = ",a) ;//| //+-----------------------------------------------------------------------------------------------+ return (b) ;// | } // | //------------------------------------------------------------------------------------------------+ Hoffe hilft KB 1 Quote Link to comment Share on other sites More sharing options...
Forex1+ Posted October 6, 2011 Author Report Share Posted October 6, 2011 Hoffe hilft KB @ KB: Hat alles geklappt Ein riesen Dank! @ Forum: Und nochmal generell Kompliment an das Forum ! Wie hier geholfen wird ist absolut toll ! Bin froh dieses Forum gefunden zu haben Lieben Gruß Quote Link to comment Share on other sites More sharing options...
Kleinerbroker Posted October 6, 2011 Report Share Posted October 6, 2011 Bin froh dieses Forum gefunden zu haben => Geht mir auch so . KB PS.: Schön, dass Du nun weitermachen kannst . Das freut Quote Link to comment Share on other sites More sharing options...
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.