Trefferquote eines EAs erhöhen

Einloggen oder registrieren, um einen Kommentar zu schreiben
UnknownInnocent
228
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:

//+------------------------------------------------------------------+
//| 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);
  }
Christian
3304
Christian  
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, ....

UnknownInnocent
228
UnknownInnocent  
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....

Christian
3304
Christian  
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.

gausambur
172
gausambur  
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..
amando
2954
amando  
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

Einloggen oder registrieren, um einen Kommentar zu schreiben