设为首页收藏本站

 找回密码
 注册
查看: 1770|回复: 2
打印 上一主题 下一主题

请教诸位,为什么这段代码在模拟盘跑的时候会持仓大于1手? [复制链接]

Rank: 1

精华
0
UID
228131
积分
5
帖子
4
主题
1
阅读权限
10
注册时间
2016-2-15
最后登录
2021-10-24
跳转到指定楼层
1#
发表于 2018-6-12 11:01:53 |只看该作者 |倒序浏览
请教诸位,为什么这段代码在模拟盘跑的时候会出现持仓大于1手,而且是第三日夜盘增加的。。。。
Params
        //此处添加参数
        Numeric length(11);
        Numeric lots(0);
        Numeric takeprofitset(51);
       
       
Vars
        //此处添加变量
        NumericSeries ma1;
        Numeric minpoint;
        Numeric myentryprice;
        Numeric myexitprice;
        Numeric btx;
       
        Bool con1;
        Bool con2;
        Bool con3;
        Bool con4;
        Bool con5;
        Bool con6;
        Bool con7;
        Bool con8;
        Bool con9;
        Bool con10;
        Bool con11;
        Bool con12;
        Bool con13;
        Bool con14;
       
Begin
        //此处添加代码正文

        btx=GetGlobalVar(0);
        If(btx==InvalidNumeric)
        {
                btx=0;
                SetGlobalVar(0,btx);
        }
       
        ma1 = AverageFC(close,length);
        PlotNumeric ("ma1",ma1);
        minpoint = MinMove*PriceScale;
        myentryprice = AvgEntryPrice;
       
        con11 = Q_AskPrice>ma1[0];     
        con12 = Q_BidPrice<ma1[0];
        con3 = GetGlobalVar(0) == 0 or  GetGlobalVar(0) == -1;
        con4 = GetGlobalVar(0) == 0 or  GetGlobalVar(0) ==1;
        con1 = con11 && (A_BuyPosition()==0) &&  con3;
        con2 = con12 && (A_SellPosition()==0) && con4;
       
        If(con1)
        {
                A_SendOrder(Enum_Buy,Enum_Entry,1,Q_AskPrice);
                SetGlobalVar(0,1);
        }
        If(con2)
        {
                A_SendOrder(Enum_Sell,Enum_Entry,1,Q_BidPrice);
                SetGlobalVar(0,-1);
        }
        If(A_BuyPosition() == 1)  // 有多仓的情况
        {
                If (high >= myentryprice+takeprofitset*minpoint)  //止盈条件
                {
                        A_SendOrder(Enum_Sell,Enum_Exit,1,Q_BidPrice);
                }else if (high >= ma1[0]+takeprofitset*minpoint)  //动态止损
                {
                        A_SendOrder(Enum_Sell,Enum_Exit,1,Q_BidPrice);
                }
        }else if (A_SellPosition()==-1)  //有空仓的情况
        {
                If ( Low <= myentryprice - takeprofitset*minpoint)  //止盈条件
                {
                        A_SendOrder(Enum_Buy,Enum_Exit,1,Q_AskPrice);               
                }else if (Low <= ma1[0]-takeprofitset*minpoint)  //止损表达式
                {
                        A_SendOrder(Enum_Buy,Enum_Exit,1,Q_AskPrice);
                }
        }               
End

Rank: 10Rank: 10Rank: 10

精华
3
UID
5
积分
26584
帖子
12686
主题
49
阅读权限
200
注册时间
2007-7-20
最后登录
2021-11-3
2#
发表于 2018-6-12 14:08:37 |只看该作者
开多与开空都用同一个号的全局变量来控制,不太合适吧?这样就会导致同时持多与空仓的可能性吧。
在这段代码下,如果成交回报慢,或是之前的委托没有成交的情况下,是可能继续重复发单的。等都成交后,自然显示的手数就大于1了。
建议开多与开空使用不同的全局变量来控制,且在平仓时就将全局变量初始化。
平仓时也需要使用全局变量来控制发单 次数。
另外,使用a_xxX,Q_XXX函数,一定要使用barstatus==2做为上层条件,以避免在历史K线数这两类函数的无效值影响条件判断结果 。

使用道具 举报

Rank: 1

精华
0
UID
228131
积分
5
帖子
4
主题
1
阅读权限
10
注册时间
2016-2-15
最后登录
2021-10-24
3#
发表于 2018-6-15 17:52:26 |只看该作者
小米 发表于 2018-6-12 14:08
开多与开空都用同一个号的全局变量来控制,不太合适吧?这样就会导致同时持多与空仓的可能性吧。
在这段代 ...

感谢版主指教!端午快乐哈!

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

bottom

静态版|手机版|联系我们|交易开拓者 ( 粤ICP备07044698   

GMT+8, 2024-5-19 17:19

Powered by Discuz! X2 LicensedChrome插件扩展

© 2011-2012 交易开拓者 Inc.

回顶部