网站首页 >> 交易开拓者程序化平台介绍 >> 第六章 TB公式应用 >> 二、TB公式交易策略类

2、交易函数

1)         BuySellShortBuyToCoverSell

语法格式:

Bool  Buy(Numeric Share=0,Numeric Price=0)

Bool  BuyToCover(Numeric Share=0,Numeric Price=0)

Bool  Sell(Numeric Share=0,Numeric Price=0)

Bool  SellShort(Numeric Share=0,Numeric Price=0)

参数说明:

n  Share 数量,为整型值,默认值为0表示使用系统设置参数;

n  Price 价格,为浮点数,默认值为0表示使用现价(非最后BarClose)

Buy ---- 对当前合约发出买入开仓的指令,如果图表讯号显示当前持有空仓,则会先平掉空仓,再开多仓;

SellShort ---- 对当前合约发出卖出开仓的指令,如果图表讯号显示当前持有多仓,则会先平掉多仓,再开空仓;

BuyToCover ---- 对当前合约发出平空仓的指令,当图表讯号显示有空头持仓时,方可执行此指令;

Sell ---- 对当前合约发出平多仓的指令,当图表讯号显示有多头持仓时,方可执行此指令;

例:判断条件,执行买入或者卖出的动作,并在图表上标识出讯号

代码如下:

                   if(condition1 && marketposition<>1)     //条件满足且没有持多仓情况下开多

                   {

                         buy();

                   }else if(condition2 && marketposition!=-1)  //条件满足且没有持空仓时开空

                   {

                            sellshort();

                   }

 

2)         MarketPosition

MarketPosition-----获得当前持仓状态。

语法格式:

Integer MarketPosition()

返回值说明:

n  -1 当前位置为持空仓

n  0 当前位置为持平

n  1 当前位置为持多仓

 

3)         A_SendOrder

A_SendOrder()与枚举函数配合使用,直接对帐户进行发送指令的动作(开空、开多、平空、平多)。A_SendOrder()仅在实时行情中最后一个Bar上针对当前帐户操作,不能在图表中标识买卖讯号,也不能进行历史回溯测试。

语法:

Bool  A_SendOrder(Integer BuyOrSell,Integer EntryOrExit,Numeric fLot,Numeric fPrice)

针对当前公式应用的帐户、商品发送委托单,发送成功返回True,发送失败返回False

参数:

n  BuyOrSell 发送委托单的买卖类型,取值为Enum_Buy(买入)Enum_Sell(卖出)之一;

n  EntryOrExit 发送委托单的开平仓类型,取值为Enum_Entry(开仓),Enum_Exit(平仓),Enum_ExitToday(平今仓)之一;

n  fLot 委托单的交易数量;

n  fPrice 委托单的交易价格。 

表:A_SendOrder函数使用示例

参数1

买卖

参数2

开平

参数3

数量

参数4

价格

1.开多Enum_Buy

Enum_Entry

5

Q_AskPrice()

A_SendOrder(Enum_Buy,Enum_Entry,5,Q_AskPrice());

2.平多Enum_Sell

Enum_Exit,

Enum_ExitToday

5  or A_BuyPosition()

Q_BidPrice()

A_SendOrder(Enum_Sell,Enum_Exit,5,Q_BidPrice());

3.开空Enum_Sell

Enum_Entry

开空仓单5

Q_BidPrice()

A_SendOrder(Enum_Sell,Enum_Entry,5,Q_BidPrice());

4.平空Enum_Buy

Enum_Exit

Enum_ExitToday

5  or A_SellPosition()

Q_AskPrice()

A_SendOrder(Enum_Buy,Enum_Exit,5,Q_AskPrice());

A_SendOrder()函数直接发单,无需任何确认,在实时行情中,每个Tick都会触发程序的运行,因此,使用A_SendOrder()函数需要根据仓位头寸并配合全局变量进行条件处理,避免造成重复发单。(请参阅第十二章案例二)

 

该函数可针对叠加商品进行处理,可用类似Data1.A_SendOrder(...)进行调用。

 

【问题】buysellshortA_sendorder有什么区别?

【回答】buysellshort在图表上标识买卖信号,k线、行情数据有关,可用于历史回测及实时交易,该函数同一个bar不会重复发单(TB底层保证)。marketposition依据图表信号判断当前持仓情况,该值不与账户关联,不能反应账户实际的持仓情况。

 A_sendorder与账户关联,交易不在图表上产生信号,不能用于历史回测,仅对实时行情有效。使用此函数进行交易,需要额外增加头寸判断的条件语句,避免重复发单。

 

【补充】交易函数匹配

n  MarketPositionBuySellShort BuyToCoverSell匹配

图表持仓情况:根据图表持仓情况判断开仓及控制仓位

n  A_sendorderA_TotalPositionA_BuyPositionA_SellPosition匹配

账户持仓情况:根据账户持仓情况,判断开仓及控制仓位