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

 
lippmaje:

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

ach du hast wohl im Kino nicht aufgepasst, Wolf of Wallstreet

Keiner weis ob eine Aktie steigt oder fällt, und wir broker am wenigsten.

Was haben wir daraus gelernt, der Kurs ist Random, Du musst nur ein ordentliches Moneymanagment haben, dann kommst Du durch

 

Kenn ich nicht. Aber über Nick Leeson gibt es einen Film, der ist ganz nett gemacht. Wie er den Monitor anschreit um den Kurs zu drehen hat was. Der hätte das Trader-Terminal sicher gebrauchen können.

Übrigens, Du bist Trader, nicht Broker. Broker sind die, die Deine Orders ausdrucken und sich drüber kaputt lachen bevor sie Dir nen Kurs rüberschieben. :D

 

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);


amando:

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

Okay, ich hab das jetzt mal gemacht, aber die  Variablen muss man dann global zugänglich machen, oder? Und der CopyBuffer bleibt in der OnTick(), weil der ja immer refreshed werden muss nehme ich an?

Hab das jetzt mal so gelöst:

#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.04;  //Die minimale Wertaenderung des SMMA des 150er RSI, der zeigt, ob ein Trend besteht (RSI Punkte)
//   input double TrendGrowthRate=0.01;
   input double Lotsize=0.05;
   input int SL=10000;
   input int TP=40000;

    //declarations, variables
   int PosMax =1;                 //still need MagicManager, Money Manager, Ordertimer/Isnewcandle?, Trailingstop and Trailingtake.

   bool BuySignalTrend=false;
   bool SellSignalTrend=false;
   double RSIfast[],MAfastLW[],MAfastSM[],RSIslow[],MAslowLW[],MAslowSM[];
   
   int RSIfastDef,MAfastLWDef,MAfastSMDef,RSIslowDef,MAslowLWDef,MAslowSMDef;
   
int OnInit()
   {
   RSIfastDef = iRSI(_Symbol,_Period,8,PRICE_WEIGHTED);
   MAfastLWDef = iMA(_Symbol,_Period,10,0,MODE_LWMA,RSIfastDef); //das habe ich mal im englischen Forum aufgeschnappt
   MAfastSMDef = iMA(_Symbol,_Period,30,0,MODE_SMMA,RSIfastDef);
   RSIslowDef = iRSI(_Symbol,_Period,150,PRICE_WEIGHTED);
   MAslowLWDef = iMA(_Symbol,_Period,10,0,MODE_SMA,RSIslowDef);
   MAslowSMDef = iMA(_Symbol,_Period,30,0,MODE_SMMA,RSIslowDef);  

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

   
   return(0);
   }


void OnTick()
  {
   
   
//Deklarationen Arrays, Buffer   
   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); 

   CopyBuffer(RSIfastDef,0,0,40,RSIfast); 
   CopyBuffer(MAfastLWDef,0,0,40,MAfastLW);
   CopyBuffer(MAfastSMDef,0,0,40,MAfastSM);
   CopyBuffer(RSIslowDef,0,0,40,RSIslow);
   CopyBuffer(MAslowLWDef,0,0,40,MAslowLW);
   CopyBuffer(MAslowSMDef,0,0,40,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])//+TrendGrowthRate)
       &&   (MAslowSM[0]-MAslowSM[1]>MAslowSM[1]-MAslowSM[2])//+TrendGrowthRate)   //Could use a for loop here and put it in a bool Decrease() function later
       &&   (MAslowLW[0]-MAslowLW[1]>MAslowLW[1]-MAslowLW[2])//+TrendGrowthRate)
       &&   (RSIslow[0]>MAslowLW[0])
       &&   (MAslowLW[0]>MAslowSM[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[2]-MAslowSM[3]<=-TrendMinChange)
       &&   (MAslowSM[1]-MAslowSM[2]<MAslowSM[2]-MAslowSM[3])//-TrendGrowthRate)    //Could use a for loop here and put it in a bool Decrease() function later
       &&   (MAslowSM[0]-MAslowSM[1]<MAslowSM[1]-MAslowSM[2])//-TrendGrowthRate)
       &&   (MAslowLW[0]-MAslowLW[1]<MAslowLW[1]-MAslowLW[2])//-TrendGrowthRate)
       &&   (RSIslow[0]<MAslowLW[0])
       &&   (MAslowLW[0]<MAslowSM[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");           
           }                     
  }

Er läuft schonmal. Mir sind noch einige Fehler in den Bedingungen aufgefallen, die sind hier korregiert.

läuft jedenfalls

MoneyManagement

Aber man sieht glaube ich deutlich, dass das Money-Management fehlt. Die Fehlsignale hauen einfach zu sehr rein. Mir kam der Gedanke, dass ich jetzt gerne Trailing Stop, Trailing Take, Tradepause mit Kerzenzähler und MagicManagement einbauen würde. Mit Klassen hab ich mir das mal angesehen, ich weiß zwar in etwa, wie man sie benutzt, aber es ist so verkapselt, dass man zu jeder Zeit in fünf Richtungen drei Vererbungsstufen von Klassen kennen muss um sich zurechtzufinden, welche Methode wo ist, außerdem komme ich mit der objektorientierten Synthax noch weniger klar. Keine Chance, da schnell durchzusteigen. Daher habe ich beschlossen, die Sachen die ich haben will prozedural zusammenzufügen. Vielleicht sollte man auch erstmal laufen lernen, bevor man anfängt, Auto zu fahren.



Nachtrag: https://www.mql5.com/de/articles/10

Grund der Beschwerde: