Metatrader Forum | Forex Expert-Advisor | Broker & Forex Tools
Zurück   Metatrader Forum | Forex Expert-Advisor | Broker & Forex Tools > Metatrader 4 > Programmierung MQL4

Programmierung MQL4 Hier gehts rund ums Programmieren in MQL4.

Login
Benutzername:
Kennwort:


Statistik
Themen: 4973
Beiträge: 43249
Benutzer: 7.221
Aktive Benutzer: 81
Links: 84
Wir begrüßen unseren neuesten Benutzer: Thomas75
Mit 2.475 Benutzern waren die meisten Benutzer gleichzeitig online (16.01.20 um 22:38).
Neue Benutzer:
vor 21 Minuten
- Thomas75
vor 13 Stunden
- JosephTK
vor 2 Tagen
- Hopfen&Mal...
vor 3 Tagen
- frankmicha...
vor einer Woche
- DFeck

Onlineuser
'Wer ist online' anzeigen Benutzer: 1
Gäste: 440
Gesamt: 441
Team: 0
Team:  
Benutzer:  Thomas75
Freunde anzeigen

Empfehlungen

Thema geschlossen
 
Themen-Optionen Thema durchsuchen Ansicht
  #1 (permalink)  
Alt 15.05.20
AVT AVT ist offline
Elite Mitglied
 
Registriert seit: Mar 2018
Ort: Hamburg
Beiträge: 612
AVT befindet sich auf einem aufstrebenden Ast
Standard 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;
      }
   }
}
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
Angehängte Grafiken
Dateityp: jpg EA-HT.JPG (147,7 KB, 5x aufgerufen)
  #2 (permalink)  
Alt 15.05.20
Elite Mitglied
 
Registriert seit: Sep 2015
Beiträge: 1.178
MA-EA befindet sich auf einem aufstrebenden Ast
Standard



Warum machst den TS nicht einfach mit Bid / Ask / OrderStopLoss() / so in der Art eben?
  #3 (permalink)  
Alt 15.05.20
AVT AVT ist offline
Elite Mitglied
 
Registriert seit: Mar 2018
Ort: Hamburg
Beiträge: 612
AVT befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Zitat von MA-EA Beitrag anzeigen

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
  #4 (permalink)  
Alt 16.05.20
Benutzerbild von Indikator-Trading
Premium Mitglied
 
Registriert seit: May 2020
Ort: Bielefeld
Beiträge: 345
Indikator-Trading befindet sich auf einem aufstrebenden Ast
Standard

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
);
  #5 (permalink)  
Alt 16.05.20
Benutzerbild von Indikator-Trading
Premium Mitglied
 
Registriert seit: May 2020
Ort: Bielefeld
Beiträge: 345
Indikator-Trading befindet sich auf einem aufstrebenden Ast
Standard

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;
}
}
  #6 (permalink)  
Alt 16.05.20
AVT AVT ist offline
Elite Mitglied
 
Registriert seit: Mar 2018
Ort: Hamburg
Beiträge: 612
AVT befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Zitat von Indikator-Trading Beitrag anzeigen
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.
AVT
  #7 (permalink)  
Alt 16.05.20
AVT AVT ist offline
Elite Mitglied
 
Registriert seit: Mar 2018
Ort: Hamburg
Beiträge: 612
AVT befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Zitat von Indikator-Trading Beitrag anzeigen
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)
AVT
  #8 (permalink)  
Alt 16.05.20
Benutzerbild von Indikator-Trading
Premium Mitglied
 
Registriert seit: May 2020
Ort: Bielefeld
Beiträge: 345
Indikator-Trading befindet sich auf einem aufstrebenden Ast
Standard

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
  #9 (permalink)  
Alt 16.05.20
AVT AVT ist offline
Elite Mitglied
 
Registriert seit: Mar 2018
Ort: Hamburg
Beiträge: 612
AVT befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Zitat von Indikator-Trading Beitrag anzeigen
Sonst teile doch mal deinen Code für den Indikator.
Da isser! Gruß AVT
Angehängte Dateien
Dateityp: mq4 EA-MA-HT.mq4 (6,1 KB, 4x aufgerufen)
  #10 (permalink)  
Alt 16.05.20
Benutzerbild von Indikator-Trading
Premium Mitglied
 
Registriert seit: May 2020
Ort: Bielefeld
Beiträge: 345
Indikator-Trading befindet sich auf einem aufstrebenden Ast
Standard

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
Thema geschlossen

Lesezeichen

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are aus
Pingbacks are aus
Refbacks are aus




Alle Zeitangaben in WEZ +1. Es ist jetzt 11:51 Uhr.





Suchmaschine - Reisen - Wavesnode - Facebook Forum - Spam Firewall
-----------------------------------------------------------------------------------------------------------------------------
Powered by vBulletin® Version 3.8.5 (Deutsch)
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Powered by vBCMS® 2.7.0 ©2002 - 2024 vbdesigns.de
SEO by vBSEO 3.6.1
Copyright ©2009 - 2023 by Expert-Advisor.com - Das Metatrader Forum
MetaTrader bzw. MetaTrader 4 und MetaTrader 5 sind eingetragene Marken der MetaQuotes Software Corp.
-----------------------------------------------------------------------------------------------------------------------------