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

 
deVries:


nicht, wenn Sie mit dem aktuellen Spread testen, dieser ist sehr verrückt bewegend und der Spread kann sehr groß werden

Wie haben Sie den Test durchgeführt?

Fester Spread oder aktueller Spread?


Ok, das ist der Zeitpunkt, an dem ich nach "Spread" google

Ich weiß es zu schätzen, dass du meine dummen Fragen beantwortest))

Ich werde in Kürze zurückkommen

 
prupru:


Ok, das ist also der Zeitpunkt, an dem ich "spread" googeln gehe

Ich weiß es zu schätzen, dass du meine dummen Fragen beantwortest))

Ich werde in einer Weile zurück sein

Spread = Briefkurs - Geldkurs
 

und bei jedem Ticken kann sich dieser Wert ändern

Der Grund, warum ich gefragt habe, wie Sie den Test durchgeführt haben

 
deVries:

und bei jedem Ticken kann sich dieser Wert ändern

Deshalb habe ich nach der Methode gefragt, wie Sie den Test durchgeführt haben.

Genau!

I der Unterschied war aufgrund der aktuellen Spread-Tests, wenn ich die Tests mit festen Spread durchgeführt sie waren genau das gleiche!

Vielen Dank, Leute!

Ich habe mein Wissen wirklich verbessert.

Und bitte lasst mich wissen, ob es noch etwas gibt, was im Code verbessert werden kann.

 
prupru:

genau!

Ich der Unterschied war aufgrund der aktuellen Spread-Tests, wenn ich die Tests mit festen Spread durchgeführt sie waren genau das gleiche!

Vielen Dank, Leute!

Ich habe mein Wissen wirklich verbessert.

Und bitte lasst mich wissen, ob es noch etwas gibt, das im Code verbessert werden kann.


wenn Sie zeigen, was Ihr Code jetzt geworden ist

Ich würde auch gerne eine neue Fehlerbehandlung sehen, siehe Kommentar RaptorUK https://www.mql5.com/en/forum/148529

 
deVries:


wenn Sie zeigen, was Ihr Code jetzt geworden ist

möchte auch eine neue Fehlerbehandlung sehen, siehe Kommentar RaptorUK https://www.mql5.com/en/forum/148529

Ok, los geht's:

#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=0;
extern int  StopLoss=0;
extern int TrailingStop=0;
extern int Slippage = 10;

extern double MinDiff = 0.002;

int LastBars = 0;
//0 - undefined, 1 - bullish cross (fast MA above slow MA), -1 - bearish cross (fast MA below slow MA)
int PrevCross = 0;

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

Preisnormalisierung:

double NormPrice(double g_price)
{
   return (NormalizeDouble(g_price,MarketInfo(Symbol(),MODE_DIGITS)));
}

GetLot Funktion, hat sich wohl nicht geändert

//function GetLot, get size of the lot according to MaxRisk
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);}

Neue Order-Funktion, verwendet jetzt normalisierte Preise:

//function NewOrder, place new order
int NewOrder(int Cmd,double Lot)
{double TP=0; //тейкпрофит
 double SL=0; //стоплосс
 double PR=0; //Цена
 color clr = CLR_NONE;
 while(!IsTradeAllowed()) Sleep(10);
 RefreshRates();
 if(Cmd==OP_BUY)
   {PR=Ask;
    if(TakeProfit>0) TP=NormPrice(Ask + Ask*TakeProfit/100);
    if(StopLoss>0) SL=NormPrice(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=NormPrice(Bid - Bid*TakeProfit/100);
    if(StopLoss>0) SL=NormPrice(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());
   Print("cmd ", Cmd, " Lot ", Lot, " PR ", PR, " Slip ", Slippage, " SL ", SL, " TP ", TP, " Ask ", Ask, " Bid ", Bid);
  }
return(tic);}

1 oder alle Aufträge schließen

Ich habe die Funktion zum Schließen von Aufträgen nicht geändert, um nach Symbolen und magischen Zahlen zu suchen, da ich nur mit einem Symbol und nur mit einem EA pro Konto handeln werde. Aber ich werde es tun, nachdem ich mich mit anderen wichtigeren Themen und Tuning beschäftigt habe.

//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("Close order error: ",GetLastError());
   Print("Type ", OrderType()," PR ",PR, " Ask ", Ask, " Bid ", Bid, " OrderTicket ", OrderTicket(), " OrderLots ", OrderLots());
  }
return;}
//--------------------------- end of close order

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

Ich habe die EMA-Kreuzungserkennung von einem Vergleich von EmaDiff[2] mit EmaDiff[1] auf einen Vergleich von EmaDiff[0] mit Null und die Verwendung eines zusätzlichen Flags geändert (all dies stammt von einem Beispiel, das ich gefunden habe)

Auf einem Demo-Konto auf Minutenskala kommt es zu Fehlauslösungen, wenn der Spread so hoch ist, dass sich die EMAs bei einem Kaufgeschäft überschneiden und bei einem darauf folgenden Verkaufsgeschäft innerhalb desselben Minutenbalkens wieder voneinander getrennt werden.

[url=http://postimg.org/image/udq4ufmqf/][img]http://s15.postimg.org/udq4ufmqf/mess.jpg[/img][/url]

Ich überlege gerade, wie ich damit umgehen kann

// check cross
void CheckCross()
{
   double FMA_Current = iMA(Symbol(),0,FastEma,0,MODE_EMA,PRICE_CLOSE,0);
   double SMA_Current = iMA(Symbol(),0,SlowEma,0,MODE_EMA,PRICE_CLOSE,0);
   double Poin = (FMA_Current + SMA_Current)/2;
   double Lot;
   if (PrevCross == 0) //Was undefined
   {
      if ((FMA_Current - SMA_Current) >= MinDiff * Poin) PrevCross = 1; //Bullish state
      else if ((SMA_Current - FMA_Current) >= MinDiff * Poin) PrevCross = -1; //Bearish state
      return;
   }
   else if (PrevCross == 1) //Was bullish
   {
      if ((SMA_Current - FMA_Current) >= MinDiff * Poin) //Became bearish
      {
         CloseAllOrders();
         Lot = GetLot(MaxRisk);
         NewOrder(OP_SELL,Lot);
         PrevCross = -1;
      }
   }
   else if (PrevCross == -1) //Was bearish
   {
      if ((FMA_Current - SMA_Current) >= MinDiff * Poin) //Became bullish
      {
         CloseAllOrders();
         Lot = GetLot(MaxRisk);
         NewOrder(OP_BUY,Lot);
         PrevCross = 1;
      }
   }
}

die Trailing-Stop-Funktion:

// trailing stop
void DoTrailing()
{
   int total = OrdersTotal();
   for (int pos = 0; pos < total; pos++)
   {
      if (OrderSelect(pos, SELECT_BY_POS) == false) continue;
      if (OrderSymbol() == Symbol())
      {
         if (OrderType() == OP_BUY)
         {
            RefreshRates();
            if (Bid - OrderOpenPrice() >= TrailingStop * Bid/100) //If profit is greater or equal to the desired Trailing Stop value
            {
               if (OrderStopLoss() < (Bid - TrailingStop * Bid/100)) //If the current stop-loss is below the desired trailing stop level
                  OrderModify(OrderTicket(), OrderOpenPrice(), NormPrice(Bid - TrailingStop * Bid/100), OrderTakeProfit(), 0);
            }
         }
         else if (OrderType() == OP_SELL)
         {
            RefreshRates();
            if (OrderOpenPrice() - Ask >= TrailingStop * Ask/100) //If profit is greater or equal to the desired Trailing Stop value
            {
                      if ((OrderStopLoss() > (Ask + TrailingStop * Ask/100)) || (OrderStopLoss() == 0)) //If the current stop-loss is below the desired trailing stop level
                  OrderModify(OrderTicket(), OrderOpenPrice(), NormPrice(Ask + TrailingStop * Ask/100), OrderTakeProfit(), 0);
            }
         }
      }
   }   
}

Und den Body selbst:

//main program
int start()
  {

   if (TrailingStop > 0) DoTrailing();
          
        static datetime Time0;
        if (Time0 == Time[0]) return;
        Time0 = Time[0];
      {
       CheckCross();     
              
      }

   return(0);
  }

Vielen Dank für Ihr Interesse!



 
prupru:


Ich habe die Funktion zum Schließen von Aufträgen nicht geändert, um nach Symbolen und magischen Zahlen zu suchen, da ich nur mit einem Symbol und nur mit einem EA pro Konto handeln werde. Aber ich werde es tun, nachdem ich mich mit anderen, wichtigeren Themen und Tuning beschäftigt habe.


Seien Sie nicht faul, machen Sie es direkt !!!!

das ist eine wichtige Sache, die man immer einbeziehen muss

wenn Sie Ihr Programm reparieren wollen und wir Ihnen Ratschläge geben, was zu tun ist

Wenn du dann nicht daran arbeiten willst, es zu reparieren, warum helfen wir dir dann?

 
deVries:


Sei nicht faul, mach es direkt !!!!

das ist eine wichtige Sache, die Sie immer einbeziehen müssen

Wenn Sie Ihr Programm reparieren wollen und wir Ihnen Ratschläge geben, was zu tun ist

Wenn du dann nicht daran arbeiten willst, es zu reparieren, warum helfen wir dir dann?


ok, ok, immer mit der Ruhe)

Hier ist es, ich denke, das sollte den Trick machen.

Funktion"Auftrag öffnen" :

OrderSend(Symbol(),Cmd,Lot,PR,Slippage,SL,TP,"",Expert_ID,0,clr);

Funktion "Alle Aufträge schließen":

//Close all Orders
void CloseAllOrders()
{
  for(int i=OrdersTotal()-1;i>=0;i--)
   {
    if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
     {
      if ((OrderSymbol() == Symbol()) && (OrderMagicNumber() == Expert_ID))  CloseOrder();
     }
    else
     {
      Print("Error selecting order: ",GetLastError());
      Print(" i= ", i, " Symbol= ", OrderSymbol());
     }
   }
return;}
 

Ich habe jetzt ein größeres Problem: Mein Broker neigt dazu, Aufträge nur teilweise auszuführen.

Sehr geehrter Kunde,

wir möchten Sie darauf hinweisen, dass Ihr Handel teilweise (2,32 von 15,84 Lots) zum Preis von 587,318 eröffnet wurde.

Sollten Sie weitere Fragen zu diesem Thema haben, zögern Sie bitte nicht, uns zu kontaktieren.

Mit freundlichen Grüßen,

Makler.

Hier ist, was der Support sagt:

Bitte beachten Sie, dass in Zeiten hoher Volatilität oder geringer Liquidität Limit Orders teilweise ausgeführt werden können. Das bedeutet, dass die Position sofort ganz oder teilweise ausgeführt wird, wenn der Preis erreicht wird. In Ihrem Fall wurde Ihr Auftrag teilweise ausgeführt, weshalb Sie eine Benachrichtigung erhalten haben.

Ich weiß, wie man alle Orders schließt, obwohl sie teilweise geschlossen wurden, ich muss nur Close all Orders while OrdersTotal() > 0 machen , aber ich weiß nicht, was ich tun soll, wenn die Orders teilweise geöffnet werden.

edit:

Ich habe gerade gemerkt, dass ich die richtigen Symbol- und Magicnumber-Orders prüfen muss, das ist etwas schwieriger

edit: hier ist die Funktion close all orders, die die Aufträge auch bei teilweiser Schließung schließen sollte

//Close all my Orders
void CloseAllOrders()
{
int notMyOrders = 0;

for(int j=OrdersTotal()-1;j>=0;j--)
{
    if(OrderSelect(j,SELECT_BY_POS,MODE_TRADES))
      {
       if ((OrderSymbol() != Symbol()) || (OrderMagicNumber() != Expert_ID)) notMyOrders++;
      }
    else
      {
       Print("Error selecting order: ",GetLastError());
       Print(" j= ", j, " Symbol= ", OrderSymbol());
      }    
}

 while (OrdersTotal()>notMyOrders)
 {
  for(int i=OrdersTotal()-1;i>=0;i--)
   {
    if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
     {
      if ((OrderSymbol() == Symbol()) && (OrderMagicNumber() == Expert_ID))  CloseOrder();
     }
    else
     {
      Print("Error selecting order: ",GetLastError());
      Print(" i= ", i, " Symbol= ", OrderSymbol());
     }
   }
 }


return;}
 

Hier ist, wie ich mit der teilweisen Ausführung von offenen Aufträgen kämpfen werde,

Die Eröffnung eines Auftrags wird nicht mehr mit einer NewOrder-Funktion durchgeführt, sondern mit dieser:

//OpenOrders in case of partial execution
int OpenPartOrders(int Cmd, double Lot)
{
 int NumOrders = 0;
 int LastTic = -1;
 double Step = MarketInfo(Symbol(),MODE_LOTSTEP);
 double LotRemains = Lot;
 
 //MathFloor( /Step)*Step;;
while (LotRemains>0)
 {
  LastTic = NewOrder(Cmd, LotRemains);
  NumOrders++;
  if(OrderSelect(LastTic, SELECT_BY_TICKET)==true)
     {
      LotRemains = LotRemains - OrderLots();
      Print("NumberOfOrders ", NumOrders, " Ticket ", LastTic, " LotRemains ", LotRemains, " initial Lot ", Lot);          
     }
  else
   {
    Print("OrderSelect returned the error of ",GetLastError());
    LotRemains = 0;//not to create an endless loop opening new orders again and again
   }
 } 
return(NumOrders);}