MT5 Strategie Tester funktioniert nicht auf macOS

Einloggen oder registrieren, um einen Kommentar zu schreiben
Lukas-800
48
Lukas-800  

Hallo,

Ich verwende den Meta trader 5 auf meinem Macbook und habe ihn ganz normal heruntergeladen ohne extra Wine etc zu installieren.

Ich habe mit Hilfe einer Anleitung einen EA erstellt und versucht ihn im Strategie Tester auszuführen, leider ohne Erfolg.

Dann habe ich versucht einen EA aus den Vorlagen auszuführen, auch kein Erfolg.

Die Meldung hänge ich als Bild an.

Meldungen

Ich habe bereits in der Firewall das Programm freigegeben, 2 mal hat der Start schon funktioniert jedoch wurde kein Trade ausgelöst.

Hier noch die Einstellungen:

Einstellungen

Ich würde mich freuen wenn mir jemand helfen kann, ob es am Mac liegt oder ob ich einen anderen Fehler mache.

Vielen Dank!

Otto Pauser
982
Otto Pauser  
Lukas-800:

Hallo,

Ich verwende den Meta trader 5 auf meinem Macbook und habe ihn ganz normal heruntergeladen ohne extra Wine etc zu installieren.

Ich habe mit Hilfe einer Anleitung einen EA erstellt und versucht ihn im Strategie Tester auszuführen, leider ohne Erfolg.

Dann habe ich versucht einen EA aus den Vorlagen auszuführen, auch kein Erfolg.

Die Meldung hänge ich als Bild an.

Ich habe bereits in der Firewall das Programm freigegeben, 2 mal hat der Start schon funktioniert jedoch wurde kein Trade ausgelöst.

Hier noch die Einstellungen:


Ich würde mich freuen wenn mir jemand helfen kann, ob es am Mac liegt oder ob ich einen anderen Fehler mache.

Vielen Dank!

Hast du den Tester vorher im visuellen mode gestartet? Dann blockiert er dir Core 1.

Falls noch ein Chart vom Tester herum steht, schließe dieses.

Vielleicht hilft das

Lukas-800
48
Lukas-800  

Hallo,

danke für deine Antwort.

Im Visuellen Modus ist manchmal ein neues Fenster aufgegangen und manchmal gab es dann einen schwarzen schirm zusehen wo stand dass auf ein update gewartet wird. Aber auch ohne visuellen modus Startet der Test nicht. Das Fenster wird hellgrau und ich kann den test nicht mehr Starten.

bild

Lukas-800
48
Lukas-800  
Kann es vielleicht sein dass ich irgendwelche Einstellungen im Programm ändern muss damit der EA zugriff auf das ganze bekommt?
Otto Pauser
982
Otto Pauser  
Lukas-800:
Kann es vielleicht sein dass ich irgendwelche Einstellungen im Programm ändern muss damit der EA zugriff auf das ganze bekommt?

Da gibt's eigentlich keine Einstellungen.

Probier einen anderen EA. Kann am Code liegen. Indexfehler können da heimtückisch sein.

Den zB.

//+------------------------------------------------------------------+
//| Beispiel: Einbinden eines MAs in einen EA                        |
//+------------------------------------------------------------------+

input int                  ma_period   =          20;
input int                  ma_shift    =           0;
input ENUM_MA_METHOD       ma_method   =    MODE_EMA;
input ENUM_APPLIED_PRICE   ma_price    = PRICE_CLOSE;

int handle;

int OnInit()
{
   handle=iMA(_Symbol,_Period,ma_period,ma_shift,ma_method,ma_price);   // erzeugen des handles
   if(handle==INVALID_HANDLE)                                           // check ob handle ok
      {
         Alert("*ERROR* creating iMA handle.");                         // Fehlermeldung
         return(INIT_FAILED);                                           // raus hier
      }
   ChartIndicatorAdd(0,0,handle);                                       // Indi im Chart darstellen

   return(INIT_SUCCEEDED);
}

void OnDeinit(const int reason)
{

}

void OnTick()
{

}
Lukas-800
48
Lukas-800  

Ich habe den EA ausprobiert, ich habe nun keine Fehlermeldung bekommen jedoch wurde in der kompletten Zeit keine Aktion getätigt, ich hänge die Backtest Auswertung an.

Backtest

Lukas-800
48
Lukas-800  

Ich habe diesen hier erstellt.

void OnTick()
  {
  // create an Array for several prices
  double myMovingAverageArray1[],myMovingAverageArray2[];
  
  // the properties of the Moving Average 1
  int movingAverageDefenition1 = iMA (_Symbol,_Period,20,0,MODE_SMA,PRICE_CLOSE);
  
  // the properties of the Moving Average 2
  int movingAverageDefenition2 = iMA (_Symbol,_Period,50,0,MODE_SMA,PRICE_CLOSE);
  
  // sort the price array1 from the current Candle downwards
  ArraySetAsSeries(myMovingAverageArray1,true);
  
  // sort the price array2 from the current Candle downwards
  ArraySetAsSeries(myMovingAverageArray2,true);
  
  // Define MA1, one line, current candle, 3 candles, store result 
  CopyBuffer(movingAverageDefenition1,0,0,3,myMovingAverageArray1);
  
  // Define MA2, one line, current candle, 3 candles, store result
  CopyBuffer(movingAverageDefenition2,0,0,3,myMovingAverageArray2);
  
  if ( // check if the 20 canlde MA is above the 50 candle MA
      (myMovingAverageArray1[0]>myMovingAverageArray2[0])
    &&(myMovingAverageArray1[1]<myMovingAverageArray2[1])
     )
         {
         Comment ("BUY");
         }
         
  if ( // check if the 50 canlde MA is above the 20 candle MA
      (myMovingAverageArray1[0]<myMovingAverageArray2[0])
    &&(myMovingAverageArray1[1]>myMovingAverageArray2[1])
     )
         {
         Comment ("SELL");
         }     
Lukas-800
48
Lukas-800  
Ich habe erneut versucht den EA den sie mir gegeben haben auszuführen und diesmal das gleiche Problem wie bei dem anderen..
Otto Pauser
982
Otto Pauser  
Lukas-800:
Ich habe erneut versucht den EA den sie mir gegeben haben auszuführen und diesmal das gleiche Problem wie bei dem anderen..

Du stehst noch komplett am Anfang. Natürlich macht dieser EA nichts, ist ja auch nur zum Testen gedacht.


Zu deinem EA: Die Quelle ist mir bekannt. Stammt aus einem YT Kanal, von einem gewissen R.B. der immer alles oberhalb der OnTick() löscht, weil er damit nichts anzufangen weis.

Ich habe diesen Herren mehrmals darauf hingewiesen wie es richtig geht, aber er ist lernresistent, macht in gewohnter Manier weiter, hat mir nachgeschnüffelt(Kontakte etc.) und sogar gedroht mich irgendwie zu diffamieren.

Ich frag mich nur womit, und was ist mit diesem Typen wirklich los .....?


Zu  deinem Code: Ich hab diesen umgearbeitet, so wie es imho richtig ist, Parameter für die Eingabe hinzugefügt um im Tester optimieren zu können.

Der EA ist nicht profitabel, aber auch nicht 'desaströs'. Filter für Spread und Handelszeiten sollten eingebaut werden.

Es fehlt eine Wiedereinstiegsmöglichkei bei langen Kursbewegungen und ein Filter für Seitwärtsbewegungen des Kurses und vieles mehr.

Es ist blos ein Demo.

//+------------------------------------------------------------------+
//|                                                    MyFirstEA.mq5 |
//+------------------------------------------------------------------+

#property description "EA mit 2 gleitenden Durchschnitten die sich kreuzen"
#property description "Leider kommen die Signale immer zu spät"

#define SPACER "—————————————————————"             // macro für die Eingabemaske
#define METHOD ENUM_MA_METHOD                      // Abkürzung
#define APRICE ENUM_APPLIED_PRICE                  // Abkürzung

#include <Trade\Trade.mqh>                         // Einbinden dr Systembibliothek Trade

CTrade Trade;                                      // Instanz Trade erzeugen

//+------------------------------------------------------------------+
input string   txt_MAfast       = SPACER;          // ———— MA fast ——————
input int      inp_MAfastPeriod = 23;              // MA fast Period
input METHOD   inp_MAfastMethod = MODE_CLOSE;      // MA fast Method
input APRICE   inp_MAfastPrice  = PRICE_CLOSE;     // MA fast Price

input string   txt_MAslow       = SPACER;          // ———— MA slow ——————
input int      inp_MAslowPeriod = 51;              // MA slow Period
input METHOD   inp_MAslowMethod = MODE_CLOSE;      // MA slow Method
input APRICE   inp_MAslowPrice  = PRICE_CLOSE;     // MA slow Price

input string   txt_Trade        = SPACER;          // ———— Trade ———————
input int      inp_SL           =   95;            // SL (points)
input int      inp_TP           =  165;            // TP (points)
input double   inp_Lots         = 0.01;            // Lotsize
input bool     inp_SigDisplay   = true;            // Signale anzeigen
input bool     inp_SigTrade     = true;            // Signale traden
//+------------------------------------------------------------------+

int      haMAfast,                  // handle für schnellen MA
         haMAslow;                  // handle für langsamen MA

double   buMAfast[],                // buffer für schnellen MA
         buMAslow[];                // buffer für langsamen MA

int      toCopy = 3;                // Anzahl der zu Kopierenden Preisdaten (rates)
int      Signal;

double   SL = inp_SL * _Point;      // Berechnung points als Kursdifferenz
double   TP = inp_TP * _Point;

//+------------------------------------------------------------------+
int OnInit()
{
   haMAfast = iMA(_Symbol,_Period,inp_MAfastPeriod,0,inp_MAfastMethod,inp_MAfastPrice);     // handle schneller MA erzeugen
   if(haMAfast==INVALID_HANDLE)                                   // errorcheck
      {
         Alert("*ERROR* creating iMAfast handle.");               // Fehlermeldung
         return(INIT_FAILED);                                     // Beenden mit Fehler
      }

   haMAslow = iMA(_Symbol,_Period,inp_MAslowPeriod,0,inp_MAslowMethod,inp_MAslowPrice);     // handle langsamer MA erzeugen
   if(haMAslow==INVALID_HANDLE)                                   // errorcheck
      {
         Alert("*ERROR* creating iMAslow handle.");               // Fehlermeldung
         return(INIT_FAILED);                                     // Beenden mit Fehler
      }

   ArraySetAsSeries(buMAfast,true);                               // Zugriffsart auf Array festlegen. Index 0 ist jüngster Datensatz
   ArraySetAsSeries(buMAslow,true);                               // die Arrays werden hier nicht sortiert! es wird die Indizierung festgelegt
   
   ChartIndicatorAdd(0,0,haMAfast);                               // Indikatoren im Chart / Tester sichtbar machen
   ChartIndicatorAdd(0,0,haMAslow);
   
   return(INIT_SUCCEEDED);                                        // soweit alles Ok
}

void OnDeinit(const int reason)                                   // wird gebraucht wenn ChartObjekte gelöscht werden sollen,
{                                                                 // oder wie hier der Comment sonst stehen bleibt.
   Comment("");                                                   // löschen wir den Comment
}                                                                 // Also erforderlich Aufräumarbeiten

void OnTick()
{
   double Ask=SymbolInfoDouble(_Symbol,SYMBOL_ASK);
   double Bid=SymbolInfoDouble(_Symbol,SYMBOL_BID);

   if(CopyBuffer(haMAfast,0,0,toCopy,buMAfast)!=toCopy) return;   // Daten aus den Indikatoren in die buffer kopieren
   if(CopyBuffer(haMAslow,0,0,toCopy,buMAslow)!=toCopy) return;   // incl. ErrorCheck

   Signal=0;                                                      // default kein Signal
   
   if((buMAfast[0]>buMAslow[0]) &&                                // Signal Buy
      (buMAfast[1]<buMAslow[1]))
       Signal= +1;

   if((buMAfast[0]<buMAslow[0]) &&                                // Signal Sell
      (buMAfast[1]>buMAslow[1]))
       Signal= -1;

   if(inp_SigDisplay)                                             // nur wenn angefordert
      switch(Signal)                                              // Signal Ausgabe
        {
         case  -1: Comment("Signal SELL");  break;
         case   0: Comment("Signal NONE");  break;
         case  +1: Comment("Signal BUY" );  break;
        }

   if(inp_SigTrade)                                               // nur wenn angefordert
      if(!PositionSelect(_Symbol))                                // nur wenn keine Position offen
         switch(Signal)
           {
            case -1: Trade.Sell(inp_Lots,_Symbol,Bid,Ask+SL,Bid-TP); break;
            case +1: Trade.Buy (inp_Lots,_Symbol,Ask,Bid-SL,Ask+TP); break;
           }
}

PS: man kann durch Unmengen an Kommentaren die man zwischen den Code 'hineinpappt' und durch VariablenNameDieSoLangSindWieEineHalbeZeile den Code besonders leserlich machen ;)

Lukas-800
48
Lukas-800  

Guten Tag,

Das Problem mit meinem Strategie Tester habe ich mittlerweile in der Griff bekommen.

Ich muss gelegentlich auf den Reiter Agenten gehen den oberen dort einmal abschalten und wieder anschalten dann geht es meistens wieder, ich habe dass Gefühl dass es damit zusammenhängt das der MT am Anfang noch nicht genügend Daten hat um den Test auszuführen aber genau kann ich es auch nicht sagen. Die Hauptsache ist es funktioniert erstmal.

Vielen Dank Otto Pauser für deine Mühe den Code zu korrigieren, das weiß ich zu schätzen! Nach und nach enthüllen sich einige Zeilen als Sinnvoll wobei ich bei anderen noch im Dunklen tappe.

Ich habe seitdem ständig an meinem Code gearbeitet und mich auf mehreren Internetseiten belesen und gemerkt dass in dem Video nicht sauber gearbeitet wurde.

Ich muss auf jeden Fall noch viel lernen und werde mir demnächst mal etwas Lehrmaterial anschaffen.

Mittlerweile habe ich meinen Code noch bearbeitet, einen weiteren Indikator hinzugefügt. Gerade versuche ich einen Trailing Stop zu integrieren bei dem ich den Abstand als Eingabe festlegen kann. Hier mein aktueller Stand und darunter den Code den ich mir als Trailing Stop hier aus dem Forum herausgesucht habe, welcher aber irgendwie nicht mit meinem Code funktioniert ich befürchte dass dieser für mql4 ist:

//+------------------------------------------------------------------+
//|                                                  EACrossover.mq5 |
//|                                                   Copyright 2018 |
//|                                                                  |
//+------------------------------------------------------------------+
#property copyright "Copyright 2018"
#property link      ""
#property version   "1.00"

#include <Trade/Trade.mqh>  

input double Cfd = 0.10;

input int SLPoints = 300;
input int TPPoints = 300;

input int MASignalPerioden = 5;
input int MABasisPerioden = 10;

input int ATRPeriode = 5;
input int ATRMin = 10;
input int ATRMax = 50;

input string Kommentar = "";

CTrade trade;
bool isLongTrade, isShortTrade;

int OnInit(){
   return(INIT_SUCCEEDED);
  }

void OnDeinit(const int reason){
 
  }

void OnTick(){
   
   double myMovingAverageArray1[],myMovingAverageArray2[];
   int movingAverageDefenition1 = iMA (_Symbol,_Period,MASignalPerioden,0,MODE_SMA,PRICE_CLOSE);
   int movingAverageDefenition2 = iMA (_Symbol,_Period,MABasisPerioden,0,MODE_SMA,PRICE_CLOSE);
   ArraySetAsSeries(myMovingAverageArray1,true);
   ArraySetAsSeries(myMovingAverageArray2,true);
   CopyBuffer(movingAverageDefenition1,0,0,3,myMovingAverageArray1);
   CopyBuffer(movingAverageDefenition2,0,0,3,myMovingAverageArray2);
   
   
   
   if (
      (myMovingAverageArray1[0]<myMovingAverageArray2[0])
    &&(myMovingAverageArray1[1]>myMovingAverageArray2[1])
      )
        {
         if(isLongTrade){
         trade.PositionClose(_Symbol);
         isLongTrade = false;
         }
         if (!isShortTrade) isShortTrade = executeShort();
        }
    
   else if (
      (myMovingAverageArray1[0]>myMovingAverageArray2[0])
    &&(myMovingAverageArray1[1]<myMovingAverageArray2[1])
      )
         {
         if(isShortTrade){
         trade.PositionClose(_Symbol);
         isShortTrade = false;
   }         
   
      if (!isLongTrade) isLongTrade = executeLong();
         } 
 
 }
 
 bool executeShort(){
 
   double atr[] = {0};
   int atrHandle = iATR(_Symbol,PERIOD_CURRENT,ATRPeriode);
   CopyBuffer(atrHandle,0,0,1,atr);
   if(atr[0] <= ATRMin) return 1;
   if(atr[0] >= ATRMax) return 1;
 
   double entry = SymbolInfoDouble(_Symbol,SYMBOL_BID);
   
   double sl = entry + SLPoints * _Point;
   
   double tp = entry - TPPoints * _Point;
 
   bool res;
   res = trade.Sell(Cfd,_Symbol,entry,sl,tp,Kommentar);
   return res;
 }
 
 bool executeLong(){
 
   double atr[] = {0};
   int atrHandle = iATR(_Symbol,PERIOD_CURRENT,ATRPeriode);
   CopyBuffer(atrHandle,0,0,1,atr);
   if(atr[0] <= ATRMin) return 1;
   if(atr[0] >= ATRMax) return 1;
 
   double entry = SymbolInfoDouble(_Symbol,SYMBOL_ASK);
   
   double sl = entry - SLPoints * _Point;
   
   double tp = entry + TPPoints * _Point;
 
   bool res;
   res = trade.Buy(Cfd,_Symbol,entry,sl,tp,Kommentar);
   return res;
 }
 

Hier noch der Trailing Stop Code:

input double stoploss = 0.00020;


void TrailingSL() {
   double StopLossTemp;
   
   for(i = 0; i < PositionsTotal(); i++)
   {      
      if(Symbol()==PositionGetSymbol(i))
      {
         if(PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_BUY)
         {
            if(PositionGetDouble(POSITION_PRICE_CURRENT) > PositionGetDouble(POSITION_PRICE_OPEN)) {
               
               StopLossTemp = PositionGetDouble(POSITION_PRICE_CURRENT) - stoploss;
               ChangePosition(StopLossTemp);
            }
         }
   
         if(PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_SELL)
         {
            if(PositionGetDouble(POSITION_PRICE_CURRENT) < PositionGetDouble(POSITION_PRICE_OPEN)) {
               StopLossTemp = PositionGetDouble(POSITION_PRICE_CURRENT) + stoploss;
               ChangePosition(StopLossTemp);
            }
         }
      }
   }
}

void ChangePosition(string StopLossTemp) {
   request.action = TRADE_ACTION_SLTP;
   request.symbol = Symbol();
   request.sl = NormalizeDouble(StopLossTemp,Digits());
   
   OrderSend(request,result);
}

Vielen Dank für die Hilfe! Sollte ich für diese Fragen vielleicht ein neues Thema erstellen weil das eigentliche Problem ja gelöst ist?

Carl Schreiber
Moderator
7274
Carl Schreiber  

Ich würde mich auf den bestehenden SL beziehen (hier  nur für Kauf und nicht getestet):

         ...
         if(PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_BUY)
         {
            if( PositionGetDouble(POSITION_PRICE_CURRENT) > PositionGetDouble(POSITION_SL)+StepSL ) {
               StopLossTemp = PositionGetDouble(POSITION_PRICE_CURRENT) - PositionGetDouble(POSITION_SL)+StepSL;
               ChangePosition(PositionGetDouble(POSITION_SL)+StepSL);
            }
         }
         ...
Einloggen oder registrieren, um einen Kommentar zu schreiben