最近在继续学习MT4编程过程中,接触到CaspianEA,中文称作“里海EA”(Caspian是里海的意思),群里今年年初已经发布了,网址是http://www.520fx.com/forum.php?mod=viewthread&tid=41038&extra=&page=1。这个ea是2009年在国外非常火,争议也大的一个ea,官方宣称是“行星地球第一大ea”,提供的测试报告数据,也是好的惊人。暂不论好坏,这也说明坛子里有好多宝贝,需要各位汇友认真发掘,吸取前人包括洋鬼子的精华之处,为我所用。
这个EA似乎是阿拉伯人搞的,后来被其它人指出是大尺寸剽窃Dragonpips EA(我比较了一下,确实95%以上雷同),而后者是从Thunder4WD改造来的,另有人反映后者(Dragonpips EA)会制造巨大损失,而前者(CaspianEA)不会。是不是好用,需要各位测试,小手数用于实盘试试。我很纳闷的地方是,这个ea是剥头皮的,每次赢利1点到数点,但原ea的测试结果,显示单次大量赢利,已不是剥头皮的风格呀,看懂源码,也没发现有什么特别的地方,所以感觉很奇怪真有宣称的超高胜率和盈亏比么?
可能受此影响,CapianEA的官方网站、demo账户、官方测试报告,我已从google搜索不到了,但还能找到国外坛子里一些残留的信息,用来反思这个EA。
本人将其汉化核心部分,以方便同等水平的汇友研读,同时老办法,去除冗余代码、参数、函数等,让核心代码显示出来。另外kitgain发帖,必属精品,但我也缺金币,恳请各位看官积极加分,方便我从坛子里继续发掘、汉化、公开源码,大大减轻你学习MT4的劳动量!
本贴,我将择要公布源码,抛砖引玉,方便讨论,希望有兴趣的朋友直接加我qq7318875,直接开门见山提问,共同探讨,纯技术沟通,不要打广告、打听个人隐私问题,时间久了,自然就是好朋友了。
现在开始,
CaspianEA有两个ex4文件和一个dll文件,这次我只讨论EURGBP这个源码(EA全称是CaspianEA.GBP),EURCHF的,我还没分析,之后我再发布新帖。dll文件是与EURCHF相关,与EURGBP无关,另外有的CaspianEA版本引入了windows自带的dll文件,无需另外下载。Anyway,下载我的汉化版更好些,免得看的眼花缭乱,当然有意深入探讨各种流传版本的,可都打开源码看看。
外部参数设置如下,
[C] 纯文本查看 复制代码extern string PartOne = "Trading Configurations";
extern int CaspianFactor = 5; //5点目标值,取了名为里海因子,只是个名字而已
extern int MaxTrades = 5; //最多开5单
extern double TakeProfit = 5.0;//原为4,我是4点点差平台,所以我改成5点止盈目标了
extern double StopLoss = 30.0;//止损30点,所以不应该有大的亏损呀
extern int MagicNumber = 6666;//必须得设,后面有好几种不同订单,通过魔术号码区别
extern int Slippage = 3;
extern string PartTwo = "Money Management Configurations";
extern bool UseMoneyManagement = TRUE; //资金管理开关
extern int Risk = 10;
extern double Lots = 0.1;
extern int LotsDigit = 1;
extern string PartThree = "Time Configurations";
extern int StartHour = 22;//就不要改了,先试试缺省的开始和结束时间吧,似乎没有调整时差功能,这是不是个bug?
extern int EndHour = 24;
非外部参数,就不详列了,可打开源码查看。(若出现不能编辑,可使用旧版本的MetaEditor)
现在看主函数,
[C] 纯文本查看 复制代码交易结束时间 = EndHour + 1;//说明这个ea喜欢在西方时间的半夜折腾
if (交易结束时间 > 24) 交易结束时间 -= 24;
int 魔术号码1 = MagicNumber + 1;
int 魔术号码2 = MagicNumber + 2;
int 魔术号码3 = MagicNumber + 3;
HideTestIndicators(TRUE);//隐藏测试指标,不清楚作用,貌似叉掉也不影响使用
//findMyOrders();//这个函数感觉没啥作用,被我连窝咔嚓了。
onScreenComment(98);//显示版本信息的,留着吧,知道我也做点贡献,汉化过:)
接下来计算分形指标,源码为:
[C] 纯文本查看 复制代码for (int i = 1; i
这里本来我认为无需使用for语句遍历循环,提出异议,结果当天就有资源组朋友指出,分形指标计算至少需要5柱,这下又让我长了见识,感谢这位朋友!也希望大家能互相交流,共同进步!
接下来,使用一条语句
[C] 纯文本查看 复制代码if (Close[0] = 分形H1下值) 在H1分形通道中 = TRUE;
判断是否在H1分形的通道中的状态,留作后用。
接着统计甲、乙、丙、丁四类订单的数量,如果大家喜欢,也可使用“戊、己、庚、辛”等天干地支来取个名,反正我是看反编译的英文代码,烦透了!其它用不着的统计开盘价的,都被核实清楚后,删除了这些冗余代码,各位看官更容易抓住这个ea的核心策略了。
[C] 纯文本查看 复制代码if (订单分类开关 == TRUE) {
for (i = 0; i = OrderOpenPrice() + TakeProfit * 货币点) {
//甲类
RefreshRates();
OrderClose(OrderTicket(), OrderLots(), Bid, Slippage, Orange);
}
}
if (OrderType() == OP_BUY && OrderMagicNumber() == 魔术号码1) {
if (Bid >= OrderOpenPrice() + (TakeProfit - 2.0) * 货币点) {
RefreshRates();
OrderClose(OrderTicket(), OrderLots(), Bid, Slippage, Orange);
}
}
if (OrderType() == OP_BUY && OrderMagicNumber() == 魔术号码2) {
if (Bid >= OrderOpenPrice() + (TakeProfit - 1.0) * 货币点) {
RefreshRates();
OrderClose(OrderTicket(), OrderLots(), Bid, Slippage, Orange);
}
}
if (OrderType() == OP_BUY && OrderMagicNumber() == 魔术号码3) {
if (Bid >= OrderOpenPrice() + (TakeProfit - 2.0) * 货币点) {
RefreshRates();
OrderClose(OrderTicket(), OrderLots(), Bid, Slippage, Orange);
}
}
......//卖单同理
}
}
上述代码,针对甲乙丙丁四类订单,平仓动作,可以看出,赢利目标很少。
[C] 纯文本查看 复制代码if (状态2 == TRUE) {
for (int ticket = 0; ticket 60 * 一段
&& TimeCurrent() - OrderOpenTime() = OrderOpenPrice() + 头皮1 * 货币点) {
//一段=60,二段=140,头皮1=3
//在60~140分钟内强行平仓
RefreshRates();
OrderClose(OrderTicket(), OrderLots(), Bid, Slippage, Orange);
Print("Prot. Level 1 - Close Price :" + DoubleToStr(OrderClosePrice(), 4) + " Lots : " + DoubleToStr(OrderLots(), 2) + " Order Number : " + DoubleToStr(OrderTicket(), 0) +
" Profit : $ " + DoubleToStr(OrderProfit(), 2));
}
... ...
上段开始对不同的时间段,执行不同目标的平仓,可以看出目标价位仍然很小,确实在剥头皮。
注意代码
[C] 纯文本查看 复制代码if (DayOfWeek() == 5 && Hour() >= 19) {
//一周尾盘平仓
RefreshRates();
OrderClose(OrderTicket(), OrderLots(), Bid, Slippage, Orange);
Print("Prot. Level 5 - Close Price :" + DoubleToStr(OrderClosePrice(), 4) + " Lots : " + DoubleToStr(OrderLots(), 2) + " Order Number : " + DoubleToStr(OrderTicket(), 0) +
" Profit : $ " + DoubleToStr(OrderProfit(), 2));
}
显示在周五尾盘,是强行平仓的。这是不是大回撤的错误来源?
[C] 纯文本查看 复制代码 if (状态3 == TRUE) {
if (iOpen(Symbol(), PERIOD_M5, 0) >= Ask + gd_300) return;//0.001
if (iOpen(Symbol(), PERIOD_M5, 0) = Ask + gd_308) return;//0.001
if (iOpen(Symbol(), PERIOD_M5, 1) = Ask + gd_316) return;//0.0012
if (iOpen(Symbol(), PERIOD_M5, 2)
上段代码,我们可以猜测是不参与跳空行情,这种代码方法,我是受教了,你呢?
接下来的一句很简单的代码
[C] 纯文本查看 复制代码if (Ask - Bid > 点差允许水平 * 货币点) return (0);
明白无误地告诉大家,平台点差,或浮动点差超过点差允许水平(缺省是4点)的,这个ea不会工作,这也说明,不看懂ea,茫然使用ea是错误的。很多洋鬼子抱怨这个ea不工作,其实就是这句语句在起作用呀!
接下来的是资金管理代码,懒得分析其逻辑,反正有MM的ea都不错,这个地球人都知道。
然后是使用常规指标赋值计算,
[C] 纯文本查看 复制代码 double 六周期M15CCI = iCCI(NULL, PERIOD_M15, 6, PRICE_CLOSE, 0);
double 贰拾周期M1RSI = iRSI(NULL, PERIOD_M1, 20, PRICE_CLOSE, 0);
double 昨八周期MA1 = NormalizeDouble(iMA(NULL, 0, 8, 0, MODE_SMA, PRICE_WEIGHTED, 1), 4);
//当前时框,建议值是M15
double 昨八周期MA2 = NormalizeDouble(iMA(NULL, 0, 8, 0, MODE_SMA, PRICE_WEIGHTED, 1), 4);
double 十四周期M15CCI = iCCI(Symbol(), PERIOD_M15, 14, PRICE_CLOSE, 0);
double 四十二周期M5CCI = iCCI(Symbol(), PERIOD_M5, 42, PRICE_CLOSE, 0);
double 贰佰壹周期M1CCI = iCCI(Symbol(), PERIOD_M1, 210, PRICE_CLOSE, 0);
double 捌拾周期M1CCI = iCCI(Symbol(), PERIOD_M1, 80, PRICE_CLOSE, 0);
double 肆周期M5动量 = iMomentum(Symbol(), PERIOD_M5, 4, PRICE_CLOSE, 0);
double 拾肆周期M5WPR = iWPR(Symbol(), PERIOD_M5, 14, 0);
double 昨日贰拾周期M5布林上限 = iBands(Symbol(), PERIOD_M5, 20, 2, 0, PRICE_WEIGHTED, MODE_UPPER, 1);
double 昨日贰拾周期M5布林下限 = iBands(Symbol(), PERIOD_M5, 20, 2, 0, PRICE_WEIGHTED, MODE_LOWER, 1);
double M5MA高 = iMA(Symbol(), PERIOD_M5, 1, 0, MODE_EMA, PRICE_HIGH, 0);
double M5MA低 = iMA(Symbol(), PERIOD_M5, 1, 0, MODE_EMA, PRICE_LOW, 0);
后面用不着的,已经被我咔擦了,各位看官是不是赶紧给我加金币啊,我做了很多删除冗余代码的工作啦,你看源码,直接晕倒!需要提醒大家的是,由于使用NULL参数,使用时应该把图表放在EURGBP M15上,免得出错。
吃完饭,接着发,稍候精彩继续...
|