1 / 60

文华财经研究部 刘艳萍

WH3 程序化交易. 文华财经研究部 刘艳萍. 1 、 程序化的含义. 交易方面: 1 、把平时的经验思路转化为策略模型,让电脑执行自动下单; 2 、利用电脑的计算能力和铁面无私,提高下单的速度和效率; 3 、避免交易受到情绪的影响,理性交易。. 研究方面: 1 、提供丰富历史数据和收益、风险等多角度模型评估算法; 2 、在电脑的仿真交易环境下去测试、改进策略模型,促进交易思想快速成熟,不再需要动辄几个月甚至几年的实盘验证; 3 、利用电脑的历史数据存储能力,节省时间和资金。. 2 、程序化最关注什么?. 多线程处理.

titus
Télécharger la présentation

文华财经研究部 刘艳萍

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. WH3程序化交易 文华财经研究部 刘艳萍

  2. 1、程序化的含义 交易方面: 1、把平时的经验思路转化为策略模型,让电脑执行自动下单; 2、利用电脑的计算能力和铁面无私,提高下单的速度和效率; 3、避免交易受到情绪的影响,理性交易。

  3. 研究方面: 1、提供丰富历史数据和收益、风险等多角度模型评估算法; 2、在电脑的仿真交易环境下去测试、改进策略模型,促进交易思想快速成熟,不再需要动辄几个月甚至几年的实盘验证; 3、利用电脑的历史数据存储能力,节省时间和资金。

  4. 2、程序化最关注什么? 多线程处理 模组和技术分析图表相独立,模组之间独立 信号区 持仓区 日志区 独立数据区

  5. 3、WH3程序化运行机制

  6. 文华麦语言( My language ) • WH3的编写语言名为“麦语言”。 源于2004年文华推出的国内第一套程序化函数库,8年时间吸收几十万用户的意见反馈,不断的完善。 • 语法清晰,函数强大。 对于国内的大多数交易者来说,学习程序化交易,存在的主要难点在于代码,因为程序化交易需要通过计算机语言即“程序代码”去编写,而文华财经的程序化平台采用“小语法 大函数”,力求将复杂的算法由软件后台完成,而提供给客户的是最简单易学的编程语言,大大减轻投资者在学习程序代码方面的负担。

  7. 常见概念 ‘技术指标’ 属于技术分析范畴,指能够绘出图线但不发交易指令的公式。例如:MA5:MA(C,5); ‘策略模型’ 属于交易范畴,包含交易指令,下单条件,方向,手数,止盈止损等部分。例如: MA5:MA(C,5); C>MA5,BK; ‘公式’(模型) 泛指指标、模型。没有具体指向性。

  8. 主要内容 一、模型构成及编写要点 二、资金管理和止损模型编写  三、如何进行多维的模型评估                  四、如何运行模型                     五、关于日内高频           

  9. 一、模型构成及编写要点 变量 内容 注释 参数 命名

  10. 1.公式名称不可和已经存在的公式名称重复 (唯一性)。2.参数不可以互相重复,不可以和变量名重复,不可以和函数名重复。 3.变量名称 可由字母和数字组成,不可以互相重复,不可以和参数名重复,不可以和函数名重复。

  11. 4.公式内容MA5:MA(C,5); 四部分:变量 + 冒号+ 函数 + 分号 一定要使用英文大写半角输入。 5.注释 编码结尾处用“//”将编码与注解隔开。 某行最前端加入“//”代表该行不参与公式运行。

  12. 6、操作符 1、加减乘除:+-* / 2、 &&(AND)表示并且,||(OR)表示或者。 3、> 大于,< 小于, >=大于等于,<=小于等于, <>不等于, = 等于。 4、 :=,表示定义一个局部变量(这个变量在画图 时是不画的)。 5、 : ,表示声明了一个变量,并且在画图时画出它并且按这个名字显示

  13. 7、常用函数 K 线基础数据

  14. 定位K线->取值类函数 均线类函数 MA20:MA(C,20); 20周期收盘价均线(画线显示) H1:REF(H,1); MC:REF(C,10); 前1根K线的最高价; 前10根K线的收盘价;

  15. 常用指标MACD(12,26,9) DIFF : EMA(CLOSE,SHORT) - EMA(CLOSE,LONG); DEA : EMA(DIFF,M); MACD:2*(DIFF-DEA),COLORSTICK; 常用指标KDJ(9,3,3) RSV:=(CLOSE-LLV(LOW,N))/(HHV(HIGH,N)- LLV(LOW,N))*100; K:SMA(RSV,M1,1); D:SMA(K,M2,1); J:3*K-2*D;

  16. A1:CROSS(MA10,MA5); A2:CROSS(MA5,MA10); B1:MA5>MA10; B2:MA5<MA10;

  17. 最值类函数 状态类函数 HH:HHV(H,5); LL:LLV(L,5); 5周期高点(低点) 一个周期前的五周期 高点(低点) H1:REF(HH,1); L1:REF(LL,1);

  18. 最近5个周期中存在最高价突破其前5周期高点 HH:HHV(H,5); H1:REF(HH,1); A1:EXIST(CROSS(H,H1),5); 连续5个周期中满足最新价小于其前5周期低点 LL:LLV(L,5); L1:REF(LL,1); B1:EVERY(C<L1,5);

  19. 根据条件取值类函数 分钟周期上,取昨日收盘价 C1:VALUEWHEN(DATE<>REF(DATE,1),REF(C,1)); 满足收盘价上穿五周期均线到当前的周期数 MA5:MA(C,5); N1:BARSLAST (CROSS(C,MA5))+1;

  20. 当天开盘以来的5周期均线(消除跳空影响) NN:=BARSLAST(DATE<>REF(DATE,1))+1; //开盘以来一共有多少K线 N:=IFELSE(NN>=5,5,NN); //开盘K线根数大于5时取5,否则取实际根数 MA5:MA(CLOSE,N); //求均线,已经消除了跳空 当天开盘以来收盘价大于当天开盘价的次数 NN:=BARSLAST(DATE<>REF(DATE,1))+1; OO:=VALUEWHEN(DATE<>REF(DATE,1),O);//当天开盘价 B:COUNT(C>OO,NN);

  21. 练习 最高价上穿5周期均线并且K线收阳,或者5周期均 线上穿10周期均线5个变动价位。 MA5:=MA(C,5); MA10:=MA(C,10); AA:(CROSS(H,MA5)&&ISUP)||CROSS(MA5,MA10+5*MD); 练习点:变量定义方式;操作符;常用函数; 提示:清晰逻辑关系,适当使用“()” 。

  22. 模型编写步骤 1)定义思路中涉及到的变量 MA5:=MA(C,5);MA10:=MA(C,10); MA20:=MA(C,20); CROSS(MA5,MA10),BK; CROSS(MA10,MA5),SP; CROSS(MA10,MA5),SK; CROSS(MA5,MA10),BP; AUTOFILTER; 2)交易条件,写入交易指令 CROSS(MA5,MA10),BK; CROSS(MA10,MA5),SP; CROSS(MA10,MA5),SK; CROSS(MA5,MA10),BP; MA5:=MA(C,5);MA10:=MA(C,10); MA20:=MA(C,20);

  23. 模型中使用的交易指令

  24. 练习 MA5:=MA(C,5); MA10:=MA(C,10); H1:=REF(HHV(H,10),1); L1:=REF(LLV(L,10),1); (CROSS(C,MA5)&&ISUP)||CROSS(C,H1),BPK; (CROSS(MA10,C)&&ISDOWN)||CROSS(L1,C),SPK; AUTOFILTER; 收盘价上穿5周期均线并且K线收阳,或者收盘价突破前10周期高点,买平开,收盘价下穿10周期均线并且K线收阴,或者最新价跌破前10周期最低价,卖平开。

  25. 如何实现跨周期 引用某品种在某个周期上加载了某个指标的数据。 #IMPORT [CODE, PERIOD, FORMULA] AS VAR。 引用 CODE 所对应的合约 PERIOD 周期下指标 FORMULA 的数据。 CODE 文华码,PERIOD 周期,FORMULA 引用指标名,VAR 定义变量名 注意:1.只能引用 .FML/.XFML文件 2.只能引用如下周期:MIN1 MIN3 MIN5 MIN15 MIN30 HOUR1 DAY WEEK MONTH 3.只能短周期引用长周期 4.被引用的指标中不能存在引用 5.如果不写文华码,默认引用当前合约

  26. 如何引用日线上的开高低收 1、新建指标AA1 HH:H; LL:L; OO:O; CC:C; 2、构建跨周期指标 #IMPORT[,DAY,AA1] ASVAR HH1:VAR.HH; LL1:VAR.LL; OO1:VAR.OO; CC1:VAR.CC;

  27. 如何引用日线上的昨天的开高低收 2、构建跨周期指标 #IMPORT[,DAY,AA2] ASVAR HH1:VAR.HH; LL1:VAR.LL; OO1:VAR.OO; CC1:VAR.CC; HH2:REF(HH1,1); LL2:REF(LL1,1); OO2:REF(OO1,1); CC2:REF(CC1,1); 错误 1、新建指标AA2 HH:H; LL:L; OO:O; CC:C;

  28. 如何引用日线上的昨天的开高低收 2、构建跨周期指标 #IMPORT[,DAY,AA3] ASVAR HH1:VAR.HH; LL1:VAR.LL; OO1:VAR.OO; CC1:VAR.CC; 1、新建指标AA3 HH:REF(H,1); LL:REF(L,1); OO:REF(O,1); CC:REF(C,1);

  29. 如何引用KDJ指标中的值 常用的KDJ指标 RSV:=(CLOSE-LLV(LOW,N))/(HHV(HIGH,N)- LLV(LOW,N))*100; K:SMA(RSV,M1,1); D:SMA(K,M2,1); J:3*K-2*D;

  30. 引用IF指数30分钟周期的KDJ指标中的值 #IMPORT[8600,MIN30,KDJ] ASVAR K1:VAR.K; D1:VAR.D; J1:VAR.J;

  31. 引用15分钟和30分钟周期的KDJ指标值 #IMPORT[,MIN15,KDJ] ASVAR1 K1:VAR1.K; D1:VAR1.D; J1:VAR1.J; #IMPORT[,MIN30,KDJ] ASVAR2 K2:VAR2.K; D2:VAR2.D; J2:VAR2.J;

  32. 练习1:30分钟引用日线数据,30分钟满足KD金叉并且日线满足DIFF,DEA也金叉买平开,反向死叉卖平开。练习1:30分钟引用日线数据,30分钟满足KD金叉并且日线满足DIFF,DEA也金叉买平开,反向死叉卖平开。 • 2、跨周期引用,构建模型。 #IMPORT[,DAY,BB] ASVAR DIFF1:VAR.DIFF; DEA1:VAR.DEA; RSV:=(CLOSE-LLV(LOW,N))/(HHV(HIGH,N)- LLV(LOW,N))*100; K:SMA(RSV,M1,1); D:SMA(K,M2,1); J:3*K-2*D; CROSS(DIFF1,DEA1)&&CROSS(K,D),BPK; CROSS(DEA1,DIFF1)&&CROSS(D,K),SPK; 1、首先建立指标BB。 DIFF : EMA(CLOSE,SHORT) - EMA(CLOSE,LONG); DEA : EMA(DIFF,M); MACD:2*(DIFF-DEA);

  33. 二、资金管理和止损模型编写 如何实现加减仓 如何实现日内交易 如何控制虚拟头寸 如何编写止损模型

  34. 如何实现加减仓 MA5:=MA(CLOSE,5); MA10:=MA(CLOSE,10); MA20:=MA(CLOSE,20); CROSS(MA10,MA20),BK; CROSS(MA10,MA5),SP; CROSS(MA20,MA10),SK; CROSS(MA5,MA10),BP; 加仓:多单2手C>MA10&&C>MA20,BK(2); 减仓:多单1手C<MA10&&C<MA20,SP(1); C>MA10&&C<MA20,BK(2); C<MA10&&C>MA20,SP(1); TIME>=1458,BP(BUYVOL); TIME>=1458,SP(SELLVOL); 尾盘全部平仓TIME>=1458,BP(SELLVOL); TIME>=1458,SP(BUYVOL);

  35. 加仓 尾盘平仓

  36. 如何实现日内交易 MA5:=MA(CLOSE,5); MA10:=MA(CLOSE,10); MA20:=MA(CLOSE,20); CROSS(MA10,MA20)&&TIME>=0900&&TIME<1455,BK; (CROSS(MA10,MA5)&&TIME>=0900&&TIME<1455)||TIME>=1455,SP; CROSS(MA20,MA10)&&TIME>=0900&&TIME<1455,SK; (CROSS(MA5,MA10)&&TIME>=0900&&TIME<1455)||TIME>=1455,BP; MA5:=MA(CLOSE,5); MA10:=MA(CLOSE,10); MA20:=MA(CLOSE,20); CROSS(MA10,MA20)&&CLOSEMINUTE>1,BK; (CROSS(MA10,MA5)&&CLOSEMINUTE>1)||CLOSEMINUTE<=1,SP; CROSS(MA20,MA10)&&CLOSEMINUTE>1,SK; (CROSS(MA5,MA10)&&CLOSEMINUTE>1)||CLOSEMINUTE<=1,BP;

  37. 如何控制虚拟头寸 MONEY 返回虚拟资金余额。 MONEYTOT 返回当前虚拟总资金。 (虚拟资金余额+持仓保证金) MONEYRADIO 返回当前的虚拟资金的使用率。 MONEY MARGIN FEE MARGIN 返回当前合约的保证金比率。 (用户启动模组时设置的) VOLMARGIN 计算当前的持仓保证金。 FEE 返回当前合约的手续费。 (用户启动模组时设置的)

  38. 过滤和非过滤模型如何实现资金管理 MA5:=MA(CLOSE,5); MA10:=MA(CLOSE,10); MA20:=MA(CLOSE,20); CROSS(MA10,MA20),BK; CROSS(MA10,MA5),SP; CROSS(MA20,MA10),SK; CROSS(MA5,MA10),BP; SETDEALPERCENT(50); AUTOFILTER; 设置模型下单用的虚拟资金比例,以后每次下单都按虚拟资金的比例下单。 用法: SETDEALPERCENT(fPercent)表示每次按资金的fPercent(范围1~100)下单。 例子:SETDEALPERCENT(20); //每次按资金比例的%20下单 注:应该与AUTOFILTER函数同时使用

  39. MA5:=MA(CLOSE,5); MA10:=MA(CLOSE,10); MA20:=MA(CLOSE,20); CROSS(MA10,MA20),BK; CROSS(MA10,MA5),SP; CROSS(MA20,MA10),SK; CROSS(MA5,MA10),BP; MA5:=MA(CLOSE,5); MA10:=MA(CLOSE,10); MA20:=MA(CLOSE,20); CROSS(MA10,MA20), BK((MONEY*0.2)/(MARGIN*C*N)); CROSS(MA10,MA5),SP(BUYVOL); CROSS(MA20,MA10), SK((MONEY*0.3)/(MARGIN*C*N)); CROSS(MA5,MA10),BP(SELLVOL);

  40. 非过滤模型如何实现过滤 H1:=REF(HHV(H,10),1); L1:=REF(LLV(L,10),1); ISLASTBK,ISLASTSK, ISLASTSP,ISLASTBP. //最新价突破前10周期最高价且前一个指令不是开仓指令,则买开仓1手; //最新价跌破前10周期最低价且前一个指令不是开仓指令,则卖开仓1手; //连续3个周期持仓量不断减少且前一个指令是卖开仓,则平1手空单; //连续3个周期持仓量不断增加且前一个指令是买开仓,则平1手多单; CROSS(C,H1)&&ISLASTSK=0&&ISLASTBK=0,BK(1); CROSS(L1,C)&&ISLASTBK=0&&ISLASTSK=0,SK(1); EVERY(OPI<REF(OPI,1),3)&&ISLASTSK=1&&ISLASTBK=0,BP(1); EVERY(OPI>REF(OPI,1),3)&&ISLASTBK=1&&ISLASTSK=0,SP(1);

  41. 如何编写止损止赢模型 增加买开价位上下5个点止赢止损,卖开价位上下10个点止赢止损 CROSS(MA10,MA5)||C<BKPRICE-5*MD||C>BKPRICE+5*MD,SP; CROSS(MA5,MA10)||C>SKPRICE+10*MD||C<SKPRICE-10*MD,BP; MA5:=MA(CLOSE,5); MA10:=MA(CLOSE,10); MA20:=MA(CLOSE,20); CROSS(MA10,MA20),BK; CROSS(MA20,MA10),SK; CROSS(MA5,MA10),BP; CROSS(MA10,MA5),SP;

  42. 三、如何进行多维的模型评估 如何进行收益率测算 如何查看资金曲线 如何进行敏感性测试 如何进行参数优化 如何计算实盘头寸

  43. 如何进行收益率测算

  44. 如何查看资金曲线 资金走势图 K线图 查看详细信息时,不仅可以查到详细的交易信息,还可以通过 资金走势图直观的了解到模型的交易和风险情况。

  45. 如何进行敏感性测试 手续费从X轴最小值依次累加,依次算出收益率, 当第一次出现收益率为负的时候,后面的就划横线

  46. 如何优化参数 参数优化

  47. 如何计算实盘头寸 最大持仓头寸=(总资金×额定风险)/(每手最大回撤×1.5) 例如:总资金100万,额定风险10%;某个模型的最大每手回撤为217.9元-》最大持仓为305手。

  48. 四、如何运行模型 运行方式:被绑定运行和独立运行。 被绑定运行:需要和模型绑定在一起运行, 选择被绑定运行,执行方式默认是1秒执行一次。 独立运行:组件可以独立模型之外运行(和信号无关) 在独立运行方式下,执行方式可以选择单次执行和循环执行 单次执行:满足条件时程序只运行一次。 循环执行:程序会按照设定的间隔时间来循环执行。

More Related