Trefferquote eines EAs erhöhen

 

Hallo, ich habe einen EA der auf Basis von 3 EMAs arbeitet: Slow, Fast, Signal.

Long-Signal: Fast > Slow, Signal kreuzt Fast von Unten

Long-Ausstieg: Signal kreuzt Fast von oben

Short: umgekehrt

Ein durchschnittlicher Gewinn ist meist mehr als doppelt so groß als ein durchschnittlicher Verlust, die Trefferquote ist aber eine Katastrophe... (Tests in M15)

Da ich leider noch nicht so viel Erfahrung im Trading habe, wollte ich mich mal umhören, ob es Ideen gibt, Fehltrades herauszufiltern und somit die Trefferquote zu erhöhen.

Vielen Dank!


Hier noch der Code:

//+------------------------------------------------------------------+
//| Includes                                                         |
//+------------------------------------------------------------------+
#include <Trade\Trade.mqh>                   CTrade _trade;             // wird verwendet für die Positionsöffnungen
#include <Trade\SymbolInfo.mqh>              CSymbolInfo _symbol;       // wird verwendet für die Symbol Information Funktionen
#include <Expert\Money\MoneyFixedRisk.mqh>   CMoneyFixedRisk _money;    // wird verwendet für die Lot-Größen-Berechnung
//+------------------------------------------------------------------+
//| Input Variablen                                                  |
//+------------------------------------------------------------------+
input group                "GENERAL"
input ENUM_TIMEFRAMES      inpTimeframe               =   PERIOD_CURRENT;    // timeframe
input ENUM_APPLIED_PRICE   inpAppliedPrice            =      PRICE_CLOSE;    // type of price

input group                "Risiko";
input double               inpRisiko                  =                2;     // Risiko in Prozent vom Kapital
input double               inpKapital                 =                0;     // Kapital, 0 = full account Balance

input int                  inpSlowMAPeriod            =               30;     // Slow EMA Period
input ENUM_MA_METHOD       inpSlowMAMode              =         MODE_EMA;     // Slow EMA Mode

input int                  inpFastMAPeriod            =               15;     // Fast EMA Period
input ENUM_MA_METHOD       inpFastMAMode              =         MODE_EMA;     // Fast EMA Mode

input int                  inpSignalMAPeriod          =                2;     // Signal Period
input ENUM_MA_METHOD       inpSignalMAMode            =         MODE_EMA;     // Signal Mode
//+------------------------------------------------------------------+
//| Variablen                                                        |
//+------------------------------------------------------------------+
MqlRates rates[];

int      emaFastHandle,emaSlowHandle,emaSignalHandle;
double   buFastEMA[],buSlowEMA[],buSignal[];

int      toCopy = 15;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit() {
   _symbol.Name(Symbol());
   _symbol.Refresh();
   if(!RefreshRates())
     {
      Print("Error RefreshRates. Bid=",DoubleToString(_symbol.Bid(),Digits()),
            ", Ask=",DoubleToString(_symbol.Ask(),Digits()));
      return(INIT_FAILED);
     }
//-- tuning for 3 or 5 digits
   int digits_adjust=1;
   if(_symbol.Digits()==3 || _symbol.Digits()==5)
      digits_adjust=10;
//---
   if(!_money.Init(GetPointer(_symbol),Period(),_symbol.Point()*digits_adjust))
      return(INIT_FAILED);
   _money.Percent(inpRisiko);
  
   ArraySetAsSeries(rates,true);
   ArraySetAsSeries(buFastEMA,true);
   ArraySetAsSeries(buSlowEMA,true);
   ArraySetAsSeries(buSignal,true);
   
   emaFastHandle = iMA(_Symbol,inpTimeframe,inpFastMAPeriod,0,inpFastMAMode,inpAppliedPrice);
   emaSlowHandle = iMA(_Symbol,inpTimeframe,inpSlowMAPeriod,0,inpSlowMAMode,inpAppliedPrice);
   emaSignalHandle = iMA(_Symbol,inpTimeframe,inpSignalMAPeriod,0,inpSignalMAMode,inpAppliedPrice);
   if(emaFastHandle == INVALID_HANDLE || emaSlowHandle == INVALID_HANDLE || emaSignalHandle == INVALID_HANDLE)
      return(INIT_FAILED);
   
   return(INIT_SUCCEEDED);
}

//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick() {

   if(!RefreshRates())
      return;
      
   if(CopyRates(_Symbol,PERIOD_CURRENT,0,toCopy,rates) != toCopy) return;
   if(CopyBuffer(emaFastHandle,0,0,toCopy,buFastEMA) != toCopy) return;
   if(CopyBuffer(emaSlowHandle,0,0,toCopy,buSlowEMA) != toCopy) return;
   if(CopyBuffer(emaSignalHandle,0,0,toCopy,buSignal) != toCopy) return;
   
   
//-- Open Long
   if(checkOpenPosition() && checkTrend(buFastEMA,buSlowEMA,"buy")) {
      if(buSignal[1] > buFastEMA[1] && buSignal[2] <= buFastEMA[2])
         buy(100,100,"EMA Crossover");
   }
   
//-- Open Short
   if(checkOpenPosition() && checkTrend(buFastEMA,buSlowEMA,"sell")) {
      if(buSignal[1] < buFastEMA[1] && buSignal[2] >= buFastEMA[2])
         sell(100,100,"EMA Crossover");
   }
   
//-- Close Long
   if((buSignal[1] < buFastEMA[1] && buSignal[2] >= buFastEMA[2]) ||
      (buSignal[1] < buSlowEMA[1])) {
         closePositions("buy");
   }
//-- Close Short
   if((buSignal[1] > buFastEMA[1] && buSignal[2] <= buFastEMA[2]) ||
      (buSignal[1] > buSlowEMA[1])) {
         closePositions("sell");
   }
}
//+------------------------------------------------------------------+

//+------------------------------------------------------------------+
//| Schließe bestimmte Positionen                                    |
//+------------------------------------------------------------------+
void closePositions(string direction) {
   if(PositionsTotal() < 1)
      return;
      
   for(int i = 0; i < PositionsTotal(); i++) {
      
      string symbol = PositionGetSymbol(i); //Symbol der Position i
      if(_Symbol == symbol) {
         ulong  posTicket     =  PositionGetInteger(POSITION_TICKET);    // Positionsticket
         int    posDirection  =  (int)PositionGetInteger(POSITION_TYPE); // Positionsrichtung          
         string posComment    =  PositionGetString(POSITION_COMMENT);    // Comment der Position
         datetime posOpenTime =  (datetime)PositionGetInteger(POSITION_TIME);      // Öffnungszeit der Position
         
         if(posDirection == POSITION_TYPE_BUY && direction == "buy" && posComment == "EMA Crossover" && posOpenTime < rates[0].time)
            _trade.PositionClose(posTicket,-1);
         
         if(posDirection == POSITION_TYPE_SELL && direction == "sell" && posComment == "EMA Crossover" && posOpenTime < rates[0].time) {
            _trade.PositionClose(posTicket,-1);
            Print(rates[0].spread);
         }
      }
   }
}
//+------------------------------------------------------------------+
//| Überprüft, ob bereits eine Position an dieser Kerze geöffnet ist |
//+------------------------------------------------------------------+
bool checkOpenPosition() {
   if(PositionsTotal() < 1)
      return true;
   
   for(int i = 0; i < PositionsTotal(); i++) {
      
      string symbol = PositionGetSymbol(i); //Symbol der Position i
      if(_Symbol == symbol) {       
         string   posComment    =  PositionGetString(POSITION_COMMENT);    // Comment der Position
         datetime posOpenTime   =  (datetime)PositionGetInteger(POSITION_TIME);      // Öffnungszeit der Position
         
         if(posComment == "EMA Crossover" && posOpenTime >= rates[0].time)
            return false;
      }
   }
   return true;
}

//+------------------------------------------------------------------+
//| Überprüfe, ob ein Trend vorliegt                                 |
//+------------------------------------------------------------------+
bool checkTrend(double &fast[], double &slow[], string direction) {
   if(direction == "buy") {
      for(int i = 1; i < 6; i++) {
         if(fast[i] <= slow[i])
            return false;
      }
      return true;
   }
   else if(direction == "sell") {
      for(int i = 1; i < 6; i++) {
         if(fast[i] >= slow[i])
            return false;
      }
      return true;
   }
   else {
      Print("'direction' muss entweder 'buy' oder 'sell' sein, der aktuelle Wert ist: " + direction);
      return false;
   }
}

//+------------------------------------------------------------------+
//| Kaufen                                                           |
//+------------------------------------------------------------------+
void buy(double slPoints, double tpPoints, string comment) {

      double sl=_symbol.Ask()-slPoints*_Point;
      Print(sl);
      double check_open_long_lot=_money.CheckOpenLong(_symbol.Ask(),sl);
      
      if(check_open_long_lot==0.0)
         return;

      //--- check volume before OrderSend to avoid "not enough money" error (CTrade)
      double chek_volume_lot=_trade.CheckVolume(_symbol.Name(),check_open_long_lot,_symbol.Ask(),ORDER_TYPE_BUY);

      if(chek_volume_lot!=0.0) {
         if(chek_volume_lot>=check_open_long_lot)
            _trade.Buy(chek_volume_lot,NULL,_symbol.Ask(),0,0,comment);
      }
      else
         Print("CMoneyFixedRisk lot = ",DoubleToString(check_open_long_lot,2),
               ", CTrade lot = ",DoubleToString(chek_volume_lot,2));
      //---
}
//+------------------------------------------------------------------+
//| Verkaufen                                                        |
//+------------------------------------------------------------------+
void sell(double slPoints, double tpPoints, string comment) {

      double sl=_symbol.Ask()+slPoints*_Point;

      double check_open_short_lot=_money.CheckOpenShort(_symbol.Bid(),sl);

      if(check_open_short_lot==0.0)
         return;

      //--- check volume before OrderSend to avoid "not enough money" error (CTrade)
      double chek_volume_lot=_trade.CheckVolume(_symbol.Name(),check_open_short_lot,_symbol.Ask(),ORDER_TYPE_BUY);

      if(chek_volume_lot!=0.0) {
         if(chek_volume_lot>=check_open_short_lot)
            _trade.Sell(chek_volume_lot,NULL,_symbol.Bid(),0,0,comment);
      }
      else
         Print("CMoneyFixedRisk lot = ",DoubleToString(check_open_short_lot,2),
               ", CTrade lot = ",DoubleToString(chek_volume_lot,2));
      //---
}
//+------------------------------------------------------------------+
//| Refreshes the symbol quotes data                                 |
//+------------------------------------------------------------------+
bool RefreshRates()
  {
//--- refresh rates
   if(!_symbol.RefreshRates())
      return(false);
//--- protection against the return value of "zero"
   if(_symbol.Ask()==0 || _symbol.Bid()==0)
      return(false);
//---
   return(true);
  }
 
UnknownInnocent:

Hallo, ich habe einen EA der auf Basis von 3 EMAs arbeitet: Slow, Fast, Signal.

Long-Signal: Fast > Slow, Signal kreuzt Fast von Unten

Long-Ausstieg: Signal kreuzt Fast von oben

Short: umgekehrt

Ein durchschnittlicher Gewinn ist meist mehr als doppelt so groß als ein durchschnittlicher Verlust, die Trefferquote ist aber eine Katastrophe... (Tests in M15)

Da ich leider noch nicht so viel Erfahrung im Trading habe, wollte ich mich mal umhören, ob es Ideen gibt, Fehltrades herauszufiltern und somit die Trefferquote zu erhöhen.

Vielen Dank!


Hier noch der Code:

Das Forum ist voll von Tipps wie:

Vergiss EMAs , dein EA muss dynamisch werden, ....

 
Christian:

Das Forum ist voll von Tipps wie:

Vergiss EMAs , dein EA muss dynamisch werden, ....

Mein Hauptproblem ist, dass ich kaum Erfahrung habe und dadurch nicht so recht weiß, wie ich eine gute Strategie entwickeln kann, um einen solchen "dynamischen" EA umzusetzen....

 
UnknownInnocent:

Mein Hauptproblem ist, dass ich kaum Erfahrung habe und dadurch nicht so recht weiß, wie ich eine gute Strategie entwickeln kann, um einen solchen "dynamischen" EA umzusetzen....

Das hatten und haben hier viele.

Bedenke das du auf diesem Gebiet alleine weiterlaufen musst.

Das Forum ist dein Info Geber ....lesen lesen lesen...


Welcher Goldgräber sagt seinem Nachbarn was er gefunden hat? ..... Denk drüber nach.

 
Christian:

Das hatten und haben hier viele.

Bedenke das du auf diesem Gebiet alleine weiterlaufen musst.

Das Forum ist dein Info Geber ....lesen lesen lesen...


Welcher Goldgräber sagt seinem Nachbarn was er gefunden hat? ..... Denk drüber nach.

Dein Analogieschluss ist nicht präzise.

Das Gold war beschränkter als die Handelsmöglichkeiten in Forex.

Wenn jemand dir seine profitable Strategie verratet, werden die Billionen Dollar auch nicht anders umverteilt..
 
gausambur:
Dein Analogieschluss ist nicht präzise.

Das Gold war beschränkter als die Handelsmöglichkeiten in Forex.

Wenn jemand dir seine profitable Strategie verratet, werden die Billionen Dollar auch nicht anders umverteilt..

Wenn du deine profitable strategie verräts, dann wird die binnen wochen nicht mehr profitabel sein

 

Hallo  UnknownInnocent,

Ich bin schon einige Jahre daran, einen EA zu entwickeln, dessen Logik ich unter der Woche in Realtime erprobe, am Wochenende im Backtestmodus.
Ich habe alle möglichen (natürlich nicht ALLE möglichen) Logiken durch, einige sahen sehr vielversprechend aus, natürlich immer mit einem Haken.
Ich will es am Beispiel Dax zusammenfassen:
Die Vergangenheit gibt wichtige Hinweise darauf, wie die Entwicklung sein wird, aber diese ist jedes mal neu und überraschend.

Ich seh es so:  Alles steht und fällt mit Deinem StopLoss.
gehst du geringes Risiko ein, bricht dir der Spread das Genick.
Du kommst einfach nicht dauerhaft in Gewinn weil temperamentvolle Strecken dich in Sekunden weghauen.

Gehst du hohes Risiko ein, hast du vielleicht Tage mit Gewinn, aber der Tag x kommt, wo du deinen SL erreichst- und dann ziehst du ihn weg .. und weg ...


Es sind einfach unheimliche viele Faktoren und Menschen, die mitspielen, nicht zuletzt der CFD-Broker, gegen dessen Programm Du spielst und der, wenn er schlau ist,
nicht zulassen wird, dass Du am Stück Gewinne einfährst. Sein Kurs hat da auf einmal eine Nadel, wo der Ursprungskurs, Dax und FDax keine hat. da machste nix, selber erlebt.
Und wenn Du direkt in der höheren Liga Futures spielst, gehst du ein Mindestrisiko von 12,50 Euro pro Tick, d.h. halber Daxpunkt.
Gekauft und wenig später bei -250 Euro, nachgedacht und bei -400 ... ohh, er kommt wieder, schnell raus bei -200. Zack, keine Minute ist um, mehrfach selber erlebt.

Trotzdem:  So nah am "großen Geld" mitzuspielen, macht Spass und evtl. den Softwarenugget zu finden, der dich sicherer in den den Entscheidungen macht, spornt an.
Ich bin immer noch dabei und habe mich sehr verbessert, aber noch reichts nicht
Aber Erfolg mit EAs? - schau dir die Vergangenheitsdaten deines Symbols mit Deiner EA-Auswahl mit neutralem Blick an (Jetzt hätte das Ding gekauft und hier raus ..) und DANN wird einiges klarer.

P.S.:  Ach ja, und am Ende mal mit "Realen Ticks" und schön langsam eingestellt testen ... das bricht viele Illusionen :-)

Grund der Beschwerde: