Tutte le domande dei nuovi arrivati su MQL4 e MQL5, aiuto e discussione su algoritmi e codici - pagina 193

 

Ho bisogno di aiuto - ho dei trailing stop - 3 ordini, ma l'esempio di trailing dai video tutorial :) solo per ordini non collegati, nel mio caso sono collegati da un algoritmo, cioè il takeprofit è calcolato dalla somma di tre ordini, o uno se sono entrato in un trend. Bene, ho pensato a qualcosa ma il mio Expert Advisor non ha iniziato a guadagnare di più - ha iniziato a guadagnare la stessa quantità di ordini ma ottengo 2-3 volte meno trade rispetto al mio precedente EA senza trailing. Quindi il mio trailing non è un trailing ma un'assurdità. Come dovrei inserirlo negli ordini collegati? Qualcuno può darmi un'idea? Temo di non riuscire a pensare ad altro. Ecco il risultato del mio "trailing" - è mostrato in blu:

Il risultato di 1 test è allegato. C'è un trailing stop o no? Non capisco. Perché il profitto per lo stesso periodo non è stato aumentato? Solo il numero di accordi è diminuito di 2-3 volte?

//+------------------------------------------------------------------+
//|                                     BLACKJACK&HOOKERS TrailX.mq4 |
//|                        Copyright 2017, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2017, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict

extern double  Lots           = 0.01;
extern int     TakeProfit     = 5;
extern int     Step           = 2;

extern int     TrailingStep   = 3;
extern int     TrailingStop   = 1;

extern int     MaPeriod       = 200;
extern int     MaShift        = 1;

extern int     Magic          = 123;
extern int     Slippage       = 5;

int timeprev=0;

extern double price,op,cn,tp;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
   if(Digits == 3 || Digits == 5)
      TakeProfit     *= 10;
      Step           *= 10;
      TrailingStep   *= 10;
      TrailingStop   *= 10;
      Slippage       *= 10;

      
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---

  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
{  if (timeprev == Time[0]) return;
   timeprev = Time[0];
   double maprice=iMA(Symbol(),0,MaPeriod,MaShift,MODE_SMA,PRICE_CLOSE,1);
   op=CalculateProfit();
   cn=CountTrades();
   tp=TakeProfit;
   if(tp>TakeProfit)
   {
      TakeProfit+=tp;
   }

   
 

 
   if (cn==0 && CountBuy() + CountSell() == 0 && Ask > maprice)
   {
      if (OrderSend(Symbol(), OP_BUY, Lots, Ask, Slippage, 0, 0, "", Magic, 0, Blue)<0)
            Print("Не удалось открыть ордер на покупку");
            
   }
   
   if (cn==0 && CountBuy() + CountSell() == 0 && Bid < maprice)
   {
      if (OrderSend(Symbol(), OP_SELL, Lots, Bid, Slippage, 0, 0, "", Magic, 0, Red)<0)
            Print("Не удалось открыть ордер на продажу");
            
   }
   

   
   if(cn==1 && CountBuy()==1)//CountBuy()==1 && 
   {
      price=FindLastBuyPrice();
      if((price-Ask)>=Step*Point)
      {
         if(OrderSend(Symbol(),OP_SELL,Lots,Bid,Slippage,0,0,"",Magic,0,Red)<1)
            Print("Не удалось открыть ордер на продажу");
      }
   }
   else if(cn==1 && CountSell()==1)//CountSell()==1 && 
   {
      price=FindLastSellPrice();
      if((Bid-price)>=Step*Point)
      {
         if(OrderSend(Symbol(),OP_BUY,Lots,Ask,Slippage,0,0,"",Magic,0,Blue)<1)
            Print("Не удалось открыть ордер на покупку");
      }
   }
   
   
   
   if(cn==2 && CountBuy()==1 && CountSell()==1)//CountBuy() + CountSell()==2 && 
   {
      price=FindLastSellPrice();
      if((price-Bid)>=Step*Point)
      {
         if(OrderSend(Symbol(),OP_SELL,Lots,Bid,Slippage,0,0,"",Magic,0,Red)<1)
               Print("Не удалось открыть ордер на продажу");
               
      }
      else 
      price=FindLastSellPrice();
      if((Bid-price)>=Step*Point)
      {
         if(OrderSend(Symbol(),OP_BUY,Lots,Ask,Slippage,0,0,"",Magic,0,Blue)<1)
            Print("Не удалось открыть ордер на покупку");
           
      }
   }
   else if(cn==2 && CountSell()==1 && CountBuy()==1)//CountSell() + CountBuy()==2 && 
   {
      price=FindLastBuyPrice();
      if((Ask-price)>=Step*Point)
      {
         if(OrderSend(Symbol(),OP_BUY,Lots,Ask,Slippage,0,0,"",Magic,0,Blue)<1)
               Print("Не удалось открыть ордер на продажу");
               
      }
      else 
      price=FindLastBuyPrice();
      if((price-Ask)>=Step*Point)
      {
         if(OrderSend(Symbol(),OP_SELL,Lots,Bid,Slippage,0,0,"",Magic,0,Red)<1)
            Print("Не удалось открыть ордер на покупку");
           
      }
   }
   
   Trailing();

   

   if (op>=tp)
   {
         CloseAll();    
   }
   
   

 
   
   
   
   
   
   
   






}    
//---------------------------------------------------------------------------------------
//   double Equity() //или OrderProfit() - эти идеи в работе и задуманы как автоподбор лота (без мартингейла) для снижения рисков от контрдвижения (интервенций) рынка 
//   {
//      double eqv=0;
//      eqv+=AccountEquity();
//      return(eqv);     
//   }
//---------------------------------------------------------------------------------------
void Trailing()

{
   for (int i=OrdersTotal() -1; i>=0; i--)
   {
      if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
      {
         if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)
         {
            if (OrderType() == OP_BUY)
            
            {
               price=FindLastBuyPrice();   
               if (Bid - price > (TakeProfit+TrailingStep)*Point)
               {
                  {
                     tp=NormalizeDouble((TakeProfit+TrailingStep)*Point, Digits);
                  }
               }
               if (price - (TakeProfit-TrailingStop)*Point < Bid - (TakeProfit+TrailingStep)*Point)
               {
                  {
                     tp=NormalizeDouble((TakeProfit-TrailingStop)*Point, Digits);
                  }
               }
            }
            
            if (OrderType() == OP_SELL)
            {
               price=FindLastSellPrice();
               if (price - Ask > (TakeProfit+TrailingStep)*Point)
               {  
                  {
                     tp=NormalizeDouble((TakeProfit+TrailingStep)*Point, Digits);
                  }
               }
               if (price - (TakeProfit-TrailingStop)*Point > Ask + (TakeProfit+TrailingStep)*Point)
               {  
                  {
                     tp=NormalizeDouble((TakeProfit-TrailingStop)*Point, Digits);
                  }
               }
            }
         }
      }
   }
}
//---------------------------------------------------------------------------------------
double CalculateProfit()
  {
   double oprofit=0;
   for(int i=OrdersTotal()-1; i>=0; i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
           {
            if(OrderType()==OP_BUY || OrderType()==OP_SELL)
              {
               oprofit+=OrderProfit();
              }
           }
        }
     }
   return(oprofit);
  }
//--------------------------------------------------------------------------------------
void CloseAll()
  {
   for(int i=OrdersTotal()-1; i>=0; i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
           {
            if(OrderType()==OP_BUY)
              {
               if(!OrderClose(OrderTicket(),OrderLots(),Bid,Slippage))
                  Print("Не удалось закрыть ордер на покупку");
              }
            if(OrderType()==OP_SELL)
              {
               if(!OrderClose(OrderTicket(),OrderLots(),Ask,Slippage))
                  Print("Не удалось закрыть ордер на продажу");
              }
           }
        }
     }
  }
//---------------------------------------------------------------------------------------------------
double FindLastBuyPrice()
  {
   int oldticket,ticket= 0;
   double oldopenprice = 0;
   for(int cnt=OrdersTotal()-1; cnt>=0; cnt--)
     {
      if(OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic && OrderType()==OP_BUY)
           {
            oldticket=OrderTicket();
            if(oldticket>ticket)
              {
               ticket=oldticket;
               oldopenprice=OrderOpenPrice();
              }
           }
        }
     }
   return(oldopenprice);
  }
//---------------------------------------------------------------------------------------------------
double FindLastSellPrice()
  {
   int oldticket,ticket= 0;
   double oldopenprice = 0;
   for(int cnt=OrdersTotal()-1; cnt>=0; cnt--)
     {
      if(OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic && OrderType()==OP_SELL)
           {
            oldticket=OrderTicket();
            if(oldticket>ticket)
              {
               ticket=oldticket;
               oldopenprice=OrderOpenPrice();
              }
           }
        }
     }
   return(oldopenprice);
  }
//----------------------------------------------------------------------------------------------
int CountBuy()
  {
   int count=0;
   for(int trade=OrdersTotal()-1; trade>=0; trade--)
     {
      if(OrderSelect(trade,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic && OrderType()==OP_BUY)
            count++;
        }
     }
   return(count);
  }
//----------------------------------------------------------------------------------------------
int CountSell()
  {
   int count=0;
   for(int trade=OrdersTotal()-1; trade>=0; trade--)
     {
      if(OrderSelect(trade,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic && OrderType()==OP_SELL)
            count++;
        }
     }
   return(count);
  }
//+---------------------------------------------------------------------------------+
int CountTrades()
{
    int count=0;
    for (int i=OrdersTotal()-1; i>=0; i--)
      {  
         if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
         {
            if(OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)
               if(OrderType() == OP_BUY || OrderType() == OP_SELL)
                  count++; 
         }
      }
      return(count);
}
//----------------------------------------------------------------------------------+
int FindLastOrderType()
{
      for(int i = OrdersTotal()-1; i>=0; i--)
      {
         if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
         {
            if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)
            return(OrderType());
         } 
      }
      return(-1);
}
//----------------------------------------------------------------------------------+



Автоматический трейдинг и тестирование торговых стратегий
Автоматический трейдинг и тестирование торговых стратегий
  • www.mql5.com
MQL5: язык торговых стратегий для MetaTrader 5, позволяет писать собственные торговые роботы, технические индикаторы, скрипты и библиотеки функций
 
geratdc:

Ho bisogno di aiuto - ho stop flips - 3 ordini, ma l'esempio di trailing solo per gli ordini non collegati, nel mio caso sono collegati da un algoritmo, cioè takeprofit si basa sulla somma di tre ordini, o uno se si è in un trend. Bene, ho pensato a qualcosa ma il mio Expert Advisor non ha iniziato a guadagnare di più - ha iniziato a guadagnare la stessa quantità di ordini ma ottengo 2-3 volte meno trade rispetto al mio precedente EA senza trailing. Quindi il mio trailing non è un trailing ma un'assurdità. Come dovrei inserirlo negli ordini collegati? Qualcuno può darmi un'idea? Temo di non riuscire a pensare ad altro, ecco il risultato del mio "strascico" - evidenziato in rosso:


Pensi che qualcuno capirà il tuo codice come uno scarabocchio?
 
Vitaly Muzichenko:
Pensi che qualcuno capirà il tuo codice scarabocchiato?

Come deve essere esposto? Beh, non posso buttare un pezzo di codice, altrimenti non sarebbe chiaro cosa sia cosa.
 
geratdc:

Come lo mostri? Beh, non posso buttare un pezzo di codice, altrimenti non sarebbe chiaro cosa sia cosa.

Almeno così:


 
Vitaly Muzichenko:

Almeno è così:



Qualcuno l'ha rifatto. Questo è certamente meglio, grazie.
 


Amici, sto studiando MQL4 e ho deciso di scrivere un EA per il sistema Lazy Trader.
L'EA è scritto, ma non funziona correttamente. L'errore che vedo è che gli ordini non sono chiusi per tempo. Può essere che ci siano altri errori.


Per favore aiutatemi a trovare questi errori e datemi un feedback sul codice che vedete.

Ecco le regole del sistema per cui ho scritto l'Expert Advisor:

1/ All'inizio della settimana aspettate la chiusura della prima candela di quattro ore.
2/ Abbiamo messo ordini pendenti Buy Stop e Sell Stop 20 pip sopra l'High e 20 pip sotto il Low di questa candela.
3/ Lo stop loss dovrebbe essere impostato al livello dell'ordine opposto. IlTake Profit non viene piazzato.
4/ Quando l'ordine raggiunge un profitto, uguale allo stop loss, trasferiamo lo stop a Breakeven (trasferiamo lo stop loss della posizione al suo prezzo di apertura).
5/ Il secondo ordine dopo l'attivazione del primo, NON RIMUOVERE!
6/ Alla fine della settimana rimuoviamo / chiudiamo tutti gli ordini, indipendentemente dal loro profitto / perdita.

Grazie per il vostro aiuto:)

Sto allegando un file con il codice EA

File:
 
ivan-baaton:


Amici, sto studiando MQL4 e ho deciso di scrivere un EA per il sistema Lazy Trader.
L'EA è scritto, ma non funziona correttamente. L'errore che vedo è che gli ordini non sono chiusi per tempo. Può essere che ci siano altri errori.


Per favore aiutatemi a trovare questi errori e datemi un feedback sul codice che vedete.

Ecco le regole del sistema per cui ho scritto l'Expert Advisor:

1/ All'inizio della settimana aspettate la chiusura della prima candela di quattro ore.
2/ Abbiamo messo ordini pendenti Buy Stop e Sell Stop 20 pip sopra l'High e 20 pip sotto il Low di questa candela.
3/ Lo stop loss dovrebbe essere impostato al livello dell'ordine opposto. IlTake Profit non viene piazzato.
4/ Quando l'ordine raggiunge un profitto, uguale allo stop loss, trasferiamo lo stop a Breakeven (trasferiamo lo stop loss della posizione al suo prezzo di apertura).
5/ Il secondo ordine dopo l'attivazione del primo, NON RIMUOVERE!
6/ Alla fine della settimana rimuoviamo / chiudiamo tutti gli ordini, indipendentemente dal loro profitto / perdita.

Grazie per il vostro aiuto:)

Sto allegando il file con il codice del consulente.

TimeHour(TimeCurrent()) == DayTimeClose

Una tale uguaglianza assoluta può essere molto rara e se si chiude la settimana a 23, sarebbe meglio chiudere gli ordini un po' prima, almeno per 15 minuti. Non ho cercato altri errori. A prima vista, sembra essere scritto abbastanza accuratamente.

 
Alexey Viktorov:

Questa uguaglianza assoluta può essere molto rara e se si chiude la settimana a 23, è meglio chiudere gli ordini un po' prima, almeno di 15 minuti. Non ho cercato altri errori. A prima vista sembra essere scritto abbastanza bene.

La chiusura della settimana è alle 00:00, cioè chiudo gli ordini 1 ora prima.


Cosa c'è di sbagliato in questo codice:TimeHour(TimeCurrent()) == DayTimeClose ?


Penso che ci sia un errore da qualche parte in questo codice:


per (int i = OrdiniTotali(); i>=0; i--)
{
if (OrderSelect(k, SELECT_BY_POS, MODE_TRADES) == true && TimeHour(TimeCurrent()) == DayTimeClose && DayOfWeek() == 5 && (OrderType() == OP_SELL || OrderType() == OP_SELLSTOP) && OrderMagicNumber() == Magic)
{
ticket_sell = OrderClose(ticket_sell, Lots, Bid, 3, Red);
se (ticket_sell == false)
Stampa("Ordine di vendita non chiuso");
}

}


Grazie

 
ivan-baaton:

La chiusura della settimana è alle 00:00, cioè chiudo gli ordini 1 ora prima.


Cosa c'è di sbagliato in questo codice:TimeHour(TimeCurrent()) == DayTimeClose ?


Penso che ci sia un errore da qualche parte in questo codice:


per(int i = OrdiniTotali(); i>=0; i--)
{
if (OrderSelect(k, SELECT_BY_POS, MODE_TRADES) == true && TimeHour(TimeCurrent()) == DayTimeClose && DayOfWeek() == 5 && (OrderType() == OP_SELL || OrderType() == OP_SELLSTOP) && OrderMagicNumber() == Magic)
{
ticket_sell = OrderClose(ticket_sell, Lots, Bid, 3, Red);
se (ticket_sell == false)
Stampa("Ordine di vendita non chiuso");
}

}


Grazie

Questo è esattamente quello che ho sottolineato. Anche se ora vedo che sono stato disattento. Ho visto evidenziato solo TimeHour(TimeCurrent()). == DayTimeClose.

Ma il fatto che il contatore del ciclo è i e l'ordine k è selezionato, non l'ho visto subito.

 
Alexey Viktorov:

Questo è esattamente quello che ho sottolineato. Anche se ora vedo che sono stato disattento. Ho visto solo evidenziato TimeHour(TimeCurrent()) == DayTimeClose.

Ma il fatto che il contatore del ciclo è i e l'ordine k è selezionato, non l'ho visto subito.


Sì, questo K è anche scritto invariabili esterne nell'intestazione superiore... Forse è il valore di ritorno di qualche funzione...


Alexey, cosa puoi dire del mio problema? Cerco di attaccare il trailing stop agli ordini inversi. Avete mai incontrato un problema simile?

Motivazione: