MA, verschiedene Timeframes

fais138
22
fais138  
#include <Trade/Trade.mqh>

CTrade trade;

//wenn das Programm startet
int OnInit() {
   Print("Start");
   return(INIT_SUCCEEDED);   
}

// wenn das Programm schliest
void OnDeinit(const int reason) {
   Print("End");
}

//wenn etwas im Programm passiert, pro Tick
void OnTick() 
{

    static datetime timestamp;
    datetime time = iTime(_Symbol,PERIOD_CURRENT,0);
    if(timestamp != time) 
    {
       timestamp = time;
       
       double ask = SymbolInfoDouble(_Symbol,SYMBOL_ASK); //aktueller ask Preis ermitteln und abspeichern
       double bid = SymbolInfoDouble(_Symbol,SYMBOL_BID); //aktueller bid Preis ermitteln und abspeichern
       
       // 200 sma
       //static int handleSlowMa = iMA(_Symbol,PERIOD_CURRENT,200,0,MODE_SMA,PRICE_CLOSE);
       //double slowMaArray[]; 
       //CopyBuffer(handleSlowMa,0,1,2,slowMaArray); //speichern von den Daten fuer 200 ma 
       //ArraySetAsSeries(slowMaArray,true);
    
       // 7 sma
       static int handlesevenMa = iMA(_Symbol,PERIOD_CURRENT,7,0,MODE_SMA,PRICE_CLOSE);
       double SevenMaArray[]; 
       CopyBuffer(handlesevenMa,0,0,2,SevenMaArray); //speichern von den Daten fuer 7 ma
       ArraySetAsSeries(SevenMaArray,true);   
        
       // 2 sma
       static int handletwoMa = iMA(_Symbol,PERIOD_CURRENT,2,0,MODE_SMA,PRICE_CLOSE);
       double TwoMaArray[]; 
       CopyBuffer(handletwoMa,0,0,2,TwoMaArray); //speichern von den Daten fuer 2 ma
       ArraySetAsSeries(TwoMaArray,true);    
       
       //buy and sell
       if(TwoMaArray[1] < SevenMaArray[1] && TwoMaArray[0] > SevenMaArray[0]) // 2ma wird groesser als 7ma
       {
           if(PositionsTotal()<1) // wenn kein trade offen ist --> kaufen
             {
              // buy
              Print("Buy");
              Print("TwoMaArray = ",TwoMaArray[0]," > ","SevenMaArray = ",SevenMaArray[0]);
              trade.Buy(0.01,_Symbol,ask,0,(ask+10000 * _Point),"This is a buy for");
             }
           if(PositionsTotal()==1) // wenn trade offen ist --> trade schliessen und kaufen
           { 
            CloseAllPositions();
            Print("SELL is closed");
            
            // buy
              Print("Buy");
              Print(" After closing a sell position: TwoMaArray = ",TwoMaArray[0]," > ","SevenMaArray = ",SevenMaArray[0]);
              trade.Buy(0.01,_Symbol,ask,0,(ask+10000 * _Point),"This is a buy for");
           }
        }
        // close Buy Trade, nur wenn eine offene position existiert 
        if(TwoMaArray[1] > SevenMaArray[1] && TwoMaArray[0] < SevenMaArray[0]) // 7ma wird groesser als 2 ma
          {
           if(PositionsTotal()<1) // wenn kein trade offen ist --> Verkaufen
             {
              Print("Sell");
              trade.Sell(0.01,_Symbol,bid,0,(bid-1000 * _Point),"This is a sell for");
              Print("TwoMaArray = ",TwoMaArray[0]," < ","SevenMaArray = ",SevenMaArray[0]);
             } 
           
           if(PositionsTotal()==1) // wenn ein trade offen ist --> schliessen und verkaufen
             {
              CloseAllPositions();
              Print("BUY is closed");
              
              // open sell Position keine position offen
              Print("Sell");
              Print("After closing a buy position:TwoMaArray = ",TwoMaArray[0]," > ","SevenMaArray = ",SevenMaArray[0]);
              trade.Sell(0.01,_Symbol,bid,0,(bid-1000 * _Point),"This is a sell for");
             }
          }
       
       
       
    }
}    
void CloseAllPositions()
{
     // from the number of positions count down to zero
     for(int i=PositionsTotal()-1; i>=0; i--) // look at all positions
     {
         // get the ticket number for the current position
         int ticket = PositionGetTicket(i);
         
         // close the current postion
         trade.PositionClose(ticket);
         // End the for loop
     }
}

Hallo zsm, 

ich versuche gerade 2 SMA darzustellen und ich will das bei einer Überkreuzung jeweils gekauft bzw verkauft wird. Jedoch kriege ich es nicht das mein Algorithmus bei der Überschneidung eingreift.

Er greift immer später ein, wenn der eine Wert größer ist als der andere.  mit einer if-Abfrage == funktioniert es auch nicht.

Meine Idee war es daher verschiedene Timeframes zu nutzen. Sprich ich erstelle meine MA für jeweils 15 min, nutze aber meinen Algorithmus in einem 1min Chart, so dass ich genauer arbeiten kann.

Ich habe erst vor kurzem mit EA angefangen, deswegen weis ich hier nicht weiter. Macht meine Idee sinn, wenn ja wie kann ich das machen bzw. kann man das Problem vllt anders lösen?

Danke schonmal!!

Carl Schreiber
Moderator
12354
Carl Schreiber  
Ich kann  Dir nur raten, proboere Deine Ideen im Debugger (mit historischen Daten) aus. Du kannst die aktuellen Werte der Indikatoren sehen und sehen warum nicht passiert, was Du Dir denkst - und Du kannst so auch erkennen, was gehen könnte.
fais138
22
fais138  
Carl Schreiber:
Ich kann  Dir nur raten, proboere Deine Ideen im Debugger (mit historischen Daten) aus. Du kannst die aktuellen Werte der Indikatoren sehen und sehen warum nicht passiert, was Du Dir denkst - und Du kannst so auch erkennen, was gehen könnte.

Habe ich. Bevor ich das mit meinem Geld ausprobiere werde ich das auch mit meinem Demo account testen. Jedoch ist halt das Problem das mein Algorithmus zu spät eingreift. Es findet eine Überschneidung statt und mein Bot kauft/verkauft auch, aber erst 1 bis 2 Kerzen später....

amando
3751
amando  
fais138:

Habe ich. Bevor ich das mit meinem Geld ausprobiere werde ich das auch mit meinem Demo account testen. Jedoch ist halt das Problem das mein Algorithmus zu spät eingreift. Es findet eine Überschneidung statt und mein Bot kauft/verkauft auch, aber erst 1 bis 2 Kerzen später....

dann musst du wohl deinen Algorithmus anpassen

fais138
22
fais138  
amando:

dann musst du wohl deinen Algorithmus anpassen

hast du vllt auch einen Vorschlag wie ich das machen könnte?
Dominik Egert
1727
Dominik Egert  
Ich habe eine Vorstellung woran es liegt.

iMA wird in einem anderen Thread ausgeführt.

Die Berechnung von iMA dauert länger als deine OnTick Funktion.

Dadurch ruft deine OnTick noch unberechnete Daten ab.

Da du dies nur 1x pro Periode machst, verpasst du den entscheidenden Moment.

Verschiebe die Ausführung deiner OnTick auf das Ende der Periode. Benutze neben iTime auch TimeCurrent um das zu erreichen.

Für 1 Minuten Perioden sind zB folgende Abstände möglich. 5 Sekunden in die Periode hinein, dann immer 17 Sekunden Abstand, bis zum Ende der Periode. Bei der nächsten dann wieder 5 Sekunden nach Beginn.


Christian
3660
Christian  
Dominik Egert:


iMA wird in einem anderen Thread ausgeführt.



Hast du da Erkenntnisse das der EA auf mehrere Threads aufgeteilt wird?

Dominik Egert
1727
Dominik Egert  
Der EA läuft in seinem eigenen Thread, Indikatoren laufen in einem gemeinsamen Thread, welcher an das Symbol des Charts gebunden ist.

Das ist auch so in der Doku zu lesen.
amando
3751
amando  
Wieso ist ima eigentlich in der ontick?
Dominik Egert
1727
Dominik Egert  
Um sicherzustellen, dass es viel Verzögerung gibt, vermute ich...

Guter Hinweis, ist mir nicht aufgefallen.
fais138
22
fais138  

Hallo, 

danke für die hinweise, das ist sehr hilfreich.

wenn ich es jetzt richtig verstanden habe, soll ich zu einem die IMA außerhalb von der on tick funktion machen (bspw in ONInit)?

und dazu füge ich noch timecurrent hinzu ?