把自带的海龟改为多图层
其中错误语句1 If(data[i].MarketPosition == 0 && ((!data[i].LastProfitableTradeFilter) Or (data[i].PreBreakoutFailure)))
语句2 data[i].Sell(data[i].0,data[i].myExitPrice); // 数量用0的情况下将全部平仓
第一句求给讲一下啊,第二句是全平的0好像得改一下
弄明白了。。。我把代码对错行了。。。。所以进不去循环
这是代码
OnBar(ArrayRef<Integer> indexs)
{
Range[0:datasourcesize()-1]
{
for i=0 To datasourcesize()-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); // 对小数取整
DonchianHi = HighestFC(High[1],boLength);
DonchianLo = LowestFC(Low[1],data[i].boLength);
fsDonchianHi = HighestFC(High[1],data.fsLength);
fsDonchianLo = LowestFC(Low[1],data.fsLength);
ExitLowestPrice = LowestFC(data.Low,data.teLength);
ExitHighestPrice = HighestFC(data.High,data.teLength);
Commentary("N="+Text(N));
Commentary("preEntryPrice="+Text(data.preEntryPrice));
Commentary("PreBreakoutFailure="+IIFString(data.PreBreakoutFailure,"True","False"));
// 当不使用过滤条件,或者使用过滤条件并且条件为PreBreakoutFailure为True进行后续操作
If(data[i].MarketPosition == 0 && ((!data[i].LastProfitableTradeFilter) Or (data[i].PreBreakoutFailure)))
{
// 突破开仓
If(data[i].High >Data[i]. DonchianHi && data[i].TurtleUnits >= 1)
{
// 开仓价格取突破上轨+一个价位和最高价之间的较小值,这样能更接近真实情况,并能尽量保证成交
data[i].myEntryPrice = min(data[i].high,data[i].DonchianHi + data[i].MinPoint);
data[i].myEntryPrice = IIF(data[i].myEntryPrice < data[i].Open, data[i].Open,data[i].myEntryPrice); // 大跳空的时候用开盘价代替
data[i].preEntryPrice = data[i].myEntryPrice;
data[i].Buy(TurtleUnits,data[i].myEntryPrice);
data[i].SendOrderThisBar = True;
data[i].PreBreakoutFailure = False;
}
If(data[i].Low < data[i].DonchianLo && data[i].TurtleUnits >= 1)
{
// 开仓价格取突破下轨-一个价位和最低价之间的较大值,这样能更接近真实情况,并能尽量保证成交
data[i].myEntryPrice = max(data[i].low,data[i].DonchianLo - data[i].MinPoint);
data[i].myEntryPrice = IIF(data[i].myEntryPrice >data[i]. Open,data[i]. Open,data[i].myEntryPrice); // 大跳空的时候用开盘价代替
data[i].preEntryPrice = data[i].myEntryPrice;
data[i].SellShort(data[i].TurtleUnits,data[i].myEntryPrice);
data[i].SendOrderThisBar = True;
data[i].PreBreakoutFailure = False;
}
}
// 长周期突破开仓 Failsafe Breakout point
If(data[i].MarketPosition == 0)
{
data[i].Commentary("data[i].fsDonchianHi="+Text(data[i].fsDonchianHi));
If(data[i].High > data[i].fsDonchianHi && data[i].TurtleUnits >= 1)
{
// 开仓价格取突破上轨+一个价位和最高价之间的较小值,这样能更接近真实情况,并能尽量保证成交
data[i].myEntryPrice = min(data[i].high,data[i].fsDonchianHi +data[i]. MinPoint);
data[i].myEntryPrice = IIF(data[i].myEntryPrice < data[i].Open, data[i].Open,data[i].myEntryPrice); // 大跳空的时候用开盘价代替
data[i].preEntryPrice = data[i].myEntryPrice;
data[i].Buy(data[i].TurtleUnits,data[i].myEntryPrice);
data[i].SendOrderThisBar = True;
data[i].PreBreakoutFailure = False;
}
data[i].Commentary("data[i].fsDonchianLo="+Text(data[i].fsDonchianLo));
If(data[i].Low <data[i]. fsDonchianLo && data[i].TurtleUnits >= 1)
{
// 开仓价格取突破下轨-一个价位和最低价之间的较大值,这样能更接近真实情况,并能尽量保证成交
data[i].myEntryPrice = max(data[i].low,data[i].fsDonchianLo - data[i].MinPoint);
data[i].myEntryPrice = IIF(data[i].myEntryPrice > data[i].Open,data[i].Open,data[i].myEntryPrice); // 大跳空的时候用开盘价代替
data[i].preEntryPrice = data[i].myEntryPrice;
data[i].SellShort(data[i].TurtleUnits,data[i].myEntryPrice);
data[i].SendOrderThisBar = True;
data[i].PreBreakoutFailure = False;
}
}
If(data[i].MarketPosition == 1) // 有多仓的情况
{
Commentary("data[i].ExitLowestPrice="+Text(data[i].ExitLowestPrice));
If(data[i].Low < data[i].ExitLowestPrice)
{
data[i].myExitPrice = max(data[i].Low,data[i].ExitLowestPrice - data[i].MinPoint);
data[i].myExitPrice = IIF(data[i].myExitPrice > data[i].Open, data[i].Open,data[i].myExitPrice); // 大跳空的时候用开盘价代替
data[i].Sell(data[i].0,data[i].myExitPrice); // 数量用0的情况下将全部平仓
}Else
{
If(data[i].preEntryPrice!=InvalidNumeric && data[i].TurtleUnits >= 1)
{
If(data[i].Open >= data[i].preEntryPrice + 0.5*data[i].N && data[i].CurrentEntries < data[i].nEntries) // 如果开盘就超过设定的1/2N,则直接用开盘价增仓。
{
data[i].myEntryPrice = data[i].Open;
data[i].preEntryPrice =data[i]. myEntryPrice;
data[i].Buy(data[i].TurtleUnits,data[i].myEntryPrice);
data[i].SendOrderThisBar = True;
}
while(data[i].High >= data[i].preEntryPrice + 0.5*data[i].N && data[i].CurrentEntries < data[i].nEntries) // 以最高价为标准,判断能进行几次增仓
{
data[i].myEntryPrice = data[i].preEntryPrice + 0.5 * data[i].N;
data[i].preEntryPrice = data[i].myEntryPrice;
if(False == data[i].Buy(data[i].TurtleUnits,data[i].myEntryPrice))
{
break;
}
data[i].SendOrderThisBar = True;
}
}
// 止损指令
If(data[i].Low <=data[i]. preEntryPrice - 1 * data[i].N && data[i].SendOrderThisBar == false) // 加仓Bar不止损
{
data[i].myExitPrice = data[i].preEntryPrice - 1 * N;
data[i].myExitPrice = IIF(data[i].myExitPrice > data[i].Open,data[i]. Open,data[i].myExitPrice); // 大跳空的时候用开盘价代替
data[i].Sell(data[i].0,data[i].myExitPrice); // 数量用0的情况下将全部平仓
data[i].PreBreakoutFailure = True;
}
}
}Else If(data[i].MarketPosition ==-1) // 有空仓的情况
{
// 求出持空仓时离市的条件比较值
Commentary("data[i].ExitHighestPrice="+Text(data[i].ExitHighestPrice));
If(data[i].High > data[i].ExitHighestPrice)
{
data[i].myExitPrice = Min(data[i].High,data[i].ExitHighestPrice + data[i].MinPoint);
data[i].myExitPrice = IIF(data[i].myExitPrice < data[i].Open, data[i].Open,data[i].myExitPrice); // 大跳空的时候用开盘价代替
data[i].BuyToCover(data[i].0,data[i].myExitPrice); // 数量用0的情况下将全部平仓
}Else
{
If(data[i].preEntryPrice!=InvalidNumeric && data[i].TurtleUnits >= 1)
{
If(data[i].Open <=data[i]. preEntryPrice - 0.5*data[i].N && data[i].CurrentEntries <data[i]. nEntries) // 如果开盘就超过设定的1/2N,则直接用开盘价增仓。
{
data[i].myEntryPrice = data[i].Open;
data[i].preEntryPrice = data[i].myEntryPrice;
data[i].SellShort(data[i].TurtleUnits,data[i].myEntryPrice);
data[i].SendOrderThisBar = True;
}
while(data[i].Low <=data[i]. preEntryPrice - 0.5*data[i].N && data[i].CurrentEntries < data[i].nEntries) // 以最低价为标准,判断能进行几次增仓
{
data[i].myEntryPrice = data[i].preEntryPrice - 0.5 * data[i].N;
data[i].preEntryPrice = data[i].myEntryPrice;
if(False == data[i].SellShort(data[i].TurtleUnits,data[i].myEntryPrice))
{
break;
}
data[i].SendOrderThisBar = True;
}
}
// 止损指令
If(data[i].High >= data[i].preEntryPrice + 1 *data[i]. N &&data[i].SendOrderThisBar==false) // 加仓Bar不止损
{
data[i].myExitPrice = data[i].preEntryPrice + 1 * data[i].N;
data[i].myExitPrice = IIF(data[i].myExitPrice <data[i].Open, data[i].Open,data[i].myExitPrice); // 大跳空的时候用开盘价代替
data[i].BuyToCover(data[i].0,data[i].myExitPrice); // 数量用0的情况下将全部平仓
data[i].PreBreakoutFailure = True;
}
]
}
}
Commentary("data[i].CurrentEntries = " + Text(data[i].CurrentEntries));
}
}
}
}
for i=0 To datasourcesize()-1位置改为在If(data[i].MarketPosition == 0 && ((!data[i].LastProfitableTradeFilter) Or (data[i].PreBreakoutFailure)))前面。另外问一下,多品种多图层交易不可以在本程序的前面加一个range[0:datasourcesize()-1]进行遍历吗,我以为是在range函数下所有语句所有层次都执行一遍