缺省返回值位置;BP与SP

本文介绍了x86架构下函数的返回值存放规则,包括整数类型和浮点数类型的返回值寄存器,以及当返回值较大时的处理方式。此外,还详细讲解了函数调用过程中bp和sp寄存器的作用及使用方法。

1、

x86上,一般整数类型的返回值放在 eax, float 类型的防在浮点数寄存器里。如果返回的对象比较大,放在堆栈里。

2、

bp为基址寄存器,一般在函数中用来保存进入函数时的sp的栈顶基址
sp是栈顶指针,它每次指向栈顶。
每次子函数调用时,系统在开始时都会保存这个两个指针并在函数结束时恢复sp和bp的值。像下面这样:
在函数进入时:
push bp  //保存bp指针
mov bp,sp //将sp指针传给bp,此时bp指向sp的基地址。这个时候,如果该函数有参数,则[bp+4]则是该子函数的第一个参数,[bp+6]则是该子函数的第二个参数,以此类推,有多少个参数则[bp+4+2^n]。
.....
.....
函数结束时:
mov sp,bp //将原sp指针传回给sp
pop bp  //恢复原bp的值。
ret  //退出子函数

操作符 + 加法 Vars Numeric Num; Begin Num = High + Close;//Num为最高价和收盘价的和 End - 减法 Vars Numeric Num; Begin Num = High - Close;//Num为最高价和收盘价的差 End * 乘法 Vars Numeric Num; Begin Num = High * Close;//Num为最高价和收盘价的乘积 End / 除法 Vars Numeric Num; Begin Num = High / Close;//Num为最高价和收盘价的商 End && 并且运算 Vars Numeric Num; Begin Num=IIF ( High > Close && Close > Low,1,0); End//判断当前最高价是否大于价格,并且,最低价小于当前价格。 || 或者运算 Vars Numeric Num; Begin Num=IIF ( High > Close || Close > Low,1,0); End//判断当前最高价是否大于价格,或者,最低价小于当前价格。 > 大于运算 Vars Numeric Num; Begin Num=IIF ( High > Close,1,0); End//判断当前最高价是否大于当前价格。 < 小于运算 Vars Numeric Num; Begin Num=IIF ( Low < Close,1,0); End//判断当前最低价是否小于当前价格。 >= 大于等于运算 Vars Numeric Num; Begin Num=IIF ( High > = Close,1,0); End//判断当前最高价是否大于等于当前价格。 <= 小于等于运算 Vars Numeric Num; Begin Num=IIF ( High < = Close,1,0); End//判断当前最高价是否小于等于当前价格。 != 不等于运算 Vars Numeric Num; Begin Num=IIF ( High ! = Close,1,0); End//判断当前最高价是否不等于当前价格。 == 等于运算 Vars Numeric Num; Begin Num=IIF ( High == Close,1,0); End//判断当前最高价是否等于当前价格。 = 为变量进行赋值 Vars Numeric Num; Begin Num=IIF ( High == Close,1,0); End //判断当前最高价是否等于当前价格,如果是把Num变量赋值为1,如果不等于把Num变量赋值为0。 语法 1. 模型关键字 (1)Data:定义数据区 A.使用部分函数时需要在Data区定义合约,从而指定合约,Data区可定义多个合约,支持写入合约代码、文华码,期货合约支持使用中文名; B.在函数前使用data0.的形式来调用,其中data0为合约名称,需要使用双引号标注; C.若模型中Data区只定义了一个合约,则函数可以不使用data0.的形式来调用,默认定义的唯一合约;若模型中Data区定义了多个合约,则必须使用data0.的形式来调用; D.订单流策略,必须定义Data数据区; E.算法下单组件,可以不定义Data数据区,默认取图表中的合约。 编写示例:定义数据区并对指定合约下单 Data data0:"m2501"; -------------------//定义数据区,指定合约为豆粕2501 Begin data0.A_SendOrder(Enum_Buy,Enum_Entry,2,data0.Price("open")); End -----------------------//开多单 (2)Setting:定义环境设置 A.定义环境设置,用于实现多样化的策略; B.Params、Vars结构并列,写入结构任意位置都可生效,不受模型从上至下计算的限制; C.限制:同一环境设置函数只能写入一次; D.关键字下需写入【计算控制函数】分类下的函数,如:AddTimes、Review_Data... 注:仅用于趋势策略模型,不支持在订单流策略和算法下单组件中使用; 编写示例: Setting Review_Data:Tick;-----------------------//指定用逐笔数据计算 (3)ImPort:设置跨合约跨周期引用关键字 A.在ImPort字段下写入#Call、#ImPort、#Call_Plus、#Call_Other函数,设置跨合约、跨周期、跨合约跨周期、跨指标引用; B.Params、Vars结构并列,写入结构任意位置都可生效,不受模型从上至下计算的限制; 注:仅用于趋势策略模型,不支持在订单流策略和算法下单组件中使用; 编写示例:跨周期引用变量 ImPort #ImPort[Day,1,AA] AS Var1-----------------------//引用日线上的趋势条件 #ImPort[Hour,2,AA] AS Var2-----------------------//引用小时周期上的趋势条件 (4)Params:定义参数 A.一个模型只能有一个Params关键字,放在模型开始部分,在定义变量之前; B.参数类型:数值型(不能使用序列变量); C.参数必须指定默认值; D.参数不可以使用赋值符号=赋值; 注:仅用于趋势策略模型,不支持在订单流策略和算法下单组件中使用; 编写示例:参数定义并赋默认值 Params Numeric N(5); -----------------------//定义参数N,默认值为5 Begin Ma(Close,N); -----------------------//表示5周期均线 End (5)Vars:定义变量 A.一个模型只能有一个Vars关键字,放在模型开始部分,在定义参数之后,主程序开始之前; B.变量类型:数值型、字符串型; C.变量可不指定默认值,默认值为0(数值型)或空串(字符串型); D.变量可以在主程序使用赋值符号=进行赋值; 编写示例:变量定义赋值 Vars Numeric N1; -----------------------//定义变量N1 Numeric N2; -----------------------//定义变量N2 String N3; -----------------------//定义变量N3 NumericArray N4; -----------------------//定义变量N4 Begin N1=3000; -----------------------//整型赋值 N2=88.888; -----------------------//浮点型赋值 N3="股指期货"; ---------------------//字符串型赋值 N4[0] = 1; -----------------------//数组型赋值 N4[1] = 2; -----------------------//数组型赋值 N4[2] = 3; -----------------------//数组型赋值 End 更多变量使用介绍请参考”5、其他“中的变量使用示例。 (6)主程序 A.格式为: Begin ... End B.返回值当根K线变化; C.主程序中模型语句从上至下、从左至右进行计算; 影响: a.返回值写在指令前写在指令后的区别 例:信号记录函数BKVOL 公式中写在开仓指令前,返回0; 公式中写在开仓指令后返回开仓手数。 b.多根K线计算的指标,例: If (IsUp) { If(Close<Ma(Close,5)) { AA=1; } } 需要单独定义在条件外确保每根K线上都会计算,即应该编写为: MA5=Ma(Close,5); if(IsUp) { If(Close<MA5) { AA=1; } } 2. 信号指令&委托函数 (1)信号指令(仅支持趋势策略) T+0指令: BK(买开)、SK(卖开)、SP(卖平)、BP(买平)、BPK(买平开)、SPK(卖平开) T+1指令: 买入(Buy)、卖出(Sell) 注: A.股票交易支持T+0指令和T+1指令,支持以上8种信号指令; B.套利交易仅支持买开(BK)、卖平(SP)、卖开(SK)、买平(BP); C.参数规则:BK(N,Price); N为建仓手数,不可缺省,Price为委托价格可以缺省。; a.N为建仓数量,可以为固定正整数,也可以为变量,不可缺省;N写入0表示建仓数量为0;写入myvol,按照模型资金参数-开仓手数进行委托; b.Price可以为具体数值,也可以为变量;参数缺省时,按照账户->程序化参数->默认下单价格进行委托; c.Price超出K线的有效范围,回测时将会取最接近的有效价格为成交价; d.信号指令只在图表上显示信号标识,不能下单委托; D.模型类型 默认按一开一平信号过滤模型规则出信号; 开平仓手数不同,为加减仓模型; Setting字段下写入AddTimes为连续建仓模型。 (2)发送委托单(支持订单流策略和算法下单组件) A_SendOrder(BuyOrSell,EntryOrExit,Lot,Price,”AccountID”) 针对当前公式应用的交易帐户、合约发送委托单) 注: A.该函数不支持趋势策略使用; B.订单流策略中支持回测,算法下单组件不支持回测; 3. 函数 编写示例: Vars Numeric Ma12; Numeric SValue; Begin Ma12=Ma(Close,12);//计算12周期均价 SValue=Summation(Close,12);//计算12周期以来的收盘价的和 PlotNumeric("Ma12",Ma12); PlotNumeric("SValue",SValue); End (1)系统函数 在策略开发平台中显示蓝色字体,如上面例子中的:Ma(求移动平均); 策略开发平台→插入→插入函数,可以查看详细的函数分类及函数说明。 (2)自定义函数 模型编写平台中显示红色字体,如上面例子中的Summation A.自定义函数结构 Params 参数定义语句; Vars 变量定义语句; Begin 脚本正文; End B.自定义函数的调用 用法:返回值 a.无参数 此类函数在编写自定义时没有定义参数的部分,所以在调用时也不需写入参数,直接写函数名即可。下面以AvgPrice为例,求当前周期的平均价格。 Vars Numeric AvgValue; Begin AvgValue=AvgPrice(); PlotNumeric("AvgValue",AvgValue); End b.有参数 此类函数在编写自定义时定义了参数个数和类型,需要根据定义时候的参数列表和顺序,输入相应的参数,以Summation为例,计算指定周期内的数值和。 Vars Numeric SValue; Begin SValue=Summation(Close,12);//计算12周期以来的收盘价的和 PlotNumeric("SValue",SValue); End c.数组类 Vars NumericArray arr[10];//建立一个数组,长度为10 Numeric i; Numeric SValue; Begin For i=0 To 9 { arr[i]=Open[i];//依次存放0-9开盘价 } SValue=SummationArray(arr); PlotNumeric("SValue",SValue); End 4. 运算控制语句 (1)条件语句 A.If语句 If语句是一个条件语句,当条件(Condition)满足后执行公式语句。 If (Condition) { 公式语句; } 注: 当If体中的语句多于一条时,要用{}括起来;只有一条时,可括可不括。 B.If-Else语句 对条件(Condition)进行判断,如果条件满足执行If后的公式语句1,否则执行Else后的公式语句2。 If (Condition) { 公式语句1; } Else { 公式语句2; } 注: 在嵌套结构中会有多个If多个Else关键字,每一个Else都应有对应的If相配对。 原则:Else其前面最近的还未配对的If相配对。 C.If-Else-If 当条件Condition1满足时,公式语句1将会被执行,当条件Condition1不满足时,将会继续判断条件Condition2,当满足条件Condition2时,公式语句2将会被执行。 If (Condition1) { 公式语句1; } Else If(Condition2) { 公式语句2; } (2)循环语句 A.For循环 For循环一般用于次数一定的循环思路。 a.For语句为循环语句,重复执行某项操作,直至循环结束。 b.循环变量为在之前已经定义的一个数值型变量. c.For To循环(从小到大) For To循环的执行是循环变量从初始值到结束值,按照步长为 1 依次递增,重复执行循环体中的公式语句,初始值必须小于或等于结束值; For 循环变量 = 初始值 To 结束值 { 公式语句; } d.For DownTo循环(从大到小) For DownTo语句中循环变量从初始值每次递减 1直到等于结束值,重复执行循环体中的公式语句,初始值必须大于或等于结束值。 For 循环变量 = 初始值 DownTo 结束值 { 公式语句; } 注: 循环数组时,数组的下标不要超过总数量。 B.While循环 While循环不像For循环那样有次数结束语句,适用于次数未知的循环思路。 While语句在条件(Condition)为真的时候重复执行某一项操作,直至条件(Condition)为假时循环结束。 While (Condition) { 公式语句; } C.Break语句 Break语句用于结束循环,跳出循环体,执行循环之后的代码。 循环在每次执行后,都将判断Condition的值,当Condition为True时,则执行Break语句,跳出整个循环,执行公式语句2; While (True) { 公式语句1; If (Condition) Break; } 公式语句2; D.Continue语句 Continue语句用于结束此次循环,进行下一次循环。 循环在每次执行后,都将判断Condition2的值,当Condition2为True时,则执行Continue语句,跳过公式语句2,判断Condition1进入下一次循环,否则继续执行公式语句2。 While(Condition1) { 公式语句1; If (Condition2) Continue; 公式语句2; } E.Return语句 Return的作用是从当前位置返回,不再执行Return后面的代码。 循环在每次执行后,都将判断Condition的值,当Condition为True时,则执行Return语句,Return之后的代码都不再执行。 While (True) { 公式语句1; If (Condition) Return 公式语句2; } 5、其他 (1)变量使用示例 A.临时变量(Numeric,String,NumericArray,StringArray) 对临时变量的计算和赋值当次计算生效,如果不做赋值临时变量直接取变量的初始值。 具体在模型应用中,用k线数据回测那么当次计算指的是对某一根k线数据的计算过程,临时变量的赋值只对这一根k线数据的计算过程中生效;逐笔回测和盘中运行,当次计算指的是对某一笔数据的计算过程,临时变量只对一笔数据的计算过程生效。 例:如果当根K线为阳线则yang为1,如果当根K线为阴线则yin为1 Vars Numeric yang; Numeric yin; Begin IF (Open < Close) { yang = 1; } IF (Open > Close) { yin = 1; } End B.序列变量(NumericSeries) 对一段k线数据回测,一根一根逐次计算过程中,如果当根K线计算对变量有赋值就取这个赋值结果,如果当根K线没有对变量进行赋值则取上一根k线的数值。 序列变量,意义在于一段k线数据的每一根k线都有对应一个数据存储,序列变量本质上是一组数值或字符串。序列变量和WT8、金字塔等软件的全局变量概念是一致的。 序列变量通常用于统计一段历史K线中满足某一条件的次数 例:统计截止当前历史K线中阳线的数量 Vars NumericSeries UpNum; Begin If(Close > Open) { UpNum = UpNum+1; } PlotNumeric("阳线的数量",UpNum); End C.广域变量(Global_Numeric、Global_String、Global_NumericArray、Global_StringArray) 广域变量和C语言的内部变量的概念是一致的,在一个公式的多次计算过程中,广域变量的计算是延续,这次计算是在上一次的结果基础上进行。 广域变量和临时变量的区别,在于一个公式的多次计算的整个过程中永久有效。 广域变量和序列变量的区别,在于广域变量和一根一根的k线没有对应关系,通常用于算法下单或逐笔数据统计。 例:在订单流策略中通过广域变量控制信号处理标识,控制满足条件时只下单一次 Data data0:"cu2411"; Vars Global_Numeric BKID;//买开委托 Global_Numeric BKFLG;//买开标志 Begin If(BKFLG == 0)//如果没有买开委托 { BKID = data0.A_SendOrder(Enum_Buy,Enum_Entry,1,data0.Price("New"));//发出买开委托 BKFLG = 1;//已发出买开委托 } If(BKFLG == 1 && F_OrderStatus(BKID) == Enum_Declared)//如果买开委托的状态是委托成功 { data0.F_DeleteOrder(F_OrderContractNo(BKID));//撤掉买开委托挂单 BKFLG = 2;//已发出撤掉买开委托挂单 } End (2)枚举值的用法 A.作为函数的参数 例: A_SendOrder(Enum_Sell,Enum_Exit,data0.F_BuyRemainPosition(),data0.Price("bid1"));//对当前公式应用的交易账户对应合约发出卖平仓委托,以买一价平公式应用交易账户当前多头可用持仓。 B.函数返回值做比对进行判断 例: If (F_OpenOrderEntryOrExit(0) == Enum_Entry)//条件语句,最后一笔未成交委托单是开仓,进行下面操作。 关键字 模型结构关键字: Data 定义数据区 Setting 定义环境设置,实现多样化的策略 ImPort 设置跨周期跨合约公式属性 Params 定义参数,必须填写默认值 Vars 定义变量,可以赋初值,不赋初值系统自动填充初值 Begin 主程序开始 End 主程序结束 控制语句关键字: If 条件语句 Else 条件语句 For 用于循环处理 To 用于循环处理 DownTo 用于循环处理 While 用于循环处理 Break 结束循环体 Continue 结束单次循环 Return 返回,不再向下执行 True 真 False 假 And 并且 Or 或者 变量类型(分为数值型和字符串型): Numeric 数值型临时变量 NumericSeries 数值型序列变量 NumericArray 数值型数组 NumericRef 数值型引用(仅用于编写自定义函数) NumericArrayRef 数值型数组引用(仅用于编写自定义函数) Global_Numeric 数值型广域变量 Global_NumericArray 数值型广域数组 String 字符串型临时变量 StringArray 字符串型数组 StringRef 字符串型引用(仅用于编写自定义函数) StringArrayRef 字符串型数组引用(仅用于编写自定义函数) Global_String 字符串型广域变量 Global_StringArray 字符串型广域数组 枚举值: 买卖状态枚举值 Enum_Buy 返回买卖状态的买入枚举值 Enum_Sell 返回买卖状态的卖出枚举值 Enum_Entry 返回开平仓状态的开仓枚举值 Enum_Exit 返回开平仓状态的平仓枚举值 Enum_ExitToday 返回开平仓状态的平今仓枚举值 委托状态枚举值 Enum_Filled 返回委托状态的全部成交枚举值 Enum_FillPart 返回委托状态的部分成交枚举值 Enum_Declare 返回委托状态的委托发出枚举值 Enum_Declared 返回委托状态的委托成功枚举值 Enum_NoOrder 返回委托状态的委托无效枚举值 Enum_Canceling 返回委托状态的正在撤单枚举值 Enum_Canceled 返回委托状态的已撤单枚举值 Enum_Deleted 返回委托状态的已废除枚举值 信号枚举值 Sig_BK 买开信号枚举值 Sig_SK 卖开信号枚举值 Sig_SP 卖平信号枚举值 Sig_BP 买平信号枚举值 Sig_BPK 买平开信号枚举值 Sig_SPK 卖平开信号枚举值 期权枚举值 Enum_CallOption 返回看涨期权的枚举值 Enum_PutOption 返回看跌期权的枚举值 手动下单委托指令类型枚举值 Enum_None 返回普通单枚举值 Enum_FOK 返回FOK指令枚举值 Enum_FAK 返回FAK指令枚举值 反复出现错误,请结合上述文华财经T9软件的操作符、语法、关键词,再好好检查分析代码,修正错误
最新发布
10-08
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值