初学TB问的问题比较初级,请工程师耐心解答,非常感谢
问题如下:
//------------------------------------------------------------------------
// 简称: TurtleTrader
// 名称: 海龟交易系统
// 类别: 公式应用
// 类型: 内建应用
//------------------------------------------------------------------------
Params
Numeric nEntries(3);
Numeric RiskRatio(1);
Numeric ATRLength(20);
Numeric boLength(20);
Numeric fsLength(55);
Numeric teLength(10);
Bool LastProfitableTradeFilter(True); //这个是定义LastProfitableTradeFilter为true的意思?还是不太明白咋用,在整个公式中的作用?
Vars
Numeric MinPoint;
Series<Numeric> AvgTR;
Numeric N;
Numeric TotalEquity;
Numeric TurtleUnits;
Series<Numeric> DonchianHi;
Series<Numeric> DonchianLo;
Series<Numeric> fsDonchianHi;
Series<Numeric> fsDonchianLo;
Numeric ExitHighestPrice;
Numeric ExitLowestPrice; // Series<Numeric> fsDonchianLo 要定义在series内, ExitLowestPrice为啥不用?不都是20 50 10 高低点
Numeric myEntryPrice;
Numeric myExitPrice;
Bool SendOrderThisBar(False);
Series<Numeric> preEntryPrice(0);
Series<Bool> PreBreakoutFailure(false); //还是对bool布尔型不太理解,这一句在这个公式的什么作用?
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);
DonchianHi = HighestFC(High[1],boLength);
DonchianLo = LowestFC(Low[1],boLength);
fsDonchianHi = HighestFC(High[1],fsLength);
fsDonchianLo = LowestFC(Low[1],fsLength);
ExitLowestPrice = LowestFC(Low[1],teLength);
ExitHighestPrice = HighestFC(High[1],teLength);
Commentary("N="+Text(N));
Commentary("preEntryPrice="+Text(preEntryPrice));
Commentary("PreBreakoutFailure="+IIFString(PreBreakoutFailure,"True","False"));//字符串是啥意思?这三句啥意思?
// 当不使用过滤条件,或者使用过滤条件并且条件为PreBreakoutFailure为True进行后续操作
If(MarketPosition == 0 && ((!LastProfitableTradeFilter) Or (PreBreakoutFailure)))//这一句啥意思?还有那个写法(!LastProfitableTradeFilter)括号里加个!?
{ // 这应该是个前提条件
// 突破开仓
If(High > DonchianHi && TurtleUnits >= 1)
{
myEntryPrice = min(high,DonchianHi + MinPoint);//为啥要他们两个值的最小值?high突破DonchianHi + MinPoint开仓,开仓价不就是DonchianHi + MinPoint
myEntryPrice = IIF(myEntryPrice < Open, Open,myEntryPrice);
preEntryPrice = myEntryPrice;
Buy(TurtleUnits,myEntryPrice);
SendOrderThisBar = True;
PreBreakoutFailure = False;
}
If(Low < DonchianLo && TurtleUnits >= 1)
{
myEntryPrice = max(low,DonchianLo - MinPoint);
myEntryPrice = IIF(myEntryPrice > Open, Open,myEntryPrice);
preEntryPrice = myEntryPrice;
SendOrderThisBar = True;
SellShort(TurtleUnits,myEntryPrice);
SendOrderThisBar = True;
PreBreakoutFailure = False;
}
}
If(MarketPosition == 0)
{
Commentary("fsDonchianHi="+Text(fsDonchianHi));
If(High > fsDonchianHi && TurtleUnits >= 1)
{
myEntryPrice = min(high,fsDonchianHi + MinPoint);
myEntryPrice = IIF(myEntryPrice < Open, Open,myEntryPrice);
preEntryPrice = myEntryPrice;
Buy(TurtleUnits,myEntryPrice);
SendOrderThisBar = True;
PreBreakoutFailure = False;
}
Commentary("fsDonchianLo="+Text(fsDonchianLo));
If(Low < fsDonchianLo && TurtleUnits >= 1)
{
myEntryPrice = max(low,fsDonchianLo - MinPoint);
myEntryPrice = IIF(myEntryPrice > Open, Open,myEntryPrice); /
preEntryPrice = myEntryPrice;
SellShort(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);
}Else
{
If(preEntryPrice!=InvalidNumeric && TurtleUnits >= 1)
{
If(Open >= preEntryPrice + 0.5*N && CurrentEntries < nEntries)
{
myEntryPrice = Open;
preEntryPrice = myEntryPrice;
Buy(TurtleUnits,myEntryPrice);
SendOrderThisBar = True;
}
while(High >= preEntryPrice + 0.5*N && CurrentEntries < nEntries) //while是同时执行的意思?
{
myEntryPrice = preEntryPrice + 0.5 * N;
preEntryPrice = myEntryPrice;
if(False == Buy(TurtleUnits,myEntryPrice))//这个IF语句啥意思?
{
break; //这个break啥意思?
}
SendOrderThisBar = True;
}
}
// 止损指令
If(Low <= preEntryPrice - 2 * N && SendOrderThisBar == false) //SendOrderThisBar == false为啥当前bar有交易不止损?
{ // 如果刚开仓或者加仓就反向2ATR也应该止损呀
myExitPrice = preEntryPrice - 2 * N;
myExitPrice = IIF(myExitPrice > Open, Open,myExitPrice);
Sell(0,myExitPrice);
PreBreakoutFailure = True;
}
}
}Else If(MarketPosition ==-1)
{
// 求出持空仓时离市的条件比较值
Commentary("ExitHighestPrice="+Text(ExitHighestPrice));
If(High > ExitHighestPrice)
{
myExitPrice = Min(High,ExitHighestPrice + MinPoint);
myExitPrice = IIF(myExitPrice < Open, Open,myExitPrice);
BuyToCover(0,myExitPrice);
}Else
{
If(preEntryPrice!=InvalidNumeric && TurtleUnits >= 1)
{
If(Open <= preEntryPrice - 0.5*N && CurrentEntries < nEntries)
{
myEntryPrice = Open;
preEntryPrice = myEntryPrice;
SellShort(TurtleUnits,myEntryPrice);
SendOrderThisBar = True;
}
while(Low <= preEntryPrice - 0.5*N && CurrentEntries < nEntries)
{
myEntryPrice = preEntryPrice - 0.5 * N;
preEntryPrice = myEntryPrice;
if(False == SellShort(TurtleUnits,myEntryPrice))
{
break;
}
SendOrderThisBar = True;
}
}
// 止损指令
If(High >= preEntryPrice + 2 * N &&SendOrderThisBar==false)
{
myExitPrice = preEntryPrice + 2 * N;
myExitPrice = IIF(myExitPrice < Open, Open,myExitPrice);
BuyToCover(0,myExitPrice);
PreBreakoutFailure = True;
}
}
}
Commentary("CurrentEntries = " + Text(CurrentEntries));
}
//------------------------------------------------------------------------
// 编译版本 GS2010.12.08
// 版权所有 TradeBlazer Software 2003-2025
// 更改声明 TradeBlazer Software保留对TradeBlazer平
// 台每一版本的TradeBlazer公式修改和重写的权利
//------------------------------------------------------------------------
为啥当前bar有交易不止损?
图表交易一般默认当根BAR不止损 ,因为K线当根内是无法判断先后的
if(False == Buy(TurtleUnits,myEntryPrice))//这个IF语句啥意思?
如果买失败了 返回了false就要break掉这个while,跳出循环
myEntryPrice = min(high,DonchianHi + MinPoint);//为啥要他们两个值的最小值?high突破DonchianHi + MinPoint开仓,开仓价不就是DonchianHi + MinPoint
这种多用于跳空时做判断,取一个更实际的值
序列变量和布尔型等等基础问题 在帮助文档里搜索
LastProfitableTradeFilter 是一个开关 决定是不是启动PreBreakoutFailure
PreBreakoutFailure是突破失败时候的一种处理