600 likes | 877 Views
WH3 程序化交易. 文华财经研究部 刘艳萍. 1 、 程序化的含义. 交易方面: 1 、把平时的经验思路转化为策略模型,让电脑执行自动下单; 2 、利用电脑的计算能力和铁面无私,提高下单的速度和效率; 3 、避免交易受到情绪的影响,理性交易。. 研究方面: 1 、提供丰富历史数据和收益、风险等多角度模型评估算法; 2 、在电脑的仿真交易环境下去测试、改进策略模型,促进交易思想快速成熟,不再需要动辄几个月甚至几年的实盘验证; 3 、利用电脑的历史数据存储能力,节省时间和资金。. 2 、程序化最关注什么?. 多线程处理.
E N D
WH3程序化交易 文华财经研究部 刘艳萍
1、程序化的含义 交易方面: 1、把平时的经验思路转化为策略模型,让电脑执行自动下单; 2、利用电脑的计算能力和铁面无私,提高下单的速度和效率; 3、避免交易受到情绪的影响,理性交易。
研究方面: 1、提供丰富历史数据和收益、风险等多角度模型评估算法; 2、在电脑的仿真交易环境下去测试、改进策略模型,促进交易思想快速成熟,不再需要动辄几个月甚至几年的实盘验证; 3、利用电脑的历史数据存储能力,节省时间和资金。
2、程序化最关注什么? 多线程处理 模组和技术分析图表相独立,模组之间独立 信号区 持仓区 日志区 独立数据区
文华麦语言( My language ) • WH3的编写语言名为“麦语言”。 源于2004年文华推出的国内第一套程序化函数库,8年时间吸收几十万用户的意见反馈,不断的完善。 • 语法清晰,函数强大。 对于国内的大多数交易者来说,学习程序化交易,存在的主要难点在于代码,因为程序化交易需要通过计算机语言即“程序代码”去编写,而文华财经的程序化平台采用“小语法 大函数”,力求将复杂的算法由软件后台完成,而提供给客户的是最简单易学的编程语言,大大减轻投资者在学习程序代码方面的负担。
常见概念 ‘技术指标’ 属于技术分析范畴,指能够绘出图线但不发交易指令的公式。例如:MA5:MA(C,5); ‘策略模型’ 属于交易范畴,包含交易指令,下单条件,方向,手数,止盈止损等部分。例如: MA5:MA(C,5); C>MA5,BK; ‘公式’(模型) 泛指指标、模型。没有具体指向性。
主要内容 一、模型构成及编写要点 二、资金管理和止损模型编写 三、如何进行多维的模型评估 四、如何运行模型 五、关于日内高频
一、模型构成及编写要点 变量 内容 注释 参数 命名
1.公式名称不可和已经存在的公式名称重复 (唯一性)。2.参数不可以互相重复,不可以和变量名重复,不可以和函数名重复。 3.变量名称 可由字母和数字组成,不可以互相重复,不可以和参数名重复,不可以和函数名重复。
4.公式内容MA5:MA(C,5); 四部分:变量 + 冒号+ 函数 + 分号 一定要使用英文大写半角输入。 5.注释 编码结尾处用“//”将编码与注解隔开。 某行最前端加入“//”代表该行不参与公式运行。
6、操作符 1、加减乘除:+-* / 2、 &&(AND)表示并且,||(OR)表示或者。 3、> 大于,< 小于, >=大于等于,<=小于等于, <>不等于, = 等于。 4、 :=,表示定义一个局部变量(这个变量在画图 时是不画的)。 5、 : ,表示声明了一个变量,并且在画图时画出它并且按这个名字显示
7、常用函数 K 线基础数据
定位K线->取值类函数 均线类函数 MA20:MA(C,20); 20周期收盘价均线(画线显示) H1:REF(H,1); MC:REF(C,10); 前1根K线的最高价; 前10根K线的收盘价;
常用指标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;
A1:CROSS(MA10,MA5); A2:CROSS(MA5,MA10); B1:MA5>MA10; B2:MA5<MA10;
最值类函数 状态类函数 HH:HHV(H,5); LL:LLV(L,5); 5周期高点(低点) 一个周期前的五周期 高点(低点) H1:REF(HH,1); L1:REF(LL,1);
最近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);
根据条件取值类函数 分钟周期上,取昨日收盘价 C1:VALUEWHEN(DATE<>REF(DATE,1),REF(C,1)); 满足收盘价上穿五周期均线到当前的周期数 MA5:MA(C,5); N1:BARSLAST (CROSS(C,MA5))+1;
当天开盘以来的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);
练习 最高价上穿5周期均线并且K线收阳,或者5周期均 线上穿10周期均线5个变动价位。 MA5:=MA(C,5); MA10:=MA(C,10); AA:(CROSS(H,MA5)&&ISUP)||CROSS(MA5,MA10+5*MD); 练习点:变量定义方式;操作符;常用函数; 提示:清晰逻辑关系,适当使用“()” 。
模型编写步骤 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);
练习 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周期最低价,卖平开。
如何实现跨周期 引用某品种在某个周期上加载了某个指标的数据。 #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.如果不写文华码,默认引用当前合约
如何引用日线上的开高低收 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;
如何引用日线上的昨天的开高低收 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;
如何引用日线上的昨天的开高低收 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);
如何引用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;
引用IF指数30分钟周期的KDJ指标中的值 #IMPORT[8600,MIN30,KDJ] ASVAR K1:VAR.K; D1:VAR.D; J1:VAR.J;
引用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;
练习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);
二、资金管理和止损模型编写 如何实现加减仓 如何实现日内交易 如何控制虚拟头寸 如何编写止损模型
如何实现加减仓 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);
加仓 尾盘平仓
如何实现日内交易 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;
如何控制虚拟头寸 MONEY 返回虚拟资金余额。 MONEYTOT 返回当前虚拟总资金。 (虚拟资金余额+持仓保证金) MONEYRADIO 返回当前的虚拟资金的使用率。 MONEY MARGIN FEE MARGIN 返回当前合约的保证金比率。 (用户启动模组时设置的) VOLMARGIN 计算当前的持仓保证金。 FEE 返回当前合约的手续费。 (用户启动模组时设置的)
过滤和非过滤模型如何实现资金管理 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函数同时使用
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);
非过滤模型如何实现过滤 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);
如何编写止损止赢模型 增加买开价位上下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;
三、如何进行多维的模型评估 如何进行收益率测算 如何查看资金曲线 如何进行敏感性测试 如何进行参数优化 如何计算实盘头寸
如何查看资金曲线 资金走势图 K线图 查看详细信息时,不仅可以查到详细的交易信息,还可以通过 资金走势图直观的了解到模型的交易和风险情况。
如何进行敏感性测试 手续费从X轴最小值依次累加,依次算出收益率, 当第一次出现收益率为负的时候,后面的就划横线
如何优化参数 参数优化
如何计算实盘头寸 最大持仓头寸=(总资金×额定风险)/(每手最大回撤×1.5) 例如:总资金100万,额定风险10%;某个模型的最大每手回撤为217.9元-》最大持仓为305手。
四、如何运行模型 运行方式:被绑定运行和独立运行。 被绑定运行:需要和模型绑定在一起运行, 选择被绑定运行,执行方式默认是1秒执行一次。 独立运行:组件可以独立模型之外运行(和信号无关) 在独立运行方式下,执行方式可以选择单次执行和循环执行 单次执行:满足条件时程序只运行一次。 循环执行:程序会按照设定的间隔时间来循环执行。