全部 智大领峰 TBQuant功能 TBL语言 TB开户 问答专区 高手圈 其他
已解决
TB策略开仓
2024-04-01 20:34

程序跑了一下,开了这么多次的仓位,苦思一周解决不了,请帮忙修改一下,能按海龟法则开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公式修改和重写的权利


//------------------------------------------------------------------------

kyover

这代码没法看,问题也描述得很不清楚,没法回答

2024-04-02 09:51
您未登录,请先 登录注册 后发表评论
顶部