Cualquier pregunta de los recién llegados sobre MQL4 y MQL5, ayuda y discusión sobre algoritmos y códigos - página 193

 

Necesito ayuda - Tengo trailing stops - 3 órdenes, pero el ejemplo de trailing de los tutoriales de vídeo :) sólo para las órdenes no vinculadas, en mi caso están vinculadas por el algoritmo, es decir, takeprofit se calcula por la suma de tres órdenes, o una si me metí en una tendencia. Bueno, he pensado en algo pero mi Asesor Experto no ha empezado a ganar más - ha empezado a ganar la misma cantidad de órdenes pero consigo 2-3 veces menos operaciones en comparación con mi anterior EA sin trailing. Así que mi arrastre no es un arrastre sino una tontería. ¿Cómo debo colocarlo en los pedidos vinculados? ¿Alguien puede darme una idea? Me temo que no se me ocurre nada más. Aquí está el resultado de mi "arrastre" - se muestra en azul:

Se adjunta el resultado de 1 prueba. ¿Hay un trailing stop o no? No lo entiendo. ¿Por qué no se aumentó el beneficio del mismo periodo? ¿Sólo el número de tratos se redujo entre 2 y 3 veces?

//+------------------------------------------------------------------+
//|                                     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, позволяет писать собственные торговые роботы, технические индикаторы, скрипты и библиотеки функций
Archivos adjuntos:
 
geratdc:

Necesito ayuda - Tengo stop flips - 3 órdenes, pero el ejemplo de trailing sólo para órdenes no relacionadas, en mi caso están vinculadas por un algoritmo, es decir, el takeprofit se basa en la suma de tres órdenes, o una si está en tendencia. Bueno, he pensado en algo pero mi Asesor Experto no ha empezado a ganar más - ha empezado a ganar la misma cantidad de órdenes pero consigo 2-3 veces menos operaciones en comparación con mi anterior EA sin trailing. Así que mi arrastre no es un arrastre sino una tontería. ¿Cómo debo colocarlo en los pedidos vinculados? ¿Alguien puede darme una idea? Me temo que no se me ocurre nada más, aquí está el resultado de mi "trailing" - subrayado en rojo:


¿Crees que alguien entenderá tu código como un garabato?
 
Vitaly Muzichenko:
¿Crees que alguien va a entender tu código garabateado?

¿Cómo debe mostrarse? Bueno, no puedo poner un trozo de código, porque si no no quedaría claro qué es qué.
 
geratdc:

¿Cómo lo demuestran? Bueno, no puedo poner un trozo de código, porque si no no quedaría claro qué es qué.

Al menos así:


 
Vitaly Muzichenko:

Al menos así es:



Alguien lo ha rehecho. Así está mejor, gracias.
 


Amigos, estoy estudiando MQL4 y decidí escribir un EA para el sistema Lazy Trader.
El EA está escrito, pero no funciona correctamente. El error que veo es que las órdenes no se cierran por tiempo. Puede ser que haya algún otro error.


Por favor, ayúdame a encontrar estos errores y dame tu opinión sobre el código que veas.

Aquí están las reglas del sistema para el que escribí el Asesor Experto:

1/ Al principio de la semana espera a que se cierre la primera vela de cuatro horas.
2/ Ponemos órdenes pendientes de Buy Stop y Sell Stop 20 pips por encima del High y 20 pips por debajo del Low de esta vela.
3/ El Stop Loss debe fijarse al nivel de la orden contraria. No se coloca el Take Profit.
4/ Cuando la orden alcanza un beneficio, igual al stop loss, transferimos el stop al Breakeven (transferimos el stop loss de la posición a su precio de apertura).
5/ La segunda orden después de la activación de la primera, ¡NO REMOVER!
6/ Al final de la semana eliminamos / cerramos todas las órdenes, independientemente de su beneficio / pérdida.

Gracias por su ayuda:)

Adjunto un archivo con el código de EA

Archivos adjuntos:
 
ivan-baaton:


Amigos, estoy estudiando MQL4 y decidí escribir un EA para el sistema Lazy Trader.
El EA está escrito, pero no funciona correctamente. El error que veo es que las órdenes no se cierran por tiempo. Puede ser que haya algún otro error.


Por favor, ayúdame a encontrar estos errores y dame tu opinión sobre el código que veas.

Aquí están las reglas del sistema para el que escribí el Asesor Experto:

1/ Al principio de la semana espera a que se cierre la primera vela de cuatro horas.
2/ Ponemos órdenes pendientes de Buy Stop y Sell Stop 20 pips por encima del High y 20 pips por debajo del Low de esta vela.
3/ El Stop Loss debe fijarse al nivel de la orden contraria. ElTake Profit no se coloca.
4/ Cuando la orden alcanza un beneficio, igual al stop loss, transferimos el stop al Breakeven (transferimos el stop loss de la posición a su precio de apertura).
5/ La segunda orden después de la activación de la primera, ¡NO REMOVER!
6/ Al final de la semana eliminamos / cerramos todas las órdenes, independientemente de su beneficio / pérdida.

Gracias por su ayuda:)

Adjunto el archivo con el código del asesor.

TimeHour(TimeCurrent()) == DayTimeClose

Esta igualdad absoluta puede ser muy rara y si se cierra la semana en 23, sería mejor cerrar las órdenes un poco antes, al menos durante 15 minutos. No he buscado otros errores. A primera vista, parece estar escrito con bastante precisión.

 
Alexey Viktorov:

Esta igualdad absoluta puede ser muy rara y si cierras la semana a 23, será mejor que cierres las órdenes un poco antes, al menos 15 minutos. No he buscado otros errores. A primera vista, parece estar escrito con bastante pulcritud.

El cierre de la semana es a las 00:00, es decir, cierro las órdenes 1 hora antes.


¿Qué está mal en este código:TimeHour(TimeCurrent()) == HoraCierreDía ?


Creo que hay un error en alguna parte de este código:


for (int i = OrdersTotal(); 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);
si (ticket_sell == false)
Print("Orden de venta no cerrada");
}

}


Gracias

 
ivan-baaton:

La semana se cierra a las 00:00, es decir, cierro las órdenes 1 hora antes.


¿Qué está mal en este código:TimeHour(TimeCurrent()) == HoraCierreDía ?


Creo que hay un error en alguna parte de este código:


for(int i = OrdersTotal(); 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);
si (ticket_sell == false)
Print("Orden de venta no cerrada");
}

}


Gracias

Eso es exactamente lo que señalé. Aunque ahora veo que estuve desatento. Sólo he visto resaltado TimeHour(TimeCurrent()). == DíaHoraCierre.

Pero el hecho de que el contador del bucle sea i y la orden k esté seleccionada, no lo vi enseguida.

 
Alexey Viktorov:

Eso es exactamente lo que señalé. Aunque ahora veo que estuve desatento. Sólo he visto resaltado TimeHour(TimeCurrent()) == DíaHoraCierre.

Pero el hecho de que el contador del bucle sea i y la orden k esté seleccionada, no lo vi enseguida.


Sí, esta K también está escrita envariables externas en la cabecera superior... Quizá sea el valor de retorno de alguna función...


Alexey, ¿qué puedes decir sobre mi problema? Intento adjuntar el trailing stop a las órdenes inversas. ¿Se ha encontrado alguna vez con un problema de este tipo?