期货全自动交易系统标准版编程指南(2) 本节介绍本软件编程语法 1.本系统只有通过强大的语言功能,才能实现交易系统的编制,而语言编制的基础 就是你必须懂得C语言或JAVASCRIPT语言,不然你会感到寸步难行 2.变量定义 2.1 变量主要用于存储全局或局部数值,本语言变量支持整数,浮点数,还有字符串 var 是通用变量定义符,例如: Code: var a=0;//整数 var a=0.0;//浮点数 var a="abcdffg";//字符串 //后是文字说明 变量定义完后参与运算时要注意其赋值类型,字符串,浮点数,整数按级别高低 从高到低排列,将高级别的值赋于低级别的变量,则变量会自动改为高级别的类型 例如:var a=0;//整数 Code: a="12345"+"678";//a会自动改为字符串类型,值为"12345678" 要保留a的整数类型可用: Code: a.lVal=="12345"+"678";//结果为12345678 对浮点数可用a.dblVal 从上面你可以看到本语言的变量定义比C语言或JAVASCRIPT语言都来得简洁, 特别是字串的运算比较简单 2.2外部变量 外部环境的变量,比如画面对象的颜色,坐标,文字等等,系统的一些控制参数同属此类,这些变量可通过编辑对话框上部的帮助列表获得,我们将在具体的例子中解释其意义 比如一个文字对象,有如下程序 Code: while(TRUE) { Wait_Click(20000); VScrollAdj=-300; } VScrollAdj就是一个外部变量,他控制滚动条滚动的大小, 上面这个文字对象实现的是:鼠标单击画面则上翻300个象素点 外部变量,不需要用Var定义,但要注意有些变量是单输入或输出性的,也即有些只可以给别的赋值,有些只能是别的赋值给他 3.程序控制 3.1 每个程序都是按顺序执行,执行到程序末尾则结束,你若想让程序一直运行下去,就必须对程序加以控制,SCRIPT语言提供了多种控制方式: a) Code: while(...) { ......... } b) Code: do { ... }while(...) c) Code: switch(...) { case X: ............. } d) Code: if(...) ...... else if(...) ...... else .....; e) Code: break; f) Code: continue g) Code: for(var i=0,i<10;i++) { .... } 上述语句的用法等同于C或JAVASCRIPT语言中相同语句的用法 这里唯一不同的是,switch()中的值在本语言中可以是浮点和字符串 3.2 一般对象的程序采用如下框架 Code: dobj.execstep=1000;//本对象程序每次运行步数,用来控制运行速度 while(TRUE) { //todo ................ // } 在程序中,我们可以通过Sleep(..)函数使程序进入休息状态,长短由该函数的参数决定,例如: 小息: Code: Sleep(20); 大息 Code: Sleep(100); 3.3 事件等待和触发 任何对象的程序都可以自顾自运行下去,无须和外界打交道,就比如利用当前文字对 象显示当前的时间,可以用下面程序: Code: var m_str00="";//显示的字符串 while(TRUE)//建立无限循环 { var m_h=GetHour();//时 var m_m=GetMinutes();//分 var m_s=GetSeconds();//秒 m_str00=m_h+":"+m_m+":"+m_s;//形成时间字符串 dobj.text=m_str00;//赋给对象文字,进行显示 SLeep(20);//不能老是刷新,让程序睡一会 } 注意,本软件在变量定义,语言关键字方面不论大小写,这一点和C语言不同,但和JAVASCRIPT语言差不多 也有相当多的对象需要和外界打交道,比如捕捉鼠标事件,等待按键,等待消息,提示输入,等等,本语言都有很好的支持 就比如上面的例子中的 Wait_Click(20000);就是无限时等待鼠标单击(你把20000改为小于10000的数,就是有限时等待) 比较常用的函数有 Code: Wait_Interval(interval)//间隔定时 Wait_Key_In(time)//键盘输入 Wait_Click(time)//鼠标单击 Wait_Dblclick(time)//鼠标双击 Wait_Move_In(time)//鼠标移入 Wait_Move_Out(time)//鼠标移出 Wait_Net_Msg(time)//消息 一但等待的事件发生,函数就会返回,程序才能继续执行 当你等待多种事件时,可以用Wait(event,time,interval), event用事件代码相或,具体情况,你可在语言编辑的帮助列表:系统函数中查到 注意在应用函数时,最好通过语言编辑的帮助列表选择该函数,这时该函数的定义 会自动填入代码的当前位置 语言编辑的帮助列表就在该对话框的最上一排 3.4 人机对话 我们在编人机对话的程序时,可用 Code: SetAskItem="询问:"; SetAskText="询问内容?"; if(QueryMessage==1) { .......... } 这一类可在语言编辑的帮助列表:画面对象属性变量这一类中找 一般这类控制对话框显示的外部变量以Query开头 4.典型示范 4.1 怎么样调用股票或期货品种的历史数据? Code: OpenLsLib("a0501",64,1,0);//打开a0501品种日历史数据接口 var m_day_size=GetLsLibDataSize();//获取日线数据个数 for(var x=0;x<m_day_size;x++) { var m_val00=GetLsLibData("最大",x); var m_val01=GetLsLibData("最小",x); //TODO ..................... } CloseLsLib();//关闭接口 上面OpenLsLib函数的参数有四个参数 参数1:品种名称 参数2:品种类型,64--期货/外汇,48--港股,<48上证或深证股票 参数3:数据源类型,0--分时,1--日线,2--周线,3--月线,4--五分钟线,5--三十分钟线,6--一小时线 参数4:用于设定分时数据的起始时间(12010000表示12月1日0时0分),当日分时可设为零,也即你要调用历史数据库中的分时数据,你必须在本参数上设定起始时间 用OpenLsLib函数打开的接口可用CloseLsLib函数关掉,或直接用OpenLsLib函数重新打开新的接口 一个接口包含该品种的所有历史数据 通过GetLsLibData函数可以调用任意类型的数据或指标,类型可在语言编辑的帮助列表:历史数据库证券类指标中查得 相关函数可在语言编辑的帮助列表:历史数据库函数中查得 当你要获得分笔数据时,可用 Code: OpenLsLib("a0501",64,0,0);//打开a0501品种分笔数据接口 var m_size=GetLsLibsDataSize();//获取分笔数据个数 for(var x=0;x<m_size;x++) { var m_val00=GetLsLibsData(0,x);//时间 var m_val01=GetLsLibsData(1,x);//价格 var m_val02=GetLsLibsData(2,x);//总手 //TODO ..................... } Code: GetLsLibData("最新",x); 中第一个参数为类型名或类型号,第二个参数为数据索引 Code: GetLsLibData("最新",x); 与GetLsLibData(1,x);结果是一样的,都是取这个点的最新收盘价格,这里就体现了本语言的灵活性 一般你可以通过本接口取得该品种的各种指标,当然你也可以建立自己的指标 这里要注意的是数据索引必须是正数,并小于总数,否则返回的数据为零 4.2 怎么样调用股票或期货品种的盘口数据? 调用股票或期货品种的盘口数据可在语言编辑的帮助列表:实时数据和委托函数中查得 大家可以通过函数名基本猜到这些函数的意思 比如 Code: GetPzName(no);//取得品种的名称,no是品种顺序号 GetPzOpen(no);//取得品种的开盘价 GetPzNew(no);//取得品种的最新价 GetPzAll(no);//取得品种的总手 GetPzCW(no);//取得品种的仓位 GetPzBuyPrice(no);//取得品种的盘口买一价 GetPzSelPrice(no);//取得品种的盘口卖一价 ...................... 4.3 怎样实现委托? 实现委托的函数可在语言编辑的帮助列表:实时数据和委托函数中查得 主要分为查找和命令两类 a 查找类函数 Code: CheckWtCmd(品种号,"多仓/空仓","现有持仓/全部成交/等待成交/开等待成交/平等待成交",start_index=0); 例如查第一个品种多单全部成交数,可用 Code: var m_size=CheckWtCmd(0,"多仓","全部成交",0);//0表示从0号单查起 b.命令类函数 Code: SetWtCmd(品种号,"开仓/平今/平仓/撤单/撤开单/撤平单/刷新","买入/卖出",数量,价格,start_index=0) 你若希望交易系统在执行命令之前再提示一次,可用SetWtCmd_Ask函数 例如第一个品种以2600价格开10手多单 Code: SetWtCmd(0,"开仓","买入",10,2600,0); SetWtCmd_Ask(0,"开仓","买入",10,2600,0); 你看,一个函数就解决问题 c.获取具体的委托列表 可用GetWTXXXX函数 Code: GetWtSize()//获得委托命令数 GetWt_Code(no)//no条命令的品种代码 .................................. 该类函数一般较少用到,当然,你可通过该类函数做当天业绩评测 4.4 怎样报警提示? 在程序中我们要实现语言报警,可用 Code: PlaySound("dat\win.wav");//播放声音文件"程序目录\\dat\\win.wav" 声音文件你可自选,只要放到程序目录下,象上面设好路经即可 你的系统若装了微软语言系统,则可用语言报警,例如 Code: Speak("This is very good!"); 请注意语言系统支持的语言,是中文的就用中文报警,例如 Code: Speak("请注意,买入.........."); 当然还有最简单的扬声器报警 Code: Beep(2500,300);//f,t