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

按2%的风险,1:2的盈亏比代码,总是不对,请老师帮忙看看 [开拓者 TB]

  • 咨询内容: 本帖最后由 xiaokakaren 于 2015-12-15 11:21 编辑

    1、我是新手,按2%的风险开仓个代码写不了,只能用一个资金的2%代替。思路是这样:第一单总资金的2%做为亏损金额,用它来考量开仓的手数。第二单在第一单没有平仓的时候再次开仓的手数就是资金-第一单止损的金额。举例:我总资金是100000的话,第一单的开仓手数=(100000*0.02)/(止损点数*一跳的价格),这个时候如果第一单没平,再开第二单的话手数=【(100000-第一单如果止损的金额)*0.02】/(止损点数*一跳的价格)。这个我在论坛上没找到相似的例子。所以也不知道应该怎么写。有老师能指点一下最好了。
    2、1:2的盈亏比的代码如下,感觉很多问题,我也不知道是那个地方。
    Params
            Numeric FastLength(5);
            Numeric SlowLength(20);
    Vars
            NumericSeries AvgValue1;
            NumericSeries AvgValue2;
           
            Numeric minpoint;       //最小变动单位,也就是一跳
            Numeric myentryprice;   //我的开仓价格
        Numeric StopLossSet;    // 止损设置(多头)
            Numeric StopLossSet1;    // 止损设置(空头)
        Numeric MyExitPrice;        // 平仓价格
        NumericSeries HighestAfterEntry;        // 开仓后出现的最高价
        NumericSeries LowestAfterEntry;         // 开仓后出现的最低价
            Numeric lots;           //开仓手数
            Numeric mycapital(1000000);   //我的资金
    Begin
            AvgValue1 = AverageFC(Close,FastLength);
            AvgValue2 = AverageFC(Close,SlowLength);

            PlotNumeric("MA1",AvgValue1);
            PlotNumeric("MA2",AvgValue2);               
            //PlotNumeric("PL",Portfolio_TotalProfit);

            // 集合竞价和小节休息过滤
            If(!CallAuctionFilter()) Return;

        minpoint=MinMove*PriceScale;//=当前公式应用商品的最小变动量*当前公式应用商品的计数单位
            StopLossSet=open-Low[1]+300;   //止损点数
            StopLossSet1=High[1]-Open+300;   //止损点数
           
            If(MarketPosition <>1 && AvgValue1[1] > AvgValue2[1])
             {
               lots=mycapital*0.02 / StopLossSet*minpoint;//开仓手数=总资金的2%/止损金额
               Buy(lots,Open);
              }
            If(MarketPosition <>-1 && AvgValue1[1] < AvgValue2[1])
              {
               lots=mycapital*0.02 / StopLossSet1*minpoint;//开仓手数=总资金的2%/止损金额
               SellShort(lots,Open);
              }

            If(BarsSinceEntry==0)//如果此K线是开仓的K线
              {
                HighestAfterEntry = Close;//开仓后的最高价=收盘价
            LowestAfterEntry = Close;//开仓后的最低价=收盘价
                    If(MarketPosition<>0)   //当前持仓状态不等于0
                    {
                      HighestAfterEntry = Max(HighestAfterEntry,EntryPrice);   // 开仓的Bar,将开仓价和当时的收盘价的较大值保留到HighestAfterEntry
                      LowestAfterEntry = Min(LowestAfterEntry,EntryPrice);     // 开仓的Bar,将开仓价和当时的收盘价的较小值保留到LowestAfterEntry
                     }
               }Else
                {
                      HighestAfterEntry = Max(HighestAfterEntry,High); // 记录下当前Bar的最高点,用于下一个Bar的跟踪止损判断
                      LowestAfterEntry = Min(LowestAfterEntry,Low);    // 记录下当前Bar的最低点,用于下一个Bar的跟踪止损判断
                     }
             
             Commentary("HighestAfterEntry="+Text(HighestAfterEntry));//在超级图表当前K线添加一行注释信号
         Commentary("LowestAfterEntry="+Text(LowestAfterEntry));
             
             myentryprice=EntryPrice;//我的开仓价格是当前持仓的第一个建仓价格。AvgEntryPrice(当前持仓的平均建仓价格),LastEntryPrice(当前持仓的最后一个建仓价格)
             
             If(MarketPosition==1)//有多仓的情况
             {
               If(HighestAfterEntry[1]>=myentryprice+StopLossSet*2*minpoint Or Open<=myentryprice-StopLossSet*minpoint)
                 {
                       Sell(0,Open);
                      }
              }
             
             If(MarketPosition==-1)//有空仓的情况
             {
               If(LowestAfterEntry[1]<=myentryprice-StopLossSet1*2*minpoint Or Open>=myentryprice+StopLossSet1*minpoint)
                 {
                       BuyToCover(0,Open);
                      }
              }
    End

    3、请各位老师帮忙看看

     

  • TB技术人员: 后面的注释老师们可以不用看,好多是复制的

     

  • TB客服:
    xiaokakaren 发表于 2015-12-15 11:07
    后面的注释老师们可以不用看,好多是复制的

    你表达的不太清楚,所以需要你再确认你的需求。我的理解是,你想做到两点:1、每次开仓按照权益的2%为亏损额度来计算下单手数。如果是反手就把权益先扣除2%。2、止损止盈做到,盈亏比是2:1

    把你的需求放在一边,你的代码中存在一些语法问题。
    1、你没有止损的代码。
    2、你对变量类型numeric 和numericseries的错用。numeric换一根BAR,就恢复为初始值。numericseries则可以记录下来,后续的BAR都可以使用。比如你代码中的myentryprice,应该用numericseries类型。
    其他变量,你都要根据你的需求来选择合适的变量类型。

     

  • 网友回复:
    tbheyihao 发表于 2015-12-15 12:31
    你表达的不太清楚,所以需要你再确认你的需求。我的理解是,你想做到两点:1、每次开仓按照权益的2%为亏 ...

    老师的理解是对的,1、每次开仓按照权益的2%为亏损额度来计算下单手数。如果是反手(这里也可以是加仓)就把权益先扣除2%。2、止损止盈做到,盈亏比是2:1。

    另外,我止损放在条件语句中不行吗?
             If(MarketPosition==1)//有多仓的情况
             {
               If(HighestAfterEntry[1]>=myentryprice+StopLossSet*2*minpoint Or Open<=myentryprice-StopLossSet*minpoint)
                 {
                       Sell(0,Open);
                      }
              }
    这里的Open<=myentryprice-StopLossSet*minpoint也就是说的止损。我不大清楚TB语言里 或者 是不是用OR来表示。
    myentryprice这个变量我是参考止损止盈的模板设置了,我改改看看

     

  • 网友回复:
    xiaokakaren 发表于 2015-12-15 13:53
    老师的理解是对的,1、每次开仓按照权益的2%为亏损额度来计算下单手数。如果是反手(这里也可以是加仓) ...

    不好意思,没看到那个或的条件。止损可以放在那里的。
    1、每次开仓按照权益的2%,反手或者加仓先把权益扣除2%。
    这个实现关键在于你要把权益给统计出来。你可以用一个序列变量来记录权益。每当平仓时自动统计平仓盈亏。
    你的开仓价、平仓价、开仓手数已经是有变量的。手续费可以自己设定。
            Numeric feerate;                                                //手续费比例
            Numeric fee;                                                //手续费
            Numeric traderesult(0);                                //单次交易盈亏
            NumericSeries voidequity(100000);                //资金权益

                    fee=2*myentryprice*ContractUnit*BigPointValue*feerate;
                    traderesult=(myentryprice-open)*ContractUnit*BigPointValue-fee;
                    voidequity=voidequity+traderesult;

    2、止损止盈的的触发价格,可以采用high/low这样的,更及时。
    你使用highestafterentry[1]来止盈,使用open来止损,也可以,做的会滞后一点。
    不过你的myentryprice要改成序列变量。


 

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

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


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

相关文章

    没有相关内容