Was sind die Möglichkeiten, in einem objektorientierten EA einen MA auf einen RSI zu legen?

pennyhunter
165
pennyhunter  

Ich dachte jetzt, ich zäume das Pferd mal von hinten auf und erstelle mir im MQL5 Assistenten (Expert Advisor generate) einen schönen objektorientierten EA mit zwei verschiedenen RSIs und auf jedem davon zwei verschiedene Durchschnitte. Es scheint da Potential zu geben für schöne, eindeutige Trend und Umkehrmuster.

Jedenfalls war ich etwas enttäuscht, denn der Assistent hat mir nicht so ganz gut assistiert. Ist vielleicht Jammern auf hohem Niveau, aber man kann so wie es aussieht nur fünf Indikatoren verwenden und ich brauche schonmal sechs. Gut, ich denke vielleicht kann ich die da analog reinfrickeln, außer die Feinheiten der Klasse macht mir da einen Strich durch die Rechnung...na jut.

Doch außerdem kann man die MAs nicht ohne Weiteres auf die RSIs anwenden. In der CExpert ist das anscheinend gar nicht vorgesehen. Es gibt eine Enumeration, aber die bezieht sich lediglich auf die verschiedenen Preise der Kerzen.

Wenn man sowas selber zusammenbauen würde, könnte man auf die Idee kommmen, das Ergebnisse eines RSIs in ein MA Array oder einen Buffer zu übertragen. Die Methode iMA, die man dafür bräuchte enthält jedoch wieder nur die Preise und nicht die Möglichkeit, den MA auf einen anderen Indikator zu beziehen, wie das im Meta Trader der Fall ist. Auch in den Examples ist die Enumeration nur Open, High, Low, Close, Typical und Weighted, aber leider nicht vorheriger bzw. erster Indikator. Bekommt man diese Enumeration gar nicht?

Jetzt komme ich langsam in Versuchung einen komplett eigenen MA selber zusammenzufrickeln wenn ich das zu Ende denke... Aber war das nicht der Sinn der Klassen, dass es weniger Gefrickel gibt? Darum frage mich, ob es noch einen eleganteren Weg gibt.

Carl Schreiber
Moderator
11638
Carl Schreiber  
Such einfach mal nach RSI und dann die Code-Base und lass Dich überraschen: https://www.mql5.com/en/search#!keyword=rsi&module=mql5_module_codebase&page=2
lippmaje
1650
lippmaje  
Lass es doch programmieren. Kostet letztendlich wohl weniger als rumzufrickeln.
pennyhunter
165
pennyhunter  

Hast Du schon mal etwas im Markt gekauft und wie lief das ab? Hast Du gewisse Programmierkenntnisse? Verkaufst Du selber freelancemäßig MQL-Programme?

Wieviel würde das was ich möchte denn kosten, mit Quellcode zur freien Nutzung? Es geht erstmal nur um einen MA, den man auf RSI beziehen kann. Man hat dort doch etwas andere Möglichkeiten als mit iOsMA.

Aber hier, damit man mal sieht um was es geht:

#property description "Expert Advisor for Gold,M30. Trying to find strategies based on different RSIs and their MAs," 
#property description "This is only the trend part. I made a raw version with four conditions for each buy and sell but unfortunately"
#property description "It doesn't do what it is supposed to. So I reduced it to one condition only to troubleshoot it and bring it up"
#property description "to par. Later on I will look into other functions like TS, MM, Security checking aso. But for now I am going to"
#property description "use something simple to check one by one if the strategies are successful."

#include<Trade\Trade.mqh>
CTrade  trade;


input double TrendMinChange=0.05;  //Die minimale Wertaenderung des SMMA des 150er RSI, der zeigt, ob ein Trend besteht (RSI Punkte)
input double Lotsize=0.03;
input int SL=150;
input int TP=450;


   
void OnTick()
  {

  //declarations, variables
   
   double RSIfast[],MAfastLW[],MAfastSM[],RSIslow[],MAslowLW[],MAslowSM[];
   double Ask=NormalizeDouble(SymbolInfoDouble(_Symbol,SYMBOL_ASK),_Digits);
   double Bid=NormalizeDouble(SymbolInfoDouble(_Symbol,SYMBOL_BID),_Digits);
   double Balance=AccountInfoDouble(ACCOUNT_BALANCE);
   double Equity=AccountInfoDouble(ACCOUNT_EQUITY);
   
   
   int Spread=SymbolInfoInteger(Symbol(),SYMBOL_SPREAD); 

   int RSIfastDef = iRSI(_Symbol,_Period,8,PRICE_WEIGHTED);
   int MAfastLWDef = iMA(_Symbol,_Period,10,0,MODE_LWMA,RSIfastDef); //das habe ich mal im englischen Forum aufgeschnappt, aber später
   int MAfastSMDef = iMA(_Symbol,_Period,30,0,MODE_SMMA,RSIfastDef); //den Thread nicht mehr gefunden. Scheint nicht zu funktionieren.
   int RSIslowDef = iRSI(_Symbol,_Period,150,PRICE_WEIGHTED);
   int MAslowLWDef = iMA(_Symbol,_Period,10,0,MODE_SMA,RSIslowDef);
   int MAslowSMDef = iMA(_Symbol,_Period,30,0,MODE_SMMA,RSIslowDef);
   
   int PosMax =1;                 //still need MagicManager, Money Manager, Ordertimer/Isnewcandle?, Trailingstop and Trailingtake.

   bool BuySignalTrend=false;
   bool SellSignalTrend=false;

   
//Deklarationen Arrays, Buffer

   ArraySetAsSeries(RSIfast,true);
   ArraySetAsSeries(MAfastLW,true);
   ArraySetAsSeries(MAfastSM,true);
   ArraySetAsSeries(RSIslow,true);
   ArraySetAsSeries(MAslowLW,true);  
   ArraySetAsSeries(MAslowSM,true);
 
   
   CopyBuffer(RSIfastDef,0,0,10,RSIfast); 
   CopyBuffer(MAfastLWDef,1,0,10,MAfastLW);
   CopyBuffer(MAfastSMDef,2,0,10,MAfastSM);
   CopyBuffer(RSIslowDef,3,0,10,RSIslow);
   CopyBuffer(MAslowLWDef,4,0,10,MAslowLW);
   CopyBuffer(MAslowSMDef,5,0,10,MAslowSM);


//Conditions
 //Buy------------------------------    

   
   BuySignalTrend=

//   Condition for long trend if SMMA30 surpasses TrendMinChange and increase at least stays the same, possibly strengthens
            (MAslowSM[2]-MAslowSM[3]>=TrendMinChange)
       &&   (MAslowSM[1]-MAslowSM[2]>=MAslowSM[2]-MAslowSM[3])
       &&   (MAslowSM[0]-MAslowSM[1]>=MAslowSM[1]-MAslowSM[2])   //Could use a for loop here and put it in a bool Decrease() function later
       &&   (MAslowLW[0]-MAslowLW[1]>=MAslowLW[1]-MAslowLW[2])
       &&   (RSIslow[0]>MAslowLW[0])
       &&   (RSIslow[0]>MAslowLW[0])
       &&   (RSIslow[0]<=50);
                
            
             
//Sell----------------
  
  SellSignalTrend=

//   Condition for long trend if SMMA30 falls below minus TrendMinChange and its decrease at least stays the same, possibly strengthens
            (MAslowSM[4]-MAslowSM[5]<=-TrendMinChange)
       &&   (MAslowSM[1]-MAslowSM[2]<=MAslowSM[2]-MAslowSM[3])    //Could use a for loop here and put it in a bool Decrease() function later
       &&   (MAslowSM[0]-MAslowSM[1]<=MAslowSM[1]-MAslowSM[2])
       &&   (MAslowLW[0]-MAslowLW[1]<=MAslowLW[1]-MAslowLW[2])
       &&   (RSIslow[0]>MAslowLW[0])
       &&   (RSIslow[0]>MAslowLW[0])
       &&   (RSIslow[0]<=50);
            
            
//Handelsaktionen verscheidener Größenordnungen
  // BuySellLarge    
        
        
  //BuySellSmall        
        
 if  (
        (BuySignalTrend==true)  
   &&   (PositionsTotal()<PosMax)
       )
      
        trade.Buy(Lotsize,NULL,Ask,(Ask-SL*_Point),(Ask+TP*_Point),NULL);
           {
            Comment("Buy");
           }
      
   
if  (
        (SellSignalTrend==true)  
   &&   (PositionsTotal()<PosMax)
       )
      
        trade.Sell(Lotsize,NULL,Bid,(Bid+SL*_Point),(Bid-TP*_Point),NULL);
           {
            Comment("Sell");           
           }                     
  }

//Handelsaktionen verscheidener Größenordnungen
  // BuySellLarge    
        
        
  //BuySellSmall        
        
if  (
        (BuySignal)  
   &&   (PositionsTotal()<PosMax)
       )
      
        trade.Buy(Lotsize,NULL,Ask,(Ask-SL*_Point),(Ask+TP*_Point),NULL);
           {
            Comment("Buy");
           }
      
      
if  (
        (SellSignal)  
   &&   (PositionsTotal()<PosMax)
       )
      
        trade.Sell(Lotsize,NULL,Bid,(Bid+SL*_Point),(Bid-TP*_Point),NULL);
           {
            Comment("Sell");           
           }                     
  }

Das ist die einfachste Version. Nichts weltbewegendes, schon klar.

Nur mit RSI und diesbezüglich geänderten if-Bedingungen läuft sie schon. Das Programm soll später noch Money-Management-, TrailingStop und -Take, Orderstoptimer und Infos erhalten. Aber erstmal soll es einfach mal laufen, damit ich die Signale ausprobieren kann, die ich in dem Graphen unten gefunden habe.

MAs auf RSIs

Hier ist das, was ich eigentlich nutzen möchte. Ein RSI(8) und ein RSI(150) (hier skaliert), jeweils mit einem LWMA(10) und SMMA(30)

Habe Muster für Trend, Trendwende, Sprung und Bounceback gefunden (Diese habe ich auch alle schon in einer Rohversion formuliert). Also vier Signale, die ich gerne einmal ausprobieren möchte und die mit iOsMA nicht in der Form finde.

Die MAs sind etwas overkill, jedoch kann man möglicherweise noch weitere gute Filter finden, wenn man sich länger damit befasst.

Doch zuerst einmal möchte ich das, was ich schon habe auch zum Laufen bekommen und dazu brauche ich diese EINE Information oder einen Tipp.



Leute, ernsthaft, ich kann auch mit Zeitreihen und Formeln selber Funktionen für SMMA und LWMA basteln, das dauert dann halt ein paar Tage...

http://www.fxcorporate.com/help/MS/NOTFIFO/i_SMMA.html

https://www.investopedia.com/terms/l/linearlyweightedmovingaverage.asp

Also, wie sieht es aus?

amando
3555
amando  
int RSIfastDef = iRSI(_Symbol,_Period,8,PRICE_WEIGHTED);
   int MAfastLWDef = iMA(_Symbol,_Period,10,0,MODE_LWMA,RSIfastDef); //das habe ich mal im englischen Forum aufgeschnappt, aber später
   int MAfastSMDef = iMA(_Symbol,_Period,30,0,MODE_SMMA,RSIfastDef); //den Thread nicht mehr gefunden. Scheint nicht zu funktionieren.
   int RSIslowDef = iRSI(_Symbol,_Period,150,PRICE_WEIGHTED);
   int MAslowLWDef = iMA(_Symbol,_Period,10,0,MODE_SMA,RSIslowDef);
   int MAslowSMDef = iMA(_Symbol,_Period,30,0,MODE_SMMA,RSIslowDef);
   
   int PosMax =1;                 //still need MagicManager, Money Manager, Ordertimer/Isnewcandle?, Trailingstop and Trailingtake.

   bool BuySignalTrend=false;
   bool SellSignalTrend=false;

   
//Deklarationen Arrays, Buffer

   ArraySetAsSeries(RSIfast,true);
   ArraySetAsSeries(MAfastLW,true);
   ArraySetAsSeries(MAfastSM,true);
   ArraySetAsSeries(RSIslow,true);
   ArraySetAsSeries(MAslowLW,true);  
   ArraySetAsSeries(MAslowSM,true);
 

Das gehört jedenfalls in die OnInit, das hat in der OnTick nix verloren. Du erzeugst ja bei jedem tick ein neues handle

amando
3555
amando  

Und das kann nicht funktionieren, weil der ma hat nur einen buffer

CopyBuffer(RSIfastDef,0,0,10,RSIfast); 
   CopyBuffer(MAfastLWDef,1,0,10,MAfastLW);
   CopyBuffer(MAfastSMDef,2,0,10,MAfastSM);
   CopyBuffer(RSIslowDef,3,0,10,RSIslow);
   CopyBuffer(MAslowLWDef,4,0,10,MAslowLW);
   CopyBuffer(MAslowSMDef,5,0,10,MAslowSM);

Den ersten rsi hast noch richtig, aber auch der 2te rsi hat nur einen buffer mit dem index 0

Carl Schreiber
Moderator
11638
Carl Schreiber  
  1. Wenn  Du denkst Dir etwas programmieren zu lassen lies unbedingt vorher:
    https://www.mql5.com/de/articles/117  // How to Order a Trading Robot in MQL5 and MQL4
    https://www.mql5.com/de/job/rules     // Regeln
    https://www.mql5.com/de/articles/4368 // EA Pflichtenheft HowTo
    https://www.mql5.com/de/articles/4304 // Indi Pflichtenheft HowTo

  2. Es gibt bereits fast alles für MT4/MT5 man muss nur suchen zB. mit der Lupe oben rechts.

  3. Der iMA ist ja nicht nur eine sma oder ema: https://www.mql5.com/en/docs/constants/indicatorconstants/enum_ma_method.
So formulieren Sie das Pflichtenheft eines Auftrages für einen Handelsroboter
So formulieren Sie das Pflichtenheft eines Auftrages für einen Handelsroboter
  • www.mql5.com
Handeln Sie nach Ihrer eigenen Strategie? Wenn Sie Ihre Handelsregeln formalisieren und als Algorithmus für ein Programm beschreiben können, wäre es doch besser, Ihren Handel einem automatisierten Expert Advisor anzuvertrauen. Ein Roboter braucht weder Schlaf noch Nahrung und ist keinen menschlichen Schwächen unterworfen. In diesem Artikel zeigen wir Ihnen, wie Sie, um einen Handelsroboter im Freelance-Service in Auftrag zu geben, das sogenannte Pflichtenheft erstellen.
pennyhunter
165
pennyhunter  
amando:

Das gehört jedenfalls in die OnInit, das hat in der OnTick nix verloren. Du erzeugst ja bei jedem tick ein neues handle

amando

Und das kann nicht funktionieren, weil der ma hat nur einen buffer

Den ersten rsi hast noch richtig, aber auch der 2te rsi hat nur einen buffer mit dem index 0

Okay das in die OnInit... und die Buffer alle auf Null wenn ich Dich richtig verstehe.

Danke schonmal für die Tips. Werde ich morgen ausprobieren. Das mit den Buffern ist toll. Habe es gerade umgesetzt und jetzt geht es, danke!

SMMA30 on RSI50 ohne Alles

Okay, könnte was bringen.

Carl Schreiber:
  1. Wenn  Du denkst Dir etwas programmieren zu lassen lies unbedingt vorher:
    https://www.mql5.com/de/articles/117  // How to Order a Trading Robot in MQL5 and MQL4
    https://www.mql5.com/de/job/rules     // Regeln
    https://www.mql5.com/de/articles/4368 // EA Pflichtenheft HowTo
    https://www.mql5.com/de/articles/4304 // Indi Pflichtenheft HowTo

  2. Es gibt bereits fast alles für MT4/MT5 man muss nur suchen zB. mit der Lupe oben rechts.

  3. Der iMA ist ja nicht nur eine sma oder ema: https://www.mql5.com/en/docs/constants/indicatorconstants/enum_ma_method.

Dank Dir, aber ich bin noch nicht fertig mit rumfrickeln. Habe aus gewissen Gründen gerade jede Menge Zeit.

Oh ja sorry Du hattest mir ja diese Suchergebnisse geschickt. Ich konnte mir die Codes mit dem Handy nicht ansehen, und danach hatte ich es leider vergessen. Ich schau noch mal drüber, aber mir ist auch nicht klar gewesen, welches davon Du meintest.

Aber natürlich kann der iMA andere Sachen als der iOsMA. Habe ich oben auch erwähnt, dass es mir deswegen wichtig ist.
lippmaje
1650
lippmaje  

An einem EA zu frickeln kann unbestritten viel Spaß machen.

Ich würde aber mal überlegen, wieviel Zeit dafür wohl letztlich draufgehen wird und wo die eigentlichen Prioritäten liegen.

Du bist ja sicher nicht hier im Forum, weil Du eine Programmiersprache lernen wolltest.

amando
3555
amando  
lippmaje:

An einem EA zu frickeln kann unbestritten viel Spaß machen.

Ich würde aber mal überlegen, wieviel Zeit dafür wohl letztlich draufgehen wird und wo die eigentlichen Prioritäten liegen.

Du bist ja sicher nicht hier im Forum, weil Du eine Programmiersprache lernen wolltest.

wieso nicht? ich betreibe das als hobby, bevor ich den Fernseher aufdrehe, da kann ich mich auchmit MQL5 beschäftigen

lippmaje
1650
lippmaje  

Aurora7

Du sollst ja auch nicht vorm Fernseher abhängen, sondern die Börsenkurse verfolgen. Hiermit zum Beispiel. ;)

https://www.spiegel.de/netzwelt/gadgets/expanscape-aurora-7-notebook-mit-sieben-bildschirmen-vorgestellt-a-f7bee9c1-4ac9-4a00-9f78-8ed7d807dab2