期货全自动交易系统标准版编程指南(2)

Discussion in '强者博弈证券期货自动交易系统' started by yzwyq, Aug 11, 2006.

  1. 期货全自动交易系统标准版编程指南(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
     
  2. >

    本节的语法介绍比较简单

    下面我们进行下一步,在上一节完成的框架内,编制一个简单的自动买卖系统