比特币通信协议 - 币圈消息

比特币通信协议篇11、二、TURN简介。在典型的情况下,TURN客户端连接到内网中,并且通过一个或者多个NAT到 详细

FOREX Combo 1.46--三种交易系统融合的EA,短线,波段,长线【详解】

[复制链接]
186 0
顺水的鱼 发表于 2013-3-25 20:12:00 | 只看该作者 |阅读模式 打印 上一主题 下一主题
本帖最后由 money365 于 2013-3-25 20:18 编辑
FOREX Combo 1.46是早年比较有名的商业系统,它是三种交易系统的组合,短线有抓回撤,波段有突破通道系统,有布林通道系统,(可用于15分钟)
  以下转贴此EA学习笔记:
 Forex Combo 1.46 详解笔记一
这个EA是有三种模式里面,我们都可以从它的参数得知这个EA拥有的模式。
extern bool Use_FXCOMBO_Scalping = TRUE;//剥头皮
extern bool Use_FXCOMBO_Breakout = TRUE;//趋势突破
extern bool Use_FXCOMBO_Reversal = TRUE;//逆势交易
EA给三种模式都设置了开关,给客户提供了方便的接口,可以单模式进行优化测试,的确很方便
extern bool Use_ECN_Broker = FALSE;//ECN平台的开关。
//ECN打开的话,下的订单都是没有止损止盈,都是从代码来实现的。
//三种模式的下单注释
extern string CommentSys1 = "==== 1 ====";
extern string CommentSys2 = "==== 2 ====";
extern string CommentSys3 = "==== 3 ====";
//三种模式的标识符
extern int Magic1 = 111;
extern int Magic2 = 222;
extern int Magic3 = 333;
//使用的最大点差
extern double MaxSPREAD = 4.0;
//下单的滑点
extern int Slippage = 2;
//自动判断时区(自动获取只有在不是测试模式下并且Auto是TRUE的情况)
extern bool AutoGMT_Offset = TRUE;
extern int GMT_Offset_TestMode = 2;//AutoGMT_Offset = FALSE的时候,GMT就由这个参数来设定
//是否采用有风险的资金管理(亏损加仓)
extern bool UseAgresiveMM = FALSE;
接下来是三种模式的资金管理(亏损加仓)设置
extern string MMSys1 = "==== FXCOMBO Scalping MM Parameters ====";
extern double LotsSys1 = 0.1;
extern double TradeMMSys1 = 0.0;
extern double LossFactorSys1 = 2.0;
int gi_196 = 0;
int gi_200 = 2;
int gi_204 = 0;
extern string MMSys2 = "==== FXCOMBO Breakout MM Parameters ====";
extern double LotsSys2 = 0.1;
extern double TradeMMSys2 = 0.0;
extern double LossFactorSys2 = 2.0;
int gi_240 = 0;
int gi_244 = 2;
int gi_248 = 0;
extern string MMSys3 = "==== FXCOMBO Reversal MM Parameters ====";
extern double LotsSys3 = 0.1;
extern double TradeMMSys3 = 0.0;
extern double LossFactorSys3 = 2.0;
int gi_284 = 0;
int gi_288 = 2;
int gi_292 = 0;
从上面我们可以看出三种模式都拥有6个参数。可以判断的是,三个模式的这6个参数的意义是一样的,并且最后三个参数已经写死了的。就是没有提供外部参数让客户改
我们接分析这6个参数具体意义
我们来看一下第一个参数LotsSys(我以LotsSys1为例子),我寻找一下有关于它的代码:我标注了一下。
      if  {
         //在LotsSys1和货币允许的最小最大手数之间通过MAX和MIN来获取合法的手数
         l_lots_392 = MathMin);
        if  l_lots_392 = MathMax / 100.0 * AccountFreeMargin / g_minlot_556 / , 0) * g_minlot_556));
         …………
         …………
        }
不难的看出,LotsSys1\2\3是三种模式的手数设定,在它下面还看到TradeMMSys这个参数的使用。
接着看看TradeMMSys这个参数:
if  l_lots_392 = MathMax / 100.0 * AccountFreeMargin / g_minlot_556 / , 0) * g_minlot_556));
从这句代码里面,我们可以看到一个函数CalcTradeMMSys1
double CalcTradeMMSys1 {
   int li_8;
   double ld_16;
   double ld_ret_0 = TradeMMSys1;
   int li_12 = 0;
   if  ld_16 = 0.01;
   else ld_16 = 0.0001;
  // 这个FOR循环,有意思,li_12记录着连续亏损的订单数量,gi_204这个参数也是6个参数之一,在这里大致的作用起一个盈利目标的作用
   for ; l_hist_total_24 >= 0; l_hist_total_24--) {//注意是订单的历史记录
      if ) {
         if   0.0) {
               if  break;
               if  - OrderOpenPrice) / ld_16 > gi_204) break;//符合盈利目标就跳出循环
            } else li_12++;
         }
      }
   }
//gi_196,gi_200,LossFactorSys1 这三个都是6个参数之一,这样一来我们就找到这个6个参数的所在地方了。
//不难看出呀,gi_196是连续亏损的参数设置,gi_200是用来计算幂
   if  {
   //大概的意思是:如果连续亏损次数>gi_196设定的次数并且设定gi_200大于1那么进入控制语句里面去
      li_8 = MathMod;
      //求得 li_12除以gi_200 的余数.按照默认的情况li_8有可能的结果为0,1
      ld_ret_0 *= MathPow;
      //通过计算得到li_8,用来做幂,底数为LossFactorSys1,返回的结果也有只有两种1,或者LossFactorSys1的值。这里还没完
      //MathPow得到的结果还需要与ld_ret_0相乘。ld_ret_0的值现在的情况应该是等于0, TradeMMSys1 就是ld_ret_0初始化时候的值.
   }
   if  ld_ret_0 = MMMax;
   //通过上面的计算还没完,得判断一下最后的结果是否在最大的允许范围内。超过就等于最大的,然后下面返回它的值
   return ;
}
这个函数用到了6个参数中的5个参数,其中有3个是官方不提供外部参数的,看来是过于复杂,担心客户接受不了还是什么的。
接着返回到函数调用处:
AccountFreeMargin 为 500
g_minlot_556 这个变量是货币的最小的手数 0.1
g_lotsize_576 这个是1个标准手数大小 10W
TradeMMSys1 = 1;默认为0,0的话无法启动这个亏损加仓机制,所以我们给它1,其他的参数的数值不改变
li_12 = 2;假设连续亏损2次
li_8 得到的结果 0
MathPow  得到结果 1
ld_ret_0 最后结果 1 并且小于 MMMax 那返回去
CalcTradeMMSys1 函数得到的结果应该为 1
CalcTradeMMSys1 / 100.0 * AccountFreeMargin / g_minlot_556 / 进入代入:
1/100*500/0.1/=0.05
可是NormalizeDouble结果是为0的。
MathMax就用最小手数0.1来下单了。证明在这个机制的情况,加仓的风险还是比较低比较安全的。
但如果要体现它这个资金管理是否合理,我们就需要大胆的改一下了:
AccountFreeMargin 为 10000
TradeMMSys1 = 3;
LossFactorSys1 = 3.0;
li_12 = 3 连续亏损3次
li_8 得到的结果 1
MathPow  得到结果 3
ld_ret_0 = 9.0 代入代码中 不详解
CalcTradeMMSys1  = 9.0
9/100*10000/0.1/1000 = 9.0
NormalizeDouble结果是为9
当然不可能是9手,后面还需要乘以0.1,之前因为等于0,所以没说需要NormailzeDouble的结果还需要乘以0.1
所以最后需要下的手数为0.9手
这个资金管理还是很周密的,如果有需要用到的话,根本可以提取代码。
通过保证金以及连续亏损次数得到一个适合自己的手数。真不错。
通过观察,我们现在就知道了这6个参数的作用。没有提供外部参数的3个参数要修改的话真的看你的需要了。毕竟这是少部分人。
========================
Forex Combo 1.46 详解笔记二
接着讲Forex Combo 1.46…… 睡不着还是来写完它比较踏实。这我认为是个不错的EA
上一次已经讲完它MM Parameters的参数作用以及前面参数的作用。
extern string CommonMM = "==== Main MM Parameters ====";
extern double MMMax = 20.0;
extern double MaximalLots = 50.0;
Main固然汉义过来是主要的意思。来看看这两个参数作用。
MMMax出现的代码处:
回顾上一遍的CalcTradeMMSys1\2\3函数,在这里的末尾都有出现:
if  ld_ret_0 = MMMax;
作用很明显主要来限制CalcTradeMMSys返回的最大值。如果大于MMMax就返回MMMax
MaximalLots出现的代码处:
if  l_lots_392 = MaximalLots;
l_lots_392变量是下单的手数,大概的作用也就是用于限制最大的下单手数。
这两个参数都是最基础,但是也是三种模式都共用的,所以才是主要资金管理参数的原因吧。
到下面的都是三种模式交易的参数:System Parameters
extern string Scalping = "==== FXCOMBO Scalping System Parameters ====";
extern int StopLoss = 300;
extern int TakeProfit = 21;
int g_period_336 = 60;
extern int TREND_STR = 20;
int g_period_344 = 18;
extern int OSC_open = 10;
extern int OSC_close = 13;
int gi_356 = -5;
int gi_360 = 21;
int gi_unused_364 = 21;
int gi_368 = 6;
StopLoss与TakeProfit:设置止损和止盈这个没什么疑问
g_period_336 = 60:这个参数也没有提供外部参数,那么我们看看这个参数出现的代码处
double l_ima_100 = iMA;
大家需要根据自己的代码来看来搜索,有可能反编译的变量名不一样,但如果出处一样这些的变量名称应该是一样。
大概看了一下 l_ima_100 是它用于判断交易值之一,g_period_336,是设置其均线周期。
TREND_STR:部分代码
double l_iclose_92 = iClose;
if  ld_40 = 0.01;
else ld_40 = 0.0001;
l_iclose_92 > l_ima_100 + TREND_STR * ld_40
判断前一根柱子的收盘价是否在均线值+TREND_STR的上面
由于代码太多,不太方便粘贴,只能在这里粗略的说说。大家应该看得懂这些参数的用意。
g_period_344这个参数没有提供外部参数,看看出现的代码处
double l_iwpr_108 = iWPR;
if  && Bid > l_iclose_92 + gi_356 * ld_40)
这是wpr的周期设置,顺便查看一下应用108变量的地方,这里还出现了OSC_close的变量。
OSC_open、OSC_close:
l_iwpr_108  l_iclose_92 + gi_356 * ld_40
Bid  l_iclose_92 + gi_356 * ld_40) ||  &&
            Bid > l_iclose_92 + gi_356 * ld_40 && Hour == li_196 || Hour == li_200)) {
            ls_400 = "SELL";
            l_cmd_28 = 1;
            l_color_24 = Red;
            RefreshRates;
            l_price_0 = NormalizeDouble;
            l_price_8 = l_price_0 + StopLoss * ld_40;
            l_price_16 = l_price_0 - TakeProfit * ld_40;
         }
在结合我们上面变量,大概应该可以知道Scalping交易的条件。
=========================
Forex Combo 1.46 详解笔记三
还是ForexCombo进行分析,依旧是它的Scalping模式,这个模式应该是三个模式中最好的,那么就值得大家去借鉴了。无数的借鉴这让你的EA更上一层楼。好的,我们进入主题,在二的笔记中,我截取了两段较长的代码,两段代码也是这个模式的主要交易代码,可能有些朋友是懂非懂的不知道这些代码的具体意义,于是我们又再详细了一下代码:
          if  && Bid  l_iclose_92 + gi_356 * ld_40) ||  &&
            Bid > l_iclose_92 + gi_356 * ld_40 && Hour == li_196 || Hour == li_200))
可以看到的与买单相反,这里不做过多的详细的讲解了。可以肯定的是,这个交易条件的成功率很高。那么我们可以占为己有。
看完Scalping的开单条件,那我们还需要来研究它的Close条件,Scalping不是靠止损和止盈,在回测的时候就可以看到它有Close事件,我们找找代码。
            if  == Magic1) {
               if  == OP_BUY) {
                  if  == 0.0) {
                     l_price_312 = NormalizeDouble;
                     l_price_320 = NormalizeDouble;
                     if , l_price_312) && CheckTarget, l_price_320)) OrderModify, OrderOpenPrice, l_price_312, l_price_320, 0, Green);
                  }
                  if  && Bid > l_iclose_92 + gi_356 * ld_40) {
                     RefreshRates;
                     OrderClose, OrderLots, NormalizeDouble, Slippage, Violet);
                  } else l_count_256++;
               } else {
                  if  == 0.0) {
                     l_price_312 = NormalizeDouble;
                     l_price_320 = NormalizeDouble;
                     if , l_price_312) && CheckTarget, l_price_320)) OrderModify, OrderOpenPrice, l_price_312, l_price_320, 0, Green);
                  }
                  if  && Bid  l_iclose_92 + gi_356 * ld_40) {
                     RefreshRates;
                     OrderClose, OrderLots, NormalizeDouble, Slippage, Violet);
                  }
这一段是平单的代码,这是买单的平单代码,wpr指标的>-OSC_close并且,买价大于前一根K线收盘价+gi_356个点的话,买单则平单。OSC_close在这里是13,大概这个平单条件比较轻重于WPR指标,如果WPR指标在-13上面,基本是一个超卖区,那么这时候就平掉多单。l_count_256是用来记录现在MAGIC1的买单数量的。
那么现在我们在来看看,卖单的平单代码:
                  if  == 0.0) {
                     l_price_312 = NormalizeDouble;
                     l_price_320 = NormalizeDouble;
                     if , l_price_312) && CheckTarget, l_price_320)) OrderModify, OrderOpenPrice, l_price_312, l_price_320, 0, Green);
                  }
上面这一段跟买单一样,判断是否没有设置止损,没有的话,设置止损。
                  if  && Bid = li_284) {
                     ld_344 = l_iatr_116 * ATRTrailingFactor2;
                     if  ld_344 = MaxPipsTrailing2 * ld_40;
                     if  ld_344 = MinPipsTrailing2 * ld_40;
                     if  > gi_428 * ld_40) ld_344 = gi_432 * ld_40;
                     l_price_352 = NormalizeDouble;
                     if  > ld_344) {
                        if   gi_428 * ld_40) ld_344 = gi_432 * ld_40;
gi_428  = 270 上面的参数设置的,gi_432 =20。这上面这句比较简单大概是盈利270点的话,那就ld_344=20点
                     if  ld_344 = MaxPipsTrailing2 * ld_40;
                     if  ld_344 = MinPipsTrailing2 * ld_40;
这另外两种获取止损位的计算方法,也比较简单,如果ATR在38以上则新的止损在Bid-MaxPipsTrailing2*ld_40,类似。如果在2以下则新的止损位在Bid-MinPipsTrailing2
大概就将移动止损的参数讲完了。大家自己去体会。接着往下看Break=13这个参数它的代码出处:
                  if  {
                     RefreshRates;
                     OrderClose, OrderLots, NormalizeDouble, Slippage, Violet);
                  } else l_count_264++;
double l_iclose_148 = iClose;
double ld_140 = l_ima_124 - l_iatr_116 * gd_408;
double gd_408 = 1.4; 这是上面的参数设置之一,也是没有提供外部接口的参数
double l_ima_124 = iMA; double l_iatr_116 = iATR;
g_period_404\g_period_400\gd_408这3个上面的变量都用到了。得代入进去。
这里的原理构成了一个以H1为主的通道。如果5分钟的收盘价跌破了前一个小时的通道下轨,那么就确定下降趋势已经形成。。
这时候平单离场,到现在为止有提供extern外部参数的变量基本都是平单或者移动止损的参数,仿佛没有开单的外部参数可以设置当然排除止损止盈。那么我们看看这个模式的开单条件是如何。。
            if  {
               ls_400 = "SELL";
               l_cmd_28 = 1;
               l_color_24 = Yellow;
               l_price_0 = NormalizeDouble;
               l_price_8 = l_price_0 + StopLoss_II * ld_40;
               l_price_16 = l_price_0 - TakeProfit_II * ld_40;
            }
            if  {
               ls_400 = "BUY";
               l_cmd_28 = 0;
               l_color_24 = DodgerBlue;
               l_price_0 = NormalizeDouble;
               l_price_8 = l_price_0 - StopLoss_II * ld_40;
               l_price_16 = l_price_0 + TakeProfit_II * ld_40;
            }
ForexCombo写的真的很规范很工整,非常喜欢。
我们拿卖单的条件来说事: if
l_count_268 这个Magic2的买单数量。
l_iclose_148 前一根K线的5分钟收盘价
看到这里我们应该明白了吧,这不是买单的平仓条件吗?
5分钟的K线的收盘价,抵触1小时的通道,平多开空。大家可以将这个通道给写出来。这应该没什么难题。
发现下面还有很多的参数没有讲到模式二已经讲得差不多了,我们具体去找找每个变量用到的地方。
gi_424 = 300;
int li_284 = g_datetime_584 + gi_424;
这个是OrderModify的间隔单位是秒。300秒,也就是OrderModify每5分钟修改一次止损。而不是不停的修改。这种好坏各占多少呢。
   int li_212 = gi_436 + li_48;
   int li_216 = gi_440 + li_48;
   int li_220 = gi_444 + li_48;
   int li_224 = gi_448 + li_48;
   int li_228 = gi_452 + li_48;
   int li_232 = gi_456 + li_48;
   int li_236 = gi_460 + li_48;
   int li_240 = gi_464 + li_48;
   int li_244 = gi_468 + li_48;
   int li_248 = gi_472 + li_48;
   int li_252 = gi_476 + li_48;
   if  li_212 -= 24;
   if  li_212 += 24;
   if  li_216 -= 24;
   if  li_216 += 24;
   if  li_220 -= 24;
   if  li_220 += 24;
   if  li_224 -= 24;
   if  li_224 += 24;
   if  li_228 -= 24;
   if  li_228 += 24;
   if  li_232 -= 24;
   if  li_232 += 24;
   if  li_236 -= 24;
   if  li_236 += 24;
   if  li_240 -= 24;
   if  li_240 += 24;
   if  li_244 -= 24;
   if  li_244 += 24;
   if  li_248 -= 24;
   if  li_248 += 24;
   if  li_252 -= 24;
   if  li_252 += 24;
这个很显然的东西阿。又是计算交易的小时数。
   if ) != li_212 && TimeHour) != li_216 && TimeHour) != li_220 && TimeHour) != li_224 && TimeHour) != li_228 &&
      TimeHour) != li_232 && TimeHour) != li_236 && TimeHour) != li_240 && TimeHour) != li_244 && TimeHour) != li_248) ||
      !) != li_252)) {
看来在很多的小时数,这个模式都被限制了交易。这种写法还挺怪异的,实际可以写的很明了,这里给人错觉是不等于才可以交易,实际是必须在我们得到的小时数里交易。
}
我这边的数据是:1、3、4、7、8、9、10、14、15、18、19
这个测试一下就知道了。
这个模式得优化呀。。。。
通过我们的工具,知道它,耗费了很多很好的盈利。比如一个订单最大获利过211点,但是平单的时候只有111点盈利。然后还有更离谱的,99点的盈利最后亏损平单。真是瞎了。很多的订单的都可以成功获利的。
=================================
Forex Combo 1.46 详解笔记五
继续探讨一下,模式二,我将继续分享。
为此,我尝试将1H的通道构造出来。这个通道包含着它如何开仓,平仓的原理,可是肉眼看不见,这是件烦人的事情。于是决定给FOREX COMBO 制作其交易原理的指标,使大家能一目了然。如图
看到这幅图,大概就知道模式二的交易原理了吧,所以说,非常简单,虽然不说盈利能力很强,但是真的有效果的。再利用我们的工具回测里面,30点止损,可是有很多的订单都曾经获得几十以上的盈利,只是它移动止损机制,无法及时捕获盈利,所以导致看上很坎坷。
看完模式2的我们返回去看看模式1的交易图又是怎样的。模式1相对模式2要繁杂多了。自己写了2个辅助指标帮盘面更加清晰:
这里符合三个要素:WPR指标,轨道之上,现价>前一根K线收盘价N点,进场做多单,这是一个漂亮的多单。这是模式2近一年的两种情况的测试,一个没有参数优化,一个是优化过后的。
收藏
收藏0
转播
转播
分享
分享
分享
淘帖0
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

发布主题
阅读排行更多+

Powered by 顺水鱼MT4外汇EA网! X3.2© 2001-2017 顺水MT4外汇EA公司.( 陕ICP备17014341号-1