顺水外汇EA交易网MT4
标题:
【资源组】详解kitgain版汉化CaspianEA.GBP(里海剥头皮EA)
[打印本页]
作者:
kitgain
时间:
2018-1-11 00:41
标题:
【资源组】详解kitgain版汉化CaspianEA.GBP(里海剥头皮EA)
最近在继续学习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上,免得出错。
吃完饭,接着发,稍候精彩继续...
作者:
kitgain
时间:
2018-1-11 01:44
补充一下,看国外讨论,CapianEA似乎是针对亚洲时段,FXOPEN平台的22~24点时间,不知有没有哪位汇友知道FXOPEN服务器是GMT+?的
go on
【甲类的前置条件】
交易时间检查IsTradeTime()
订单总数= Ask + 20.0 * 货币点。Ask价格在昨天八周期MA下方的20点之内。
[C] 纯文本查看 复制代码if (!订单分类开关) 止盈 = Ask + TakeProfit * 货币点;
止损 = Ask - StopLoss * 货币点;//止损30点
这个止盈、止损设置是否合理,需要各位看官给个意见,上述止盈应该是不起作用的,“订单分类开关”缺省值是TRUE。
【甲类卖单开仓条件】
六周期M15CCI > 70.0
或 贰拾周期M1RSI > 64.0
且 昨八周期MA2 纯文本查看 复制代码if (六周期M15CCI 40.0) {
甲类卖单状态 = TRUE;
甲类买单状态 = TRUE;
}
震荡区间,可改状态,准备开单。这种代码写法是为了防止重复开单用的。
【乙类的前置条件】
交易时间检查IsTradeTime()
订单总数= 150.0 且 贰佰壹周期M1CCI >= 120.0 )
或 (十四周期M15CCI >= 150.0 且 贰佰壹周期M1CCI >= 120.0)
且 Ask >= 分形M15中间值 + CaspianFactor * 货币点)
止盈位缺省是分形M15的下限。
十四周期M15CCI在【-50,+50】之间处于震荡状态。
【丙类】
前置较少,不提也罢。
四周期M5动量>=99.85 且 八十周期的M1 CCI指标200,且Ask价格在分形M15中间值以上5点开外,下卖单,止盈位为M15上限,这里的止损位跟买单不同,需要留心一下。
八十周期的M1的CCI在【-50,50】之间处于震荡状态,意思是为下一步开单做准备。
【丁类】
前置较少,不提也罢。
同时满足以下三个条件,开买单:
拾肆周期M5WPR -10.0
M5MA高 >昨日贰拾周期M5布林上限
Bid>=分形M15中间值 + 5点
六周期M15的CCI在【40,60】之间处于震荡,为下一步开单做准备。
IsTradeTime()函数,缺省设置了,在每个小时的最后5分钟,不交易,这种方法也值得学习。看起来这个ea喜欢在稳定行情下剥1点到数点的头皮,行情大了,玩不起。
好了,下载时间到了,我向来不设置金币购买等限制咯,希望各位汇友多给点金币评分哦,又不扣减你的金币的,赠人玫瑰,手有余香!
作者:
浪漫满屋-
时间:
2018-1-11 02:41
感谢楼主的辛勤付出~~~~
作者:
admin
时间:
2018-1-11 04:13
顶精品 促研究
作者:
人民币
时间:
2018-1-11 04:20
路过。。看下解析。
作者:
翘楚以待
时间:
2018-1-11 04:33
感谢楼主的辛勤付出~~~~
作者:
hzzh2009
时间:
2018-1-11 05:26
好专业。好深奥。
作者:
psp
时间:
2018-1-11 06:29
看不懂,没那个技术
作者:
dashayuyu
时间:
2018-1-11 07:04
感谢楼主的辛勤付出~~~~
作者:
好起来了
时间:
2018-1-11 07:56
520FX有你更精彩!
作者:
zw0806
时间:
2018-1-11 08:43
感谢楼主的辛勤付出~~~~
作者:
lcjxau
时间:
2018-1-11 08:49
看在你写的那么辛苦的份上,顶一个
作者:
qiaqia
时间:
2018-1-11 09:50
谢谢分享
作者:
bhl
时间:
2018-1-11 10:40
感谢楼主的辛勤付出~~~
作者:
子泉
时间:
2018-1-11 10:50
建议 胡老师和王老师讲课后,让他也讲讲课
专门研究ea使用,调试,参数设置等
编程学不会,使用还是要学好的
欢迎光临 顺水外汇EA交易网MT4 (http://waterforex.com/)
Powered by Discuz! X3.2