求问为什么riskratio=4就不出信号,是不是写的关于计算头寸的代码有问题
Params
Numeric FastLength(5);// 短期指数平均线参数
Numeric SlowLength(20);// 长期指数平均线参数
Numeric nEntries(3); // 最大建仓次数
Numeric RiskRatio(0.5); // % Risk Per N ( 0 - 100)
Numeric ATRLength(20); // 平均波动周期 ATR Length
Numeric fskcglxs(2); // 长期开仓过滤系数
Numeric kcglxs(2); // 开仓过滤系数
Numeric teLength(10); // 离市周期 Trailing Exit Length
Numeric jcxs(1);
Numeric zsxs(2);
Numeric zyxs(0);
Bool LastProfitableTradeFilter(True); // 使用入市过滤条件
Vars
Series<Numeric> AvgValue1;
Series<Numeric> AvgValue2;
Numeric MinPoint; // 最小变动单位
Series<Numeric> AvgTR; // ATR
Numeric N; // N 值
Numeric TotalEquity; // 按最新收盘价计算出的总资产
Numeric TurtleUnits; // 交易单位
Series<Numeric> fsHighestPrice; // 长期包络通道上轨,延后1个Bar
Series<Numeric> fsLowestPrice; // 长期包络安通道下轨,延后1个Bar
Series<Numeric> HighestPrice; // 包络通道上轨,延后1个Bar,长周期
Series<Numeric> LowestPrice; // 包络通道下轨,延后1个Bar,长周期
Numeric ExitHighestPrice; // 离市时判断需要的N周期最高价
Numeric ExitLowestPrice; // 离市时判断需要的N周期最低价
Numeric myEntryPrice; // 开仓价格
Numeric myExitPrice; // 平仓价格
Bool SendOrderThisBar(False); // 当前Bar有过交易
Series<Numeric> preEntryPrice(0); // 前一次开仓的价格
Series<Bool> PreBreakoutFailure(false); // 前一次突破是否失败
Range[0:DataCount-1]
{
If(BarStatus == 0)
{
preEntryPrice = InvalidNumeric;
PreBreakoutFailure = false;
}
MinPoint = MinMove*PriceScale;
AvgTR = XAverage(TrueRange,ATRLength);
N = AvgTR[1];
TotalEquity = Portfolio_CurrentCapital() + Portfolio_UsedMargin();
TurtleUnits = (TotalEquity*RiskRatio/100) /(N * ContractUnit()*BigPointValue());
TurtleUnits = IntPart(TurtleUnits); // 对小数取整
AvgValue1 = AverageFC(Close,FastLength);
AvgValue2 = AverageFC(Close,SlowLength);
HighestPrice =AvgValue2[1]+kcglxs*N ;
LowestPrice = AvgValue2[1]-kcglxs*N;
fsHighestPrice =AvgValue2[1]+fskcglxs*N;
fsLowestPrice = AvgValue2[1]-fskcglxs*N;
ExitLowestPrice = AvgValue2[1]-zyxs*N;
ExitHighestPrice = AvgValue2[1]+zyxs*N;
PlotNumeric("MA1",AvgValue1);
PlotNumeric("MA2",AvgValue2);
PlotNumeric("HighestPrice",HighestPrice);
PlotNumeric("LowestPrice",LowestPrice);
PlotNumeric("fsHighestPrice",fsHighestPrice);
PlotNumeric("fsLowestPrice",HighestPrice);
Commentary("N="+Text(N));
Commentary("preEntryPrice="+Text(preEntryPrice));
Commentary("PreBreakoutFailure="+IIFString(PreBreakoutFailure,"True","False"));
// 当不使用过滤条件,或者使用过滤条件并且条件为PreBreakoutFailure为True进行后续操作
If(MarketPosition == 0 )
{
// 突破开仓
If( AvgValue1[1] > AvgValue2[1]&&close[1] > HighestPrice[1] && TurtleUnits >= 1)
{
// 开仓价格取突破上轨+一个价位和最高价之间的较小值,这样能更接近真实情况,并能尽量保证成交
myEntryPrice = open;
preEntryPrice = open;
Buy(TurtleUnits,myEntryPrice);
SendOrderThisBar = True;
PreBreakoutFailure = False;
}
}
If(MarketPosition == 1) // 有多仓的情况
{
Commentary("ExitLowestPrice="+Text(ExitLowestPrice));
If(Low < ExitLowestPrice)
{
myExitPrice = max(Low,ExitLowestPrice - MinPoint);
myExitPrice = IIF(myExitPrice > Open, Open,myExitPrice); // 大跳空的时候用开盘价代替
Sell(0,myExitPrice); // 数量用0的情况下将全部平仓
}Else
{
If(preEntryPrice!=InvalidNumeric && TurtleUnits >= 1)
{
If(Open >= preEntryPrice + jcxs*N && CurrentEntries < nEntries) // 如果开盘就超过设定的1/2N,则直接用开盘价增仓。
{
myEntryPrice = Open;
preEntryPrice = myEntryPrice;
Buy(TurtleUnits,myEntryPrice);
SendOrderThisBar = True;
}
while(High >= preEntryPrice + jcxs*N && CurrentEntries < nEntries) // 以最高价为标准,判断能进行几次增仓
{
myEntryPrice = preEntryPrice + jcxs * N;
preEntryPrice = myEntryPrice;
if(False == Buy(TurtleUnits,myEntryPrice))
{
break;
}
SendOrderThisBar = True;
}
}
// 止损指令
If(Low <= preEntryPrice - zsxs * N && SendOrderThisBar == false) // 加仓Bar不止损
{
myExitPrice = preEntryPrice - zsxs * N;
myExitPrice = IIF(myExitPrice > Open, Open,myExitPrice); // 大跳空的时候用开盘价代替
Sell(0,myExitPrice); // 数量用0的情况下将全部平仓
PreBreakoutFailure = True;
}
}
}
你这个代码复制了少东西
刚看见短了onbar ,老师调取资金是应该用这个吗,Portfolio_CurrentEquity(),还有没有更合适的数据
Portfolio_CurrentEquity()是图表上的当前权益
可以作为计算