Ich habe einen EA mit 2 EMA-Kreuzung erstellt und brauche Ratschläge.

 

Hallo zusammen!

Ich bin neu in mql 4 und ich habe einen einfachen 2 EMA Cross Advisor, die ich auf Demo-Konto getestet haben, aber ein wenig Angst, es auf einem echten zu bekommen

Das Testen mit kleinen Lots auf 1h-Skala würde zu viel Zeit in Anspruch nehmen, und das Testen auf Minuten-Skalen ist teuer, da das minimale Lot bei meinem Broker etwa 7 usd beträgt.

Ich wäre Ihnen also dankbar, wenn Sie einen Blick darauf werfen und vielleicht auf einige offensichtliche Fehler hinweisen, die ich gemacht haben könnte.

Dieser Berater soll auf Bitcoin/USD-Markt handeln, die extrem volatil ist (Preis kann + - 30% pro Tag gehen), so Stop-Loss und Take-Profit sind nicht in Pips, sondern in Prozentsätze eines bid oder ask.

Die Variablen und so weiter:

#property copyright "me"
#property link      "killnosock.net"
extern int SlowEma = 21;
extern int FastEma = 10;
extern int MaxRisk = 100;// % of Depo to be traded per order
extern int  TakeProfit=100;
extern int  StopLoss=100;
extern int Slippage = 10;

int LastBars = 0;

int init(){return(0);}
int deinit() {return(0);}

Diese Funktion bestimmt die Lot-Größe, je nach Prozentsatz des Depots, das pro Order verwendet werden darf (int Risk)

double GetLot(int Risk)
{double Free    =AccountFreeMargin();
 double One_Lot =MarketInfo(Symbol(),MODE_MARGINREQUIRED);
 double Min_Lot =MarketInfo(Symbol(),MODE_MINLOT);
 double Max_Lot =MarketInfo(Symbol(),MODE_MAXLOT);
 double Step    =MarketInfo(Symbol(),MODE_LOTSTEP);
 double Lot     =MathFloor(Free*Risk/100/One_Lot/Step)*Step;
 if(Lot<Min_Lot) Lot=Min_Lot;
 if(Lot>Max_Lot) Lot=Max_Lot;
 if(Lot*One_Lot>Free) {
 Alert(" free= ", AccountFreeMargin()," for one lot= ", MarketInfo(Symbol(),MODE_MARGINREQUIRED)," lot= ", Lot);
 return(0.0);}
return(Lot);}

Dies ist die Funktion, die eine neue Order öffnet, Cmd ist buy oder sell

int NewOrder(int Cmd,double Lot)
{double TP=0; //takeprofit
 double SL=0; //stoploss
 double PR=0; //price
 color clr = CLR_NONE;
 while(!IsTradeAllowed()) Sleep(10);
 RefreshRates();
 if(Cmd==OP_BUY)
   {PR=Ask;
    if(TakeProfit>0) TP=Ask + Ask*TakeProfit/100;
    if(StopLoss>0) SL=Ask - Ask*StopLoss/100;
    if(SL<0) SL = 0;
    if(TP<0) TP = 0;
    clr = Green;}
 if(Cmd==OP_SELL)
   {PR=Bid;
    if(TakeProfit>0) TP=Bid - Bid*TakeProfit/100;
    if(StopLoss>0) SL=Bid + Bid*StopLoss/100;
    if(SL<0) SL = 0;
    if(TP<0) TP = 0;
    clr = Red;}
 int tic=OrderSend(Symbol(),Cmd,Lot,PR,Slippage,SL,TP,"",0,0,clr);
 if(tic<0) Print("Open order error: ",GetLastError());
return(tic);}

Hier schließe ich 1 Order oder schließe alle Orders:

//CloseOrder
void CloseOrder()
{double PR=0;
 while(!IsTradeAllowed()) Sleep(10);
 RefreshRates();
 if(OrderType()==OP_BUY)  PR=Bid;
 if(OrderType()==OP_SELL) PR=Ask;
 if(!OrderClose(OrderTicket(),OrderLots(),PR,Slippage,CLR_NONE))
   Print("Order close error: ",GetLastError());
return;}
//Close all Orders
void CloseAllOrders()
{
  for(int i=OrdersTotal()-1;i>=0;i--)
   if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
     {
      CloseOrder();
     }
return;}

Diese Funktion wird verwendet, um die Differenz zwischen schnellem und langsamem EMA zu berechnen (schneller EMA - langsamer EMA):

double EmaDiff(int shift)
   {
      double difference;
      difference = iMA(Symbol(),0,FastEma,0,MODE_EMA,PRICE_CLOSE,shift)
                 - iMA(Symbol(),0,SlowEma,0,MODE_EMA,PRICE_CLOSE,shift);
      return(difference);
   }

Und hier kommt der Hauptteil:

int start()
  {
double Lot;
    // check if new bar opened
    if (LastBars == Bars) return(0);
    else LastBars = Bars;
      {         
         if ((EmaDiff(1) > 0) && (EmaDiff(2) < 0))
            {
               CloseAllOrders();
               Lot = GetLot(MaxRisk);
               NewOrder(OP_BUY,Lot);
            }
            
         if ((EmaDiff(2) > 0) && (EmaDiff(1) < 0))
            {
               CloseAllOrders();
               Lot = GetLot(MaxRisk);
               NewOrder(OP_SELL,Lot);
            }                    
      }
   return(0);
  }

Ich werde einen Trailing-Stop hinzufügen und erwäge, EmaDiff nicht mit Null, sondern mit einem kleinen Wert zu vergleichen, um nicht abgehackt zu werden, wenn langsame und schnelle EMA sehr nahe beieinander liegen und sich in jedem Takt schneiden.

 
 //CloseOrder
void CloseOrder()
{double PR=0;
 while(!IsTradeAllowed()) Sleep(10);
 RefreshRates();
 if(OrderType()==OP_BUY)  PR=Bid;
 if(OrderType()==OP_SELL) PR=Ask;
 if(!OrderClose(OrderTicket(),OrderLots(),PR,Slippage,CLR_NONE))
   Print("Order close error: ",GetLastError());
return;}



//Close all Orders
void CloseAllOrders()
{
  for(int i=OrdersTotal()-1;i>=0;i--)
   if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
     {
      CloseOrder();
     }
return;}

nicht überprüfen Symbol nicht überprüfen eine magische Zahl....

was wird dann passieren, wenn man es live mit verschiedenen EA's benutzt???

 
deVries:

nicht überprüfen Symbol nicht überprüfen eine magische Zahl....

was wird dann passieren, wenn man es live mit verschiedenen EA's benutzt???


Meinen Sie, dass zwei EAs von einem Konto aus laufen?
 
prupru:

Meinen Sie, dass Sie zwei EAs von einem Konto aus betreiben?
Zwei EAs oder ein EA und manuell platzierte Trades ... oder nur manuell platzierte Trades.
 
prupru:

Hallo zusammen!

Ich bin neu in mql 4 und ich habe einen einfachen 2 EMA Cross Advisor, die ich auf Demo-Konto getestet haben, aber ein wenig Angst, um es auf einem echten zu bekommen

Das Testen mit kleinen Lots auf 1h-Skala würde zu viel Zeit in Anspruch nehmen, und das Testen auf Minuten-Skalen ist teuer, da das minimale Lot bei meinem Broker etwa 7 usd beträgt.

Ich wäre Ihnen also dankbar, wenn Sie einen Blick darauf werfen und mich vielleicht auf einige offensichtliche Fehler hinweisen würden, die ich gemacht haben könnte.

Es ist gut zu sehen, dass jemand die Rückgabewerte von Handelsfunktionen überprüft, ohne dazu aufgefordert zu werden ... aber Sie brauchen mehr Informationen, wenn Sie einen Fehler erhalten, damit Sie diagnostizieren können, was das Problem verursacht hat, Sie können nicht in lebendiger Situation in die Vergangenheit zurückgehen, um zu überprüfen, was der Spread war oder was der Freeze-Level zu der Zeit war ...

if(tic < 0) Print("Open order error: ", GetLastError());

... das ist gut, aber Sie brauchen mehr, welche Variablen müssen Sie ausdrucken, damit Sie die Ursache eines Fehlers, den Sie erhalten, bestimmen können? wenn Sie bestimmt haben, was Sie brauchen könnten, fügen Sie sie alle in Ihren Print()-Aufruf ein und stellen Sie sicher, dass Sie die richtige Anzahl von Dezimalstellen (DoubeToStr(value, digits)) für alle Doppelvariablen wie Ask, Bid, etc. verwenden

 
RaptorUK:

Es ist gut zu sehen, dass jemand die Rückgabewerte von Handelsfunktionen überprüft, ohne dazu aufgefordert zu werden...

Sorry, aber diesen Teil habe ich nicht verstanden. Das einzige, was ich verstanden habe, ist, dass ich dem Print()-A ufruf so viele Variablen wie möglich hinzufügen muss. Ich habe den Punkt verstanden, danke.

deVries, danke auch für deinen Rat, jetzt verstehe ich, was du meinst.

Gibt es noch etwas zu beheben?

 

natürlich gibt es

    // check if new bar opened
    if (LastBars == Bars) return(0);
    else LastBars = Bars;

Nehmen wir an, Sie haben bereits eine maximale Anzahl von Balken (es gibt eine Grenze) .....

 
deVries:

natürlich gibt es

Nehmen wir an, Sie haben bereits eine maximale Anzahl von Balken (es gibt eine Grenze) .....


Ok, wie erkenne ich also besser den Moment, in dem sich eine neue Kerze öffnet?
 
prupru:

Ok, wie erkenne ich also besser den Moment, in dem eine neue Kerze geöffnet wird?


Prüfen Sie die Zeit des letzten Taktes Time[0]

Suchen Sie nach NewBar und Sie finden einige Beispiele

 
deVries:


Prüfen Sie die Zeit des letzten Balkens Time[0]

Suchen Sie nach NewBar und Sie finden einige Beispiele


Danke, ich habe dies gefunden https://www.mql5.com/en/code/10370

 
 if(Cmd==OP_BUY)
   {PR=Ask;
    if(TakeProfit>0) TP=Ask + Ask*TakeProfit/100;
    if(StopLoss>0) SL=Ask - Ask*StopLoss/100;
    if(SL<0) SL = 0;
    if(TP<0) TP = 0;
    clr = Green;}

Ich glaube nicht, dass dies richtig ist

Wie kommen Sie auf 100 Pips Take-Profit und 150 Pips Stoploss?

Update siehe " Stop Loss und Take Profit werden also nicht in Pips, sondern in Prozenten eines Bid oder Ask angegeben."

trotzdem erhalten Sie auf diese Weise einen gültigen Preis ... wenn Ihr Symbol 5 Ziffern hat, wird das Ergebnis oft 2 Ziffern mehr sein