fatto un 2 EMA cross EA, bisogno di consigli - pagina 3

 
deVries:


non se testate con lo spread corrente questo è molto pazzo in movimento così lo spread può diventare molto enorme

come hai fatto il test?

spread fisso o spread corrente ??


ok, quindi questo è il momento in cui vado su Google "spread"

Apprezzo che tu stia rispondendo alle mie stupide domande))

Tornerò tra un po

 
prupru:


ok, quindi questo è il momento in cui vado su google "spread"

Apprezzo che tu stia rispondendo alle mie stupide domande))

Tornerò tra un po

Spread = Richiesta - Offerta
 

e ogni tick questo valore può cambiare

motivo per cui ho chiesto il metodo come avete fatto il test

 
deVries:

e ogni tick questo valore può cambiare

motivo per cui ho chiesto il metodo come hai fatto il test

esattamente!

Io la differenza era dovuta al test dello spread corrente, quando ho eseguito i test con lo spread fisso erano esattamente gli stessi!

Grazie mille ragazzi!

Ho davvero migliorato le mie conoscenze.

E per favore fatemi sapere se c'è ancora qualcosa da migliorare nel codice.

 
prupru:

esattamente!

Io la differenza era dovuta al test dello spread attuale, quando ho eseguito i test con lo spread fisso erano esattamente gli stessi!

Grazie mille ragazzi!

Ho davvero migliorato le mie conoscenze.

E per favore fatemi sapere se c'è ancora qualcosa da migliorare nel codice.


se mostrate ciò che il vostro codice è diventato ora

come vedere anche un nuovo errorhandling, vedi commento RaptorUK https://www.mql5.com/en/forum/148529

 
deVries:


se mostri ciò che il tuo codice è diventato ora

come vedere anche un nuovo errorhandling, vedi commento RaptorUK https://www.mql5.com/en/forum/148529

Ok, ci siamo:

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

normalizzazione dei prezzi:

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

Funzione GetLot, credo che non sia cambiata

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

Nuova funzione Order, ora usa prezzi normalizzati:

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

Chiudi 1 o tutti gli ordini

Non ho cambiato la funzione di chiusura degli ordini per controllare il simbolo e i numeri magici, perché ho intenzione di fare trading su un solo simbolo e con un solo EA per conto. Ma lo farò dopo aver affrontato altri problemi più importanti e la messa a punto.

//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;}

Ho cambiato il rilevamento dell'EMA cross dal confronto di EmaDiff[2] con EmaDiff[1] al confronto di EmaDiff[0] con zero e usando un flag aggiuntivo (tutto questo viene da alcuni esempi che ho trovato)

Su un conto Demo a scala di minuti fa falsi trigger quando lo spread è così alto che un'operazione di acquisto fa intersecare le EMA e poi un'operazione di vendita successiva nella stessa barra di minuti le fa separare di nuovo.

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

Sto pensando a come affrontare questo problema in questo momento

// 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;
      }
   }
}

la funzione trailing stop:

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

e il corpo stesso:

//main program
int start()
  {

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

   return(0);
  }

Grazie per il tuo interesse!



 
prupru:


Non ho cambiato la funzione di chiusura dell'ordine per controllare il simbolo e i numeri magici, perché ho intenzione di fare trading su un solo simbolo e con un solo EA per conto. Ma lo farò dopo aver affrontato altre questioni più importanti e la messa a punto.


non essere pigro, fallo direttamente !!!!

è una cosa importante che devi sempre includere

se vuoi aggiustare il tuo programma e noi ti consigliamo cosa è necessario fare

allora se non vuoi lavorare per aggiustarlo allora cosa stiamo facendo per aiutarti?

 
deVries:


non essere pigro, fallo direttamente !!!!

è una cosa importante da includere sempre

se vuoi aggiustare il tuo programma e noi ti diamo dei consigli su cosa è necessario fare

poi se non vuoi lavorare per aggiustarlo allora cosa stiamo facendo per aiutarti?


Ok, ok, stai calmo)

Ecco qui, penso che questo dovrebbe bastare.

aprire la funzione ordine :

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

chiudere tutti gli ordini funzione:

//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;}
 

Ora ho un problema più grande, il mio broker tende a eseguire parzialmente gli ordini.

Gentile cliente,

La informiamo che il suo ordine è stato aperto parzialmente (2,32 lotti su 15,84) al prezzo 587,318.

Se dovesse avere ulteriori domande su questo problema, non esiti a contattarci.

Cordiali saluti,

Broker.

Ecco cosa dice il supporto:

Vi informiamo che durante i periodi di alta volatilità o bassa liquidità, gli ordini limite possono essere eseguiti parzialmente. Questo significa che la posizione sarà riempita immediatamente in tutto o in parte se il prezzo è soddisfatto. Nel suo caso il suo ordine è stato eseguito parzialmente, ecco perché ha ricevuto la lettera di notifica.

Ho capito come chiudere tutti gli ordini nonostante siano stati chiusi parzialmente, devo solo fare Close all Orders while OrdersTotal() > 0, ma non so ancora cosa fare quando gli ordini si aprono parzialmente.

modifica:

Ho appena realizzato che devo controllare gli ordini Symbol e magicnumber, è un po' più difficile

edit: ecco la funzione close all orders che dovrebbe chiudere gli ordini anche con chiusura parziale

//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;}
 

Ecco come lotterò con l'esecuzione parziale degli ordini aperti,

L'ordine di apertura non sarà più eseguito con una funzione NewOrder, ma sarà fatto con questa:

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