《程序化交易培训课件.pptx》由会员分享,可在线阅读,更多相关《程序化交易培训课件.pptx(61页珍藏版)》请在三一办公上搜索。
1、程序化交易,ETL 平台简介,01,3,ETL平台,提供整套策略分析、设计、测试、评价、优化的交易平台,ETL 平台,提供交易策略和系统函数,支持用户函数图形分析界面,多维度的交易模型测试分析报告及参数优化功能支持交易模型导入导出,DLL(无源码)形式导出,移植性好不易破解,4,ETL语言,ETL是在C+语言的基础上扩展而来,兼容C+的语法ETL在编译时首先被解析为C+,再被编译为标准的动态链接库(DLL)ETL主要在如下几方面对C+做了扩展:不区分大小写设定了参数和变量的定义区域Params、Vars、GlobalVars兼容C+的一些通用关键字和符号,如:or、and、 not、“+=”实
2、现了浮点数的模糊比较函数没有参数时可以省略括号实现了序列变量,5,程序化交易,开发,测试,执行,账户设置、策略监控持仓矫正、后台交易,ETLVisual Studio第三方软件,历史回溯、参数优化性能报告、属性设置,6,交易模式,策略交易模式指的是一种虚拟交易模式,通过Buy,Sell,SellShort,BuyToCover等策略交易函数进行开仓和平仓,通过CurrentContracts等策略状态函数和Available等策略性能函数查看当前策略的持仓和资金状态,订单交易是直接通过交易通道发送订单的交易方式,使用账户函数(A_函数)进行下单、撤单、查询等操作,可以精确得知订单的状态,并及时
3、进行撤单、追单等操作,7,持仓矫正,实现不成交订单的自动撤单和自动追单,通过设置撤单和追单的相关参数,实现策略仓和账户仓的自动校正,实现策略持仓与账户持仓自动同步,将处于排队中的订单进行撤单,然后根据仓差情况发送等量的订单,发送订单遵循先平仓后开仓的思路,使用持仓同步时,若追单助手功能已经开启,会将追单助手自动关闭,以免追单助手的自动下单影响到持仓同步。,8,实时触发机制,9,历史回测和实时交易,10,性能报告,11,交易状态,策略只会在触发机制的调用下运行,不会发送订单,也不会报警,如果策略发出下单信号,会出现一个报警窗口提示用户,策略发出下单信号时,将发送订单至交易通道,用户也可以勾选“下
4、单前进行确认”,则在下单前会弹出对话框询问用户是否下单,自动发单状态,报警状态,静默状态,12,策略执行监控,所有策略,单个策略,组合性能 列出了所有策略单个以及组合的资产收益情况,便于用户直观的了解每个策略的性能。,持仓监控 列出了所有交易策略在不同账户和不同的合约的持仓情况,策略性能 使用户对当前策略的性能有一个粗略的认识,了解策略交易的情况,策略持仓 了解当前策略的持仓情况,运行日志 当前策略的输出,用户输出及买入、卖出信号,13,扩展性,支持采用Visual Studio编写策略,生成DLL,便于对策略进行扩展,及使用第三方库(如:Matlab)软件安装目录下VisualStudioS
5、ample文件夹,里面有VS编写的相关文档和例子,14,安全性,策略导入导出模式无源码模式:直接导出应用程序,对方客户端导入后无需编译可直接使用于图表上,不能看到源代码。有源码模式:对方客户端导入后需要通过编译方可使用。,无源码,dll格式,安全性高,有源码,esl格式,可重复编辑,编程入门,02,16,交易指令和函数,易盛程序化交易公式包括交易指令和函数,17,代码结构,参数定义区,变量定义区,程序主体,Params Numeric Length(10); 公式参数段 Vars NumericSeries MA; 局部变量段 GlobalVars NumericSeries MA; 全局变量
6、段 Begin MA = AverageFC(Close, Length); PlotNumeric(“MA”, MA); End,18,数据类型,19,参数声明,参数是一个预先声明的存储空间,用来存放输入参数的值。使用参数可以增强代码的健壮性和可维护性。声明方法如下:,Params 参数类型 参数名 1(初值); 参数类型 参数名 2(初值);,交易指令的参数只支持三种基本类型和整型,函数的参数支持全部的数据类型交易指令的参数一定要有初始值,函数的参数可以没有默认值当函数被交易指令调用,若交易指令省略了参数,此时交易指令参数的输入值就为函数的默认值Ref数据类型参数不能设置初始值若某个参数没
7、有设置初始值,则定义在该参数前边的参数即使有初始值,该初始值也会被忽略,ParamsNumericRef P1; NumericSeries P2(0); String P3(Hello);,Params Numeric P1(3); Numeric P2; Numeric P3(10);,Params Numeric P1; Numeric P2; Numeric P3(10);,20,变量声明,变量的主要用处在于存放计算或比较的结果,以方便在之后的程序中直接引用运算的值,而无需重现计算过程。变量在使用前必须进行声明,声明方法如下:,Vars 变量类型 变量名 1(初值); 变量类型 变量名
8、 2(初值);,引用类型(NumericRef、StringRef、BoolRef)不能定义为变量,只能定义为参数变量赋值时,变量类型和表达式的类型要一致,如:,VarsNumericSeries MA; Numeric Stopline(30);,变量名 = 表达式 MA=AverageFC(Close,10);,21,序列变量,序列变量是程序化交易编程语言与一般编程语言(如:C+)的一个显著差别,是为了简化金融统计运算而设计实现的,如下为序列变量定义的例子:,Vars NumericSeries MyNum (0); BoolSeries MyBool (False); StringSer
9、ies MyStr ( );,序列变量拥有数据回溯的功能,它可以用中括号的方式访问以前K线的数据,如:High表示本周期的最高价,High1就表示上一根K线的最高价。Close代表本周期收盘价或者最新价,Close3就表示3周期前的收盘价。Close和Close()两个的意思完全不同!序列变量是一个长度自动变化的数组,它的长度始终和图表中K线的数量是一致的。,22,序列变量与非序列变量,Vars Numeric m(0); NumericSeries n(0);Begin If (CO) m=1; If (CO) n=1; PlotNumeric(m=,m); PlotNumeric(n=,n
10、);End,序列变量的值具有传导效应非序列变量在条件满足时,显示的是满足条件时的值,在不满足条件时,显示的是为初始值;序列变量在条件满足时,显示的是满足条件的值,在不满足条件时,显示的是上一根K线的值。,23,序列变量与数组,序列变量依赖于图表,数组不依赖图表序列变量对于历史周期的数据只能访问,不能修改,而数组可以随意修改以前的数据访问当前周期数据时,序列变量可以省略0,而数组必须加上0不能将一个数组作为函数的参数传给一个序列变量。如计算数组的均值,不能用Average函数,而应当使用iMA函数计算,为方便用户实现对跨周期跨合约历史数据的获取,系统定义了数组类型NumericArray和数组引
11、用类型NumericArrayRef。系统提供了函数HisData函数供调用,它的返回值为一个数组(NumericArray)。数组和序列变量都可以进行历史数据的回溯,但数组与序列变量有着本质的区别:,24,数组,ParamsVarsNumericArray arr; /注意,数组不能设置初始值BeginArrAdd(arr,3); /添加一个数据,此时arr:3ArrAdd(arr,15.6); /添加一个数据,arr:3, 15.6ArrRevers(arr); /反转数组,arr中的数据15.6, 3arr1=5; /修改一个元素的值,arr中的数据15.6, 5 ArrPrint(ar
12、r); /在调试窗口打印数组arr的成员ArrClear(arr); /arr被清空/获取周线的收盘价历史数据arr = HisData(Enum_Data_Close,Enum_Period_Week,1); if(ArrLength(arr)1) /判断是否成功获取到了周线收盘价历史数据 Print(arr0); /打印当前时刻的周线价格 Print(arr1); /打印上周的周线价格End,25,全局变量,公式内部使用的全局变量,全局变量需要定义在GlobalVars区域,为方便起见,除了序列变量外,其他变量都可以定义在以Begin开头的程序体内部,序列变量只能定义在GlobalVars
13、或Vars区域中全局变量在公式被加载将一直存在,直到公式停止运行。局部变量在每次代码运行结束都会被自动销毁,下次运行代码时会被重新赋予初始值只有交易指令才有GlobalVars区域,函数中不能定义GlobalVars,VarsNumeric a(5);Begin a = a+ 5;Print(a);End,GlobalVarsNumeric a(5);Begin a = a+ 5;Print(a);End,Vars NumericSeries a(5);Begin a = a+5; Print(a);End,GlobalVars NumericSeries a(5);Begin a = a+
14、5;Print(a);End,26,全局变量,公式之间使用的全局变量,除了使用GlobalVars关键字定义全局变量外,用户还可以使用系统函数SetGlobalVar和GetGlobalVar存取全局变量。这两个函数定义的全局变量可以实现多个交易指令之间共享数据单个公式应用中可提供最多 500 个全局变量,全局变量的索引值从0开始计数到499全局变量的默认值为0,它的值不会因为当前Bar的变化而变化,而只能由SetGlobalVar函数来设置全局变量值的变化只跟SetGlobalVar的执行顺序有关,因此在图表上进行刷新时,必须考虑因交易指令重新运行导致的全局变量值的变化全局变量依附在K线图上
15、,一旦关掉K线图,所有与该图表有关的全局变量将不复存在,BeginSetGlobalVar(0,125);End,BeginNumeric P = GetGlobalVar(0);Print(P);End,27,全局变量,可被存储的全局变量,使用SetELProfileString函数可以将一个字符串写入到配置文件中保存下来,采用GetELProfileString获得配置文件中的字符串;同理函数SetELProfileString2file和GetELProfileString2file也一样单个公式应用中可提供最多 500 个全局变量,全局变量的索引值从0开始计数到499读写文件的效率会远
16、低于SetGlobalVar/GetGlobalVar的效率,避免频繁调用该函,SetELProfileString,GetELProfileString,SetELProfileString2file,GetELProfileString2file,28,运算,运算包括算术运算,关系运算,逻辑运算。进行运算时,扩展数据类型和基础数据类型没有任何区别数值型变量、字符串变量可以进行算术运算和关系运算,不能进行逻辑运算布尔型变量不能进行算术运算和关系运算,只能进行逻辑运算,29,运算,算术运算,数值型变量可以进行加、减、乘、除、求余数、乘方等运算算术运算符 + -,赋值运算符 += -= *=字符
17、串变量两个字符串可以做相加运算,结果返回一个将两个源串连接在一起的字符串,源串不发生变化不能写Print (Hello+ World);,关系运算,= = = !=字符串变量只能进行 = 和 != 运算,其意义是判断两个字符串内容是否相同,不区分大小写,VarsString a(Hello);BeginString b = World;a= a + b;a += ! ;Print(a); /Hello World!End,VarsString a(Hello);Numeric b(23.5);BeginString m = a + Text(b);Print(m); /Hello23.5000
18、00Print(a+ World); /Hello WorldEnd,30,运算,逻辑运算,只有布尔型变量(Bool)才可以进行逻辑运算。,VarsBool a(true);Bool b(false);BeginPrint(a /0End,VarsBool a(true);Bool b(false);Begina=54;Print( a and CO); /0Print( CO and a); /执行效率没有上一条高Print(b or CO); /1Print(CO or b); /执行效率没有上一条高End,31,控制语句,条件语句If 语句If - Else 语句If - Else -
19、If 语句If - Else 嵌套循环语句While 循环(避免死循环)For 循环变量 = 初始值 To 结束值For 循环变量 = 初始值 DownTo 结束值,If (Condition)ETL公式语句;,If (Condition1) ETL公式语句1; Else If(Condition2) ETL公式语句2; Else ETL公式语句3; ,For 循环变量 = 初始值 To(DownTo) 结束值ETL公式语句;,While (Condition)ETL公式语句;,32,终止语句,Break循环在每次执行后,都将判断Condition的值,当Condition为true时,则执行
20、Break语句,跳出整个循环Continue当Condition1为true时,执行循环体,当Condition2为true时,将跳过ETL公式语句2,重新判断Condition1的值,进入下一次循环,否则将继续执行ETL公式语句2,While (True)ETL公式语句;If (Condition)Break; ,While (Condition1)ETL公式语句1;If (Condition2)Continue;ETL公式语句2;,Break是跳出整个循环,Continue是跳出当层循环对于For循环,Break和Continue的用法也是类似,33,终止语句,Vars Numeric i
21、;BeginFor i=0 to 9If( i=2 )Break;ElsePrint(i);End,Vars Numeric i(0);BeginWhile (i=3) i+; If(i=2)Continue;ElsePrint(i);End,Break,Continue,34,函数,函数是可以通过名称进行调用的一组语句的集合,它具有特定的功能,执行结束后有返回值,这个值可以是Numeric,Bool,String,Integer四种类型中的任何一种。 函数编写方法如下: 打开公式编辑器新建用户函数,定义好函数的简称和名称编写代码 设置参数根据需要设置变量编写具体实现功能的代码,通过retur
22、n返回结果 编译保存当前函数,函数可以通过名称进行调用,实际应用中一般将某些经常需要用到的功能做成函数以方便以后编程时调用,也可以把技术指标改写成用户函数的形式系统函数可以查看和调用,不能修改函数通过参数传入数据,通过Return返回值或通过引用型变量返回值函数间可以相互调用,也可以递归调用若一个函数没有参数,则调用时可以省略小括号函数的Return语句和交易指令的Return语句有所不同,35,函数引用参数,函数的参数可以在代码中被引用,若希望调用该函数的上层代码对应的变量在调用函数结束后也得到修改,实现函数能返回多个值,可用引用数据类型(XXRef)。调用函数func的代码片段: func
23、函数源码:,Params Numeric a(2); Numeric b(3); Vars Numeric m; Begin m=func(a,b); Print(a); /a=10 Print(b); /b=3 Print(m); /m=30End,Params NumericRef P1; /上层代码对应的变量值会被修改 Numeric P2(5.2);Vars Numeric P;Begin P1=10; P=P1*P2; Return P;End,Ref数据类型参数不能设置初始值用户函数参数的声明数据类型需和调用时传入参数的数据匹配。匹配是指数据的基本数据类型要一致,除了序列类型变量不
24、能传给引用类型的参数,36,序列函数,序列函数是一种特殊的用户函数,当它的参数或变量中使用了序列变量时,即被称之为序列函数。 序列数据作为ETL语言和普通计算机语言的重要区别,是进行金融序列数据计算的的核心。序列函数保存了每一周期的计算结果,由于序列函数可能被多个主函数多次调用,若使用不当,会导致序列函数中的历史数据发生混乱。为避免这个问题,使用序列函数必须遵循一些规则,具体如下:尽可能保证每一周期的序列函数都得到执行。 尽量不要在If-Else等语句中使用序列函数。 可以在循环语句中使用序列函数,但必须保证每个周期中序列函数的调用次数是相同的。,37,序列函数,ParamsNumeric P
25、1(5);Numeric P2(10);Begin Numeric ret1=Function(Close,P1);Numeric ret2=Function(Close,P2);PlotNumeric(“EMA1”, ret1);PlotNumeric(“EMA2”, ret2);End,ParamsNumeric Price(0);Numeric P(5);VarsNumericSeries ret;Begin /求指数平均Numeric factor=2/(P+1);ret=factor*(Price-ret1)+ret1;return ret;End,指数平均算法:当天EMA = 昨天
26、的EMA + 加权因子 * ( 当天的收盘价 - 昨天的EMA )加权因子=2 / ( N + 1 );,Function源码,常用系统函数,39,系统函数分类,K线数据即时行情策略交易策略状态策略性能账户函数商品属性金融统计,绘图函数颜色函数数学函数时间函数字符串函数数组函数枚举函数其他函数,40,K线数据,BarStatus,If (Barstatus=1 ,41,策略状态,MarketPosition,If (close open) Buy(1); If (marketpositon = 1) Sell(1); ,MarketPosition会在每个策略交易指令发出后立即更新,不管该笔交
27、易是否成交。例如:在同一次策略执行过程中前面有开仓,后面紧接着平仓,判断条件是(MarketPosition = 1),只要前面开仓条件满足后,后面的平仓语句是会执行的。,42,策略状态,BarSinceEntry,If (Markeposition=1 ,在历史回测中,无法得知是先满足了开仓条件还是先满足了平仓条件,这样就会造成回测和实盘不一致,所以要避免在同一根K线上即开仓又平仓。,43,其他函数,Print,Commentary,44,其他函数,FileAppend,BeginFileAppend(D:sample.txt, Date=+DateToString(Date)+ Time=
28、 + TimeToString(time) + Close= + Text(Close)+ CurrentBar= + Text(CurrentBar) + Barstatus=+ Text(BarStatus);End,45,绘图函数,PlotNumeric,46,绘图函数,UnPlot,47,商品属性,最小变动价,Numeric MinPoint = MinMove * PriceScale;,MinMove最小变动量,PriceScale计数精度,48,金融统计,穿越函数,CrossOver上穿,CrossUnder下破,49,策略交易,Buy - 平掉所有空头持仓,开多头仓位sell
29、- 平掉指定多头持仓Sellshort - 平掉所有多头持仓,开空头仓位Buytocover - 平掉指定空头持仓,50,账户函数,A_SendOrder,51,A函数和Q函数,A函数指以A_开头的系统函数,获取自动交易关联帐户的帐户信息Q函数指以Q_开头的系统函数,主要是获取实时行情信息Q函数和A函数都是反映最新的实时状态,该类函数若用于历史回测,历史数据可能会取不到或者不准确,所以不适用对历史行情数据进行回溯或调用A_SendOrder函数每一次执行都会发送一次委托,一般需配合仓位头寸进行条件处理,使用全局变量配合控制委托次数,避免反复开仓。 A函数在不清楚运行机制的情况下慎用。 A函数的
30、例子:系统自带的账户交易示例,52,浮动止损,SetFloatStopPoint,做多模式,做空相反,53,跨合约获取行情,Close,ParamsString Symbol1(ZCE TA 509);String Symbol2(ZCE TA 510);BeginPlotNumeric (Spread, Close(Symbol1) - Close(Symbol2);End,54,跨周期获取行情,HisData,ParamsString Symbol1(ZCE TA 509);VarsNumericArray data;Begindata = HisData(Enum_Data_Close,
31、Enum_Period_Min,15, Symbol1);if( ArrLength(data) 0)Numeric myMA = iMA(data, 5); /5周期均线PlotNumeric(myMA,myMA);End,相似函数对比,56,Average & AverageFC,Average和AverageFC都是系统函数,目的都是用来求N个Bar以来的平均值,可以直接在编辑器里看到实现的代码。AverageFC是指FastCalculate,即快速计算。当这两个函数的第二个参数,即N个Bar是常量时,使用AverageFC,提高计算效率。当N是不确定的变量时,则必须使用Average
32、,否则会出现计算问题。系统里面类似的用户函数还有Summation和SumamtionFC,Highest 和HighestFC,Lowest和LowestFC等。,57,序列平均 & 数组平均,序列变量求平均Average :求平均,同MAXAverage :求指数平均,同EMASMA:求权重移动平均MACD:求指数平滑异同平均WAverage :求权重平均,数组求平均iMA :求数组中元素的平均值iEMA :求数组中元素的指数平滑平均值iSMA:求权重移动平均iMACD :求数组中元素的指数平滑平均值,MA = (C1 + C2 + C3 + C4 + C5 + . + Cn) / nEM
33、A = 2 / (N + 1) * C + (N - 1) / (N + 1) * 昨EMASMA = M / (N + 1) * C + (N + 1 - M) / (N + 1) * 昨SMAMACD = 2 * (DIFF DEA) 其中: DIFF = EMA12 - EMA26; DEA = EMA (DIFF,9); WAverage =(C1 + 2C2 + 3C3 + 4C4 + 5C5 + . + n * Cn) * 2 / (n * (n + 1)),58,最高 & 最低,Low :当前合约当前周期的最低价,简写为L;LowD: N天前(含当天)的最低价;Lowest:计算
34、指定周期内的数值型序列值的最低值;LowestFC :快速计算指定周期内的数值型序列值的最低值;,同理:有 H , High,HighD,Highest,HighestFC,59,策略资金 & 账户资金,策略资金Available :获得策略当前的可用虚拟资金;Margin :获得策略当前占用的持仓保证金。账户资金A_Available :返回当前账户的可用资金;A_Margin :当前账户的持仓保证金;A_Assets :返回当前账户的权益。,60,时间函数,Time:返回Bar数据的时间,每一个Bar上的Time是确定且唯一的,不随着系统时间的变化而变化;Time在时分秒周期Bar上返回的
35、是Bar结束时间,在日周月年周期返回的是Bar起始时间;历史阶段日线上的Time返回0。CurrentTime:实时阶段返回电脑操作系统的时间。历史阶段返回历史K线Bar的时间,与Time函数一致。若以CurrentTime作为判断条件的公式指令,会有可能导致信号消失,需加以处理以保持信号的稳定性。 注意:同样的关系还有Date和CurrentDate。TradeDate:当前Bar的交易日时间,如果是日间交易结果跟Date是一样的,但是国内品种夜盘返回的TtadeDate会比Date晚一天。ExchangeTime:实时阶段启动交易后返回交易所的时间。否则返回值如下:处于历史阶段时,返回历史K线当前的时间。处于实时阶段时,但是没有启动交易,返回客户端所在操作系统的时间。,谢谢观看,