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

 

Hallo zusammen,


ich hoffe Ihr könnt mir wieder weiterhelfen, denn ich habe ein neues Problem. Meine Idee ist, immer dann eine Buy Order zu eröffnen, wenn der ADX Wert größer als ein voreingestellter ADX Wert ist und weiterhin beim ADX der D+ Wert den D- Wert kreuzt.Jetzt habe ich dazu noch den SAR Parabolic Indikator integriert und er wird mir in den Simulationen einwandfrei angezeigt. Es gibt keine Fehler oder Warnungen beim Kompilieren. Selbst einige Testkommentare die ich mal probeweise in die IF-Bedingung eingefügt habe, ob mein buy-Signal durch den Indikator funktioniert, klappt einwandfrei in der Simulation.


Also es geht in der Simulation  alles einwandfrei, jedoch wieder nicht im Livekonto (ohne den neu hinzugefügten Parabolic SAR Indikator funktioniert alles auch im Livekonto).

Wo liegt das Problem?

Ich poste mal den modifizierten Quellcode:


//+------------------------------------------------------------------+

#property version   "1.00"


#include<Trade\Trade.mqh>  // Benötigte Library
// Erstellung der CTrade Instanz
CTrade trade;

// Eingaben und Array- und Variablendefinitionen
   // Stop Loss
   input int      StopLoss=30;     
   // Take Profit
   input int      TakeProfit=20;  
   //  ADX-Einstellung für das Crossing zwischen D+ und D- und D- und D+
   input int setADX = 10; 
    // Lotgröße
   input double myLotSize = 0.01;

   // für ADX-Wert
   double ArrayADX[];
   // für D+-Wert
   double ArrayDpl[];
   // für D- -Wert
   double ArrayDmi[]; 
   
   // Preisarray für Parabolic Indikator
   MqlRates SARPricearray[];
   // Create a string for the signal
   string SARsignalkaufen ="";
    // Create a SAR Array
   double meinSARArray[];
  
   // Verwendung für Stop-Loss & Take-Profit-Werte
   int SL, TP;  
  
    // handle für den ADX und Parabolic indicator
   int adx;
   int SARDefinition;
   
//+------------------------------------------------------------------+
// Anfang Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
   //--- Get handle for ADX indicator
   adx=iADX(Symbol(),_Period,14);
   // Defined SAR EA, current candle, 3 candles, save the result
   SARDefinition = iSAR(_Symbol,_Period,0.02,0.2);
   
   
   //---  Wenn Handle ungültiges Handle zurückgibt?
   if(adx<0  || SARDefinition<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);
   
   // sort the array from the current candle downwards
   ArraySetAsSeries(SARPricearray,true);
    // sort the SARArray from the current candle downwards
   ArraySetAsSeries(meinSARArray,true);
     
   //--- Let us handle currency pairs with 5 or 3 digit prices instead of 4
   SL = StopLoss;
   TP = TakeProfit;
   if(_Digits==5 || _Digits==3)
     {
      SL = SL*10;
      TP = TP*10;
     }
        return(INIT_SUCCEEDED);
  }

//+------------------------------------------------------------------+
// Ende Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
      //--- Release our indicator handles
   IndicatorRelease(adx);
    IndicatorRelease(SARDefinition);
  }
  
//+------------------------------------------------------------------+
// Anfang Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
    // Bevor wir unser Buytrade eröffnen können - müssen wir den Nachfragepreis kennen
   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
   
   //Wir werden die statische Variable Old_Time verwenden, um die Barzeit zu bedienen.
   // Bei jeder OnTick-Ausführung werden wir die aktuelle Barzeit mit der gespeicherten überprüfen.
   // Wenn die Barzeit nicht mit der gespeicherten Zeit übereinstimmt, zeigt dies an, dass wir einen neuen Tick haben.

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

// Kopieren der letzten Barzeit auf das Element New_Time[0]
   int copied=CopyTime(_Symbol,_Period,0,1,New_Time);
   if(copied>0) // ok, die Daten wurden erfolgreich kopiert
     {
      if(Old_Time!=New_Time[0]) // wenn die alte Zeit nicht gleich der neuen Barzeit ist
        {
         IsNewBar=true;   // wenn es sich nicht um einen ersten Aufruf handelt, ist die neue Bar erschienen
         if(MQL5InfoInteger(MQL5_DEBUGGING)) Print("We have new bar here ",New_Time[0]," old time was ",Old_Time);
         Old_Time=New_Time[0];            // Speicherung der Barzeit
        }
     }
   else
     {
      Alert("Error in copying historical times data, error =",GetLastError());
      ResetLastError();
      return;
     }
     
   // we fill the array with price data
   int Data = CopyRates(Symbol(),Period(),0,3,SARPricearray);     

   // 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
   // SAR Parabolic:, current buffer, current candle, 3 candles, save in array
   CopyBuffer(SARDefinition,0,0,3,meinSARArray);
  
// 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],2);  // ADX
   double DplWert=NormalizeDouble(ArrayDpl[0],2);  // D+
   double DminWert=NormalizeDouble(ArrayDmi[0],2);  // D-
   
   // Calculate the the value for the last candle
   double LastSARValue = NormalizeDouble(meinSARArray[0],5);
   // Calculate the value for the candle before last candle
   double NextToLastSARValue=NormalizeDouble(meinSARArray[1],5);
    
   // Anfang buy signal  
   // If it was above the high the candle before - wenn die Punkte unter dem Candle sind

   if (LastSARValue < SARPricearray[0].low)    // mrate[1].low
   {
   // It it was above the high the candle before
   if (NextToLastSARValue > SARPricearray[1].high) // mrate[2].high
   {
      SARsignalkaufen="buy";
 //     Comment ("The current signal is: ",SARsignalkaufen);
   }
} // Ende if

// Anfang sell signal

   

   // If it was over the high the candle before - wenn die Punkte über dem Candle sind
   if (LastSARValue > SARPricearray[0].low)

   // It it was over the high the candle before
   if (NextToLastSARValue < SARPricearray[1].high) 
   {
      SARsignalkaufen="sell";
      // Comment ("The current signal is: ",SARsignalkaufen);
   }
   
// Ende der Buy-Parabolic Indikator Implementierung 

// Ende der ADX-Handelsstrategie Umsetzung 
   
   // Testkommentar
   //Comment ("The current ADX signal is: ",ADXWert);
  
   //--- Haben wir bereits offene Positionen?
   bool Buy_opened=false;  // variable to hold the result of Buy opened position
   bool Sell_opened=false; // variables to hold the result of Sell opened position
   
   if(PositionSelect(_Symbol)==true) // we have an opened position
     {
      if(PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_BUY)
        {
         Buy_opened=true;  // Es ist ein Kauf
        }
      else if(PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_SELL)
        {
         Sell_opened=true; // Es ist ein Verkauf
        }
     } // Ende if PositionSelect
   
   if ((SARsignalkaufen =="buy") && (ADXWert>=setADX)  && (ArrayDpl[0] > ArrayDmi[0]) && (ArrayDpl[1] < ArrayDmi[1]))   //Crossing for D+ and D-   ((ArrayDpl[0] > ArrayDmi[0]) && (ArrayDpl[1] < ArrayDmi[1])    
   {
    // irgendeine offene Kaufposition?
   if(Buy_opened)
   {
    // Alert("We already have a Buy Position!!!");    nervt wenn es andauernd aufpoppt. 
   return;    // Don't open a new Buy Position
   } // Ende Buy_opened
   trade.Buy(myLotSize,NULL,Ask,(Ask-SL*_Point),(Ask+TP*_Point),NULL); 
       //  Comment ("The current ADX signal is: ",ADXWert);  
     } // Ende if Buy Condition   
     
  } // Ende on Tick
//+------------------------------------------------------------------+
// Ende Expert tick function                                             |
//+------------------------------------------------------------------+


Ich würde mich sehr freuen, wenn Ihr mir wieder weiterhelfen könntet. 


Viele Grüße und bleibt gesund!

Paul

 

arbeitest Du auf Hedge oder auf Netting Konto?

dein Programmierstil ist definitiv für Netting, und ganz ehrlich, auf einem Netting Konto, wenn Du die Position nicht umdrehen willst, ist es egal ob du eine Long oder Short hat.


   if(PositionSelect(_Symbol)==true) // we have an opened position
     {
      if(PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_BUY)
        {
         Buy_opened=true;  // Es ist ein Kauf
        }
      else if(PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_SELL)
        {
         Sell_opened=true; // Es ist ein Verkauf
        }
     } // Ende if PositionSelect

da reicht eigentlich zu fragen, ob PositionSelect(_Symbol) auf true ist


bei Normalize Double, da kannst Du auf _Digits runden, dann passt das für alle Symbole, nicht nur für die 5 Stelligen.


wenn Du SL und TP in Points gleich von anfang an verwendest, und nicht in Pips, dann brauchst 

   if(_Digits==5 || _Digits==3)
     {
      SL = SL*10;
      TP = TP*10;
     }

den Teil gar nicht. Ich mach das schon so, seit es nur noch 5 Stellige Broker gibt, weil das ist einfach nur mühsam. Wenn Du den in Points eingibst, dann passt der auch auf allen Instrumenten


ich nehm an, das soll dir eine neue Bar anzeigen

// Kopieren der letzten Barzeit auf das Element New_Time[0]
   int copied=CopyTime(_Symbol,_Period,0,1,New_Time);
   if(copied>0) // ok, die Daten wurden erfolgreich kopiert
     {
      if(Old_Time!=New_Time[0]) // wenn die alte Zeit nicht gleich der neuen Barzeit ist
        {
         IsNewBar=true;   // wenn es sich nicht um einen ersten Aufruf handelt, ist die neue Bar erschienen
         if(MQL5InfoInteger(MQL5_DEBUGGING)) Print("We have new bar here ",New_Time[0]," old time was ",Old_Time);
         Old_Time=New_Time[0];            // Speicherung der Barzeit
        }
     }
   else
     {
      Alert("Error in copying historical times data, error =",GetLastError());
      ResetLastError();
      return;
     }

schau dir mal das an dazu

https://www.mql5.com/de/search#!keyword=isnewbar&module=mql5_module_codebase


was nicht immer Funktioniert ist NULL beim Symbol reinschreiben, es gibt Funktionen, da verweigert das MQL5

wenn Du stattdessen _Symbol reinschreibst, dann passt es immer

genauso bei der Periode, aktuelle Periode = 0, kannst Du auch PERIOD_CURRENT verwenden, macht den Code auch übersichtlicher



das hier 

   if(Buy_opened)
   {
    // Alert("We already have a Buy Position!!!");    nervt wenn es andauernd aufpoppt. 
   return;    // Don't open a new Buy Position
   } // Ende Buy_opened
   trade.Buy(myLotSize,NULL,Ask,(Ask-SL*_Point),(Ask+TP*_Point),NULL); 
       //  Comment ("The current ADX signal is: ",ADXWert);  
     } // Ende if Buy Condition   

fängst Du besser so ab

   if(!Buy_opened)
   trade.Buy(myLotSize,NULL,Ask,(Ask-SL*_Point),(Ask+TP*_Point),NULL); 
Suche - MQL5.community
Suche - MQL5.community
  • www.mql5.com
Die Suche beruht auf der Morphologie, Klein-/Großschreibung wird nicht beachtet. Alle eingegebenen Buchstaben werden als Minuskeln betrachtet. In der Standardeinstellung werden die...
 
und wenn Du die Kommentare aus dem flow nach rechts rüber schiebst, dann ist der code besser lesbar ;-)
 
amando:
und wenn Du die Kommentare aus dem flow nach rechts rüber schiebst, dann ist der code besser lesbar ;-)

Hallo armando,

danke für Deine schnelle Antwort. Ich werde den Code versuchen entsprechend Deiner Tipps anzupassen und melde mich dann wieder ob alles geklappt hat.

Das Konto ist ein Hedging Konto.

Danke und viele Grüße

Paul

 
PS-WW-Trader:

Hallo armando,

danke für Deine schnelle Antwort. Ich werde den Code versuchen entsprechend Deiner Tipps anzupassen und melde mich dann wieder ob alles geklappt hat.

Das Konto ist ein Hedging Konto.

Danke und viele Grüße

Paul

da hast 3 Funktionen um zu überprüfen ob du eine Position offen hast, deine Version inkludiert alle Positionen und nicht die des Experten

bool CheckPositionLong(const string sym, const int magic)
  {

   bool Positions=false;
   ulong ticket=0;

   int i=PositionsTotal();
   while(i-->0)
     {
      ticket=PositionGetTicket(i);
      PositionSelectByTicket(ticket);

      if(PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_BUY
         && PositionGetString(POSITION_SYMBOL) == sym
         && PositionGetInteger(POSITION_MAGIC) == magic)
        {
         Positions=true;
         break;
        }
     }
//Print("Long Positions: ", Positions);
   return(Positions);
  }


//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
bool CheckPositionShort(const string sym, const int magic)
  {

   bool Positions=false;

   ulong ticket=0;

   int i=PositionsTotal();
   while(i-->0)
     {
      ticket=PositionGetTicket(i);
      PositionSelectByTicket(ticket);

      if(PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_SELL
         && PositionGetString(POSITION_SYMBOL) == sym
         && PositionGetInteger(POSITION_MAGIC) == magic)
        {
         Positions=true;
         break;
        }
     }

   return(Positions);
  }
 
amando:

da hast 3 Funktionen um zu überprüfen ob du eine Position offen hast, deine Version inkludiert alle Positionen und nicht die des Experten

Hallo amando,

ich habe wieder mal dank Deiner Hilfe den Code vereinfachen können, aber zudem festgestellt, das leider keine Trades im Livekonto eröffnet werden und ich vermute, das es an der neuen Kerzenprüffunktion IsNewBar liegen könnte. In der Simulation klappt wieder mal alles fehlerfrei....;)

   if(PositionSelect(_Symbol)==true) // we have an opened position
     {
      if(PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_BUY)
        {
         Buy_opened=true;  // Es ist ein Kauf
        }
      else if(PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_SELL)
        {
         Sell_opened=true; // Es ist ein Verkauf
        }
     } // Ende if PositionSelect

Den obigen Code habe ich komplett rausgeschmissen, da nach meinem Verständnis sowieso nur einmal ein buy Trade geöffnet wird, wenn eine neue Kerze erscheint und die Bedingung der If-Anweisung erfüllt ist. Darüber hinaus habe ich alle Normalize Double auf _Digits gerundet und den Wert NULL durch _Symbol ersetzt.

Weiterhin habe ich wie von Dir vorgeschlagen, die SL und TP Werte in Points angegeben damit ich auch auf diesen Teil verzichten kann:

if(_Digits==5 || _Digits==3)
     {
      SL = SL*10;
      TP = TP*10;
     }


Dann bin ich für die Erkennung einer neuen Bar Deinem Link gefolgt, und habe die IsNewBar Funktion nun eingebaut und die alte Funktion:

/ Kopieren der letzten Barzeit auf das Element New_Time[0]
   int copied=CopyTime(_Symbol,_Period,0,1,New_Time);
   if(copied>0) // ok, die Daten wurden erfolgreich kopiert
     {
      if(Old_Time!=New_Time[0]) usw....

ebenfalls rausgenommen, da sie an dieser Stelle in der onTick Funktion eigentlich, sofern ich das richtig verstehe,  keinen Sinn gemacht hat.

Zu guter Letzt, habe ich die trade.buy Funktion ebenfalls optimiert. 


Ich bin leider kein Programmierprofi und hoffe wie immer auf Deine / Eure Hilfe. Vielleicht seht Ihr ja auf den ersten Blick, woran es liegen könnte, das keine Trades im Livekonto eröffnet werden. ;)

Der aktuelle Quellcode sieht nach all den Optimierungen nun folgendermaßen aus: (Den Parabolic Indikator habe ich erstmal wieder entfernt, weil ich möchte, das der EA erstmal mit einem Handelssignal "sauber" funktioniert.)

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

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

   // Eingaben und Array- und Variablendefinitionen
      // Stop Loss in Points
   input int      SL=30;     
      // Take Profit in Points
   input int      TP=20;  
      //  ADX Setting for Crossing between D+ and D-
   input int setADX = 10; 
      // Lotsize 
   input double myLotSize = 0.01;

      // 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,14);
   
   //--- 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);
     
        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 CIsNewBar NB1;

   // 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+
   double DminWert=NormalizeDouble(ArrayDmi[0],_Digits);  // D-

   // Ende der ADX-Handelsstrategie Umsetzung 
  
   
   if(NB1.IsNewBar(Symbol(),PERIOD_CURRENT)) // Prüfung auf neuen Balken
   { // Anfang isnewbar
       if( (ADXWert>=setADX)  && ((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),_Symbol); // Parameter: myLotsize = Positionsgröße, _Symbol= akt. Chartsymbol, Ask = Ask Preis, SL, TP, letzte Parameter = für Kommentare     
      }   // Ende if Buy Condition
   }   // Ende isnewbar
   
    
   }   // Ende on Tick

// Ab hier Funktionen einfügen

 // Neue Kerze aufgetaucht - Funktion
   bool IsNewBar(string symbol,            // Währungssymbol
              ENUM_TIMEFRAMES TimeFrame);       // Berechnung des TimeFrame
              
              
              

Nach weiteren Simulationen habe ich auch festgestellt, das der EA keine anderen Timeframes außer den 1 min Chart tradet. Woran kann das liegen?


Viele Grüße und einen sonnigen Tag

Paul

 

Hallo,


also der handelt, auch auf allen Timeframens,

ich habe dir hier noch die Magic Number eingefügt, 

ACHTUNG: Immer eine Magic verwenden, einen Text kann der Broker verändern, da steht dann auch TP und SL drin wenn er mal gezogen ist, kann aber theoretisch in der Position auch verändert werden.

Anhand der Magic Number und des Symbols kannst Du dir deine offenen Positionen und Orders immer suchen.


//+------------------------------------------------------------------+
//|                                                      ProjectName |
//|                                      Copyright 2018, CompanyName |
//|                                       http://www.companyname.net |
//+------------------------------------------------------------------+
#property copyright "Copyright 2020, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"

// Benötigte Librarys
#include <IsNewBar.mqh>
#include<Trade\Trade.mqh>

// Create an instance of Ctrade called
CTrade trade;
CIsNewBar NB1;

// Eingaben und Array- und Variablendefinitionen

input int      SL=30;            // Stop Loss in Points
input int      TP=20;            // Take Profit in Points
input int setADX = 10;           //  ADX Setting for Crossing between D+ and D-
input double myLotSize = 0.01;   // Lotsize

input int    MN = 1232314123;    // 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



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


//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {

   adx=iADX(Symbol(),_Period,14);
   if(adx<0)         //--- What if handle returns Invalid Handle
     {
      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

// 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+
   double DminWert=NormalizeDouble(ArrayDmi[0],_Digits);  // D-

// Ende der ADX-Handelsstrategie Umsetzung


   if(NB1.IsNewBar(Symbol(),PERIOD_CURRENT)) // Prüfung auf neuen Balken
     {
      // Anfang isnewbar
      if( ADXWert >= setADX  
         && 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
     }   // Ende isnewbar


  }   // Ende on Tick

// Ab hier Funktionen einfügen

btw, Rechnen kann MQL mittlerweile, Du hast viele Klammern drin die du nicht brauchst, hab dir die mal rausgegeben.

hast du Demo und Live beim gleichen broker?


Was steht im Symbol drin bei Filling Mode?

es gibt broker, da steht der nicht drin, dann musst du diesen selber ausfüllen.

 
amando:

Hallo,


also der handelt, auch auf allen Timeframens,

ich habe dir hier noch die Magic Number eingefügt, 

ACHTUNG: Immer eine Magic verwenden, einen Text kann der Broker verändern, da steht dann auch TP und SL drin wenn er mal gezogen ist, kann aber theoretisch in der Position auch verändert werden.

Anhand der Magic Number und des Symbols kannst Du dir deine offenen Positionen und Orders immer suchen.


btw, Rechnen kann MQL mittlerweile, Du hast viele Klammern drin die du nicht brauchst, hab dir die mal rausgegeben.

hast du Demo und Live beim gleichen broker?


Was steht im Symbol drin bei Filling Mode?

es gibt broker, da steht der nicht drin, dann musst du diesen selber ausfüllen.

Hi,

also ich habe den obigen Code genommen und bei mir geht damit nur die Simulation im 1 min Timeframe beim EUR/USD. Bei den anderen Timeframes bspw. 30 min zeigt er keine Operationen an.

Mein Demo und Livekonto ist beim selben Broker (Roboforex)

Anbei ein Screenshot...

 

also ich habs am 1h Timeframe robiert, da waren in einem Jahr aber auch nur 5 Trades, als auf höheren Timeframes sind die Bedingungen nicht wirklich oft erfüllt.


Hast Du den im Strategy Tester laufen oder am Demokonto?

da muss es was mit den Einstellungen haben. Ist der EA auch wirklich aktiviert am Livekonto? (grünes Symbol rechts oben)

 
amando:

also ich habs am 1h Timeframe robiert, da waren in einem Jahr aber auch nur 5 Trades, als auf höheren Timeframes sind die Bedingungen nicht wirklich oft erfüllt.


Hast Du den im Strategy Tester laufen oder am Demokonto?

da muss es was mit den Einstellungen haben. Ist der EA auch wirklich aktiviert am Livekonto? (grünes Symbol rechts oben)

Ich bin im Livekonto eingeloggt und verwende dort den Strategytester.

Bei dieser eigentlich älteren Version tradet er jeden Timeframe. Da passt komischerweise alles, aber ich sehe den Unterschied nicht.....woran kann das liegen?

Meine Vermutung ist ja, das es an der IsNewBar Funktion liegen könnte. ich hatte noch mal eine andere Art der Candle Erkennung drin und da hatte ich genau dasselbe Ergebnis. Das war der nachfolgende Code zur Erkennung einer neuen Kerze....

void OnTick()
  {
  
   MqlRates priceData[]; 
   
   ArraySetAsSeries(priceData,true);
   //Copy candle prices for 3 candles into array
   CopyRates(_Symbol,_Period,0,3,priceData);
   // create a counter for the candle
   static int candlecounter; 
   // create datetime variable for the last time stamp
   static datetime timestamplastcheck;
   // create datetime variable for current candle
   datetime timestampcurrentcandle;
   // read time stamp for current candle in array
   timestampcurrentcandle=priceData[0].time;
   //if the current time stamp is different from last time
   if (timestampcurrentcandle!=timestamplastcheck)
   {
      //remember current timestamp for next time
      timestamplastcheck=timestampcurrentcandle;
      // add 1 to the candlecounter
      candlecounter=candlecounter+1;
      
      // Chart output
      Comment("Counted candles since start:",candlecounter);
      
   }
  
  
  } // Ende onTick
 
Schreibt er irgendwas im reiter experten?