Metatrader Forum | Forex Expert-Advisor | Broker & Forex Tools

Metatrader Forum | Forex Expert-Advisor | Broker & Forex Tools (http://www.expert-advisor.com/forum/index.php)
-   Programmierung MQL4 (http://www.expert-advisor.com/forum/forumdisplay.php?f=220)
-   -   EA abschalten wenn der EMA 20 vom Kontostand unterschritten wird (http://www.expert-advisor.com/forum/showthread.php?t=7193)

smilemore 10.06.22 11:25

EA abschalten wenn der EMA 20 vom Kontostand unterschritten wird
 
Hallo liebes Forum,

es gibt Marktphasen da läuft der Markt nur so und dann gibt es Marktphasen, da will der Markt nicht laufen und stoppt den EA andauernd aus.

Deshalb, möchte ich einen EA programmieren, der den EMA20 vom Kontostand berechnet (oder einen anderen Wert, ließe sich über Optimierung herausfinden). Sollte der Kontostand unter den EMA fallen so wird der Live-Handel eingestellt, und der EA geht in die Simulation über, wenn der Kontostand wieder über dem EMA notiert wird der EA wieder scharf gestellt.

Bei EMA20 muss der EA 20 abgeschlossene Trades gemacht haben

Also
Code:

input bool ea_on=true;
// Live-Handel erlaubt
//  Mehr als 20 geschlossene Trades=> berechne EMA(Kontostand);
// Wenn Kontostand der abgeschlossenen Trades kleiner EMA(Kontostand)
ea_on=false;
// Sobald Kontostand abgeschlossene Trade größer EMA(Kontostand)
ea_on=true;

Soweit die Therie.
Frage:
1) Kann man den EMA vom Kontostand berechnen, wenn ja wie muss man das machen
2) Wie kann man den ES in der Simulation weiter laufen lassen, wenn ich doch den Live-Handel bei unterschreiten des EMA(Kontostand) abschalte?
Aber damit der EA bei überschreiten vom EMA(Kontostand) wieder handeln kann, braucht der EA in der Simulation alle Trades?
Kann ein EA auf Daten eines anderen EAs zugreifen? Dann könnte man den EA Live laufen lassen und würde auf den EMA(Konto) zugreifen können, den der EA Simulation bereit stellt.
Wenn das nicht geht, wie könnte man das noch realisieren?

Ich freue mich auf die Vorschläge des Forums und bedanke mich für eure Zeit und eure Antworten.

Beste Grüße

smilemore

MA-EA 10.06.22 12:43

Könntest vielleicht die letzten 20 Trades der History raussuchen und prüfen, ob die Geld-Summe im + oder - ist...

Ob man einfach so zwischen Demo- und Live-Konto hin- und- herschalten kann weiß ich nicht.

Bobs 11.06.22 10:29

Der EA kann jede Trade in einer Datei aufzeichnen. Diese Datei wird für die Analyse verwendet.

MA-EA 13.06.22 10:18

Wärs nicht weniger Aufwand, wenn der EA selbst die letzten Orders checkt, als wenn er immer wieder diese Datei abfragt? :confused: :rolleyes:

Bobs 14.06.22 18:23

Der EA sollte jedoch auch die Ergebnisse der Simulation berücksichtigen, wie ich das Problem verstehe.

smilemore 15.06.22 11:43

Hallo, danke für eure Vorschläge.
Zitat:

Zitat von Bobs (Beitrag 46089)
Der EA sollte jedoch auch die Ergebnisse der Simulation berücksichtigen, wie ich das Problem verstehe.

genau, sobald der Kontostand unter den EMA(Kontostand) rutsch, werden die Trades nur noch vom EA nicht live ausgeführt, da nun eine längere Drawdown-Phase starten könnte, erst wenn der Kontostand wieder über EMA(Kontostand) ist, soll der EA wieder live handeln.

Wie mache ich dass, das der EA in eine Datei schreibt?
Die Problemlösung ist wohl nicht ganz so einfach.

Liebe Grüße smilemore

MA-EA 15.06.22 14:38

Dann könnte man ihn vielleicht Paper-Trading machen lassen im Live-Konto und mit dieser Datei. Ihn die Trades nur simulieren lassen, unter Live-Konto-Bedingungen und so. :confused:

Bobs 19.06.22 22:25

Zitat:

Zitat von smilemore (Beitrag 46091)
Hallo, danke für eure Vorschläge.
Wie mache ich dass, das der EA in eine Datei schreibt?
Die Problemlösung ist wohl nicht ganz so einfach.

Das wird nicht zu schwierig. Man kann die folgenden Funktionen verwenden: FileOpen, FileWrite, FileReadString usw.

smilemore 22.06.22 12:24

Hallo,

solange der Kontostand über dem Ema20 ist, kann in der Datei der neue Kontostand geschrieben werden.
Doch wie geht das wenn der wenn der Live-Handel eingestellt ist, weil der Kontostand unter den Ema20 fällt?

Liebe Grüße

smilemore

Bobs 23.06.22 11:24

Ich meine, nicht den Live-Kontostand zu beobachten, aber die parallele virtuelle Balance von Simulationen. Der EA muss bei jedem Signal eine simulierte (virtuelle) Order generieren. Die Ergebnisse werden in einer Datei gespeichert (v_OrderOpenPrice, v_OrderClosePrice ...).

TraderMike 24.06.22 10:36

Globale Variablen sind hier die einfachste Lösung

Mike

smilemore 24.06.22 11:27

Hallo,
wie programmiere ich eine virtuelle Simulation?
Die Funktion OrderSend() führt ja reelle Trades aus?
Wie benutze ich OrderSend() für die virtuelle Simulation?
Oder geht das nicht über OrderSend()?
Ich muss doch den EA handeln lassen, ansonsten kann er ja keinen Gewinn oder Verlust machen, der EA soll aber bei Kontostand kleiner Ema20 nur noch virtuelle Trades machen?

Liebe Grüße

smilemore

Bobs 30.06.22 09:51

Für die virtuelle Simulation muss man eigenen Funktionen erstellen (z.B. virtuelleOrderSend(), virtuelleOrderClose()). Diese Funktionen führen Aufzeichnungen für die virtuelle Simulation (in eine Datei oder in GV).
EA berechnet Ema20 basierend auf virtueller Stimulation.
Wenn der virtuelle Kontostand höher ist als Ema20, sendet EA gleichzeitig virtuelleOrderSend() und OrderSend().

smilemore 30.06.22 11:10

Hallo liebes Forum,

vorerst habe ich folgende Idee:
Jede geöffnete Order bekommt als Kommentar die virtuelle Lotsize, sollte der Ema_Kontostand unterschritten werden, wird mit kleinstmöglicher Lotsize gehandelt, die Simulation geht über die Lotsize die Im Orderkommentar abgespeichert wird. Alle geschlossenen Orders werden in einem Pool, absteigend sortiert, ein Array arr_orderticket soll das Orderticket aus dem Pool abspeichern sofern es in arr_ordericket noch nicht enthalten ist. Wenn das passiert weiß der EA er muss den EMA_Kontostand und die virtuelle Balance neu berechnen, soweit die Theorie.
Aber arr_ordeticket hat immer den Anfangswert -3, es wird also bis jetzt in das arr_orderticket kein Orderticket aus dem Pool gespeichert

PHP-Code:

#property strict
//https://www.forexfactory.com/thread/230203-how-do-i-stop-trading-for-half-hour
#include <MQL4OrderPool.mqh> 

//Virtuelle AccountBalance
double v_Balance=AccountBalance();
input int ema_period_acccount=20;

//https://tradistats.com/exponentieller-gleitender-durchschnitt/
double sf=2/(ema_period_acccount +1);
double ema_acccountAccountBalance();


int arr_orderticket[1]={-3};     //-3 um zu sehen falls nicht gespeichert wurde
MQL4OrderPool pool

int OnInit()
{
   
pool.Init(Symbol(),magic_number,MODE_HISTORY,ORDERS_FILLED,SORT_CLOSE_TIME_DESCENDING);
   return(
INIT_SUCCEEDED);
}
void OnTick(){
pool.Init(_Symbol,MAGIC,MODE_HISTORY,ORDERS_FILLED,SORT_CLOSE_TIME_DESCENDING);     //Geschlossen Order sind absteigend sortiert
pool.Refresh();

                            
for(
int i=0;i<pool.Total();i++){
   Print(
"Array pool_",,"     "pool[i].OrderTicket() );

      
   
//arr_orderticket sortieren
   
ArraySort(arr_orderticket ,WHOLE_ARRAY,0,MODE_ASCEND);
               for(
int i=0;i<ArraySize(arr_orderticket);i++) printf("arr_orderticket[%d] = %d",i,arr_orderticket[i]);
               
   
   
// Wenn Orderticket aus Pool nicht in arr_orderticket ist, dann speichere es dort ab
   
if(   ArrayBsearch(arr_orderticketpool[i].OrderTicket(),WHOLE_ARRAY,0,MODE_DESCEND) < -1  ){                         
         
      
// Falls arr_orderticket nur einen Inhalt hat, also die -3 speicheere Ticket aus Pool in arr_orderticket[0]
      //Muss so gemacht werden, da Ema_Kontostand als ersten Wert die AccountBalance() bekommt, danach wird Ema_Kontostand nach Formel berechnet
      
if(ArraySize(arr_orderticket) == 1){
            
arr_orderticket[0]= pool[i].OrderTicket();
                
             
//v_Balance updaten
            // jede geöffnete Order hat im Kommentar die simulierte Ordersie
            
if(pool[i].OrderLots() == StringToDoublepool[i].OrderComment() ) ){
                  
v_Balance=v_Balance pool[i].OrderProfit();
             
                  
//ema_acccount updaten          
                  
ema_acccountsf*v_Balance +(1-sf)* ema_acccount;     
                  
                  
            }
            
//Balance ist unter Ema_Kontostand gefallen,
            //Die Simulation erfolgt über die Lotsize aus dem Kommentar
            //tatsächliche Lotszie die real gehandelt wird ist die kleinstmögliche Lotsize      
            
if(pool[i].OrderLots() != StringToDoublepool[i].OrderComment() ) )
                  
//dann ist reale Lotgröße 0.1
                  
if(pool[i].OrderLots() == 0.1 ){
                        
v_Balance=v_Balance  pool[i].OrderProfit() *( StringToDoublepool[i].OrderComment() )/pool[i].OrderLots() );
                        
                        
//ema_acccount updaten          
                        
ema_acccountsf*v_Balance +(1-sf)* ema_acccount;
                        
                  
                  }
           
// Vergrößere arr_orderticket um einen Wert
           
arrayPusharr_orderticket, -); 
      }
         
         
         
      
// arr_orderticket enthält min. ein OrderTicket aus dem Pool
      
if(ArraySize(arr_orderticket) > 1){
         
// speichere an Letzte Stelle das Orderticket aus dem Pool, das in arr_orderticket noch nicht enthalten ist
         
arr_orderticket[ArraySize(arr_orderticket)-1]= pool[i].OrderTicket();
         
// vergrößere arr_orderticket um eins
         
arrayPusharr_orderticket, -); 
   
   
         
//v_Balance updaten
         // jede geöffnete Order hat im Kommentar die simulierte Ordersie
         
if(pool[i].OrderLots() == StringToDoublepool[i].OrderComment() ) ){
               
v_Balance=v_Balance pool[i].OrderProfit();
          
               
//ema_acccount updaten          
               
ema_acccountsf*v_Balance +(1-sf)* ema_acccount;      
         }
               
         if(
pool[i].OrderLots() != StringToDoublepool[i].OrderComment() ) )
            
//dann ist reale Lotgröße 0.1
            
if(pool[i].OrderLots() == 0.1 ){
                  
v_Balancev_Balance pool[i].OrderProfit() *( StringToDoublepool[i].OrderComment() )/pool[i].OrderLots() );
                  
                  
//ema_acccount updaten          
                  
ema_acccountsf*v_Balance +(1-sf)* ema_acccount;
            }
      }
                     
              
   }
// if(   ArrayBsearch(arr_orderticket, pool[i].OrderTicket(),WHOLE_ARRAY,0,MODE_DESCEND) < -1  ){     
}//for(int i=0;i<pool.Total();i++){
}//OnTick()

// Helper function to "push" to array
void arrayPush(int & array[] , int dataToPush){
    
int count ArrayResize(array, ArraySize(array) + 1);
    array[
ArraySize(array) - 1] = dataToPush;


Habe nun schon Stunden investiert, aber komme einfach nicht weiter. Vielleicht weiß ja einer warum das noch nicht richtig funktiniert. Um Hilfe bin ich dankbar.

Liebe Grüße smilemore


Alle Zeitangaben in WEZ +2. Es ist jetzt 14:02 Uhr.

Powered by vBulletin® Version 3.8.5 (Deutsch)
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
SEO by vBSEO 3.6.1
Powered by vBCMS® 2.7.0 ©2002 - 2024 vbdesigns.de
Copyright ©2009 - 2023 by Expert-Advisor.com - Das Metatrader Forum