Metatrader Forum | Forex Expert-Advisor | Broker & Forex Tools

Metatrader Forum | Forex Expert-Advisor | Broker & Forex Tools (http://www.expert-advisor.com/forum/index.php)
-   Programmierung MQL4 (http://www.expert-advisor.com/forum/forumdisplay.php?f=220)
-   -   Trailing Wert ist nicht korrekt (http://www.expert-advisor.com/forum/showthread.php?t=6662)

AVT 15.05.20 13:44

Trailing Wert ist nicht korrekt
 
Liste der Anhänge anzeigen (Anzahl: 1)
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;
      }
  }
}

Bild im Anhang zeigt Werte einer Bar nach der Eröffnung: Der erste SL bei der Eröffnung wird korrekt gelesen und gesetzt. Bei der nächsten Bar sollte er eigentlich runtergezogen werden - der Wert ist aber komplette Fantasie wie man sieht, gibt es den Wert nirgendswo.

Habt Ihr Hinweise? Danke. AVT

MA-EA 15.05.20 22:10

:confused:

Warum machst den TS nicht einfach mit Bid / Ask / OrderStopLoss() / so in der Art eben?

AVT 15.05.20 22:51

Zitat:

Zitat von MA-EA (Beitrag 43685)
:confused:
Warum machst den TS nicht einfach mit Bid / Ask / OrderStopLoss() / so in der Art eben?

Weil Bid/Ask völlig egal sind, genauso wie über/unter der Linie auch völlig egal ist. Er soll bei einem Short-Trade einfach den SL entlang dem oberen Band nach (unten) ziehen. Und damit er das kann, muß er wissen, welchen Wert das obere Band zum aktuellen Zeitpunkt hat. So einen Wert bekommt man aus einem Indikator mit iCustom. Und beim Eröffnen der Order ist ja auch alles ok.
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

Indikator-Trading 16.05.20 09:57

Hi, ich glaube, du wirst nicht die richtige Anzahl an Parameter an deinen Indikator über iCustom weiterleiten.
Aktuell gibst du nur das Symbol, TF, Indikatorname, BufferVariable und Shift an.
Bei fast allen Indikatoren sind aber Input Variablen definiert, welche du nach dem Indikatornamen weiterleiten musst.

Hat dein Indikator z.B. nur den Parameter zur Periodenlänge, über die er seinen Channel legt, müsste dein aufruf z.B. so aussehen:

Periodenlänge 20,Shift 0:
double Ssl=iCustom(Symbol(),MAframe,INDI,20, 2,0); //chan.hi
double Lsl=iCustom(Symbol(),MAframe,INDI,20, 3,0); //chan.low
Sonst häng bitte den Indikator mit hier dran und ich schaue mir das mal genauer an.

double iCustom(
string symbol, // symbol
int timeframe, // timeframe
string name, // path/name of the custom indicator compiled program
... // custom indicator input parameters (if necessary)
int mode, // line index
int shift // shift
);

Indikator-Trading 16.05.20 10:06

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;
}
}

AVT 16.05.20 15:21

Zitat:

Zitat von Indikator-Trading (Beitrag 43688)
Hi, ich glaube, du wirst nicht die richtige Anzahl an Parameter an deinen Indikator über iCustom weiterleiten.
Aktuell gibst du nur das Symbol, TF, Indikatorname, BufferVariable und Shift an.
Bei fast allen Indikatoren sind aber Input Variablen definiert, welche du nach dem Indikatornamen weiterleiten musst.

Danke für den Hinweis. Der Indikator hat zwar die Möglichkeit, die Parameter zu verändern, es sollen aber alle defaults benutzt werden.

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. :confused:
AVT

AVT 16.05.20 15:27

Zitat:

Zitat von Indikator-Trading (Beitrag 43689)
Hab gerade noch was in deinem Code entdeckt.

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) :eek:
AVT

Indikator-Trading 16.05.20 17:01

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

AVT 16.05.20 17:53

Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:

Zitat von Indikator-Trading (Beitrag 43695)
Sonst teile doch mal deinen Code für den Indikator.

Da isser! Gruß AVT

Indikator-Trading 16.05.20 19:41

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


Alle Zeitangaben in WEZ +2. Es ist jetzt 19:36 Uhr.

Powered by vBulletin® Version 3.8.5 (Deutsch)
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
SEO by vBSEO 3.6.1
Powered by vBCMS® 2.7.0 ©2002 - 2024 vbdesigns.de
Copyright ©2009 - 2023 by Expert-Advisor.com - Das Metatrader Forum