下载MetaTrader 5

请观看如何免费下载自动交易

有趣的脚本?
因此发布一个链接 -
让其他人评价

喜欢这个脚本? 在MetaTrader 5客户端尝试它

程序库

通用EA框架 - MetaTrader 4程序库

| Chinese English 日本語 Русский Español Deutsch Português

显示:
2109
等级:
投票: 8
已发布:
2016.03.29 13:37
已更新:
2016.11.22 07:33

有的时候, 我会有新的想法来实现新的策略, 并想在策略测试器中看到结果. 之前, 我会复制以前的EA并把不想要的部分删掉
再加入我的新的内容, 这样就得到了新的EA. 过了一些时候, 我找到了一个新的方法. 我为我绝大多数未来的EA开发了一个框架模板.
当我考虑在一个EA中加入多个策略, 以在不同时间段(趋势, 波动...)中在其中做切换的时候, 我开发了它.
我需要EA框架, 使得可以把全部"操作"代码放在一起, 所有"策略"代码也放到一起. 我就有了今天与您分享的框架.

此EA的主要结构如下:

ActionCode - 这里包含了在EA中独立于策略之外的代码
StrategyCode - 这里包含了全部的策略代码

ActionCode 部分要做的每件事, 都是通过向 StrategyCode 部分做请求, 并返回结果, 然后再由通用的 ActionCode 部分做执行.

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


StrategyCode 部分

double Strategy(int STRATEGY, int COMMAND)
{
   switch(STRATEGY)
   {
// 策略的简要描述 
      case 1:
      {
         return(Strategy_001(COMMAND));
      }
// 策略的简要描述 
      case 2:
      {
         return(Strategy_002(COMMAND));
      }

//...

// 策略的简要描述
      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(建立买入仓位条件为 true)
            result = 1;

         break;
      }
      case _OPEN_SHORT:
      {
//         break;

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

         if(建立卖出仓位条件为 true)
            result = 1;

         break;
      }
      case _CLOSE_LONG:
      {
//         break;

         if(关闭 买入仓位条件为 true)
            result = 1;
            
            break;
      }
      case _CLOSE_SHORT:
      {
//         break;

         if(关闭 卖出仓位条件为 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);
}


您可以看到, 在框架中实现新的策略非常容易. 只要在 Strategy() 函数中加上新的 CASE, 再加上新的函数 Strategy_NNN() 以实现策略的规则.

本框架不能适用于所有的策略, 只能是一次建立一个仓位并有标准"工作流"的策略.

我把完整代码放到附件中作为示例, 实现了几个随意的策略(参见附加代码)

我希望您们能够被它所鼓舞也许您会有一些新的想法来提高这个概念.

由MetaQuotes Software Corp.从英文翻译成
官方代码: https://www.mql5.com/en/code/8625

MySQL 封装 MySQL 封装

用于读写 MySQL 的封装

OrdersSuite 修改版 2 OrdersSuite 修改版 2

用于处理现货货币对, 现货黄金, 现货白银, 并含有错误处理的函数. OrderProcess() 已经加强. 增加了新的函数, Lots, OrderCloseByRetracement, OrderModifyTS 和 OrderSendI. 修改版 2 已经在EA中使用

MacdPatternTraderv04. 双峰。从 200 - 1900。 MacdPatternTraderv04. 双峰。从 200 - 1900。

完美地操作期货。高盈利性。

МТ4 里的交易事件 МТ4 里的交易事件

这个程序库包括监控 MT4 客户终端里的交易事件外观的函数。