|
Programmierung MQL4 Hier gehts rund ums Programmieren in MQL4. |
|
Themen-Optionen | Thema durchsuchen | Ansicht |
|
|||
Trailing Wert ist nicht korrekt
Situation:
1. ein Indikator -. hat default Werte, die nie verändert werden (TF=h1) 2. ein EA (TF=h1) -. liest (eigentlich) die Werte des Indikators aus -. benutzt diese Werte zum Ein-/Ausstieg und Trailen Problem: Der SL wird anhand einer Indikatorline, also auf einen festen Wert gesetzt (im Gegensatz zu Bid/Ask+/-EinWert). Aber obwohl bei der 1. Order der SL-Wert korrekt vom Indikator übernommen wird, erscheint beim Trailing plötzlich ein Fantasie-Wert, bei dem ich nicht erkennen kann, woher der überhaupt kommt. Frage: Was übersehe ich hier? Code:
//============================================================================= void CheckToOpen() { int tckt; // === default values of Indi double upLi=iCustom(Symbol(),MAframe,INDI, 0,0); //HT.up,UpLine double dnLi=iCustom(Symbol(),MAframe,INDI, 1,0); //HT.dn,DnLine double Ssl=iCustom(Symbol(),MAframe,INDI, 2,0); //chan.hi,UpperBorder double Lsl=iCustom(Symbol(),MAframe,INDI, 3,0); //chan.low,LowerBorder double sigL=iCustom(Symbol(),MAframe,INDI, 4,0); //sig.up,= 1 double sigS=iCustom(Symbol(),MAframe,INDI, 5,0); //sig.dn,=-1 bool ShortOnly=(dnLi>0); //IfStoppedOutLastShort bool LongOnly=(upLi>0); //IfStoppedOutLastLong Print(__FUNCTION__," HT.up=",DoubleToStr(upLi,_Digits)," HT.dn=",DoubleToStr(dnLi,_Digits), " chan.hi=",DoubleToStr(Ssl,_Digits)," chan.lo=",DoubleToStr(Lsl,_Digits), " sig.up=",DoubleToStr(sigL,_Digits)," sig.dn=",DoubleToStr(sigS,_Digits) ); // ============================================================= OpenShort if( (sigS==-1 || ShortOnly) && NoOfRunnings(Symbol())!=-1 ) //Sig.dn,HT.dn { tckt=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,0,0,NULL,EAMAGIC,0,clrRed); Print(__FUNCTION__," tck: ",IntegerToString(tckt)," SL: ",DoubleToStr(Ssl,_Digits)); if(tckt>0) { if(OrderSelect(tckt,SELECT_BY_TICKET)) { Print(__FUNCTION__," order ",IntegerToString(tckt)," selectable"); if(!OrderModify(tckt,OrderOpenPrice(), NormalizeDouble(Ssl,_Digits),OrderTakeProfit(),0,clrOrange) ) Print(__FUNCTION__," open short, SL: ",DoubleToStr(Ssl,_Digits) ); } } return; } // ============================================================= OpenLong if( (sigL==1 || LongOnly) && NoOfRunnings(Symbol())!=1 ) //Sig.up,HT.up { tckt=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,0,0,NULL,EAMAGIC,0,clrGreen); Print(__FUNCTION__," tck: ",IntegerToString(tckt)," SL: ",DoubleToStr(Lsl,_Digits)); if(tckt>0) { if(OrderSelect(tckt,SELECT_BY_TICKET)) { Print(__FUNCTION__," order ",IntegerToString(tckt)," selectable"); if(!OrderModify(tckt,OrderOpenPrice(), NormalizeDouble(Lsl,_Digits),OrderTakeProfit(),0,clrOrange) ) Print(__FUNCTION__," open long, SL: ",DoubleToStr(Lsl,_Digits) ); } } return; } } //============================================================================= void CheckToTrail() { double Ssl=iCustom(Symbol(),MAframe,INDI, 2,0); //chan.hi double Lsl=iCustom(Symbol(),MAframe,INDI, 3,0); //chan.low for(int i=0; i<OrdersTotal(); i++) { if(OrderMagicNumber()!=EAMAGIC || OrderSymbol()!=Symbol()) continue; // ============================================================= TrailShort if( OrderType()==OP_SELL) { Print(__FUNCTION__," cur SL=",DoubleToStr(OrderStopLoss(),_Digits), " chan.hi=",DoubleToStr(Ssl,_Digits) ); if(OrderStopLoss()>Ssl ) //SlHigherThanChan.hi { if(!OrderModify(OrderTicket(),OrderOpenPrice(), NormalizeDouble(Ssl,_Digits),OrderTakeProfit(),0,clrOrange)) Print(__FUNCTION__," fail modify short, SL ",DoubleToStr(Ssl,_Digits) ); } break; } // ============================================================= TrailLong if(OrderType()==OP_BUY) { Print(__FUNCTION__," cur SL=",DoubleToStr(OrderStopLoss(),_Digits), " chan.low=",DoubleToStr(Lsl,_Digits) ); if(OrderStopLoss()<Lsl ) //SlLowerThanChan.low { if(!OrderModify(OrderTicket(),OrderOpenPrice(), NormalizeDouble(Lsl,_Digits),OrderTakeProfit(),0,clrOrange)) Print(__FUNCTION__," fail modify long, SL ",DoubleToStr(Lsl,_Digits) ); } break; } } } Habt Ihr Hinweise? Danke. AVT |
|
|||
Warum machst den TS nicht einfach mit Bid / Ask / OrderStopLoss() / so in der Art eben? |
|
|||
Zitat:
Wie Du siehst benutzt die Trailingfunktion dieselben iCustom Zeilen wie die zum Order senden. Trotzdem stimmt der Wert des oberen Bandes nicht. (Steht im Log und im Chart ist die Linie wo er eigentlich sein soll - nur die Nachkommastellen, denn die sind relevant). AVT |
|
||||
Hab gerade noch was in deinem Code entdeckt.
In einer For-Schleife führst du keine OrderSelect Funktion aus. Der EA wird dir dann nicht die richtige Magicnumber und auch nicht das korrekte Symbol für die jeweilige Order auswählen. for(int i=OrdersTotal()-1; i>=0; i--) { if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false ) break; if((OrderMagicNumber()!=MagicNumber_local)) continue; //--- check order type if(OrderType()==OP_BUY) { //Trailing continue; } if(OrderType()==OP_SELL) { //Trailing continue; } } |
|
|||
Zitat:
Wenn bei iCustom irgendwelche Angaben zu Indikatorwerten nicht gemacht werden, dann nimmt er die Vorgabe. ("If the values of input parameters is not specified, the default values will be used."). Aus diesem Grunde sind all meine EA Versionen von Indikatoren so gebaut, daß die "unwichtig veränderbaren" Eingaben am Ende stehen (damit man sie beim iCustom Aufruf weglassen kann). Aber selbst wenn ich sämtliche Parameter explizit eingebe, ändert sich nichts am Ergebnis. Der Tester malt ja die Linien korrekt, ich verstehe nur nicht, warum die Linienvariable einen Wert hat, von dem ich nicht sehe woher der kommen soll. AVT |
|
|||
Jep, ich hab's auf die alte Art geändert. Bringt aber für die iCustom Werte nichts. (Hab einfach mal einen herumliegenden EA kurz geändert anstatt einen funktionierenden umzuschreiben - war mir zu viel Arbeit ne Kurzform draus zu machen)
AVT |
|
||||
Sonst teile doch mal deinen Code für den Indikator. Bei selbstentwickelten Indikatoren kann es 1001 Gründe für falsche Berechnungen geben. Ich arbeite gerade an einem der iClose von mehreren Forexpaaren auswertet. Da gibt's auch vieles was man zusätzlich beachten muss, was einen einfacheren Indikatoren der wirklich nur den aktiven aktuellen Chart auswertet nicht beachten muss. Gruß Timo
|
|
|||
Da isser! Gruß AVT
|
|
||||
Du multiplizierst deine Grundlinie mit dem ATR von dem TF den du gerade offen hast und nicht mit H1.
Aus: atr1=iATR(NULL,0,100,i); Mach mal: atr1=iATR(NULL,HTframe,100,i); Damit der Indikator auch in kleineren Zeiteinheiten sinnvoll im Chart angezeigt werden wird, müsstest du nach dem Berechnen der eigentlichen Werte in H1 eine neue Schleife durchlaufen lassen, in der du die iTime von deinem Indikator zu dem iTime von dem Bar im Chart vergleichst und nur wenn dort ein Zeitsprung erfolgt, die nächsten H1 Werte angezeigt werden. In H1 werden ja deutlich weniger Werte für den Chart erzeugt, als wenn du M5 nehmen würdest. Die Berechneten Werten von z.B. 09 Uhr in H1 gelten dann im M5 Chart von 09.00 bis 09.55, also für 12 Bars |
Lesezeichen |
|
|