neues Problem: Nach Hinzufügen des Parabolic SAR Indikators kein Livetrading möglich - obwohl in der Simulation alles sauber läuft - Seite 3

 

kann das überhaupt wahr werden?


        ADXWert >= setADX  
         && ArrayDpl[0] > ArrayDmi[0]
         && ArrayDpl[1] < ArrayDmi[1]

du verlangst, das die werte DPL und DMi sich ändern nachdem der ADX Wert deinen vorgegebenen Wert übersprungen hat.

noch dazu, das DPL und Dmi sich auf der aktuellen Kerze den wert angenommen haben

 
amando:

die candle erkennung kennt er aber, sonst würde sich die zeit im comment nicht verändern, also liegts an den bedinungen.


Was stimmt dann an den Bedingungen nicht? Warum geht's dann ohne die Candleerkennung?

 

weil du da auch die Werte nimmst, die aktuell passieren, der indicator verändert sich am index 0

wenn du auf die neue candle wartest, dann ist der index 0 genau der was bei der eröffnung passiert ist.

 
amando:

kann das überhaupt wahr werden?


du verlangst, das die werte DPL und DMi sich ändern nachdem der ADX Wert deinen vorgegebenen Wert übersprungen hat.

noch dazu, das DPL und Dmi sich auf der aktuellen Kerze den wert angenommen haben

Ich möchte, das bei einem Crossing zwischen D+ und D- in Abhängigkeit des vorgegebenen ADX Werts, ein Trade eröffnet wird.

 
amando:

weil du da auch die Werte nimmst, die aktuell passieren, der indicator verändert sich am index 0

wenn du auf die neue candle wartest, dann ist der index 0 genau der was bei der eröffnung passiert ist.

Wie kann ich das lösen? Oder lass ich die Candle Erkennung einfach weg, weil dann gehts ja?
 

Guten morgen,


ich habe was interessantes festgestellt, wenn ich die Bedingung umändere und sage, D+ soll nur größer als D- sein, dann klappt’s. Ich muss vermutlich, um auf die Werte der vorherigen Kerze zugreifen zu können mit Shift+1 arbeiten. Muss mich dazu aber weiter einlesen, also meiner Vermutung nach, wird der Aufruf der Bedingung deswegen ignoriert, da die Werte aus dem vorherigen candle nicht ausgelesen werden. 

Vielleicht weiß jemand wie das mit dem Shift genau funktioniert

Beste Grüße 

Paul 

Update: Ok wenn ich die crossing Bedingung rausnehme und definiere, das D- über D+ ist gehts auch, nur in Kombination nicht. Weiß jemand wie man das crossing hinbekommt? 

Danke und viele Grüße 

Paul

 

Thread kann geschlossen werden ich hab die Lösung gefunden.


Besten Dank für Eure Hilfe.

 
ich hab die Lösung gefunden.

Wäre schön, wenn Du die noch anderen mitteilen könntest.

Gruß

 

Ja logo, man muss die Werte aus den Arrays erst in separate Variablen speichern und dann die Crossing Bedingung definieren.

Also ich hab das jetzt folgendermaßen umgesetzt:

//+------------------------------------------------------------------+
#property copyright "Copyright 2020, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"


#include<Trade\Trade.mqh>  // Benötigte Library
// Create an instance of Ctrade called 
CTrade trade;

// Eingaben und Array- und Variablendefinitionen
  
   input int      SL=200;     // Stop Loss in Points
  
   input int      TP=100;      // Take Profit in Points
   
   input int setADX = 22;     //  ADX Setting for Crossing between D+ and D-
    
   input int setPer = 14;     //  ADX Periode - Standard 14, größere Werte spätere Trends--> Genauer
   
   input double myLotSize = 0.01;  // Lotsize 
   
   input int    MN = 12345;    // IMMER EINE MAGIC NUMBER VERWENDEN BEI EINEM EA; NIEMALS OHNE
   
   input string Text = "myOwnText";  // Diesen kannst Du verwenden um den Komment in der Position anzuzeigen

   // für ADX-Wert
   double ArrayADX[];
   // für D+-Wert
   double ArrayDpl[];
   // für D- -Wert
   double ArrayDmi[]; 
  
    // handle for our ADX indicator
   int adx;
   

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
   //--- Get handle for ADX indicator
   adx=iADX(Symbol(),_Period,setPer);
   
   //--- What if handle returns Invalid Handle
   if(adx<0)
     {
      Alert("Error Creating Handles for indicators - error: ",GetLastError(),"!!");
      return(-1);
     }
     
   // sortiere die Preise abwärts von der aktuellen Kerze
   ArraySetAsSeries(ArrayADX,true);  
   ArraySetAsSeries(ArrayDpl,true);
   ArraySetAsSeries(ArrayDmi,true);
     
    trade.SetExpertMagicNumber(MN);          // Immer die Magic Number verwenden um Trades zu sortieren, den kommentar kann der Broker verändern     
     
        return(INIT_SUCCEEDED);
  }

//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
      //--- Release our indicator handles
   IndicatorRelease(adx);
  }
  
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
    // Before we can open our buytrade - we need to know the ask price
   double Ask=NormalizeDouble(SymbolInfoDouble(_Symbol,SYMBOL_ASK),_Digits); //Ask Price, is the price when we want to buy something, _Digits variable stores the number of digits after the decimal point
   
   // Neue Kerze aufgetaucht

   static datetime Old_Time;
   datetime New_Time[1];
   bool IsNewBar=false;



   // Definierter EA, erste Indikatorlinie (ADX) = (erste 0) die 1 liefert den Wert für die zweite Indikatorlinie D+ usw., aktuelle Kerze (zweite Index 0), 3 Kerzen (Kopieren der Daten für 3 Kerzen), speichere Resultat in meinPreisArray  // Mit der Funktion Copybuffer füllen wir unser Preisarray aufgrund der ADX Definition
   CopyBuffer(adx,0,0,3,ArrayADX);   // ADX-Wert
   CopyBuffer(adx,1,0,3,ArrayDpl);         // Dplus
   CopyBuffer(adx,2,0,3,ArrayDmi);   // D-Minus
  
// Kann für die Anzeige der Indikatorwerte in Verbindung mit der comment Funktion verwendet werden 
   
   // Berechne den EA für für die aktuelle Kerze (ADX)
   double ADXWert=NormalizeDouble(ArrayADX[0],_Digits);  // ADX
   double DplWert=NormalizeDouble(ArrayDpl[0],_Digits);  // D+ Wert aktuelle Kerze
   double DplWert1=NormalizeDouble(ArrayDpl[1],_Digits);  // D+ Wert vorherige Kerze
   
   double DminWert=NormalizeDouble(ArrayDmi[0],_Digits);  // D- Wert aktuelle Kerze
   double DminWert1=NormalizeDouble(ArrayDmi[1],_Digits);  // D-Wert vorherige Kerze

// Ende der ADX-Handelsstrategie Umsetzung 
   
   // Testkommentar
 //  Comment ("Aktueller D+ Wert: ",DplWert, "\n  ", "Vorheriger D+ Wert: ", DplWert1);


//   bool Buy_Condition_1 = (ArrayDpl[0] > ArrayDmi[0]); /*&& (ArrayDpl[1] < ArrayDmi[1]);  */     // +DI greater than -DI - für die aktuelle Kerze - Crossing
   
   
   
   // copying the last bar time to the element New_Time[0]
   int copied=CopyTime(_Symbol,_Period,0,1,New_Time);
   if(copied>0) // ok, the data has been copied successfully
     {
      if(Old_Time!=New_Time[0]) // if old time isn't equal to new bar time
        {
         IsNewBar=true;   // if it isn't a first call, the new bar has appeared
         if(MQL5InfoInteger(MQL5_DEBUGGING)) Print("We have new bar here ",New_Time[0]," old time was ",Old_Time);
         Old_Time=New_Time[0];            // saving bar time
         
         //Comment ("Neue KERZE ",Old_Time);
           if( (ADXWert>=setADX)  && (DplWert > DminWert) && (DplWert1 < DminWert1))    //       ((ArrayDpl[0] > ArrayDmi[0]) && (ArrayDpl[1] < ArrayDmi[1])))   //Crossing for D+ and D-   ((ArrayDpl[0] > ArrayDmi[0]) && (ArrayDpl[1] < ArrayDmi[1])
   {
      
        trade.Buy(myLotSize,_Symbol,Ask,(Ask-SL*_Point),(Ask+TP*_Point),Text); // Parameter: myLotsize = Positionsgröße, _Symbol= akt. Chartsymbol, Ask = Ask Preis, SL, TP, letzte Parameter = für Kommentare   
      
     } // Ende if Buy Condition   
         
         
        }
     }
   else
     {
      Alert("Error in copying historical times data, error =",GetLastError());
      ResetLastError();
      return;
     }
   
   
 
  } // Ende on Tick

// Ab hier Funktionen einfügen
 

Du hast quasi den index 0 auf den letzten wert stehen lassen.

das gleiche wäre wenn du gleich den wert 1 aus dem array nimmst