开拓者期货期权程序化系统交易论坛

标题: 平仓指令,不能实现自动止损平仓.SetStopLoss(1,100,true), [打印本页]

作者: zejunl    时间: 2010-4-26 10:52:05     标题: 平仓指令,不能实现自动止损平仓.SetStopLoss(1,100,true),

Dear Adm and all,
      我写了一个模型测试一下,使用函数SetStopLoss(1,100,true)不能进行自动平仓,望管理员及各位高手给予帮助,谢谢。
代码如下:
//------------------------------------------------------------------------
// 简称: my_trtst
// 名称: my_trtst
// 类别: 交易指令
// 类型: 其他
// 输出:
//------------------------------------------------------------------------

Params
Numeric down_length(1.5);
Numeric up_length(0.5);
Vars

//-------------止损平仓1000-----------------
SetStopLoss(1,100,true);
//-------------价格盈利回落10%(0.1)实行平仓------------
SetPercentTrailing(600,0.1,true);

//----------------获得当前持仓位置的浮动盈亏--------------
if (MarketPosition!=0 And BarStatus ==2){
FileDelete("C:\\Program_Trading.log");  
FileAppend("C:\\Program_Trading.log","浮动盈亏 = "+Text(A_ProfitLoss()));为什么输出的是一个N/A的字符串。

}
End

//------------------------------------------------------------------------
// 编译版本        GS2004.06.12
// 用户版本        2010/04/17 23:44
// 版权所有        zejunl
// 更改声明        TradeBlazer Software保留对TradeBlazer平台
//                        每一版本的TrabeBlazer公式修改和重写的权利
//------------------------------------------------------------------------
此贴在lh948同志的大力支持下已经得到解决。
Submitter: zejunl

[ 本帖最后由 zejunl 于 2010-4-27 13:42 编辑 ]
作者: lh948    时间: 2010-4-26 12:06:32

SetStopLoss这个函数暂时无法在实盘上使用,只能用于历史测试.
作者: zejunl    时间: 2010-4-26 12:10:28

请问这个函数的说明中为什么有该函数仅支持交易指令 ,及怎样去区分函数是否支持交易指令。谢谢!
SetStopLoss
说明 根据参数进行止损平仓操作。
语法 Bool SetStopLoss(Integer Type,Numeric Value,Bool ExitPosition=False)
参数 Type 止损平仓的设置类型,参数定义如下:
0 按照持仓亏损数来计算止损平仓
1 按照每张合约亏损数来计算止损平仓
Value 根据Type类型而不同的设定值。
ExitPosition 布尔值,为True时,表示对当前所有持仓一起计算进行平仓,为False对每一个仓位单独计算进行平仓。  
备注 根据参数进行止损平仓操作,返回值为布尔型,执行成功返回True,否则返回False,该函数仅支持交易指令
止损平仓是指当亏损大于等于设定值时,自动进行平仓操作,平仓的价格是满足亏损值等于设定值的价格。止损平仓在计算亏损时不考虑佣金。如果Type和Value的输入值无效,该函数的操作将被忽略。  
示例 SetStopLoss(0,2000,True); 当前所有持仓亏损达到2000之后,执行所有持仓位置的止损平仓。(此时是计算所有持仓的亏损数)
SetStopLoss(1,50, False); 当前持仓的某一个建仓位置每张合约的亏损达到50之后,执行该持仓位置的止损平仓。(此时只计算该持仓位置的每张合约亏损)
作者: lh948    时间: 2010-4-26 13:00:01

公式类型分为技术指标,用户函数,k线形态,用户字段,特征走势,交易指令
SetStopLoss只能用于交易指令,用于历史的测试,不能在技术指标中使用,不能用于实盘交易
作者: zejunl    时间: 2010-4-26 13:45:17

Sorry,是我表述错误,我的意思是,如果在函数解释中标注有“该函数仅支持交易指令”,我怎样去区分这交易函数是只能用于历史测试,还是可以用于实盘操作呢?期待您的解答!谢谢。
Zejunl
作者: ranran0623    时间: 2010-4-26 14:01:28

我帮你顶!!!!!
作者: lh948    时间: 2010-4-26 14:37:42

暂时只有这个函数。
作者: zejunl    时间: 2010-4-26 14:58:59     标题: 回复 7# lh948 的帖子

不明白您的意思,我是说在所有的交易函数中,那些函数可以用于实盘交易,那些只能用于测试中使用,因为我看了交易函数解释,通通都有这样一句,”该函数仅支持交易指令“,所以就把我弄糊涂了哈。请给予帮助解答。谢谢。

zejunl
作者: zejunl    时间: 2010-4-26 15:05:08

请看附图。[attach]3254[/attach]
作者: lh948    时间: 2010-4-26 17:00:48

更正一下我之前对上面的回答:

首先,对1楼,A_ProfitLoss()是和账户关联的,前面没有带A和Q的函数(即非A、Q函数)是与图表关联的,也就是说buysell开的仓只在图表上显示开仓平仓。并不是实际在账户上持仓的,所以A_ProfitLoss()取到无效值的。只有交易了,在账户有相应的值,A_ProfitLoss才能取到有效值。

其次,我之前说的对历史测试用的函数,我们建议非A、Q函数,不要用于实盘交易,因为非A、Q函数主要是做来给用户进行历史测试的。这是我们的建议。如果客户非要使用buysell进行交易,也是可以的。A/Q函数交易比较灵活,但是在图表上没有信号。
作者: zejunl    时间: 2010-4-27 00:05:42

请问一下管理员同志及其它大侠,Bool A_SendOrder(Integer BuyOrSell,Integer EntryOrExit,Numeric fLot,Numeric fPrice)函数,能否把Numeric fPrice 替换为NextOpen来获取交易价格数据,因为这样不会发生重复开仓的问题,谢谢!
if ( tr_hbop[1] > tr_x[1] And (Abs(tr_s1[1]-tr_x[1])<=0 or Abs(tr_s1[1]-tr_x[1])<=0.50))
{
        if (A_SellPosition()>0)
        {
                A_SendOrder(Enum_Sell,Enum_Exit,A_SellPosition(),Q_AskPrice());
        }
        A_SendOrder(Enum_Buy,Enum_Entry,1,Q_BidPrice());
}

if ( tr_hbop[1]<tr_x[1]  And (Abs(tr_b1[1]-tr_x[1])<=0  or Abs(tr_b1[1]-tr_x[1])<=0.50))
{
        if (A_BuyPosition()>0)
        {
                A_SendOrder(Enum_Buy,Enum_Exit,A_BuyPosition(),Q_BidPrice());
        }
        A_SendOrder(Enum_Sell,Enum_Entry,1,Q_AskPrice());
}
//----------------止损操作--------------
if ((A_BuyPosition()>0 or A_SellPosition()>0 ) And BarStatus ==2)
{
//-------------止损平仓100-----------------
        if (A_BuyProfitLoss()<=-100)
        {
                A_SendOrder(Enum_sell,Enum_exit,A_BuyPosition(),Q_BidPrice());
        }
        if (A_SellProfitLoss()<=-100)
        {
                A_SendOrder(Enum_Buy,Enum_exit,A_SellPosition(),Q_AskPrice());
        }

By,Zejunl
作者: zejunl    时间: 2010-4-27 00:09:41     标题: 回复 6# ranran0623 的帖子

谢谢[size],呵呵。
作者: lh948    时间: 2010-4-27 08:47:24     标题: 回复 11# zejunl 的帖子

A_SendOrder避免重复开仓配合全局变量使用。
例如:
if(getglobalvar(0)==0 && 开仓条件)
{
A_SendOrder(略);
setglobalvar(0,1);
}
作者: zejunl    时间: 2010-4-27 09:09:27

Hi, 请看下列代码,为什么不能根据自动止损平仓呢?谢谢!
交易指令应用周期:1分钟,
开仓方向:多仓
开仓价格:SR1101 4995
现在价格:SR1101 4958
损失:SR1101 5995-4958= -370

//----------------止损操作--------------
if ((A_BuyPosition()>0 or A_SellPosition()>0 ) And BarStatus ==2)
{
//-------------止损平仓100-----------------
        if (A_BuyProfitLoss()<=-100)
        {
                A_SendOrder(Enum_Sell,Enum_Exit,A_BuyPosition(),Q_BidPrice());
        }
        if (A_SellProfitLoss()<=-100)
        {
                A_SendOrder(Enum_Buy,Enum_Exit,A_SellPosition(),Q_AskPrice());
        }
       
       
}
作者: lh948    时间: 2010-4-27 09:22:58

启动了自动交易吗?
BarStatus ==2这句可以删去
以下平仓部分没有问题
if (A_BuyPosition()>0 or A_SellPosition()>0 )
{
//-------------止损平仓100-----------------
        if (A_BuyProfitLoss()<=-100)
        {
                A_SendOrder(Enum_Sell,Enum_Exit,A_BuyPosition(),Q_BidPrice());
        }
        if (A_SellProfitLoss()<=-100)
        {
                A_SendOrder(Enum_Buy,Enum_Exit,A_SellPosition(),Q_AskPrice());
        }      
}
作者: zejunl    时间: 2010-4-27 10:23:25

好的,请问,是否我把BarStatus ==2 删除了就能实现自动止损平仓了呢。? 我现在就去难一下。
作者: lh948    时间: 2010-4-27 10:25:56     标题: 回复 16# zejunl 的帖子

BarStatus ==2是多余的,删不删除都可以实现平仓的功能。这部分代码没有问题。
作者: zejunl    时间: 2010-4-27 10:49:44

刚刚才我把程序代码做了些修改,主要是为了避免同一方向重复下单的问题,按照您的提示,我把代码修改如下,请看下列代码,其中我有一个疑问,为什么还是在重复发送同一方向的单,我应该把SetGlobalVar(0,0) and SetGlobalVar(1,0)的初始值放在程序的那一部分。如果把SetGlobalVar(0,0) and SetGlobalVar(1,0)放在Begin and End 之间的话,可能随时都会去把默认值识为当前值。期待您及高手的回答!
关于开平仓记录请看附件中的文件,先行谢过了。
Parms
......
Vars
......
Begin
{
//前面程序计算部分.........

SetGlobalVar(0,0);//多开平仓标志,没有多单持仓用0表示,有多单持仓用1表示。获取数据用GetGlobalVar(0);
SetGlobalVar(1,0);//空开平仓标志,没有空单持仓用0表示,有空单持仓用1表求。获取数据用GetGlobalVar(1);


if ( tr_hbop[1] > tr_x[1] And (Abs(tr_s1[1]-tr_x[1])<=0 or Abs(tr_s1[1]-tr_x[1])<=0.50))
{
        if (GetGlobalVar(1)==1)
        {
                A_SendOrder(Enum_Sell,Enum_Exit,A_SellPosition(),Q_AskPrice());
                SetGlobalVar(1,0);
        }
        if (GetGlobalVar(0)==0)
        {
                A_SendOrder(Enum_Buy,Enum_Entry,1,Q_BidPrice());
                SetGlobalVar(0,1);               
        }
}

if ( tr_hbop[1]<tr_x[1]  And (Abs(tr_b1[1]-tr_x[1])<=0  or Abs(tr_b1[1]-tr_x[1])<=0.50))
{
        if (GetGlobalVar(0)==1)
        {
                A_SendOrder(Enum_Buy,Enum_Exit,A_BuyPosition(),Q_BidPrice());
                SetGlobalVar(0,0);
        }
        if (GetGlobalVar(1)==0)
        {
                A_SendOrder(Enum_Sell,Enum_Entry,1,Q_AskPrice());
                SetGlobalVar(1,1);
        }
}

End
[attach]3257[/attach]

By : Zejunl

[ 本帖最后由 zejunl 于 2010-4-27 12:47 编辑 ]
作者: pitkin    时间: 2010-12-3 10:29:14

这样的好贴得顶!
作者: pitkin    时间: 2010-12-3 10:33:25

zejunl ,你好!如何加你qq好友?希望能对你发的这段代码的某些问题向你请教,谢谢啦~!
作者: kyler    时间: 2012-6-6 16:15:38

mark,顶!




欢迎光临 开拓者期货期权程序化系统交易论坛 (http://bbs.tb18.net/) Powered by Discuz! X2