程序跑了一下,开了这么多次的仓位,苦思一周解决不了,请帮忙修改一下,能按海龟法则开3次仓就太好了。谢谢老师!
//------------------------------------------------------------------------
// 简称: TurtleTrader
// 名称: 海龟交易系统
// 类别: 公式应用
// 类型: 内建应用
//------------------------------------------------------------------------
//------------------------------------------------------------------------
// 简称: BOLLQDQD
// 名称: BOLLQDQDBOLLQDQD
// 类别: 公式应用
// 类型: 用户应用
// 输出: Void
//------------------------------------------------------------------------
/*
策略说明:
基于布林通道的突破系统
系统要素:
1、基于收盘价计算而来的布林通道
2、基于收盘价计算而来的进场过滤器
3、自适应出场均线
入场条件:
1、满足过滤条件,并且价格上破布林通道上轨,开多单
2、满足过滤条件,并且价格下破布林通道下轨,开空单
出场条件:
1、持有多单时,自适应出场均线低于布林通道上轨,并且价格下破自适应出场均线,平多单
2、持有空单时,自适应出场均线高于布林通道下轨,并且价格上破自适应出场均线,平空单
*/
Params
Numeric nEntries(3); // 最大建仓次数
Numeric RiskRatio(1); // % Risk Per N ( 0 - 100)
Numeric ATRLength(20); // 平均波动周期 ATR Length
Numeric bollingerLengths(50); // 布林通道参数
Numeric Offset(1.25); // 布林通道参数
Numeric rocCalcLength(30); // 过滤器参数
Numeric liqLength(50); // 自适应出场均线参数
Bool LastProfitableTradeFilter(True); // 使用入市过滤条件
Vars
Numeric MinPoint; // 最小变动单位
Series<Numeric> AvgTR; // ATR
Numeric N; // N 值
Numeric TotalEquity; // 按最新收盘价计算出的总资产
Numeric TurtleUnits; // 交易单位
// 布林
Series<Numeric> MidLine(0); // 布林通道中轨
Numeric Band(0);
Series<Numeric> upBand(0); // 布林通道上轨
Series<Numeric> rocCalc(0); // 过滤器
Series<Numeric> liqDays(50); // 自适应出场均线的参数
Series<Numeric> liqPoint(0); // 自适应的出场均线
Numeric myEntryPrice; // 开仓价格
Numeric myExitPrice; // 平仓价格
Bool SendOrderThisBar(False); // 当前Bar有过交易
Series<Numeric> preEntryPrice(0); // 前一次开仓的价格
Series<Bool> PreBreakoutFailure(false); // 前一次突破是否失败
Events
OnBar(ArrayRef<Integer> indexs)
{
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); // 对小数取整
// 布林通道中轨
MidLine = AverageFC(Close,bollingerLengths);
Band = StandardDev(Close,bollingerLengths,2);
// 布林通道上轨
upBand = MidLine + Offset*Band;
// 画线
PlotNumeric(MidLine,MidLine);
PlotNumeric(upBand,upBand);
// 进场过滤器
rocCalc = Close - Close[rocCalcLength - 1];
Commentary(N=+Text(N));
Commentary(preEntryPrice=+Text(preEntryPrice));
Commentary(PreBreakoutFailure=+IIFString(PreBreakoutFailure,True,False));
// 当不使用过滤条件,或者使用过滤条件并且条件为PreBreakoutFailure为True进行后续操作
If(MarketPosition == 0 && ((!LastProfitableTradeFilter) Or (PreBreakoutFailure)))
// 自适应出场均线
{
liqDays = liqLength;
}
{
liqDays = liqDays - 1;
liqDays = Max(liqDays,10);
}
liqPoint = Average(Close,liqDays);
// 画线
PlotNumeric(liqPoint,liqPoint);
{
// 突破开仓
If(rocCalc[1] > 0 And High >= upBand[1] && TurtleUnits >= 1)
{
// 开仓价格取突破上轨+一个价位和最高价之间的较小值,这样能更接近真实情况,并能尽量保证成交
myEntryPrice = min(high,upBand[1] + MinPoint);
myEntryPrice = IIF(myEntryPrice < Open, Open,myEntryPrice); // 大跳空的时候用开盘价代替
preEntryPrice = myEntryPrice;
Buy(TurtleUnits,myEntryPrice);
SendOrderThisBar = True;
PreBreakoutFailure = False;
}
}
If(MarketPosition == 1) // 有多仓的情况
{
Commentary(ExitLowestPrice=+Text(upBand[1]));
If(liqPoint[1] < upBand[1] And Low <= liqPoint[1])
{
myExitPrice = max(Low,upBand[1] - MinPoint);
myExitPrice = IIF(myExitPrice > Open, Open,myExitPrice); // 大跳空的时候用开盘价代替
Sell(0,myExitPrice); // 数量用0的情况下将全部平仓
}Else
{
If(preEntryPrice!=InvalidNumeric && TurtleUnits >= 1)
{
If(Open >= preEntryPrice + 0.5*N && CurrentEntries < nEntries) // 如果开盘就超过设定的1/2N,则直接用开盘价增仓。
{
myEntryPrice = Open;
preEntryPrice = myEntryPrice;
Buy(TurtleUnits,myEntryPrice);
SendOrderThisBar = True;
}
while(High >= preEntryPrice + 0.5*N && CurrentEntries < nEntries) // 以最高价为标准,判断能进行几次增仓
{
myEntryPrice = preEntryPrice + 0.5 * N;
preEntryPrice = myEntryPrice;
if(False == Buy(TurtleUnits,myEntryPrice))
{
break;
}
SendOrderThisBar = True;
}
}
// 止损指令
If(Low <= preEntryPrice - 2 * N && SendOrderThisBar == false) // 加仓Bar不止损
{
myExitPrice = preEntryPrice - 2 * N;
myExitPrice = IIF(myExitPrice > Open, Open,myExitPrice); // 大跳空的时候用开盘价代替
Sell(0,myExitPrice); // 数量用0的情况下将全部平仓
PreBreakoutFailure = True;
}
}
}
}
//------------------------------------------------------------------------
// 编译版本 GS2010.12.08
// 版权所有 TradeBlazer Software 2003-2025
// 更改声明 TradeBlazer Software保留对TradeBlazer平
// 台每一版本的TradeBlazer公式修改和重写的权利
//------------------------------------------------------------------------
这代码没法看,问题也描述得很不清楚,没法回答