自动化交易示例

更新时间:2023-10-09 01:36:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

inputs: Length( 60 ) ;

Buy ( \) next bar at HighestFC( High, Length ) + 3 point stop ;

Sell Short ( \) next bar at LowestFC( Low, Length ) - 3 point stop ;

金魔方智能交易攻略(1)-交易指令基础 作者:仁心慧能

博庭公司推出的金魔方软件继承了飞狐交易师优秀的技术分析功能,并且增加了许多新特性,尤其是在公式系统和程序化交易方面,祝愿金魔方再创辉煌!

金魔方用于编写公式的语言称为金语言(KingLanguage,KL),它有许多增强的特性,我们将逐步讲解。金魔方在公式树中增设了一项新的智能交易公式类型,它与旧的交易系统公式相似而又不同。

旧交易系统的范式是:交易信号: 条件表达式 新智能交易的范式是:If 条件表达式Then 交易指令

与交易系统的四种信号对应,新智能交易也有四种基本指令,如下所示: 交易类别:老交易系统信号 –> 新智能交易指令 开多、多头开仓、买入开仓、买入:ENTERLONG–> Buy 平多、多头平仓、卖出平仓、卖出:EXITLONG–> Sell

开空、空头开仓、卖出开仓、空头卖出:ENTERSHORT–> SellShort 平空、空头平仓、买入平仓、空头回补:EXITSHORT–> BuyTocover

旧交易系统只能定义交易信号,但无法在公式中进行仓位控制等复杂操作。

新智能交易公式可以通过交易指令的参数以及许多交易相关函数进行各式各样的精细控制。

最好的学习方法是多实践。让我们开始创建公式,在公式树【智能交易】下【新建文件夹】,命名为“攻略”,然后在其下【新建公式】,输入名称“例1_1”,确定后,出现公式编辑器,输入以下源代码:

1. //-------金魔方智能交易公式-------------- 2. //例1_1 均线交叉延时过滤买卖策略 3. {策略:

4. 1.收盘价金叉30周期均线,且在其上延时几个周期后买入 5. 2.收盘价死叉30周期均线,且在其下延时几个周期后卖出 6. 3.外部参数切换多种类型均线 7. }

8. input:

9. 均线周期数(30,5,200,5), //缺省值,最小值,最大值,步长 10. 延时周期数(0,0,6,1), 均线类型(1,1,5,1); 11.switch 均线类型 begin

12. case 1: MA1 := MA(C,均线周期数);

13. case 2: MA1 := MA((H+L+C)/3,均线周期数); 14. case 3: MA1 := EMA(C,均线周期数); 15. case 4: MA1 := WMA(C,均线周期数); 16. case 5: MA1 := SMA(C,均线周期数,1); 17.end

18.Plot(MA1,'均线'); //显示均线

19.bEnterLong := BarsLast(Cross(C, MA1))=延时周期数 And C>MA1; 20.bExitLong := BarsLast(Cross(MA1,C))=延时周期数 And C

25.1.用 input 语句声明公式参数,好处是便于修改、复制。 26. 其中的最小值、最大值、步长用于今后的参数优化。 27.2.均线类型在外部参数设置,可用于参数优化 28. 公式中用 switch case语句选用均线类型 29.3.Plot函数输出指标线到主图

30.4.交易条件先赋给 bEnterLong 等中间变量,便于今后修改、替换, 31. 但语句多了影响运行效率,若执行速度很重要,就直接把条件表达式写在If后。

32.5.Buy类交易函数其实有很多参数,但从后到前可以取缺省值不用写出}

复制代码

编写好公式后,点击工具栏第1个按钮进行编译,如果无误,编译信息窗会提示编译通过,这就可以应用公式了。此时可以看到“攻略”文件夹下多了个“例1_1”公式,双击它或拖放到主图上,这时出现【策略设置】,有【属性】【自动交易】【公式参数】三个页面,先初略看看,不管细节,点确定后:

可以看到,收盘价上穿均线后的次周期开盘价出现紫色的三角箭头指示买入价 位,收盘价下穿均线后的次周期开盘价出现反向的三角箭头指示卖出价位,这两个箭头间紫色连线表示这笔交易盈利,蓝色则表示亏损。把鼠标移到三角箭头,出现 浮动信息窗,可以看到交易详情,包括数量、价格、开平仓配对等信息。在主图左上角公式名称处,右键菜单【查看测评报告】,选择【交易明细】页面,可以看到 交易详情:

在主图左上角公式名称处,右键菜单【策略设置】,点选【公式参数】页面,修改这3个参数的值,点确定后看看均线和交易信号发生了什么变化?

金魔方的智能交易公式可输出指标线以及画线、文字等对象,便于核对交易信号与指标线的关系、提示报警等,甚至可直接代替技术指标等其它类型的公式。与飞狐公式逐行执行不同,它的运行模式是逐根计算的,才能实现复杂的仓位控制。

我们看到期指主连的K线图下边有复权标记,这是因为股指期货存在换月价差,为了走势的连续性和指标、测评的正确性,需要做复权处理,把鼠标移到复权标记处可看到换月价差信息。

Buy、Sell表示操作股票时的买入、卖出,如果我要操作期货呢?既做多也做空,我们试试下面的公式: 1. 2. 3. 4. 5. 6. 7.

//-------金魔方智能交易公式-------------- //例1_2 自适应均线转向多空策略 {策略:

1.自适应均线上拐一定幅度后,平空反手开多 2.自适应均线下拐一定幅度后,平多反手开空 }

input:

8. N(10), Pct(0.05);

9. AMA1: AdaptiveMovAvg(C, N, 2, 30);

10. bEnterLong := (AMA1[0]/AMA1[1])>(100+Pct)/100; 11. bEnterShort := (AMA1[0]/AMA1[1])<(100-Pct)/100; 12. if bEnterLong then Buy;

13. if bEnterShort then SellShort; 14. {

15. 注解:

16. 1.AdaptiveMovAvg为自适应移动平均线,其参数FL=2,SL=30为Kaufman在其《精明交易者》中所用的数值 17. 2.序列下标表示K线位置,AMA1[0]表示取当前周期的值,AMA1[1]表示取前一个周期的值

18. 3.当AMA1上升且大于前值百分之Pct时买多,反之卖空 19. }

复制代码 有图有真相:

如图所示,多了蓝色箭头表示空头交易,我们发现,多头平仓交易与空头开仓交易同时执行,查看交易明细证实了这一点。这是因为:

1、 单一策略只能持多仓、持空仓、无持仓三种状态,不允许多空双向同时持仓。 2、 某交易指令开仓时,如果已有反向持仓,先自动平掉旧仓再反手开新仓。

本例在市场中始终持仓,空头开仓时会自动先平掉原有的多头持仓,反之亦然。多空交易交错发生,不需要写平仓指令。

这种机制使得编写公式特别简洁,如果允许同时持有多头和空头仓,公式的逻辑和函数、语句将变得很复杂,难以掌握。虽然单 一策略不能同时有多头和空头的持仓,但不同策略可以持有不同方向的仓位,例如策略A持有多头,策略B持有空头,它们互不干扰,而且,不同的策略可以编写在 同一个公式文件中,如何实现?敬请持续关注本攻略!

以上例子属于趋势交易策略,我们再试试用布林通道实现振荡交易策略。

1. //-------金魔方智能交易公式-------------- 2. //例1_3 布林通道振荡策略 3. {策略:

4. 1.最低价低于下轨后开多,最高价高于中线后平多 5. 2.最高价高于上轨后开空,最低价低于中线后平空 6. 3.可连续同向开仓3次 7. }

8. input:

9. M(20,5,200,5), N(2), S(3); 10. //计算布林通道 11. Mid : MA(C,M);

12. Upper: Mid + N*STD(C,M); 13. Lower: Mid - N*STD(C,M); 14.

15. AllowSameEntries(S);

16. bEnterLong := L < Lower; //多头开仓条件 17. bExitLong := H > Mid; //多头平仓条件 18. bEnterShort := H > Upper; //空头开仓条件 19. bExitShort := L < Mid; //空头平仓条件 20. if bEnterLong then Buy; 21. if bExitLong then Sell;

22. if bEnterShort then SellShort; 23. if bExitShort then BuyToCover; 24. { 25. 注解:

26. 1.AllowSameEntries函数设置允许连续同向开仓最大次数 27. 默认不能连续开同向仓}

复制代码 有图有真相:

如图所示,可以用AllowSameEntries函数控制同方向连续开仓的最大次数,如果没有用到这个函数,或者把S参数设置为1,则在已有持仓情况下,不再连续开同方向的仓,大家可以试试。默认不能连续开同向仓,也是为了使大多数策略的公式编写简单,逻辑清晰。

从以上的例子,我们知道,不带任何参数的交易指令是在信号发生的下一周期开盘时进行交易的,因为本周期收盘时才能确定信号最终不变的状态,但那一瞬间却是下不到单的。

在公式编辑器中把鼠标移到Buy函数名处,出现浮动信息窗, 看到函数说明,我们发现其实它有很多参数,如何应用这些参数?如何使用其它的下单方式、控制下单时机、价位和数量吗?如果想在收盘时下单怎么办呢?另外, 默认的交易数量是如何定的呢?回想起【策略设置】中有“委托数量”的设置,是在那里设置的吗?

且听下回分解!

金魔方智能交易攻略(2)-交易指令进阶 作者:仁心慧能

以多头开平仓函数为例:

Buy('Symbol'='',Size=DEFAULT,Price=0,Slippage=0,OT=OT_MARKET,OB=OB_NEXTBAR,EntryName='')

Sell('Symbol'='',Size=DEFAULT,Price=0,Slippage=-1,OT=OT_MARKET,OB=OB_NEXTBAR,ExitName='')

括号里面表示函数的参数,之所以见到有赋值,表示如果不写这个参数,其默认值为等号后面的值,实际应用时填入需要指定的值,而不是写赋值语句。

例如:

Buy; 等价于 Buy('', DEFAULT, 0, 0,OT_Market, OB_NextBar, ''); Buy('',2); 等价于 Buy('', 2, 0, 0,OT_Market, OB_NextBar, '');

Buy('',2, 0,1); 等价于 Buy('', 2, 0, 1,OT_Market, OB_NextBar, ''); Buy('',2, 1000,0,OT_LIMIT); 等价于 Buy('', 2, 1000, 0,OT_LIMIT, OB_NextBar, '');

也就是说,如果你不写从后到前的参数,系统会自动替你填进那些参数,怎么填呢?就是格式中等号后面的那些值。

平仓函数后有尖括号括起来的,表示这是可选的,需要用到时才写。

这类函数可以设置交易商品、委托类型、时机、数量、价格、滑移价差,还可以指定一个开仓名EntryName,用于标识不同的交易信号所开的仓,以及今后的单独控制;平仓函数则可指定一个平仓名ExitName,并且用from 表示平其中某种信号开的仓。

函数的参量后若有等号,表示等号后的值是默认值,这样的参数按照从后到前的顺序,可以省略不写。省略所有参数的交易指令,其委托数量是取用【策略设置】中的数值,可以为固定数量,也可以由资金自动计算下单量。缺省的交易时机和

类型是次周期(OB_NEXTBAR)市价单(OT_MARKET),市价单是要求立即成交的委托单,次周期市价单在历史测评时以下一周期的开盘价作为委托成交价,在实际交易中以周期开始时的市价下单,委托价格一般在买入时为卖一价,卖出时为买一价,有时再加减允许的滑移价差,以保证立即成交。

更详细的参数说明可参看公式编辑器里的函数说明,我们还是多做些实验吧。 1. //-------金魔方智能交易公式-------------- 2. //例2_1 一目均衡多空策略 3. {策略:

4. 1.转换线金叉基准线,本周期收盘时平空反手做多 5. 2.转换线死叉基准线,本周期收盘时平多反手做空 6. 3.多头自开仓20周期后平仓 7. }

8. input:

9. SN(26), FN(9);

10. 基准线: (HHV(H,SN)+LLV(L,SN))/2; 11. 转换线: (HHV(H,FN)+LLV(L,FN))/2;

12. bEnterLong := CrossOver(转换线, 基准线); 13. bEnterShort := CrossUnder(转换线, 基准线);

14. if bEnterLong then Buy('', DEFAULT, 0, 0, OT_CLOSE, OB_THISBAR);

15. if bEnterShort then SellShort ('', DEFAULT, 0, 0, OT_CLOSE, OB_THISBAR); 16. if BarsSinceEntry(0) >= 20 then Sell;

17. if BarsSinceEntry(0) >= 20 then BuyToCover; 18. { 19. 注解:

20. 1.CrossOver函数等同于Cross函数

21. 2.开仓DEFAULT指定的下单量为[策略设置]中的委托数量 22. 平仓函数里的DEFAULT表示全部平仓

23. 3.OT_CLOSE 与 OB_THISBAR 配合指定本周期收盘时交易,历史回测时以本周期收盘价作为成交价格,

24. 实盘自动交易时,对于分钟线周期,其实是在本周期结束,下一周期开始时下市价单的,

25. 对于日线周期,或者对于分钟线当天收盘的最后一个周期,

26. 则下单时机在[策略设置]-[自动交易]中的“日收盘交易在(n)秒前下单”指定。 27. }

复制代码 有图有真相:

对于例1_3的布林通道振荡策略,若想在价格达到上下轨或均线时下单,公式如下:

1. //-------金魔方智能交易公式-------------- 2. //例2_2 布林通道振荡策略之二 3. {策略:

4. 1.价格跌至下轨时开多,价格升至中线时平多 5. 2.价格升至上轨时开空,价格跌至中线时平空 6. }

7. input:

8. M(20,5,200,5), N(2), S(3); 9. Mid : MA(C,M);

10. Upper: Mid + N*STD(C,M),Shift1; 11. Lower: Mid - N*STD(C,M),Shift1; 12. Buy('', 1, Lower, 0, OT_LIMIT); 13. Sell('', 1, Mid, 0, OT_LIMIT);

14. SellShort('', 1, Upper, 0, OT_LIMIT,OB_NEXTBAR); 15. BuyToCover('', 1, Mid, 0, OT_LIMIT,OB_NEXTBAR); 16. {

17. 注解:

18. 1.Shift1 使指标线向右偏移1个周期,使得它显示时与NEXTBAR的交易时机对上。 19. }

复制代码 有图有真相:

如 图所示,当价格跌到前周期的下轨值时买入,然后价格达到前周期的均线值时卖出,因本周期未结束时,指标值是不定的,所以我们用上一周期的指标值,那么,交 易指令的OB参数还是OB_NEXTBAR,可省略,表示在下一周期用本周期的指标值下单,下单类型为OT_LIMIT限价单,限定价格Price参数为 布林线下轨Lower等指标值。

这个策略在行情盘整时看起来不错,但在趋势行情时会亏损,那么,我们再来个反向操作策略,并且把布林通道改为肯特纳(Keltner)通道,公式如下:

1. //-------金魔方智能交易公式-------------- 2. //例2_3 肯特纳(Keltner)通道趋势策略

3. {策略:

4. 1.价格升破上轨时开多,价格跌至中线时平多 5. 2.价格跌破下轨时开空,价格升至中线时平空 6. }

7. input:

8. M(20,5,200,5), N(2); 9. Mid : EMA(C,M);

10. Upper: Mid + N*ATR(10),Shift1; 11. Lower: Mid - N*ATR(10),Shift1;

12. Comment('突破买入价: ', Upper[1]:8:2), ColorRed; 13. Comment('突破卖空价: ', Lower[1]:8:2), ColorBlue; 14. Buy('', 2, Upper+MinDiff, -1, OT_STOP); 15. Sell('', DEFAULT, Mid, -1, OT_STOP);

16. SellShort('', 2, Lower-MinDiff, -1, OT_STOP); 17. BuyToCover('', DEFAULT, Mid, -1, OT_STOP); 18. {

19. 注解:

20. 1.ATR(10)为10周期平均真实波幅,均线加减ATR倍数即形成肯特纳(Keltner)通道

21. 2.Comment('突破买入价: ', Upper[1]:8:2)在主图左上角显示提示信息, 22. 此处指定输出的数字串为8个字符长度,带2位小数;可以指定颜色 23. 3.平仓函数委托数量为DEFAULT表示全部平仓 24. }

复制代码

运行结果如下图:

如图所示,这次的开平仓正好和前例是反着的,因为下单类型为OT_STOP停损单,它与限价单正好是相反的,当我们要买 入时,限价单是埋在当前市价的下方,等待价格下跌到限价时成交,而停损单是在当前市价的上方,等待价格向上突破时成交。卖出时方向相反。对于停损单这个术 语,卖出停损容易明白,对于买入开仓,可以这样理解,因为我是要买入的,价格在不断往上行,少赚也是一种亏损,所以在价格升到一定位置时买入“停损”。

需要注意的是,停损价之后的Slippage参数都被设为-1,这表示只要价格突破停损价就交易,例如次日跳空高开,不管多高都要买入。如果要限制交易价格,太高了就不买入,那就设置Slippage参数为允许的范围,这种单叫做停损限价单,请自行修改测试。

这次我们在公式的交易指令函数中指定委托数量为2,可以把鼠标移到交易箭头处或查看测评报告中的交易明细。

以上的趋势和振荡策略实例在贴图中都用于日线周期,自动交易常用于日内交易,这类公式有些什么特殊的编制技巧呢?

且听下回分解!

金魔方智能交易攻略(3)-日内交易之开盘区间突破 作者:仁心慧能

日内交易常用的一类策略是开盘区间突破,它与前例的通道突破策略相似,其基本公式是:

1. //-------金魔方智能交易公式-------------- 2. //例3_1 开盘区间突破策略 3. //用于分钟线周期 4. {策略:

5. 1.当日开盘价加减指定价差形成区间 6. 2.突破区间高点做多,跌破区间低点做空 7. 3.当天仅做多1次,做空1次 8. 4.日内交易,收盘前清仓 9. }

10.input: 11. Rng(10), //区间范围

12. EndTime(1400); //下午14:00以后不开仓 13.RngH: OpenD(0) + Rng; 14.RngL: OpenD(0) - Rng;

15.if Time < EndTime*100 then begin

16. if EntriesToday(Date,MP_LONG)<1 then 17. Buy('', 2, RngH, -1, OT_STOP); 18. if ExitsToday(Date,MP_SHORT)<1 then 19. SellShort('', 2, RngL, -1, OT_STOP); 20.end;

21.SetExitOnClose; 22.{

23.注解:

24.1.OpenD(0)返回当日开盘价,这套函数在日内交易时方便常用; 25.2.EntriesToday(Date,MP_LONG)取得当天多头开仓次数,MP_LONG 是值为1的宏;

26.3.ExitsToday (Date,MP_SHORT)取得当天空头平仓次数,MP_SHORT 是值为-1的宏;

27.4.SetExitOnClose用于在收市时清仓,历史测评时以收盘价作为平仓价,自动交易时在收市前若干秒平仓,可在【策略设置】中设置,默认在收市前60秒清仓。 28.}

复制代码

如图所示,该策略以当日开盘价加减由Rng参数指定的范围,形成一个区间,当价格突破区间时进场交易,收盘时清仓不过夜。

上例的区间范围Rng是个常数,不能适应市场变动,所以Rng通常用各种算法得到,例如,著名的Dual Thrust系统曾长期在交易系统排行榜名列三甲,其原始公式应用于日线周期,不太能如实反映日内波动,我们把它改造为应用于分钟周期的策略:

1. //-------金魔方智能交易公式-------------- 2. //例3_2 Dual Thrust日内策略 3. //用于1分钟-15分钟周期 4. {策略:

5. 1.根据前几日的波动范围动态调整开盘区间 6. 2.突破区间高点做多,跌破区间低点做空 7. 3.可选是否持仓过夜 8. }

9. input:

10. K1(0.5),K2(0.5),Mday(1),Nday(1), 11. ExitOnClose(1); 12.variable:

13. BarsPerDay(48), BuyRange(1000), SellRange(1000); 14.if BarPos = 1 then begin //只需计算1次

15. switch DataPeriod begin //沪深300股指期货日周期数 16. case 1: BarsPerDay:=270; //1分钟周期数/每日 17. case 2: BarsPerDay:=54; //5分钟周期数/每日 18. case 3: BarsPerDay:=18; //15分钟周期数/每日 19. end 20.end

21.Bars:= Mday*BarsPerDay; 22.MHH := HHV(H,Bars)[1]; 23.MHC := HHV(C,Bars)[1]; 24.MLL := LLV(L,Bars)[1];

25.MLC := LLV(C,Bars)[1]; 26.Bars:= Nday*BarsPerDay; 27.NHH := HHV(H,Bars)[1]; 28.NHC := HHV(C,Bars)[1]; 29.NLL := LLV(L,Bars)[1]; 30.NLC := LLV(C,Bars)[1]; 31.

32.if Date <> Date[1] then begin //新交易日开始,计算区间范围 33. BuyRange := Max(MHH - MLC, MHC - MLL); 34. SellRange := Max(NHH - NLC, NHC - NLL); 35.end

36.RngH: OpenD(0) + K1*BuyRange; 37.RngL: OpenD(0) - K2*SellRange; 38.

39.if SessionLastBar = 0 then begin

40. Buy('', DEFAULT, RngH, -1, OT_STOP,OB_NEXTBAR);

41. SellShort('', DEFAULT, RngL, -1, OT_STOP,OB_NEXTBAR); 42.end

43.if ExitOnClose then SetExitOnClose; 44.{ 45.注解:

46.1.用不同的参数分别设置买卖区间的幅度

47.2.BarsPerDay为1天的K线数量,只需在第1根K线时计算1次

48. 用switch语句根据周期类型赋值,公式中是股指期货的每日周期数量 49.3.HHV(H,Bars)[1]表示取用前一周期的指标值 50. 可以把之前的:=改为:进行调试

51.4.SessionLastBar函数用于判断是否是当日最后一个周期 52.5.外部参数ExitOnClose控制是否做日内交易或持仓过夜 53.}

复制代码 如图所示:

可见,在同一时间段,本例的区间与上例相比较是动态变化的,各位可以修改公式参数看看运行结果。

在实际交易中,分批开平仓是常用的技巧,金魔方如何实现呢?

且听下回分解!

金魔方智能交易攻略(4)-分批开平仓 作者:仁心慧能

分批开平仓不仅要求可以根据不同的信号连续进场,然后对分次开出的仓位分别控制,另外,用不同的止盈目标位分批出场也是常用的技巧,我们来看一个实例,金魔方公式如下:

1. //-------金魔方智能交易公式-------------- 2. //例4_1 区间突破分批策略 3. {策略:

4. 1.允许连续买入2次

5. 2.突破20周期高点买入1次,该仓位命名为'Buy1' 6. 3.突破50周期高点买入1次,该仓位命名为'Buy2' 7. 4.跌破10周期低点卖出'Buy1'的仓位 8. 5.跌破25周期低点卖出'Buy2'的仓位 9. }

10.Buy1: HHV(H,20),Shift1; 11.Buy2: HHV(H,50),Shift1; 12.Sell1: LLV(L,10),Shift1; 13.Sell2: LLV(L,25),Shift1; 14.AllowSameEntries(2);

15.//if EntryName <> 'Buy1' then

16. Buy('',1,Buy1+MinDiff,-1,OT_STOP,OB_NEXTBAR,'Buy1'); 17.//if EntryName <> 'Buy2' then

18. Buy('',1,Buy2+MinDiff,-1,OT_STOP,OB_NEXTBAR,'Buy2');

19.Sell('',1,Sell1,-1,OT_STOP,OB_NEXTBAR,'Sell1') from 'Buy1'; 20.Sell('',1,Sell2,-1,OT_STOP,OB_NEXTBAR,'Sell2') from 'Buy2'; 21.{

22.注解:

23.1.MinDiff 为价格最小变动单位。

24.2.用EntryName函数识别已有哪个信号的仓位。

25. 但因为即使允许连续同向开仓,也不允许连续开相同开仓名的仓, 26. 所以,EntryName判断已有哪种信号持仓的语句可以不用。

27.3.平仓指令函数后用from指定平掉哪个信号的仓位。 28.}

复制代码

有图有真相:

右键菜单【查看测评报告】的交易明细:

可见,Sell1与Buy1、Sell2与Buy2分别一一配对,这样我们就可分别控制不同的仓位。

再看一个早盘区间突破分批平仓日内交易策略,公式如下:

1. //-------金魔方智能交易公式-------------- 2. //例4_2 早盘区间突破分批平仓策略 3. //用于5分钟周期 4. {策略:

5. 1.根据上午10点前的价格波动范围画出最高价水平线 6. 2.下午14点前,价格突破区间高点买入2口 7. 3.跌破买入价以下20点清仓止损 8. 4.涨至买入价以上30点止盈其中1口 9. 5.当天若有亏损交易,不再开新仓 10.6.日内交易,收市前清仓 11.}

12.input:

13. 早盘终点时间(1000), //10:00 14. 开仓结束时间(1400); //14:00 15.variable:

16. ID(-1); //趋势线标识号,赋初值-1

17.if Date <> Date[1] then begin //新交易日开始 18. RngH := High;

19. ID := TL_new(Date,Time,RngH,Date,Time,RngH); //新建画线 20.end 21.

22.if Time < 早盘终点时间*100 then begin //上午10:00前的最高价作为区间高点

23. RngH := Max(High, RngH); 24.end 25.

26.//随时间调整区间高点水平线

27.TL_SetBegin(ID, TL_GetBeginDate(ID), TL_GetBeginTime(ID), RngH); 28.TL_SetEnd(ID, Date, Time, RngH); 29.

30.bTradeTime := Time >= 0955*100 And Time < 开仓结束时间*100; //交易时间

31.if bTradeTime And DailyLosers(Date,0)<1 then //

32. Buy('', 2, RngH, -1, OT_STOP, OB_NEXTBAR, '买入'); 33.if MarketPosition = 1 then begin //若持多头仓

34. Sell('', DEFAULT, EntryPrice - 20, -1, OT_STOP, OB_NEXTBAR, '止损');

35. if CurrentContracts = 2 then

36. Sell('', 1, EntryPrice + 30, 0, OT_LIMIT, OB_NEXTBAR, '止盈'); 37.end

38.SetExitOnClose; //收市前清仓 39.{ 40.注解:

41.1.画线函数TL_New、TL_SetBegin、TL_SetEnd用于画出区间通道 42.2.5分钟周期,9:55 的下一个周期开始交易 43. 金魔方以K线开始时间作为K线的时间

44.3.DailyLosers(Date,0)取得当日亏损交易次数

45.4.EntryPrice为开仓价,对多头开仓而言就是买入价 46.5.CurrentContracts取得当前持仓数量 47.}

复制代码

有图有真相:

右键菜单【查看测评报告】的交易明细:

可见,开仓2口的单被拆成2笔,1笔止盈,1笔日内交易平仓。

从这个公式,我们可以看出它逐根计算的机制:在每天开盘的那根K线创建1条新的趋势线,然后随着下1根K线的不断增加,调整趋势线的起点和终点。 以上介绍了仓位控制的方法,金魔方还有哪些风险控制的技巧呢? 且听下回分解!

金魔方智能交易攻略(5)-指标背离交易及风险控制策略 作者:仁心慧能

缠论等交易理论重视指标背离时的交易信号,请看金魔方公式如何实现:

1. //-------金魔方智能交易公式-------------- 2. //例5_1 指标背离买入风险控制策略 3. {策略:

4. 1、RSI指标上穿25且与价格形成底背离时买入,不采用指标平仓,而是 5. 2、综合运用止盈、止损、保本平仓、跟踪止损、盘整平仓等风险控制技术 6. }

7. input:

8. 波谷强度(3),//用于找波谷并判断背离 9. 止损价差(35), 10. 止赢价差(100), 11. 保本启动价差(20), 12. 跟踪启动价差(30), 13. 跟踪回撤价差(20), 14. 跟踪回撤幅度(20), 15. 盘整最大价差(5), 16. 盘整周期数(5),

17. 使用价差(1), //开关控制使用价差或金额参数 18. 止损金额(10000), 19. 止赢金额(30000), 20. 保本启动金额(6000), 21. 跟踪启动金额(9000), 22. 跟踪回撤金额(6000); 23. //计算RSI指标

24.RSI1 : SMA(Max(C-C[1],0),8,1)/SMA(Abs(C-C[1]),8,1)*100, OwnerScale;

25.底背离: Divergence(C,RSI1,波谷强度,30,-1), LineThick0; 26.

27.//若指标与价格走势发生牛背离,则在指标上穿25时买入 28.if 底背离 and CrossOver(RSI1,25) then Buy; 29.

30.if 使用价差 = 1 then begin

31. SetStopContract; //以下风控金额基于单口计算 32. if 止损价差 > 0 then

33. SetStopLoss(止损价差*BigPointValue); 34. if 止赢价差 > 0 then

35. SetProfitTarget(止赢价差*BigPointValue); 36. if 保本启动价差 > 0 then

37. SetBreakEven(保本启动价差*BigPointValue); 38. if 跟踪启动价差 > 0 And 跟踪回撤价差 > 0 then

39. SetDollarTrailing(跟踪回撤价差*BigPointValue,跟踪启动价差*BigPointValue);

40. if 跟踪启动价差 > 0 And 跟踪回撤幅度 > 0 then

41. SetPercentTrailing(跟踪启动价差*BigPointValue,跟踪回撤幅度);

42. if 盘整最大价差 > 0 And 盘整周期数 > 0 then

43. SetInactive(盘整最大价差*BigPointValue,盘整周期数); 44.end

45.else begin

46. SetStopPosition; //整个仓位的止损止盈金额 47. if 止损金额 > 0 then

48. SetStopLoss(止损金额); 49. if 止赢金额 > 0 then

50. SetProfitTarget(止赢金额); 51. if 保本启动金额 > 0 then

52. SetBreakEven(保本启动金额);

53. if 跟踪启动金额 > 0 And 跟踪回撤金额 > 0 then 54. SetDollarTrailing(跟踪回撤金额,跟踪启动金额); 55. if 跟踪启动金额 > 0 And 跟踪回撤幅度 > 0 then 56. SetPercentTrailing(跟踪启动金额,跟踪回撤幅度); 57.end 58.{

59.注解:

60.1.OwnerScale修饰符可以使RSI指标叠加在主图上

61.2.LineThick0修饰符用于查看底背离状态而不画出指标线 62.3.Divergence函数可用于判断指标与价格走势的背离,

63. 波谷点是前后各N个周期的相对低点,这个N即为波谷强度

64. 最后一个参数为1表示判断顶背离(熊背离),为-1表示判断底背离(牛背离) 65.}

复制代码

有图有真相:

可以看到,在买入前,RSI指标与价格走势发生了背离,当RSI上穿25时,发出买入指令,之后止盈平仓。

之前介绍的都是指标交易策略,金魔方能否实现形态交易呢?比如趋势线交易?

SetStopLoss之类的函数实现了经典的风险控制技巧,它们在满足条件时都是全部清仓的。我们怎样通过Sell/BuyToCover平仓函数和一些交易状态函数实现更灵活的控制?

且听下回分解!

78. for n = 1 to 突破列数 do begin

79. if 极点值[n] > value1 then value1 := 极点值[n]; 80. if 极点值[n] < value2 then value2 := 极点值[n]; 81. end;

82. 突破买价 := value1 + 偏移量; 83. 突破卖价 := value2 - 偏移量; 84.end; 85.

86.Buy('', DEFAULT, 突破买价, -1, OT_STOP);

87.SellShort('', DEFAULT, 突破卖价, -1, OT_STOP); 88.

89.买线: 突破买价, Precision0; 90.卖线: 突破卖价, Precision0;

91.盈利因子: -GrossProfit/GrossLoss, Precision2, LineThick0; 92.盈亏比: -(GrossProfit/NumWinTrades)/(GrossLoss/NumLosTrades), Precision2, LineThick0;

93.胜率%: PercentProfit, Precision2, LineThick0; 94.净利: NetProfit, Precision2,LineThick0;

95.当前连亏次数: NumConsecLosers, Precision0, LineThick0; 96.{注解:

97.1.用variable定义变量可增加可读性,在本例其实可以省略 98.2.Precision指定输出数值的小数位数

99.3.盈亏比=平均盈利/平均亏损,GrossLoss返回值为负数 100. } 101.

复制代码 如图所示:

点数图算法的代码比较复杂,如果每个涉及到点数图的公式都包含那么多代码 会比较难看,我们是否可以把它做成公共代码供其它公式调用呢?用传统的调用指标公式的方法不太好使,而且一次调用只能返回一个结果,本例的点数图就需要返 回“突破买价”和“突破卖价”两个结果,用户能否自编函数,并且让这个函数能同时返回多个结果呢?

敬请关注本攻略!

金魔方智能交易攻略(9)-均线与趋势线交叉加仓位管理 作者:仁心慧能

本节讲解如何应用公共(自编)函数,如何在公式中调用手工绘制的趋势线产生交易信号,如何根据前次交易结果调整下单量,如何应用新的文本绘制函数,请跟随本ID一探究竟。

首先在公式树的【公共函数】下创建名为“显示绩效”的公式: 1. input:

2. NumericSeries MA1, //序列参数 3. Numeric 下单量, //数值参数

4. NumericRef 盈利因子, //数值型引用参量,装载计算结果 5. NumericRef 盈亏比; 6. 均线: MA1,Precision0;

7. 单量: 下单量,Precision0, LineThick0;

8. 胜率%: PercentProfit, Precision0, LineThick0; 9.

10. 盈利因子:= -GrossProfit/GrossLoss; //总盈利/总亏损

11. 盈亏比:= -(GrossProfit/NumWinTrades)/(GrossLoss/NumLosTrades); 12. return (InitialCapital+NetProfit); //函数返回

复制代码

编译通过后,再创建以下智能交易公式: 1. 2. 3. 4. 5. 6. 7.

//-------金魔方智能交易公式--------------

//例9_1 均线与趋势线交叉加仓位管理策略 {策略:

1.均线与手工画的趋势线交叉作为交易信号

2.上次交易为'止盈'平仓或首次开仓,下单量为初始单量 3.上次交易为非'止盈'平仓的,下单量按加仓步长渐次增加 4.下单量增大到超过最大单量则回复为初始单量

8. } 9. input:

10. TL标识号(99), //手工绘制趋势线的标识号,【设置画线】标题栏可见 11. 止盈价差(600), 12. 止损价差(200), 13. 初始单量(1),

14. 加仓步长(1), //下单量渐次增加步长 15. 最大单量(10),

16. 转折强度(15); //波峰波谷前后N周期最高最低 17. variable: 下单量(1),等量次数(1); 18.

19. MA1 := MA(C,2);

20. TLV := TL_GetValue(TL标识号, Date, Time); //趋势线数值序列 21. bEnterLong := CrossOver(MA1,TLV); //均线上叉趋势线平空开多 22. bEnterShort:= CrossUnder(MA1,TLV); //均线下叉趋势线平多开空 23.

24. if bEnterLong or bEnterShort then begin 25. //上次平仓标识为'止盈'或没有交易过

26. if ExitName(1) = '止盈' OR ExitName(1) = '' then 27. 下单量 = 初始单量; 28. else begin //渐次增加下单量

29. if 下单量=初始单量 or 等量次数 = 2 then begin 30. 下单量 = 下单量 + 加仓步长; 31. 等量次数 = 1; 32. end else

33. 等量次数 = 等量次数 +1;

34. if (下单量 > 最大单量) then 下单量 = 初始单量; 35. end 36. end 37.

38. if bEnterLong then begin 39. Buy('',下单量);

40. ID1:=Text_New(Date,Time, L, 314, true); //绘制314号图标-右上箭头 41. Text_SetColor(ID1,ColorMagenta); 42. end

43. if bEnterShort then begin 44. SellShort('',下单量);

45. ID1:=Text_New(Date,Time, H, 316, true); //绘制316号图标-右下箭头 46. Text_SetColor(ID1,ColorCyan);

47. Text_SetStyle(ID1, 0, 1); //设置下对齐 48. end 49.

50. if MarketPosition = 1 then begin //多头持仓

51. Sell('',DEFAULT,EntryPrice+止盈价差,0,OT_LIMIT,OB_NEXTBAR,'止盈');

52. Sell('',DEFAULT,EntryPrice-止损价差,0,OT_STOP,OB_NEXTBAR,'止损'); 53. end

54. if MarketPosition = -1 then begin //空头持仓

55. BuyToCover('',DEFAULT,EntryPrice-止盈价差,0,OT_LIMIT,OB_NEXTBAR,'止盈');

56. BuyToCover('',DEFAULT,EntryPrice+止损价差,0,OT_STOP,OB_NEXTBAR,'止损'); 57. end 58.

59. //显示波峰点

60. pos := SwingHighBar(1,High,转折强度,转折强度+1);//波峰位置 61. SWV := SwingHigh(1,High,转折强度,转折强度+1); //波峰数值 62. if pos = 转折强度 then begin

63. ID1 :=Text_New(Date[pos],Time[pos], SWV, SWV); 64. Text_SetColor(ID1,ColorMagenta);

65. Text_SetStyle(ID1, 2, 1); //设置水平中对齐、垂直下对齐 66. end

67. //显示波谷点

68. pos := SwingLowBar(1,Low,转折强度,转折强度+1); //波谷位置 69. SWV := SwingLow(1,Low,转折强度,转折强度+1); //波谷数值 70. if pos = 转折强度 then begin

71. ID1 :=Text_New(Date[pos],Time[pos], SWV, SWV); 72. Text_SetColor(ID1,ColorBlue);

73. Text_SetStyle(ID1, 2, 0); //设置水平中对齐、垂直上对齐 74. end 75.

76. //调用“显示绩效”公共函数显示绩效,并计算返回余额、盈利因子、盈亏比

77. variable: //公式中可以有多组input、variable声明 78. PF(0),PR(0); //引用型变量,装回计算结果

79. 余额:显示绩效(MA1,下单量,PF,PR),Precision0,OwnerScale; 80. 盈亏比:PR, Precision1, LineThick0; 81. 盈利因子:PF, Precision1, LineThick0; 82. {

83. 注解:

84. 1.ExitName(1)取得上一回持仓的最后一次平仓的标识名

85. 2.Text_*系列函数请参见【字典】中【新画线函数】类里的说明 86. 3.“显示绩效”为用户自编的公共函数 87. }

复制代码

如下图所示,在主图上手工绘制一条直线(图中粗紫色线),选中它,右键菜单【设置画线】,标题栏上#后面的数字即为该画线的标识号,把公式的外部参数“TL标识号”的数值99改为这个数字,然后把公式拖放到图上,即可让公式跑出交易结果。

右键菜单【查看测评报告】-【交易明细】,因公式中等单量次数上限为2,所以下单量从1->2->2->3->,遇到止盈,再从1->2...,如图所示:

新的文本绘制函数Text_New 不仅可以在图上标出文本、数字,还能绘制680种图标,图标与数字标号对照表请见下图:

上节的点数图算法可以改写成公共函数,这样,其它公式就可以直接调用而不用写繁杂的语句,可以把“转向价”作为函数的return输出,用引用型参数NumericRef定义“突破买价”、“突破卖价”,这样可以同时输出这三个计算结果,请各位自行试验。

我们已经介绍了一些经典的策略和交易技巧及其金魔方公式实现,在研发交易策略时,如何评估策略的好坏、评估能否用于真实交易呢? 且听下回分解!

金魔方智能交易攻略(6)-自动趋势线交易策略 作者:仁心慧能

之前介绍过画水平线,金魔方还可以通过波峰、波谷点函数自动画出趋势线并据此交易,让我们看看这个公式:

1. //-------金魔方智能交易公式-------------- 2. //例6_1 自动趋势线交易加分级锁定盈利策略 3. //用于5分钟周期 4. {策略:

5. 1.在当天5分钟周期走势上自动画出下降趋势线 6. 2.突破下降趋势线买入

7. 3.当最大浮盈达到10点后,把盈利锁定在买入价之上1点 8. 4.当最大浮盈达到20点后,把盈利锁定在买入价之上8点 9. 5.当最大浮盈达到30点后,把盈利锁定在买入价之上10点 10.6.买入价之上50点为止盈位,买入价之下10点为止损位 11.}

12.input: 波峰强度(3); 13.const: 点数量(5);

14.array: 波峰点日期[点数量](0),波峰点时间[点数量](0),波峰点数值[点数量](0);

15.variable: 下降线ID(-1), 起点下标(0); 16.

17.if Date <> Date[1] then begin //每个交易日内重新找趋势线 18.// print('=============', Date, '============='); 19. 下降线ID := -1;

20. for pos=0 to 点数量 do begin //清空数组

21. 波峰点日期[pos]:=0; 波峰点时间[pos]:=0; 波峰点数值[pos]:=0; 22. end

23.end 24.

25.位置 : SwingHighBar(1,High,波峰强度,波峰强度+1),linethick0; 26.

27.if 位置 = 波峰强度 then begin //出现新的波峰点 28.//该波峰点是当天的且没被记录过

29.if Date[位置] = Date And Time[位置] <> 波峰点时间[0] then begin 30.// print('时间:', Time/100, ' 波峰强度: ', 波峰强度); 31.

32. for pos = 点数量-1 DownTo 0 do begin 33. 波峰点日期[pos+1] := 波峰点日期[pos]; 34. 波峰点时间[pos+1] := 波峰点时间[pos]; 35. 波峰点数值[pos+1] := 波峰点数值[pos]; 36. end

37. //将新波峰点存入数组下标0的位置 38. 波峰点日期[0] := Date[波峰强度]; 39. 波峰点时间[0] := Time[波峰强度]; 40. 波峰点数值[0] := High[波峰强度];

41.// print('时间:', 波峰点时间[0]/100,' 数值:', 波峰点数值[0]); 42.

43. if MarketPosition < 1 then begin //如果未持多仓,更新趋势线 44. //找趋势线起点,起点应比最近的新波峰点高,才能形成下降趋势线 45. for pos = 1 to 点数量 do begin

46. if 波峰点数值[pos] > 波峰点数值[0] then begin//有更高的 47. 起点下标 := pos;

48. pos := 点数量+1; //For语句中再加1,然后跳出循环 49. end 50. end

51. if pos <> 点数量+1 then begin //表示找到有更高的波峰点 52.// print('TL_SetBegin:', 波峰点时间[起点下标]/100,' 数值:', 波峰点数值[起点下标]);

53.// print('TL_SetEnd :', 波峰点时间[0]/100,' 数值:', 波峰点数值[0]);

54.// if 下降线ID = -1 then

55. 下降线ID := TL_New(Date,Time,High,Date,Time,High); 56. TL_SetBegin(下降线ID, 波峰点日期[起点下标],波峰点时间[起点下标],波峰点数值[起点下标]);

57. TL_SetEnd(下降线ID, 波峰点日期[0],波峰点时间[0],波峰点数值[0]); 58. end 59. end 60.end 61.end

62.else begin

63. TL_SetEnd(下降线ID,Date,Time,TL_GetValue(下降线ID,Date,Time)); 64.end

65.TLValue:=TL_GetValue(下降线ID,Date,Time); 66.bEnterLong := CrossOver(C, TLValue);

67.if Time < 143000 And 下降线ID > -1 And bEnterLong then Buy; 68.

69.if MarketPosition>0 then begin //持有多头仓位

70. Sell('', DEFAULT, EntryPrice+50, 0, OT_LIMIT, OB_NEXTBAR, '止盈');

71. Sell('', DEFAULT, EntryPrice-10, -1, OT_STOP, OB_NEXTBAR, '止损');

72. if MaxContractProfit>10*BigPointValue then

73. Sell('', DEFAULT, EntryPrice+1, -1, OT_STOP, OB_NEXTBAR, '锁盈1');

74. if MaxContractProfit>20*BigPointValue then

75. Sell('', DEFAULT, EntryPrice+8, -1, OT_STOP, OB_NEXTBAR, '锁盈2');

76. if MaxContractProfit>30*BigPointValue then

77. Sell('', DEFAULT, EntryPrice+10, -1, OT_STOP, OB_NEXTBAR, '锁盈3'); 78.end

79.SetExitOnClose; 80.{

81.注解:

82.1.const:点数量(5) 声明'点数量'为常量并赋值为5

83.2.array: 波峰点日期[点数量](0) 声明'波峰点日期'为一维数组并赋初值为0

84.3.找出最近5个波峰点,波峰点的H大于前后各N个周期的H,这个N即为波峰强度

85.4.新出现一个波峰点后,就向前找到一个比它更高的波峰点作为起点,连接这两个点形成下降趋势线

86.5.周期收盘价上叉下降趋势线时买入

87.6.MarketPosition函数返回当前持仓方向

88.7.MaxContractProfit为以单口计算的最大浮动盈利,BigPointValue为1整数点的单口价值。

89.8.print函数输出到[公式日志],可用于调试公式 90.}

复制代码 有图有真相:

可以看到,9月5日做了2笔趋势线交易,第1笔“锁盈1”平仓,第2笔日内交易平仓。

这个公式比较复杂,本ID在编写时用print函数在一些重要位置输出(到【公式日志】,可在【量化交易】主菜单下打开)、观察数据进行调试,调试通过后再把print语句注释掉。

各位可以试着把本公式中的print语句前的注释去掉,运行公式,看看【公式日志】,有助于理解公式逐根执行的逻辑,提升调试技巧。

公式逐根执行及其与逐行执行的不同解释如下:

逐行执行:对整个K线序列逐行地执行语句 逐根执行:对K线序列逐根地执行整个公式

假设当前有100根K线,公式有2行计算指标值1和指标值2的语句 MA1:MA(C,5); MA2:MA(C,10);

逐行执行:

1.执行第1行语句,计算这100根K线的MA1 2.执行第2行语句,计算这100根K线的MA2

逐根执行:

1.对第1根K线,执行整个公式,计算第1根K线的MA1和MA2 2.对第2根K线,执行整个公式,计算第2根K线的MA1和MA2 ...

100.对第100根K线,执行整个公式,计算第100根K线的MA1和MA2

继续,当有新行情生成第101根K线时

逐行执行:

3.执行第1行语句,计算全部101根K线的MA1 4.执行第2行语句,计算全部101根K线的MA2 逐根执行:

101.对第101根K线,执行整个公式,计算第101根K线的MA1和MA2

智能交易公式默认为逐根执行,为了能够对交易进行各种控制 技术指标类公式默认为逐行执行,为了兼容国内的主流公式 逐根执行是更灵活的执行方式,它能实现逐行执行做不到的功能

对技术指标类公式,可以用编译开关#RunMode设置执行模式 #RunMode RUN_BY_BAR //逐根执行 #RunMode RUN_BY_SERIES //逐行执行

只要控制好风险,加上人工干预,网格交易也是一种不错的方法,特别是在外汇市场,金魔方公式如何实现呢?

且听下回分解!

本文来源:https://www.bwwdw.com/article/v2cf.html

Top