按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 进行 有偿 编写!(不贵!点击查看价格!)
相关文章
-
没有相关内容