您现在的位置:程序化交易>> 期货公式>> 交易开拓者(TB)>> 开拓者知识>>正文内容

止损出现错误 [开拓者 TB]

  • 咨询内容: 今天在用数据库测试时发现开仓不正确,根据输出的日志发现一个问题。
    程序如下,本程序在价格突破前6根Bar的高低点时建仓,止损设置为4跳。但是在09:29:01时开空后立即止损,止损价格就是开仓价格,并且止损单买入平仓失败。我没有发现程序的问题,所以请版主解答一下,谢谢!
    1. Params
    2.                 Numeric L1(6);
    3.                 Numeric Stoploss(4);
    4. Vars
    5.                 Bool        upbreak;
    6.                 Bool        lowbreak;
    7.                 String        orderstate;
    8.                 Numeric protectprice;
    9.                 Numeric Mx;
    10.                 Numeric Mn;
    11.                 Numeric i;
    12. Begin
    13.         //求最值------------------------------------------------------------------------
    14.     Mx=High[1];
    15.     Mn=Low[1];
    16.     For i=2 To L1
    17.     {
    18.         If(High[i]>Mx)
    19.             Mx=High[i];
    20.         If(Low[i]<Mn)
    21.             Mn=Low[i];
    22.     }
    23.     PlotNumeric("最大值",Mx);
    24.     PlotNumeric("最小值",Mn);
    25.        
    26.         If(BarStatus==2)
    27.                 {
    28.                         orderstate=GetTBProfileString2File("C:\\breaktest.log","开仓控制","已发单");
    29.                         Commentary("已发单:"+orderstate);
    30.                         If(orderstate=="0" Or orderstate==InvalidString)
    31.                                 {
    32.                                         If(Q_Last>Mx)
    33.                                                 {
    34.                                                         FileAppend("C:\\breaktest记录.log",TimeToString(CurrentTime)+",开多前orderstate为:"+orderstate+",开多前持仓为:"+Text(A_TotalPosition)+",发单价格:"+Text(Q_Last));
    35.                                                         A_SendOrder(Enum_Buy,Enum_Entry,1,Q_AskPrice);
    36.                                                         SetTBProfileString2File("C:\\breaktest.log","开仓控制","已发单",Text(1));
    37.                                                 }
    38.                                         If(Q_Last<Mn)
    39.                                                 {
    40.                                                         FileAppend("C:\\breaktest记录.log",TimeToString(CurrentTime)+"开空前orderstate为:"+orderstate+",开空前持仓为:"+Text(A_TotalPosition)+",发单价格:"+Text(Q_Last));
    41.                                                         A_SendOrder(Enum_Sell,Enum_Entry,1,Q_BidPrice);
    42.                                                         SetTBProfileString2File("C:\\breaktest.log","开仓控制","已发单",Text(-1));
    43.                                                 }
    44.                                 }
    45.                         If(orderstate=="1")
    46.                                 {
    47.                                         protectprice=A_BuyAvgPrice-Stoploss;
    48.                                         If(Q_Last<protectprice)
    49.                                                 {
    50.                                                         FileAppend("C:\\breaktest记录.log",TimeToString(CurrentTime)+"多单止损前orderstate为:"+orderstate+"止损前持仓为:"+Text(A_TotalPosition)+",发单价格:"+Text(Q_Last));
    51.                                                         A_SendOrder(Enum_Sell,Enum_Exit,1,Q_BidPrice);
    52.                                                         SetTBProfileString2File("C:\\breaktest.log","开仓控制","已发单",Text(0));
    53.                                                 }
    54.                                         Else If(Q_Last<Mn)
    55.                                                 {
    56.                                                         FileAppend("C:\\breaktest记录.log",TimeToString(CurrentTime)+"平多前orderstate为:"+orderstate+"平仓前持仓为:"+Text(A_TotalPosition)+",发单价格:"+Text(Q_Last));
    57.                                                         A_SendOrder(Enum_Sell,Enum_Exit,1,Q_BidPrice);
    58.                                                         SetTBProfileString2File("C:\\breaktest.log","开仓控制","已发单",Text(0));
    59.                                                 }
    60.                                 }
    61.                         If(orderstate=="-1")
    62.                                 {
    63.                                         protectprice=A_SellAvgPrice+Stoploss;
    64.                                         If(Q_Last>protectprice)
    65.                                                 {
    66.                                                         FileAppend("C:\\breaktest记录.log",TimeToString(CurrentTime)+"空单止损前orderstate为:"+orderstate+"止损前持仓为:"+Text(A_TotalPosition)+",发单价格:"+Text(Q_Last));
    67.                                                         A_SendOrder(Enum_Buy,Enum_Exit,1,Q_AskPrice);
    68.                                                         SetTBProfileString2File("C:\\breaktest.log","开仓控制","已发单",Text(0));
    69.                                                 }
    70.                                         Else If(Q_Last>Mx)
    71.                                                 {
    72.                                                         FileAppend("C:\\breaktest记录.log",TimeToString(CurrentTime)+"平空前orderstate为:"+orderstate+"平仓前持仓为:"+Text(A_TotalPosition)+",发单价格:"+Text(Q_Last));
    73.                                                         A_SendOrder(Enum_Buy,Enum_Exit,1,Q_AskPrice);
    74.                                                         SetTBProfileString2File("C:\\breaktest.log","开仓控制","已发单",Text(0));
    75.                                                 }
    76.                                 }
    77.                 }
    78. End

     

  • TB技术人员: 买入平仓失败的原因是前面的开空单尚未成交,因此平仓会失败。但是不明白为什么止损条件未达到就发了止损单

     

  • TB客服:
    zhoucx 发表于 2016-7-14 14:23
    买入平仓失败的原因是前面的开空单尚未成交,因此平仓会失败。但是不明白为什么止损条件未达到就发了止损单 ...

    现有的日志可以确认是满足了哪一个条件而进行的平仓动作。
    可以在日志里再加上内容,判断当时的条件分别是什么从而满足了人工认为不应该满足的条件 。。
    上述出现问题的是条件是If(Q_Last>protectprice),可以在日志里将q_last,protectprice的值都分别写日志里再观察 。。
    在使用A函数交易中,在没有经过一段时间的实时交易测试确认策略能完全按自己的需求执行前,建议在必要的地方(特别是开平仓时)都写日志吧。这样有助于及时排查问题,减少测试周期。

     

  • 网友回复:
    小米 发表于 2016-7-14 15:19
    现有的日志可以确认是满足了哪一个条件而进行的平仓动作。
    可以在日志里再加上内容,判断当时的条件分别 ...

    刚才加入了你说的这些,不过只进行了三次交易,没有错误,明天再试试吧

     

  • 网友回复:
    小米 发表于 2016-7-14 15:19
    现有的日志可以确认是满足了哪一个条件而进行的平仓动作。
    可以在日志里再加上内容,判断当时的条件分别 ...

    问题解决了,谢谢小米
    确实是开仓单未成交的原因,因为已经发出了开空单,orderstate已经变成-1,下一tick到来时由于A_SellAvgPrice=0,所以protectprice=4,触发了平仓动作,造成多开一单

 

有思路,想编写各种指标公式,程序化交易模型,选股公式,预警公式的朋友

可联系技术人员 QQ: 511411198  点击这里给我发消息进行 有偿 编写!不贵!点击查看价格!


【字体: 】【打印文章】【查看评论

相关文章

    没有相关内容