通用EA框架 - MetaTrader 4程序库
- 显示:
- 7369
- 等级:
- 已发布:
- 2016.03.29 13:37
- 已更新:
- 2016.11.22 07:33
- 需要基于此代码的EA交易或指标吗?请在自由职业者服务中订购 进入自由职业者服务
有的时候, 我会有新的想法来实现新的策略, 并想在策略测试器中看到结果. 之前, 我会复制以前的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 Ltd译自英文
原代码: https://www.mql5.com/en/code/8625
用于读写 MySQL 的封装
OrdersSuite 修改版 2用于处理现货货币对, 现货黄金, 现货白银, 并含有错误处理的函数. OrderProcess() 已经加强. 增加了新的函数, Lots, OrderCloseByRetracement, OrderModifyTS 和 OrderSendI. 修改版 2 已经在EA中使用