开拓者代码(2)代码学习各种买卖指令及实例

来源:百度文库 编辑:神马文学网 时间:2024/04/20 13:28:11
各种买卖指令
Buy
说明 产生一个多头建仓操作。
语法 Buy(Numeric Share=0,Numeric Price=0,Bool Delay=False)
参数 Share 买入数量,为整型值,默认为使用系统设置参数;
Price 买入价格,为浮点数,默认=0时为使用现价(非最后Bar为Close);
Delay 买入动作是否延迟,默认为当前Bar发送委托,当Delay=True,在下一个Bar执行。
备注 产生一个多头建仓操作,无返回值,该函数仅支持交易指令。
该函数仅用于多头建仓,其处理规则如下:
如果当前持仓状态为持平,即MarketPosition = 0 时,该函数按照参数进行多头建仓。
如果当前持仓状态为空仓,即MarketPosition = -1 时,该函数首先平掉所有空仓,达到持平的状态,然后再按照参数进行多头建仓。
如果当前持仓状态为多仓,即MarketPosition = 1 时,该函数将继续建仓,但具体是否能够成功建仓要取决于系统中关于连续建仓的设置,以及资金,最大持仓量等限制。
示例 在MarketPosition=0的情况下:
Buy(50,10.2,1) 表示用10.2的价格买入50张合约,延迟到下一个Bar发送委托。
Buy(10,Close) 表示用当前Bar收盘价买入10张合约,马上发送委托。
Buy(5,0) 表示用现价买入5张合约,马上发送委托。
BuyToCover
说明 产生一个空头平仓操作。
语法 BuyToCover(Numeric Share=0,Numeric Price=0,Bool Delay=False)
参数 Share 买入数量,为整型值,默认为平掉当前所有持仓;
Price 买入价格,为浮点数,默认=0时为使用现价(非最后Bar为Close);
Delay 买入动作是否延迟,默认为当前Bar发送委托,当Delay=True,在下一个Bar执行。
备注 产生一个空头平仓操作,无返回值,该函数仅支持交易指令。
该函数仅用于空头平仓,其处理规则如下:
如果当前持仓状态为持平,即MarketPosition = 0 时,该函数不执行任何操作。
如果当前持仓状态为多仓,即MarketPosition = 1 时,该函数不执行任何操作。
如果当前持仓状态为空仓,即MarketPosition = -1 时,如果此时Share使用默认值,该函数将平掉所有空仓,达到持平的状态,否则只平掉参数Share的空仓。
示例 在MarketPosition = -1的情况下:
BuyToCover(50,10.2,1) 表示用10.2的价格空头买入50张合约,延迟到下一个Bar发送委托。
BuyToCover(10,Close) 表示用当前Bar收盘价空头买入10张合约,马上发送委托。
BuyToCover(5,0) 表示用现价空头买入5张合约),马上发送委托。
sell
说明 产生一个多头平仓操作。 (BK)
语法 Sell(Numeric Share=0,Numeric Price=0,Bool Delay=False)
参数 Share 卖出数量,为整型值,默认为平掉当前所有持仓;
Price 卖出价格,为浮点数,默认=0时为使用现价(非最后Bar为Close);
Delay 卖出动作是否延迟,默认为当前Bar发送委托,当Delay=True,在下一个Bar执行。
备注 产生一个多头平仓操作,无返回值,该函数仅支持交易指令。
该函数仅用于多头平仓,其处理规则如下:
如果当前持仓状态为持平,即MarketPosition = 0 时,该函数不执行任何操作。
如果当前持仓状态为空仓,即MarketPosition = -1 时,该函数不执行任何操作。
如果当前持仓状态为多仓,即MarketPosition = 1 时,如果此时Share使用默认值,该函数将平掉所有多仓,达到持平的状态,否则只平掉参数Share的多仓。
示例 在MarketPosition=0的情况下:
Sell(50,10.2,1) 表示用10.2的价格卖出50张合约,延迟到下一个Bar发送委托。
Sell(10,Close) 表示用当前Bar收盘价卖出10张合约,马上发送委托。
Sell(5,0) 表示用现价卖出5张合约,马上发送委托。
sellshort
说明 产生一个空头建仓操作。
语法 SellShort(Numeric Share=0,Numeric Price=0,Bool Delay=False)
参数 Share 卖出数量,为整型值,默认为使用系统设置参数;
Price 卖出价格,为浮点数,默认=0时为使用现价(非最后Bar为Close);
Delay 卖出动作是否延迟,默认为当前Bar发送委托,当Delay=True,在下一个Bar执行。
备注 产生一个空头建仓操作,无返回值,该函数仅支持交易指令。
该函数仅用于空头建仓,其处理规则如下:
如果当前持仓状态为持平,即MarketPosition = 0 时,该函数按照参数进行空头建仓。
如果当前持仓状态为多仓,即MarketPosition = 1 时,该函数首先平掉所有多仓,达到持平的状态,然后再按照参数进行空头建仓。
如果当前持仓状态为空仓,即MarketPosition = -1 时,该函数将继续建仓,但具体是否能够成功建仓要取决于系统中关于连续建仓的设置,以及资金,最大持仓量等限制。
示例 在MarketPosition=0的情况下:
SellShort(50,10.2,1) 表示用10.2的价格空头卖出50张合约,延迟到下一个Bar发送委托。
SellShort(10,Close) 表示用当前Bar收盘价空头卖出10张合约,马上发送委托。
SellShort(5,0) 表示用现价空头卖出5张合约,马上发送委托。
对应的BPK,SPK,你清楚了吗
函数名 描述
Buy 平掉所有空头持仓,开多头仓位。(*BPK*)
Sell 平掉指定的多头持仓。
SellShort 平掉所有多头持仓,开空头仓位。 (*SPK*)
BuyToCover 平掉指定的空头持仓。
获得当前持仓状态,太妙了
MarketPosition
说明 获得当前持仓状态。
语法 Integer MarketPosition()
参数 无
备注 获得当前持仓状态,返回值为整型,该函数仅支持交易指令。
返回值定义如下:
-1 当前位置为持空仓
0 当前位置为持平
1 当前位置为持多仓
示例 无
内建平仓指令--精华之特色
内建平仓指令
除了上节的Sell和BuyToCover可以进行平仓之外,TradeBlazer公式提供了额外的八种平仓函数,通过合理的应用内建平仓函数,可以帮助您有效的锁定风险并及时获利。
您可以组合使用内建平仓函数,也可以在自己的交易指令中调用内建平仓函数进行平仓,八个内建平仓函数如下:
函数名 描述
SetExitOnClose 该平仓函数用来在当日收盘后产生一个平仓动作,将当前所有的持仓按当日收盘价全部平掉。
SetBreakEven 该平仓函数在获利条件满足的情况下启动,当盈利回落达到保本时产生平仓动作,平掉指定的仓位。
SetStopLoss 该平仓函数在亏损达到设定条件时产生平仓动作,平掉指定的仓位。
SetProfitTarget 该平仓函数在盈利达到设定条件时产生平仓动作,平掉指定的仓位。
SetPeriodTrailing 该平仓函数在盈利回落到设定条件时产生平仓动作,平掉指定的仓位。
SetPercentTrailing  该平仓函数在盈利回落到设定条件时产生平仓动作,平掉指定的仓位。
SetDollarTrailing 该平仓函数在盈利回落到设定条件时产生平仓动作,平掉指定的仓位。
SetInactivate 该平仓函数在设定时间内行情一直在某个幅度内波动时产生平仓动作,平掉指定的仓位。
关于ExitPosition
上述多个平仓函数都用到了参数ExitPosition,作为平仓函数仓位控制的重要参数,有必要对该参数进行单独说明。
ExitPosition是布尔型参数,当ExitPosition=True时,表示将当前所有的持仓作为一个整体,根据其平均建仓成本,计算各平仓函数的盈亏,当条件满足时,会将所有仓位一起平掉;当ExitPosition=False时,表示单独对每个建仓位置进行平仓,单独计算各平仓函数盈亏时,当单个建仓位置条件满足后,平掉该建仓位置即可。
触发单
触发单
触发单是交易开拓者特有的交易方式,触发单是指用户设置条件,将触发单提交到交易开拓者的交易服务器,当设定条件满足情况,交易服务器会自动发送委托到交易所。触发单可以帮助解决用户盯盘的辛苦,及手动发单的速度问题。
触发单分为以下四种类型:吊买、吊卖、追买、追卖。
每个触发单在发送时需要输入以下参数:
触发价格:触发单设定的条件价格,通过比较现价和触发价格确定是否下单。下单之后,该触发单会从交易服务器中删除;
执行价格:条件满足之后,发送委托的价格,设定为0可自动获取当时的叫买/卖价;
过期时间:设定触发单的过期时间,到这个时间还没有触发的订单会被设为过期,不再进行监控。
吊买
吊买是指当现价向下跌破触发价格,即按执行价格产生一个即时买入委托单,如下图所示:吊卖
吊卖是指当现价向上突破触发价格,即按执行价格产生一个即时卖出委托单,如下图所示:追买
追买是指当现价向上突破触发价格,即按执行价格产生一个即时买入委托单,如下图所示:追卖
追卖是指当现价向下跌破触发价格,即按执行价格产生一个即时卖出委托单,如下图所示:
修改或删除触发单
当存在某个商品的触发单,可通过双击帐户管理的触发单页面的项目,打开交易师,进行修改或删除操作。您可以修改数量、触发单类型、触发价格、执行价格、过期时间及止损获利等,完成修改之后,点击[修改]按钮即可完成修改;您可以直接点击[删除]按钮将该触发单删除。
注意: 触发单在发送之后将会生效,该委托单在服务器上运行,此时您关闭程序或电脑不会影响触发单的执行。
SetPercentTrailing(2000,0.2,True); 又是一个宝
SetPercentTrailing(2000,0.2,True); 当前所有持仓盈利在大于2000之后回落,当回落百分比达到20%之后,执行所有持仓位置的百分比回落平仓。(此时是计算所有持仓的盈利数)
SetPercentTrailing(1000,0.1,False); 当前持仓的某一个建仓位置的盈利大于1000之后回落,当回落百分比达到10%之后,执行该持仓位置的百分比回落平仓。(此时只计算该持仓位置的盈利)
SetStopLoss(0,2000,True); 当前所有持仓亏损达到2000之后,执行所有持仓位置的止损平仓。(此时是计算所有持仓的亏损数)
SetStopLoss(1,50, False); 当前持仓的某一个建仓位置每张合约的亏损达到50之后,执行该持仓位置的止损平仓。(此时只计算该持仓位置的每张合约亏损)
SetBreakEven(0,2000,True); 当前所有持仓的盈利达到2000之后,启动所有持仓位置的保本平仓。(此时是计算所有持仓的盈利数)
SetBreakEven(1,50, False); 当前持仓的某一个建仓位置每张合约的盈利达到50之后,启动该持仓位置的保本平仓。(此时只计算该持仓位置的每张约的盈利)
精华中精华文华所没有实现复杂策略工具一
循环语句
循环语句包括两种表达方式:For和While。
For
For语句是一个循环语句,重复执行某项操作,直到循环结束。
语法如下:
For 循环变量 = 初始值 To 结束值
{
TradeBlazer公式语句;
}
循环变量为在之前已经定义的一个数值型变量,For循环的执行是从循环变量从初始值到结束值,按照步长为1递增,依次执行TradeBlazer公式语句。结束值必须大于或等于初始值才有意义,初始值和结束值可以使用浮点数,但是在执行过程中会被直接取整。只计算其整数部分。
TradeBlazer公式语句是一些语句的组合,如果TradeBlazer公式语句是单条,您可以省略{},二条或者二条以上的语句必须使用{}。
第一次执行时,首先将循环变量赋值为初始值,然后判断循环变量是否小于等于结束值,如果满足条件,则执行TradeBlazer公式语句,同时循环变量加1。接着重新判断循环变量是否小于等于结束值,一直到条件为False,退出循环。
例如,以下的用户计算Price最近Length周期的和。
Params
NumericSeries Price(1);
Numeric Length(10);
Vars
Numeric SumValue(0);
Numeric i;
Begin
for i = 0 to Length - 1
{
SumValue = SumValue + Price[ i ];
}
Return SumValue;
End
如果希望For语句从大到小进行循环,可以使用以下的语法:
For 循环变量 = 初始值 DownTo 结束值
{
TradeBlazer公式语句;
}
For-DownTo让循环变量从结束值每次递减1直到等于结束值,依次调用TradeBlazer公式语句执行,初始值必须大于或等于结束值才有意义。
For语句是比较常用的一种循环控制语句,它应用于知道循环次数的地方,很多内建用户函数中都使用For语句来完成相应的功能,比如Summation,Highest,Lowest,LinearReg等。
While
While语句在条件为真的时候重复执行某一项操作。即,只要条件表达式的值为真(True)时,就重复执行某个动作。直到行情信息改变以致条件为假(False)时,循环才结束。
语法如下:
While (Condition)
{
TradeBlazer公式语句;
}
Condition是一个逻辑表达式,当Condition为True的时候,TradeBlazer公式语句将会被循环执行,Condition可以是多个条件表达式的逻辑组合,Condition必须用()括起来。
TradeBlazer公式语句是一些语句的组合,如果TradeBlazer公式语句是单条,您可以省略{},二条或者二条以上的语句必须使用{}。
例如,以下的公式用来计算要产生大于100000成交量需要最近Bar的个数:
Vars
Numeric        SumVolume(0);
Numeric        Counter (0);
Begin
While (SumVolume < 100000)
{
SumVolume = SumVolume + Vol[Counter]
Counter = Counter + 1;
}
End
首先,我们定义两个变量SumVolume和Counter,并将其默认值设为0。当SumVolume <100000这个表达式为True时,While内的TradeBlazer公式语句一直被调用,将前Counter个Bar的Vol加到SumVolume中,当SumVolume大于等于100000时,退出循环。
在使用While循环的时候,有可能会遇到循环一直执行,永远不能退出的情况,这种情况我们称之为死循环,比如下面的语句;
While (True)
{
TradeBlazer公式语句;
}
在这种情况下,循环将一直执行,导致程序不能继续工作,在这种情况,我们可以使用Break来跳出循环,详细情况参加下节。
Break
针对上节的例子,要想从死循环中跳出,我们可以在循环之中添加Break语句,如下:
While (True)
{
TradeBlazer公式语句;
If (Condition)
Break;
}
循环在每次执行后,都将判断Condition的值,当Condition为True时,则执行Break语句,跳出整个循环。
Continue
有的时候在循环中,我们可能希望跳过后面的代码,进入下一次循环,在这种情况下,可以使用Continue语句来达到目的,如下:
While (Condition1)
{
TradeBlazer公式语句1;
If (Condition2)
Continue;
TradeBlazer公式语句2;
}
当Condition1满足时,循环被执行,在执行完TradeBlazer公式语句1后,将判断Condition2的值,当Condition2为True,将跳过TradeBlazer公式语句2,重新判断Condition1的值,进入下一次循环。否则将继续执行TradeBlazer公式语句2。
精华中精华文华所没有实现复杂策略工具二
控制语句
TradeBlazer公式支持两大类的控制语句:条件语句和循环语句。
条件语句
条件语句包括以下四类表达方式:
If
If语句是一个条件语句,当特定的条件满足后执行一部分操作。
语法如下:
If (Condition)
{
TradeBlazer公式语句;
}
Condition是一个逻辑表达式,当Condition为True的时候,TradeBlazer公式语句将会被执行,Condition可以是多个条件表达式的逻辑组合,Condition必须用()括起来。
TradeBlazer公式语句是一些语句的组合,如果TradeBlazer公式语句是单条,您可以省略{},二条或者二条以上的语句必须使用{}。
例如,您可以计算图表中上升缺口(当前Bar的开盘价高于上一个Bar的最高价)出现了多少次,只要在图表中使用If语句,当找到一个满足条件的Bar时,即条件为真时,变量加1,脚本如下:
Vars
NumericSeries Counter(0);
Begin
If ( Open > High[1])
{
Counter = Counter[1] + 1;
...
}
...
End
在TradeBlazer公式中,If语句被广泛使用,如K线型态和特征走势,都需要大量的使用If语句,当条件满足的时候,在满足条件的Bar上面进行标记。例如,下面的语句就是特征走势的例子:
If(High > High[1] AND Low < Low[1])
{
PlotNumeric(High,"Outside Bar");
}
If语句在不是用括号的情况,只执行下面的第一条语句,如下的语句,Alert不会只在条件为True时执行,而是每次都执行。
If(High > High[1] AND Low < Low[1])
PlotNumeric(High,"Outside Bar");
Alert("Outside Bar");
要想Alert只在条件为True时执行,您需要按照下面的格式编写:
If(High > High[1] AND Low < Low[1])
{
PlotNumeric(High,"Outside Bar");
Alert("Outside Bar");
}
If-Else
If-Else语句是对指定条件进行判断,如果条件满足执行If后的语句。否则执行Else后面的语句。
语法如下:
If (Condition)
{
TradeBlazer公式语句1;
}Else
{
TradeBlazer公式语句2;
}
Condition是一个逻辑表达式,当Condition为True的时候,TradeBlazer公式语句1将会被执行;Condition为False时,TradeBlazer公式语句2将会被执行。Condition可以是多个条件表达式的逻辑组合,Condition必须用()括起来。
TradeBlazer公式语句是一些语句的组合,如果TradeBlazer公式语句是单条,您可以省略{},二条或者二条以上的语句必须使用{}。
例如,比较当前Bar和上一个Bar的收盘价,如果Close > Close[1],Value1 = Value1 + Vol;否则Value1 = Value1 - Vol,脚本如下:
If (Colse > Close[1])
Value1 = Value1 + Vol;
Else
Value1 = Value1 - Vol;
If-Else-If
If-Else-If是在If-Else的基础上进行扩展,支持条件的多重分支。
语法如下:
If (Condition1)
{
TradeBlazer公式语句1;
}Else If(Condition2)
{
TradeBlazer公式语句2;
}Else
{
TradeBlazer公式语句3;
}
Condition1是一个逻辑表达式,当Condition1为True的时候,TradeBlazer公式语句1将会被执行,Condition1为False时,将会继续判断Condition2的值,当Condition2为True时,TradeBlazer公式语句2将会被执行。Condition2为False时,TradeBlazer公式语句3将会被执行。Condition1,Condition2可以是多个条件表达式的逻辑组合,条件表达式必须用()括起来。
TradeBlazer公式语句是一些语句的组合,如果TradeBlazer公式语句是单条,您可以省略{},二条或者二条以上的语句必须使用{}。
If-Else-If的语句可以根据需要一直扩展,在最后的Else之后再加If(Condition)和新的执行代码即可。当然您也可以省略最后的Else分支,语法如下:
If (Condition1)
{
TradeBlazer公式语句1;
}Else If(Condition2)
{
TradeBlazer公式语句2;
}
If-Else的嵌套
If-Else的嵌套是在If-Else的执行语句中包含新的条件语句,即一个条件被包含在另一个条件中。
语法如下:
If (Condition1)
{
If (Condition2)
{
TradeBlazer公式语句1;
}Else
{
TradeBlazer公式语句2;
}
}Else
{
If (Condition3)
{
TradeBlazer公式语句3;
}Else
{
TradeBlazer公式语句4;
}
}
Condition1是一个逻辑表达式,当Condition1为True的时候,将会继续判断Condition2的值,当Condition2为True时,TradeBlazer公式语句1将会被执行。Condition2为False时,TradeBlazer公式语句2将会被执行。当Condition1为False的时候,将会继续判断Condition3的值,当Condition3为True时,TradeBlazer公式语句3将会被执行。Condition3为False时,TradeBlazer公式语句4将会被执行。Condition1,Condition2,Condition3可以是多个条件表达式的逻辑组合,条件表达式必须用()括起来。
TradeBlazer公式语句是一些语句的组合,如果TradeBlazer公式语句是单条,您可以省略{},二条或者二条以上的语句必须使用{}。
例如,在一个交易指令中,条件设置如下:当前行情上涨的时候,如果收盘价高于开盘价时,则产生一个以收盘价买入1张合约;否则产生一个以开盘价买入1张合约。当前行情没有上涨的时候,如果收盘价高于开盘价,则产生一个以收盘价卖出1张合约;否则产生一个以开盘价卖出1张合约。脚本如下:
If (Open > High[1])
{
If (Close>Open)
{
Buy(1,Open);
}Else
{
Buy(1,Close);
}
}Else
{
If (Close > Open)
{
Sell(1,Open);
}Else
{
Sell (1,Close);
}
}
接平仓东东
SetDollarTrailing (2000,True); 当前所有持仓盈利在回落达到2000之后,执行所有持仓位置的价值回落平仓。(此时是计算所有持仓的盈利数)
SetDollarTrailing (1000,False); 当前持仓的某一个建仓位置的盈利在回落达到1000之后,执行该持仓位置的价值回落平仓。(此时只计算该持仓位置的盈利)
说明 当日收盘全部平仓。
语法 SetExitOnClose()
参数 无
备注 当日收盘全部平仓,无返回值,该函数仅支持交易指令。
在当日收盘之后以收盘价全部平仓,将持仓状态变为持平,该函数仅用于历史数据测试,在小于1日线的周期情况下,该操作在建仓日期的最后一个Bar上执行,在1日线及以上的周期中,该操作以建仓Bar的收盘价在同一Bar内执行。在自动交易中因为收盘之后不一定能够保证成功发送委托,所以该函数延迟到第二天的开盘发送。
PositionProfit
说明 获得当前持仓位置的浮动盈亏。
语法 Numeric PositionProfit()
参数 无
备注 获得当前持仓位置的浮动盈亏,已考虑交易费用,返回值为浮点数,该函数仅支持交易指令。
只有当MarketPosition != 0时,即有持仓的状况下,该函数才有意义,否则返回0。
当前持仓的平均建仓价格
说明 获得当前持仓的平均建仓价格。
语法 Numeric AvgEntryPrice()
参数 无
备注 获得当前持仓的平均建仓价格,返回值为浮点数,该函数仅支持交易指令。
示例 无
当前持仓位置的每手浮动盈亏
ContractProfit
说明 获得当前持仓位置的每手浮动盈亏。
语法 Numeric ContractProfit()
参数 无
备注 获得当前持仓位置的每手浮动盈亏,已考虑交易费用,返回值为浮点数,该函数仅支持交易指令。
只有当MarketPosition != 0时,即有持仓的状况下,该函数才有意义,否则返回0。
获得当前的可用资金
CurrentCapital
说明 获得当前的可用资金。
语法 Numeric CurrentCapital()
参数 无
备注 获得当前的可用资金,已考虑交易费用,返回值为浮点数,该函数仅支持交易指令。
根据参数进行获利平仓操作
SetProfitTarget (0,2000,True); 当前所有持仓盈利达到2000之后,执行所有持仓位置的获利平仓。(此时是计算所有持仓的盈利数)
SetProfitTarget (1,50, False); 当前持仓的某一个建仓位置每张合约的盈利达到50之后,执行该持仓位置的获利平仓。(此时只计算该持仓位置的每张合约盈利)
第一课:实例之战
一个文华交易系统的移植例子
多空趋势-交易系统之文华的公式脚本:
[Copy to clipboard] [ - ]CODE:
MA1:=EMA(CLOSE,16);
MA2:=EMA(CLOSE,35),COLORYELLOW;
MA3:=EMA(CLOSE,60);
MA4:=REF(HIGH,1);
LOWV:=LLV(LOW,9);
HIGHV:=HHV(HIGH,9);
RSV:=EMA((CLOSE-LOWV)/(HIGHV-LOWV)*100,3);
K:=EMA(RSV,3);
D:=MA(K,3);
MV5:=MA(VOL,5);
KK:=REF(K,1);
PP:=REF(LOW,1);
VAR3:=(2*CLOSE+HIGH+LOW)/4;
VAR4:=LLV(LOW,33);
VAR5:=HHV(HIGH,33);
ZL:=EMA((VAR3-VAR4)/(VAR5-VAR4)*100,17);
SH:=EMA(0.667*REF(ZL,1)+0.333*ZL,2);
LC:=REF(CLOSE,1);
RSI:=SMA(MAX(CLOSE-LC, 0), 6, 1)/SMA(ABS(CLOSE-LC), 6, 1)*100;
CROSS(CLOSE,MA1)&&(K>D)&&(ZL>SH)||CROSS(MA1,MA2)&&(ZL>SH)&&(VOL>1.25*MV5)&&(K>D)||CROSS(K,D)&&(CLOSE>MA1)&&(ZL>SH)||CROSS(RSI,70),BK;
CROSS(PP,CLOSE)&&(D>K)&&(SH>ZL)||CROSS(D,K)&&(CLOSEZL),SK;
CROSS(D,K)||(CLOSECROSS(K,D)||(CLOSE>MA1*1.001),BP;
TradeBlazer公式代码:
[Copy to clipboard] [ - ]CODE:
//------------------------------------------------------------------------
// 简称: Test
// 名称: 多空趋势交易系统
// 类别: 交易指令
// 类型: 其他
// 输出:
//------------------------------------------------------------------------
Params
Numeric Length1(16);
Numeric Length2(35);
Numeric Length3(9);
Numeric Lots(1);
Vars
NumericSeries Value1;
NumericSeries Value2;
Numeric LowestValue;
NumericSeries Value5;
NumericSeries RSV;
NumericSeries KValue;
NumericSeries DValue;
Numeric AvgVol5;
NumericSeries CloseTmp1;
NumericSeries CloseTmp2;
NumericSeries RSIValue;
NumericSeries PreLow;
NumericSeries PreKValue;
Numeric Lowest33Value;
NumericSeries VarTmp1;
NumericSeries VarTmp2;
NumericSeries ZL;
Numeric SH;
Begin
Value1 = XAverage(Close,Length1);
Value2 = XAverage(Close,Length2);
//取两条均线的值
LowestValue = Lowest(Low,Length3);
//取最低值
Value5 = (CLOSE-LowestValue)/(Highest(High,Length3)-LowestValue)*100;
RSV = XAverage(Value5,3);
KValue = XAverage(RSV,3);
DValue = Average(KValue,3);
PreKValue = KValue[1];
PreLow = Low[1];
AvgVol5 = Average(Vol,5);
Lowest33Value = Lowest(Low,33);
VarTmp1 =((2*CLOSE+HIGH+LOW)/4 - Lowest33Value )/(Highest(High,33) - Lowest33Value) * 100;
ZL = XAverage(VarTmp1,17);
VarTmp2 = 0.667*ZL[1] + 0.333*ZL;
SH = XAverage(VarTmp2,2);
CloseTmp1 = Max(Close - Close[1], 0);
CloseTmp2 = Abs(Close - Close[1]);
RSIValue = WAverage(CloseTmp1,6)/WAverage(CloseTmp2,6) *100;
//以上为KD部分只要如何换书写方式就可了,,higest ==hhv lowest==llv   xAverager=ma
// Buy什么时做买入动作,条件
If( (CrossOver(Close,Value1 ) && (KValue > DValue) && (ZL>SH)) Or
(CrossOver(Value1,Value2) && (ZL>SH) && (Vol > 1.25 * AvgVol5) && (KValue > DValue)) Or
(CrossOver(KValue,DValue) && (Close > Value1) && (ZL>SH)) Or
(CrossOver(RSIValue,70)))//条件
{
Buy(Lots,Close);
}
// SellShort 什么作卖出动作
If( (CrossOver(PreLow,Close) && (KValue > DValue ) && (SH>ZL) ) Or
(CrossOver(DValue,KValue) && (Close < Value1) && (Value1 < Value2)) Or
(CrossOver(PreKValue,KValue)&& (SH>ZL)))//条件
{
SellShort(Lots,Close);
}
// Sell 什么做多平动作
If(CrossOver(DValue,KValue) || Close < Value1 * 1.001)//条件
{
Sell;
}
// BuyToCover什么进个做空平动作
If(CrossOver(KValue,DValue) || Close > Value1 * 1.001)//条件
{
BuyToCover;
}
End
//------------------------------------------------------------------------
// 编译版本        GS2004.06.12
// 用户版本        2007-06-25 10:37
// 版权所有        TradeBlazer
// 更改声明        TradeBlazer Software保留对TradeBlazer平台
//                        每一版本的TrabeBlazer公式修改和重写的权利
//------------------------------------------------------------------------
第二课:交易思想是灵魂
要是打算根据3日的高低价平仓呢?想法如下
想实现这样一个一个想法:价格突破5天最高价,开多仓,把当天和前一天的K线做比较,取两日的最低价格做为止损,当价格突破3日最低价时,平多仓。
价格突破5日最低价,开空仓,把今天和 ...
你看看哦,代码大致如此:
Params
vars
NumericSeries EntryHi;
NumericSeries EntryLo;
NumericSeries ShortStop;
NumericSeries LongStop;
NumericSeries SellHi;
NumericSeries SellLo;
Numeric myEntryPrice;
Numeric myExitPrice;
begin
//入场点,开多和开空点,突破5天最高或最低
EntryHi = Highest(high[1],5);
EntryLo  = Lowest(low[1],5);
//离场点,止盈点,三天较高或较低
SellHi=Highest(high[1],3);
SellLo= Lowest(low[1],3);
//止损点,两天较高或较低
ShortStop= Highest(high[1],2);
LongStop=Lowest(low[1],2);
if(MarketPosition ==0)
{
If(CrossOver(high,EntryHi))
{
myEntryPrice = min(high,EntryHi );
myEntryPrice = IIF(myEntryPrice < Open, Open,myEntryPrice);
Buy(0,myEntryPrice);
}
If(CrossUnder(Low,EntryLo ))
{
myEntryPrice = max(low,EntryLo  );
myEntryPrice = IIF(myEntryPrice > Open, Open,myEntryPrice);
SellShort(0,myEntryPrice);
}
}
If(MarketPosition ==1)
{
if (CrossUnder(Low,LongStop))
{
myExitPrice = max(low,LongStop );
myExitPrice = IIF(myExitPrice > Open, Open,myExitPrice);
Sell(0,myExitPrice);
}Else
if (CrossUnder(Low,SellLo))
{
myExitPrice = max(low,SellLo );
myExitPrice = IIF(myExitPrice > Open, Open,myExitPrice);
Sell(0,myExitPrice);
}
}
If(MarketPosition ==-1)
{
if (CrossOver(high,ShortStop))
{
myExitPrice = min(high,ShortStop );
myExitPrice = IIF(myExitPrice < Open, Open,myExitPrice);
BuyToCover(0,myExitPrice);
}Else
if (CrossOver(high,SellHi))
{
myExitPrice = min(high,SellHi );
myExitPrice = IIF(myExitPrice < Open, Open,myExitPrice);
BuyToCover(0,myExitPrice);
}
}
end
第三课:双均线策略
// 以下为均线交易系统,5日均线上穿20均线为买入,5日均线下穿20均线为买出
Params        // 宣告参数定义
Numeric Length1(5);        // 5日均线的参数值
Numeric Length2(20);        // 20日均线的参数值
Numeric Lots(1);                // 默认的交易数量,您可以通过公式计算来产生
Vars        // 宣告变量定义
NumericSeries MA1;        // 中间变量,用来保存5日均线的值,因为CrossOver的输入参数需要序列变量,因此定义为序列变量
NumericSeries MA2;        // 中间变量,用来保存20日均线的值,因为CrossOver的输入参数需要序列变量,因此定义为序列变量
Begin        // 宣告公式正文开始
MA1 = AverageFC(Close,Length1);        // 求出5日均线值,并将值赋给MA1
MA2 = AverageFC(Close,Length2);        // 求出20日均线值,并将值赋给MA2
If(CrossOver(MA1,MA2))        // 当出现5日均线上穿20均线时买入
{
Buy(Lots,Close);        // 用当前Bar的收盘价买入,详细的Buy函数调用请参见帮助文件
}
If(CrossUnder(MA1,MA2))// 当出现5日均线下穿20均线时卖出
{
Sell;                                // Sell不用参数时会自动平掉所有仓位,详细的Sell函数调用请参见帮助文件
}
End                // 宣告公式正文结束
问题集中一下,双策略
收盘价格突破5天均线,开仓,跌破5天线平仓;
收盘价格突破25天均线,开仓,跌破25天线平仓;
各平各的仓,不可乱平.
是这样解决
如果您希望两个交易指令不相互平仓,那直接开两个图表分别执行交易指令就可以啦!
你举例的交易指令除了参数还都是一样的。所以只需要更改两个图表中交易指令的参数就可以解决了。
操作步骤如下:
1、新建一个交易指令,假定命名为Demo:
[Copy to clipboard] [ - ]CODE:
Params        // 宣告参数定义
Numeric Length(5);        // 均线的参数值
Numeric Lots(1);        // 默认的交易数量,您可以通过公式计算来产生
Vars        // 宣告变量定义
NumericSeries MA1;        // 中间变量,用来保存均线的值,因为CrossOver的输入参数需要序列变量,因此定义为序列变量
Begin        // 宣告公式正文开始
MA1 = AverageFC(Close,Length);        // 求出均线值,并将值赋给MA1
If(CrossOver(Close,MA1))        // 当出现收盘价上穿均线时买入
{
Buy(Lots,Close);        // 用当前Bar的收盘价买入,详细的Buy函数调用请参见帮助文件
}
If(CrossUnder(Close,MA1))// 当出现收盘价下穿均线时卖出
{
Sell;                                // Sell不用参数时会自动平掉所有仓位,详细的Sell函数调用请参见帮助文件
}
End                // 宣告公式正文结束
2、编译保存该公式后,开两个图表,都加入该交易指令。一个图表的交易指令参数设置为5,一个设置为20。
问题1回复
这就相当两个毫无关联的交易系统组合在一起的效果,就好像有两个人[A和B]可以同时操作一个账户,A,B都可以在任何时候进行开平仓。
必然会出现A开的仓被B平掉,或者B想开仓,发现资金不够。所以,您在组合交易系统的时候,一定要知道每个交易系统会干什么,会产生什么关联。就相当于A和B两个人需要约定一下,A来管开仓,B来管平仓。或者其他分工,这样就不会乱啦。
问题2回复
我提供的是一个无任何实际意义的例子,所以,您不与拘泥于公式的条件写法。
比如开仓条件,先从单个条件写起。如果错误的讯号太多,则需要增加条件,过滤一些无效的讯号。
如果讯号太少,则说明您的条件太苛刻,也需要对条件进行修改。
平仓的讯号也是类似,唯一不同的是还需要加上一些止损的条件
第四课:开仓和资金关联
如何进行增减开仓控制
能否在开仓前检测资产总额,比如盈亏20%时增减1手仓位?[
假定我们在当前持多仓盈利的盈利达到10%的时候在增仓一倍。其他的用法类似。
[Copy to clipboard] [ - ]CODE:
Vars
Numeric ProfitRatio;
Begin
// 前面的代码为建仓,平仓操作。。
If(MarketPosition == 1) // 当前为多仓
{
ProfitRatio = ContractProfit/(AvgEntryPrice()*ContractUnit()*MarginRatio()); // 当前盈利比例=每手盈利/(每手的总价格*保证金)
If(ProfitRatio > 0.1)
{
Buy(CurrentContracts,Close);        // 再按照当前的仓位买入
}
}
End
CurrentCapital,AvgEntryPrice,CurrentContracts,ContractProfit等函数可获得测试时的资金,盈亏等数据。
然后进行后续仓位控制。
第5课:资金管理与TB的结合范例应
通过对资金管理来实现及时止损和止赢(最为关键一课)
第6课:海龟--著名交易系统
只有吃透海龟你才算是合格的系统交易者

第七课:实战例
//------------------------------------------------------------------------
// 简称: sd
// 名称: sd
// 类别: 交易指令
// 类型: 多头建仓
// 输出:
//------------------------------------------------------------------------
Vars
Numeric lots(8);//精华在这里
Bool szwy;
Bool ssly;
Bool sly;
Bool sszwy;
Begin
if (BarStatus == 2 )
{Lots=A_FreeMargin /(Q_AskPrice*ContractUnit*MarginRatio);
Lots= IntPart(Lots); }// 取整
Else If(BarStatus<>2  )
{Lots=CurrentCapital/(Close*ContractUnit*MarginRatio);
Lots=IntPart(Lots); // 取整
}
//这是本例华部分,也是作者思想可取,一个好的交易者先首要件就是控制作风险.......
SZWY=(closeSSLY=(CLOSE>OPEN)&&(CLOSE[1]>=OPEN[1])&&(CLOSE[2]>=OPEN[2])&&(CLOSE[3]>=OPEN[3]);
SLY=(CLOSE>OPEN )&&(CLOSE[1]>=OPEN[1])&&(CLOSE[2]>=OPEN[2]);
SSZWY=(CLOSE// 开多条件
IF(ssly and Time<0.144500 )               // 在四连阳形态的时候!在下根K线开盘价做多(注:每个人入场方式可以不同)
Buy(lots,Close,True);
// 开空条件
if(sszwy and Time<0.144500  )                 //在四连阴形态的时候!在下根K线开盘价卖空((注:每个人入场方式可以不同)
SellShort(lots,Close,True);
if(szwy )
Sell(lots,Close,True);
if(sly)
BuyToCover(lots,Close,True);//这都关键性,别的系统所不能这样做
end
//------------------------------------------------------------------------