设为首页收藏本站

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

按2%的风险,1:2的盈亏比代码,总是不对,请老师帮忙看看 [复制链接]

Rank: 1

精华
0
UID
222437
积分
23
帖子
18
主题
5
阅读权限
10
注册时间
2015-11-3
最后登录
2016-1-5
跳转到指定楼层
1#
发表于 2015-12-15 11:06:13 |只看该作者 |倒序浏览
本帖最后由 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、请各位老师帮忙看看

Rank: 1

精华
0
UID
222437
积分
23
帖子
18
主题
5
阅读权限
10
注册时间
2015-11-3
最后登录
2016-1-5
2#
发表于 2015-12-15 11:07:37 |只看该作者
后面的注释老师们可以不用看,好多是复制的

使用道具 举报

期市新手

TB官方客服

Rank: 1

精华
0
UID
223934
积分
18
帖子
18
主题
0
阅读权限
10
注册时间
2015-11-26
最后登录
2016-5-12
3#
发表于 2015-12-15 12:31:24 |只看该作者
xiaokakaren 发表于 2015-12-15 11:07
后面的注释老师们可以不用看,好多是复制的

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

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

使用道具 举报

Rank: 1

精华
0
UID
222437
积分
23
帖子
18
主题
5
阅读权限
10
注册时间
2015-11-3
最后登录
2016-1-5
4#
发表于 2015-12-15 13:53:38 |只看该作者
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这个变量我是参考止损止盈的模板设置了,我改改看看

使用道具 举报

期市新手

TB官方客服

Rank: 1

精华
0
UID
223934
积分
18
帖子
18
主题
0
阅读权限
10
注册时间
2015-11-26
最后登录
2016-5-12
5#
发表于 2015-12-15 15:05:05 |只看该作者
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要改成序列变量。


使用道具 举报

Rank: 1

精华
0
UID
222437
积分
23
帖子
18
主题
5
阅读权限
10
注册时间
2015-11-3
最后登录
2016-1-5
6#
发表于 2015-12-15 16:16:36 |只看该作者
tbheyihao 发表于 2015-12-15 15:05
不好意思,没看到那个或的条件。止损可以放在那里的。
1、每次开仓按照权益的2%,反手或者加仓先把权益扣 ...

再麻烦老师一下!
这一段代码:
        StopLossSet=open-Low[1]+80;   //止损点数
        StopLossSet1=High[1]-Open+80;   //止损点数
        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);
          }
如果把stoplossset和stoplossset1放在if的括号里,所表达的点数是不是一样的。也就是这样写
        If(MarketPosition <>1 && AvgValue1[1] > AvgValue2[1])
         {
           StopLossSet=open-Low[1]+80;   //止损点数
           lots=mycapital*0.02 / StopLossSet*minpoint;//开仓手数=总资金的2%/止损金额
           Buy(lots,Open);
          }
        If(MarketPosition <>-1 && AvgValue1[1] < AvgValue2[1])
          {
           StopLossSet1=High[1]-Open+80;   //止损点数
            lots=mycapital*0.02 / StopLossSet1*minpoint;//开仓手数=总资金的2%/止损金额
           SellShort(lots,Open);
          }

如果表达的点数是不一样的,我想在平仓的时候读取开仓时的stoplossset和stoplossset1怎么办?
         If(MarketPosition==1)//有多仓的情况
         {
           If(Close>=myentryprice+StopLossSet*2*minpoint Or Close<=myentryprice-StopLossSet*minpoint)
             {
                   Sell(0,Close);
                  }
          }
         
         If(MarketPosition==-1)//有空仓的情况
         {
          If(Close<=myentryprice-StopLossSet1*2*minpoint Or Close>=myentryprice+StopLossSet1*minpoint)
             {
                   BuyToCover(0,Close);
                  }
          }
这段平仓的代码应该怎么办?

使用道具 举报

期市新手

TB官方客服

Rank: 1

精华
0
UID
223934
积分
18
帖子
18
主题
0
阅读权限
10
注册时间
2015-11-26
最后登录
2016-5-12
7#
发表于 2015-12-16 09:06:31 |只看该作者
xiaokakaren 发表于 2015-12-15 16:16
再麻烦老师一下!
这一段代码:
        StopLossSet=open-Low[1]+80;   //止损点数

你第二种写法可以满足你的要求。
应该放在IF里面计算,如果stoplossset和stoplossset1这两个变量,只用来记录开仓时的止损额度的话。
变量类型一定是numericseries。开仓时,计算一次,其余沿用前值。

使用道具 举报

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

bottom

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

GMT+8, 2024-5-12 09:44

Powered by Discuz! X2 LicensedChrome插件扩展

© 2011-2012 交易开拓者 Inc.

回顶部