Descargar MetaTrader 5

Mira cómo descargar robots gratis

¿Es interesante este script?
Deje un enlace a él, ¡qué los demás también lo valoren!

¿Le ha gustado el script?
Evalúe su trabajo en el terminal MetaTrader 5

Librerías

EA Universal scheme - librería para MetaTrader 4

| Spanish English 日本語 Русский 中文 Deutsch Português

Visualizaciones:
189
Ranking:
votos: 7
Publicado:
2016.05.23 07:48
Actualizado:
2016.11.22 07:33

Vez en cuando que me sale una nueva idea acerca de alguna estrategia nueva para aplicar y ver resultados en el probador de estrategias. Antes, todavía copié mi EA anterior y elimininé todo lo que me indesaba
y añadí cosas nuevas, por lo que el resultado fue el nuevo EA. Hace algún tiempo encontré una mejor manera para mí. He desarrollado una plantilla o esquema para la mayor parte de mis futuros EAs.
Esto sucedió cuando estaba pensando en más estrategias en un EA y de conmutación entre ellas, según un período (tendencia, agitación,...).
Necesitaba un esquema de EA que me permite tener todo el código de la "acción" junto y todo el código "estrategia" junto. Llegué a un esquema que quiero compartir hoy con vosotros.

La estructura principal de este EA es el siguiente:

ActionCode - contiene código independiente de la estrategia implementada en este EA
StrategyCode - contiene código de toda la estrategia

Cada uno hace algo, la parte ActionCode para decidir lo que hay que hacer, se pide llamando a la parte StrategyCode, la cual devuelve un resultado, que puede ser ejecutado de nuevo por parte universal ActionCode.

Parte ActionCode

int   _STRATEGY_NUMBER              = 1;

#define     _OPEN_LONG                    1
#define     _OPEN_SHORT                   2
#define     _CLOSE_LONG                   3
#define     _CLOSE_SHORT                  4
#define     _GET_LONG_STOPLOSS_PRICE      5
#define     _GET_SHORT_STOPLOSS_PRICE     6
#define     _GET_LONG_TAKEPROFIT_PRICE    7
#define     _GET_SHORT_TAKEPROFIT_PRICE   8
#define     _GET_LOTS                     9
#define     _GET_TRAILED_STOPLOSS_PRICE   10
#define     _GET_TRAILED_TAKEPROFIT_PRICE 11
#define     _GET_TRADED_TIMEFRAME         12
#define     _OPEN_PENDING_BUY_STOP        13
#define     _OPEN_PENDING_SELL_STOP       14
#define     _OPEN_PENDING_BUY_LIMIT       15
#define     _OPEN_PENDING_SELL_LIMIT      16
#define     _GET_PENDING_BUY_STOP_PRICE   17
#define     _GET_PENDING_SELL_STOP_PRICE  18
#define     _GET_PENDING_ORDER_EXPIRATION 19

int start()
{
   double            Stoploss          = 0;
   double            TakeProfit        = 0;
   
   if(LastBarTraded())
      return(0);

   if(OrdersTotal() > 0)
   {
      Stoploss = Strategy(_STRATEGY_NUMBER, _GET_TRAILED_STOPLOSS_PRICE);
      TakeProfit = Strategy(_STRATEGY_NUMBER, _GET_TRAILED_TAKEPROFIT_PRICE);
   
      if(Stoploss != 0 || TakeProfit != 0)
         ModifyAllPositions(_MAGICNUMBER, Stoploss, TakeProfit);

      if(Strategy(_STRATEGY_NUMBER, _CLOSE_LONG) == 1)
         CloseAllLongPositions(_MAGICNUMBER);
      if(Strategy(_STRATEGY_NUMBER, _CLOSE_SHORT) == 1)
         CloseAllShortPositions(_MAGICNUMBER);
   }
   

   if(!TradeAllowed(1))
      return(0);

   if(Strategy(_STRATEGY_NUMBER, _OPEN_LONG) == 1)
      OpenPosition(false, Strategy(_STRATEGY_NUMBER, _GET_LOTS), Strategy(_STRATEGY_NUMBER, _GET_LONG_STOPLOSS_PRICE), 
      Strategy(_STRATEGY_NUMBER, _GET_LONG_TAKEPROFIT_PRICE), 3, _MAGICNUMBER);
   if(Strategy(_STRATEGY_NUMBER, _OPEN_SHORT) == 1)
      OpenPosition(true, Strategy(_STRATEGY_NUMBER, _GET_LOTS), Strategy(_STRATEGY_NUMBER, _GET_SHORT_STOPLOSS_PRICE), 
      Strategy(_STRATEGY_NUMBER, _GET_SHORT_TAKEPROFIT_PRICE), 3, _MAGICNUMBER);

   if(Strategy(_STRATEGY_NUMBER, _OPEN_PENDING_BUY_STOP) == 1)
      OpenPendingPosition(false, Strategy(_STRATEGY_NUMBER, _GET_LOTS), Strategy(_STRATEGY_NUMBER, _GET_PENDING_BUY_STOP_PRICE), 
      Strategy(_STRATEGY_NUMBER, _GET_LONG_STOPLOSS_PRICE), Strategy(_STRATEGY_NUMBER, _GET_LONG_TAKEPROFIT_PRICE), 3, _MAGICNUMBER, 
      Strategy(_STRATEGY_NUMBER, _GET_PENDING_ORDER_EXPIRATION));
   if(Strategy(_STRATEGY_NUMBER, _OPEN_PENDING_SELL_STOP) == 1)
      OpenPendingPosition(true, Strategy(_STRATEGY_NUMBER, _GET_LOTS), Strategy(_STRATEGY_NUMBER, _GET_PENDING_SELL_STOP_PRICE), 
      Strategy(_STRATEGY_NUMBER, _GET_SHORT_STOPLOSS_PRICE), Strategy(_STRATEGY_NUMBER, _GET_SHORT_TAKEPROFIT_PRICE), 3, _MAGICNUMBER, 
      Strategy(_STRATEGY_NUMBER, _GET_PENDING_ORDER_EXPIRATION));

   return(0);
}


Parte StrategyCode

double Strategy(int STRATEGY, int COMMAND)
{
   switch(STRATEGY)
   {
// Descripción breve de la estrategia
      case 1:
      {
         return(Strategy_001(COMMAND));
      }
// Descripción breve de la estrategia
      case 2:
      {
         return(Strategy_002(COMMAND));
      }

//...

// Short description of strategy
      case 99:
      {
         return(Strategy_099(COMMAND));
      }
   }

   return(0);
}


double Strategy_001(int COMMAND)
{
   string   _SYMBOL        = Symbol();
   int      _TIMEFRAME     = getStrategyTimeframeByNumber(_STRATEGY_TIMEFRAME);
         
   double   result         = 0;
   
   int      i;

   switch(COMMAND)
   {
      case _OPEN_LONG:
      {
//         break;

//         if(!OpenNewBar())
//            break;

         if(Open long condition is true)
            result = 1;

         break;
      }
      case _OPEN_SHORT:
      {
//         break;

//         if(!OpenNewBar())
//            break;

         if(Open short condition is true)
            result = 1;

         break;
      }
      case _CLOSE_LONG:
      {
//         break;

         if(Close long condition is true)
            result = 1;
            
            break;
      }
      case _CLOSE_SHORT:
      {
//         break;

         if(Close short condition is true)
            result = 1;
            
            break;
      }
      case _GET_LONG_STOPLOSS_PRICE:
      {
//         break;

         result = Long SL price
         
         break;
      }
      case _GET_SHORT_STOPLOSS_PRICE:
      {
//         break;

         result = Short SL price
         
         break;
      }
      case _OPEN_PENDING_BUY_STOP:
      {
         break;
      }
      case _OPEN_PENDING_SELL_STOP:
      {
         break;
      }
      case _GET_PENDING_BUY_STOP_PRICE:
      {
         break;
      }
      case _GET_PENDING_SELL_STOP_PRICE:
      {
         break;
      }
      case _GET_LONG_TAKEPROFIT_PRICE:
      {
         break;
      }
      case _GET_SHORT_TAKEPROFIT_PRICE:
      {
         break;
      }
      case _GET_TRAILED_STOPLOSS_PRICE:
      {
         break;
      }      
      case _GET_TRAILED_TAKEPROFIT_PRICE:
      {
         break;
      }
      case _GET_LOTS:
      {
         result = Lot amount;

         break;
      }
      case _GET_TRADED_TIMEFRAME:
      {
         result = _TIMEFRAME;

         break;
      }
      case _GET_PENDING_ORDER_EXPIRATION:
      {
         break;
      }
   }
      
   return(result);
}


Se puede ver que la aplicación de la nueva estrategia en este esquema es muy fácil. Sólo poner un nuevo CASO en la función Strategy() y agrega una nueva función Strategy_NNN() con las reglas de la estrategia implementada.

Este esquema no se ajusta a cualquier estrategia, solo para los que abren una posición en el tiempo y tienen un nivel de "workflow".

Como ejemplo adjunto código completo con estrategia de pocas perdidas implementada (véase código)

Espero que muchos de vosotros podáis inspiraros en esto y tal vez vengan algunas nuevas ideas, para mejorar este concepto.

Traducción del inglés realizada por MetaQuotes Software Corp.
Artículo original: https://www.mql5.com/en/code/8625

STik STik

Otro indicador que muestra el gráfico de ticks, que sería útil para los pipsers. Tiene algunas características.

MySQL wrapper MySQL wrapper

Wrapper para leer y escribir en MySQL

Waddah Attar Weekly Fibo Waddah Attar Weekly Fibo

Otro indicador Fibo.

Ryan_Jones_SM Ryan_Jones_SM

Muestra dónde comprar y donde vender a través de las flechas. Si una tendencia se produce luego traerá beneficio, si no hay ninguna tendencia, no habrá ningún beneficio.