开拓者期货期权程序化系统交易论坛

标题: 再发个简单的双均线系统,提供源码 [打印本页]

作者: 穿堂风    时间: 2011-6-22 12:43:08     标题: 再发个简单的双均线系统,提供源码

很古老的均线系统,随手写的,初学者可以参考
根据核心原理,大家可以拿去扩充一下,我刚才试着扩充加入其它因子,提升不大,可能是没找到合适的组合吧
RB 1H周期,malen1=10,malen2=50
[attach]4713[/attach]
[attach]4714[/attach]
作者: 穿堂风    时间: 2011-6-22 12:43:47

  1. //------------------------------------------------------------------------
  2. // 简称:
  3. // 名称:
  4. // 类别: 公式应用
  5. // 类型: 用户应用
  6. // 输出: 穿堂风
  7. //------------------------------------------------------------------------

  8. Params
  9. Numeric maLen1(10);
  10. Numeric maLen2(50);
  11. Numeric lots(1);
  12. Numeric offset(0);
  13. Vars
  14. Numeric ma1;
  15. Numeric ma2;
  16. Numeric i_offset;

  17. Begin

  18. ma1 = Average(Open,maLen1);
  19. ma2 = Average(Open,maLen2);

  20. PlotNumeric("ma1",ma1);
  21. PlotNumeric("ma2",ma2);

  22. i_offset = offset*MinMove*PriceScale;
  23. If(CurrentBar > maLen2)
  24. {
  25.         If(MarketPosition == 0)
  26.         {
  27.                 If(Open>ma1 and ma1>ma2)
  28.                 {
  29.                         Buy(lots,Open+i_offset);
  30.                         Return;
  31.                 }

  32.                 If(Open < ma1 and ma1<ma2)
  33.                 {
  34.                         SellShort(lots,Open-i_offset);
  35.                         Return;
  36.                 }
  37.         }

  38.         If(MarketPosition == 1)
  39.         {
  40.                 If(Open < ma1)
  41.                 {
  42.                         Sell(lots,Open-i_offset);
  43.                         Return;
  44.                 }
  45.         }

  46.         If(MarketPosition == -1)
  47.         {
  48.                 If(Open > ma1)
  49.                 {
  50.                         BuyToCover(lots,Open+i_offset);
  51.                         Return;
  52.                 }
  53.         }
  54. }
  55. End


  56. //------------------------------------------------------------------------
  57. // 编译版本        GS2010.12.08
  58. // 用户版本        2011/06/21 15:59
  59. // 版权所有        穿堂风
  60. // 更改声明        TradeBlazer Software保留对TradeBlazer平台
  61. //                        每一版本的TrabeBlazer公式修改和重写的权利
  62. //------------------------------------------------------------------------
复制代码

作者: kings425    时间: 2011-7-6 23:40:03

I_Offset  是滑点吧


If(MarketPosition == 0)
        {
                If(Open>ma1 and ma1>ma2)
                {
                        Buy(lots,Open+i_offset);
                        Return;
                }

                If(Open < ma1 and ma1<ma2)
                {
                        SellShort(lots,Open-i_offset);
                        Return;
                }
        }

两个Return有什么意义呢?第一个是不是Returen之后程序不再执行     If(Open < ma1 and ma1<ma2)及之后的判断,请指教一下
作者: kings425    时间: 2011-7-7 00:02:49

Return 就是让后面的代码无效,相当于goto EndIf

请问一下,这个系统测试下来效果还行啊,如果就拿这个系统实盘会出现什么问题呢?
作者: hal5667    时间: 2011-7-7 00:18:44

ma1>ma2

这里得改成 ma1[1]>ma2[1],并且我觉得里面所有比较的都应该加上[1];

因为用的是开盘价,但这个ma1>ma2在收盘后才能确定,所以用开盘价开仓会造成信号闪烁;
作者: kings425    时间: 2011-7-7 09:21:51

楼上的朋友说得不错,因为ma1这时已经是用Close进行描绘的了

相当于未来函数,必须用Close[1]描绘的Ma1[1]才行,或者用Close进行Buy or Sell
作者: 穿堂风    时间: 2011-7-7 12:43:14

Return 就是让后面的代码无效,相当于goto EndIf

请问一下,这个系统测试下来效果还行啊,如果就拿这个系 ...
kings425 发表于 2011-7-7 00:02



    因为有两种情况,达到哪种情况,都不再往下走,直接return。
作者: 穿堂风    时间: 2011-7-7 12:45:26

ma1>ma2

这里得改成 ma1[1]>ma2[1],并且我觉得里面所有比较的都应该加上[1];

因为用的是开盘价,但这个 ...
hal5667 发表于 2011-7-7 00:18



    我均线都是用open算的,K线一出来就决定了ma1是否大于小于ma2,并且持续到K线结束也不会改变,怎么会闪烁?
我很多系统确实用了xxx[1]的办法来防止闪烁和未来数据引用,但这里没必要啊
作者: kings425    时间: 2011-7-7 12:51:39

ma1 = Average(Open,maLen1);

是的哦,没有注意这句,的确是用OPEN来计算的均线    

请问这类系统可以用于实盘么?具体要注意哪些问题?
作者: 穿堂风    时间: 2011-7-7 12:52:38

楼上的朋友说得不错,因为ma1这时已经是用Close进行描绘的了

相当于未来函数,必须用Close[1]描绘的Ma1[1] ...
kings425 发表于 2011-7-7 09:21



    你们所说的问题,我知道这是大家最容易犯的错误。
所以我在设计系统的时候,首先就是查看所有交易逻辑,确保没有引用未来数据,并且成交价格,成交时机都不会出现矛盾点,比如不能出现多种情况同时出现,无法区分先后,还有就是很多人都没考虑跳空。
作者: 穿堂风    时间: 2011-7-7 13:00:20

ma1 = Average(Open,maLen1);

是的哦,没有注意这句,的确是用OPEN来计算的均线    

请问这类系统可 ...
kings425 发表于 2011-7-7 12:51



    有时越简单的系统,长期来看是越有效的。
不过像这样的系统,可能执行力和坚持占首位,一是在趋势不明显的品种上表现不好,另外市场可能会改变,可能出现无法接受的回撤或不应期。
要用到实盘,事先得有心理准备,这个系统只是发给初学者熟悉下TB。
作者: selffinder    时间: 2011-7-8 11:54:12

楼主,赞一个!我接触TB不久,而且V4版本跟原来版本改动较大,想学习一下别人的程序结果在新版本中运行却大相径庭!无奈啊!真希望论坛里的大虾们都像楼主一样,能分享一些系统,哪怕是比较简单的,对新手来说也是莫大的帮助。真心希望这个论坛成为大家共同进步的乐园!
作者: zhy88    时间: 2011-7-30 09:11:04

不错啊,谢谢分享.
作者: hotkey110    时间: 2011-8-15 21:47:13

逻辑语法没问题,但是用到历史数据,好像总感觉不太对镜,不知道大家有这种现象吗
作者: z185036668    时间: 2011-11-24 17:15:47

这个实盘会出现信号消失的。
作者: z185036668    时间: 2011-11-24 17:16:24

这个实盘会出现信号消失的。
作者: z185036668    时间: 2011-11-24 17:17:21

这个实盘会出现信号消失的。
作者: 穿堂风    时间: 2011-11-25 09:24:29

回复 17# z185036668


    说清楚点,哪块会引起消失。
你是认真看了代码后觉得的呢?还是实盘跑了确定的?
作者: z185036668    时间: 2011-11-29 11:29:49

回复 18# 穿堂风

楼主,我实盘试了.
ma1 = Average(Close,maLen1);
ma2 = Average(Close,maLen2);

这两句用CLOSE出现信号消失,用OPEN可以。
作者: z185036668    时间: 2011-11-29 11:30:58

回复 18# 穿堂风

楼主,我实盘试了.
ma1 = Average(Close,maLen1);
ma2 = Average(Close,maLen2);

这两句用CLOSE出现信号消失,用OPEN可以。
作者: 穿堂风    时间: 2011-11-29 11:52:22

本帖最后由 穿堂风 于 2011-11-29 11:54 编辑
回复  穿堂风

楼主,我实盘试了.
ma1 = Average(Close,maLen1);
ma2 = Average(Close,maLen2);

这两句用 ...
z185036668 发表于 2011-11-29 11:30


我代码里是open啊
所以我才问你是否认真读了我代码
不要先入为主的先断定我是个很容易犯低级错误的人。
作者: z185036668    时间: 2011-11-29 12:25:46

回复 21# 穿堂风


刚接触TB,有些东西还没搞懂,谢楼主了。还有个问题楼主,在震荡行情里面,用均线怎么能不反复开仓啊?
作者: 草根。    时间: 2012-7-1 11:35:24

沙发。。。
作者: yml6363    时间: 2012-7-3 23:16:39

顶   感谢大侠
作者: sqj888    时间: 2012-7-4 18:12:41

楼主慷慨啊
作者: kk031007    时间: 2012-7-29 17:59:47

请教一下穿堂风,If(CurrentBar > maLen2) 是什么意思?谢谢。  参数怎样可以这样比较?

你的思路我知道了。。
作者: lanshan    时间: 2012-7-29 21:26:44

支持下楼主,思路清晰,代码简洁明了,学习!
作者: 西湖    时间: 2012-7-30 06:03:39

谢谢楼主;学习中。
作者: 黏黏兔    时间: 2012-7-31 11:11:25

不错 谢谢楼主分享
作者: haiphong    时间: 2012-7-31 17:50:09


作者: shufelyc    时间: 2012-8-1 15:16:29

这个确实比较老了
作者: sqj888    时间: 2012-8-1 23:33:43

不管老不老,先定一下楼主
作者: 松鹏    时间: 2012-8-19 08:53:02

老的就是入门基础,适合我这样的新手,多谢
作者: 紫色千纸鹤    时间: 2012-8-24 15:34:08

穿堂风 发表于 2011-7-7 12:52
你们所说的问题,我知道这是大家最容易犯的错误。
所以我在设计系统的时候,首先就是查看所有交易逻 ...

学习了,很有用
作者: CenyLee    时间: 2012-8-31 10:41:50

越是简单的系统,长期越是有效。
作者: 迎风尿十丈    时间: 2012-9-9 09:01:32

kk031007 发表于 2012-7-29 17:59
请教一下穿堂风,If(CurrentBar > maLen2) 是什么意思?谢谢。  参数怎样可以这样比较?

你的思路我知道了 ...

这行代码我也不懂
作者: 迎风尿十丈    时间: 2012-9-9 11:37:47

感谢风兄
在风兄的基础上,我在加入了加码,按7 3 1加码,以多都为例,于前一次的开仓价比较,涨了1%,加一次码,共三次建仓,于开仓均价比较,跌了2%止损。可能这加码不是最好,大家可以自己测试,
空头也一样,只是相反,
以下是胶指日线测试,

作者: 迎风尿十丈    时间: 2012-9-9 11:39:55

一下为代码
高手在看看代码有没问题
//------------------------------------------------------------------------
// 简称: abc
// 名称: abc
// 类别: 公式应用
// 类型: 用户应用
// 输出:
//------------------------------------------------------------------------

Params
Numeric maLen1(10);
Numeric maLen2(50);
Numeric lots(1);
Numeric offset(0);
Vars
Numeric MyEntryPrice;
                        NumericSeries firstPrice;
                        NumericSeries LastPrice;
                                                NumericSeries firstPrice2;
                        NumericSeries LastPrice2;
                        Numeric AddSet(0.01);
                        Numeric SubSet(-0.01);
Numeric ma1;
Numeric ma2;
Numeric i_offset;

Begin

ma1 = Average(Open,maLen1);
ma2 = Average(Open,maLen2);

PlotNumeric("ma1",ma1);
PlotNumeric("ma2",ma2);

i_offset = offset*MinMove*PriceScale;
If(CurrentBar > maLen2)
{
        If(MarketPosition == 0)
        {
                If(Open>ma1 and ma1>ma2)
                {
                                firstprice=open+i_offset;
                                lastprice=firstprice;
                        Buy(7,firstprice);
                        Return;
                }

                If(Open < ma1 and ma1<ma2)
                {
                       firstPrice2 = Open-i_offset;
LastPrice2 = firstPrice2;
                                           SellShort(7,firstPrice2);
                        Return;
                }
        }
                }
                else If(MarketPosition == 1)
                {
While(CurrentEntries < 2&& High >= LastPrice + AddSet*firstprice)
{LastPrice=LastPrice + AddSet*firstprice;
If(o>=LastPrice + AddSet*firstprice)
{LastPrice = o;
}
Buy(3,LastPrice);
}



While(CurrentEntries < 3&& High >= LastPrice + AddSet*firstprice)
{LastPrice=LastPrice + AddSet*firstprice;
If(o>=LastPrice + AddSet*firstprice)
{LastPrice = o;
}
Buy(1,LastPrice);
}

}
else if (MarketPosition == -1)
{
While(CurrentEntries < 2&& Low <= LastPrice2 + subSet*firstprice2)
{LastPrice2=LastPrice2+ subSet*firstprice2;
If(o<=LastPrice2 + subSet*firstprice2)
{LastPrice2=o;
}
SellShort(3,LastPrice2);
}



While(CurrentEntries < 3&& Low <= LastPrice2 + subSet*firstprice2)
{LastPrice2=LastPrice2+ subSet*firstprice2;
If(o<=LastPrice2 + subSet*firstprice2)
{LastPrice2=o;
}
SellShort(1,LastPrice2);
}
}
        If(MarketPosition == 1)
        {
                If(Open < ma1)
                {
                        Sell(0,Open-i_offset);
                        Return;
                }
                                Else If(l/AvgEntryPrice<0.98)
{Sell(0,MyEntryPrice*0.98-i_offset);
}
Else If(o/AvgEntryPrice<0.98)
{Sell(0,o-i_offset);}
        }

        
                If(MarketPosition == -1)
        {
                If(Open > ma1)
                {
                        BuyToCover(0,Open+i_offset);
                        Return;
                }
                                Else If(h/AvgEntryPrice>1.02 )
{
BuyToCover(0,AvgEntryPrice*1.02+i_offset);
}
Else if(o/AvgEntryPrice>1.02)
{BuyToCover(0,o+i_offset);}
        }

End


//------------------------------------------------------------------------
// 编译版本        GS2010.12.08
// 用户版本        2012/09/09 10:50
// 版权所有        zhuanqian
// 更改声明        TradeBlazer Software保留对TradeBlazer平台
//                        每一版本的TrabeBlazer公式修改和重写的权利
//------------------------------------------------------------------------
作者: 迎风尿十丈    时间: 2012-9-9 11:42:02

ta日线

作者: flyfish    时间: 2012-9-10 08:57:46

顶楼的平仓策略似乎不如满足反向开仓条件时直接反手。
作者: VentureTaker    时间: 2012-10-9 01:17:58

If(CurrentBar > maLen2) 的意思是为了防止在历史测试数据不足的情况下 或 在历史测试数据开始的几根线内的无效建仓行为,因为如果currenbar小于均线期的话,均线是扭曲的
作者: JPMorgan    时间: 2012-10-23 10:21:02

不错的源码
作者: nixun_china    时间: 2013-1-7 11:28:13

MarketPosition 是干什么用的? 怎么判定?
作者: aizaitiank    时间: 2013-5-17 10:49:48

没有价格小于MA2de 情况


作者: 散兵游勇    时间: 2013-5-27 14:55:55

领教了,初学者感谢!
作者: luckybirdtom    时间: 2013-6-1 19:55:02


作者: 天崖    时间: 2013-6-1 20:14:37

不错 谢谢楼主分享
作者: jun_lin76    时间: 2013-6-29 15:01:37

我个人觉得TB最难点也在编程,有好的学习方法吗?
作者: goodstudy    时间: 2013-7-7 13:48:18

楼主很无私!!
作者: nashiii    时间: 2013-7-8 14:53:02

这个收藏了,谢谢
作者: ASP    时间: 2013-7-9 23:07:54

感谢楼主提携新人
作者: caiyuanguangjin    时间: 2013-10-10 09:42:16

学习
作者: xhqh10101257    时间: 2014-2-26 14:26:00

仔细阅读完,楼主实在太赞了。逻辑严密。作为初学者的我,受益匪浅。
作者: cruelxie1    时间: 2014-5-13 11:46:36

可不可以编个个资金比例确定开仓头寸的双均线交易系统,我觉得那样更能体现出年化收益率和回撤率。小弟初到开拓者,还不懂编程,望各位高手多多指教
作者: steven_hansh    时间: 2014-12-9 14:57:11

来晚了,无缘与楼主直接交流,不过还是学习了。
作者: htzq61302908    时间: 2017-5-10 22:09:06

达者为先,谢谢楼主无私分享,提携新人。




欢迎光临 开拓者期货期权程序化系统交易论坛 (http://bbs.tb18.net/) Powered by Discuz! X2