UploadFiles/Files/WH3程序化讲解

Download Report

Transcript UploadFiles/Files/WH3程序化讲解

文华财经研究部
刘艳萍
1、程序化的含义
交易方面:
1、把平时的经验思路转化为策略模型,让电
脑执行自动下单;
2、利用电脑的计算能力和铁面无私,提高下
单的速度和效率;
3、避免交易受到情绪的影响,理性交易。

研究方面:
1、提供丰富历史数据和收益、风险等多角度模
型评估算法;
2、在电脑的仿真交易环境下去测试、改进策略
模型,促进交易思想快速成熟,不再需要动
辄几个月甚至几年的实盘验证;
3、利用电脑的历史数据存储能力,节省时间和
资金。

2、程序化最关注什么?
多线程处理
独立数据区
速度
独立
性
稳定
性
执行
力
模组和技术分
析图表相独立,
模组之间独立
信号区
持仓区
日志区
3、WH3程序化运行机制
策略模型
• 条件产
生信号
信号确认
• 过滤虚
假信号
下单组件
• 控制信
号下单


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、 : ,表示声明了一个变量,并且在画图时画出
它并且按这个名字显示
HIGH
最高价
简写H
OPEN
开盘价
简写O
LOW
最低价
简写L
CLOSE
收盘价
简写C
SETTLE
结算价
VOL
成交量
OPI
持仓量
TIME
K线时间
BARPOS
K线位置
简写V
引申: YEAR MONTH DATE DAY WEEKDAY HOUR MINUTE 等时间函数
K
线
基
础
数
据
REF(X,N)
X 在N个周期前的值
REFX(X,N)
X 在N个周期后的值
MA(X,N)
求X在N周期内的简单移动平均。
EMA(X,N)
求X在N周期内的指数加权平均.
定位K线->取值类函数
均线类函数
计算方法:EMA(X,N)=[2*X+(N-1)*EMA(X,(N-1))]/(N+1) 其中EMA(X,(N-1))为第(N-1)天的EMA值
DMA(X,N)
求X得动态移动平均
计算方法:DMA(N)=DMA(N-1)*(1-A)+X(N)*A 其中DMA(N-1)为第(N-1)天的DMA值,A必须小于1大于0。
EMA2(X,N)
求X在N周期内的线性加权平均.
MA2(X,N)=(N*X0+(N-1)*X1+(N-2)*X2)+...+1*XN)/(N+(N-1)+(N-2)+...+1),X0表示本周期值X1表示上一周期值...
20周期收盘价均线(画线显示)
MA20:MA(C,20);
前1根K线的最高价;
前10根K线的收盘价;
H1:REF(H,1);
MC:REF(C,10);
常用指标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); B1:MA5>MA10;
A2:CROSS(MA5,MA10); B2:MA5<MA10;
HHV(X,N)
N个周期中X的最高值
LLV(X,N)
N个周期中X的最低值
EVERY(X,N)
连续N个周期均为满足X条件的K线
最值类函数
状态类函数
EXIST(X,N)
N个周期中存在满足X条件的K线
5周期高点(低点)
HH:HHV(H,5);
LL:LLV(L,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);
VALUEWHEN(A,X)
IFELSE(X,A,B)
取最近一次满足A条件时对应K线的X值。
满足X条件则取A值,否则取B。
BARSLAST(X)
上一次满足X条件到当前的周期数
COUNT(X,N)
最近的N个周期中满足X条件的次数
根据条件取值类函数
分钟周期上,取昨日收盘价
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);
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);
CROSS(MA5,MA10),BK;
CROSS(MA10,MA5),SP;
CROSS(MA10,MA5),SK;
CROSS(MA5,MA10),BP;
AUTOFILTER;
练习
收盘价上穿5周期均线并且K线收阳,或者收盘价突破前10
周期高点,买平开,收盘价下穿10周期均线并且K线收阴
,或者最新价跌破前10周期最低价,卖平开。
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;
如何实现跨周期

引用某品种在某个周期上加载了某个指标的数据。
#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] AS VAR
HH1:VAR.HH;
LL1:VAR.LL;
OO1:VAR.OO;
CC1:VAR.CC;
如何引用日线上的昨天的开高低收
1、新建指标AA2
HH:H;
LL:L;
OO:O;
CC:C;
2、构建跨周期指标
#IMPORT[,DAY,AA2] AS VAR
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、新建指标AA3
HH:REF(H,1);
LL:REF(L,1);
OO:REF(O,1);
CC:REF(C,1);
2、构建跨周期指标
#IMPORT[,DAY,AA3] AS VAR
HH1:VAR.HH;
LL1:VAR.LL;
OO1:VAR.OO;
CC1:VAR.CC;
如何引用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] AS VAR
K1:VAR.K;
D1:VAR.D;
J1:VAR.J;


引用15分钟和30分钟周期的KDJ指标值
#IMPORT[,MIN15,KDJ] AS VAR1
K1:VAR1.K;
D1:VAR1.D;
J1:VAR1.J;
 #IMPORT[,MIN30,KDJ] AS VAR2
K2:VAR2.K;
D2:VAR2.D;
J2:VAR2.J;

练习1:30分钟引用日线数据,30分钟满足KD金叉并且日线满足
DIFF,DEA也金叉买平开,反向死叉卖平开。
1、首先建立指标BB。
DIFF : EMA(CLOSE,SHORT) - EMA(CLOSE,LONG);
DEA : EMA(DIFF,M);
MACD:2*(DIFF-DEA);

2、跨周期引用,构建模型。
#IMPORT[,DAY,BB] AS VAR
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;

二、资金管理和止损模型编写
如何实现加减仓
 如何实现日内交易
 如何控制虚拟头寸
 如何编写止损模型

如何实现加减仓
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;
C>MA10&&C<MA20,BK(2);
C<MA10&&C>MA20,SP(1);
TIME>=1458,BP(BUYVOL);
TIME>=1458,SP(SELLVOL);
加仓:多单2手
C>MA10&&C>MA20,
BK(2);
减仓:多单1手
C<MA10&&C<MA20,
SP(1);
尾盘全部平仓
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
MARGIN
FEE
MONEY
返回虚拟资金余额。
MONEYTOT 返回当前虚拟总资金。
(虚拟资金余额+持仓保证金)
MONEYRADIO 返回当前的虚拟资金的使用率。
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((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);
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;
非过滤模型如何实现过滤
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个点止赢止损
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;
CROSS(MA10,MA5)||C<BKPRICE-5*MD||C>BKPRICE+5*MD,SP;
CROSS(MA5,MA10)||C>SKPRICE+10*MD||C<SKPRICE-10*MD,BP;
三、如何进行多维的模型评估
如何进行收益率测算
 如何查看资金曲线
 如何进行敏感性测试
 如何进行参数优化
 如何计算实盘头寸

如何进行收益率测算
如何查看资金曲线
资金走势图
K线图
查看详细信息时,不仅可以查到详细的交易信息,还可以通过
资金走势图直观的了解到模型的交易和风险情况。
如何进行敏感性测试
手续费从X轴最小值依次累加,依次算出收益率,
当第一次出现收益率为负的时候,后面的就划横线
参数优化
如何优化参数
如何计算实盘头寸
最大持仓头寸=(总资金×额定风险)/
(每手最大回撤×1.5)
例如:总资金100万,额定风险10%;某
个模型的最大每手回撤为217.9元-》最
大持仓为305手。
四、如何运行模型
运行方式:被绑定运行和独立运行。
被绑定运行:需要和模型绑定在一起运行,
选择被绑定运行,执行方式默认是1秒执行一次。
独立运行:组件可以独立模型之外运行(和信号无关)
在独立运行方式下,执行方式可以选择单次执行和循环执行
单次执行:满足条件时程序只运行一次。
循环执行:程序会按照设定的间隔时间来循环执行。
软件内置
模块
自编下单
组件
五、关于日内高频
日内高频有何优势?
 TICK图详细信息
 便捷的测算收益
 全面调用盘口数据
 程序化交易
盘口数据区
红色部分:当前实时买盘盘口挂单价格及挂单量;
绿色部分:当前实时卖盘盘口挂单价格及挂单量;
K线显示区
灰色部分:当日曾出现过的买、卖盘口挂单价格
及挂单量;
黄点:提示最新成交价格的成交量达到或超过了所设置“大
单”量;
红点:提示离最新成交价最近的,并且达到或超过所设置
“大单”量的买盘报价具体价位;
绿点:提示离最新成交价最近的,并且达到或超过所设置
“大单”量的卖盘报价具体价位;
信号区
分笔数据区
持仓区
日内高频模型举例
买卖人气型:
根据盘口价量变化判断买卖双方的交易气氛,依此作
为入场依据,可获得短暂盈利。
可能用到的函数:各档位委托量、多空双方的大单价
格、主动买卖的成交次数等。
A:=L2_BIDVOL1+L2_BIDVOL2+L2_BIDVOL3;//定义买盘前3档总量
B:=L2_ASKVOL1+L2_ASKVOL2+L2_ASKVOL3;//定义卖盘前3档总量
D:A-B;
CROSS(D,0)&&ISLASTSK=0&&ISLASTBK=0,BK(1);//买量大于卖量
且前一个指令不是开仓指令,则买开仓1手;
CROSS(0,D)&&ISLASTBK=0&&ISLASTSK=0,SK(1);//买量小于卖量
且前一个指令不是开仓指令,则卖开仓1手;
EVERY(D>REF(D,1),2)&&ISLASTSK=1&&ISLASTBK=0,BP(1);//连续
2个周期买量不断增加且前一个指令是卖开仓,则平1手空单;
EVERY(D<REF(D,1),2)&&ISLASTBK=1&&ISLASTSK=0,SP(1);//连续
2个周期卖量不断增加且前一个指令是买开仓,则平1手多单;