是不
回测的时候只在第一个止损位置出场,后面给你出场信号出现了都没有,只在第一个止损位置出场
建议贴代码,不是发截图。如果想给你复现一下问题还要自己重新输入一遍,那不是很浪费时间吗
Params Numeric nEntries(3); // 最大建仓次数 Numeric RiskRatio(1); // % Risk Per N ( 0 - 100) Numeric yha(2); // Numeric yhb(20); // Numeric yhc(21); // Numeric yhd(42); // Numeric bla(1); // Numeric blb(2); // Numeric blc(3); // Numeric bld(13); Numeric teLength(10); // Vars Numeric MinPoint; // 最小变动单位 Series<Numeric> AvgTR; // ATR Numeric N; // N 值 Numeric TotalEquity; // 按最新收盘价计算出的总资产 Numeric TurtleUnits; // 交易单位 Series<Numeric> YA; // Series<Numeric> YB; // Series<Numeric>BA ; // Series<Numeric>BB; Series<Numeric>BC; // Series<Numeric>BD; Series<Numeric>BE; Series<Numeric>BF; Series<Numeric>BG; Series<Numeric> DonchianLo; // 唐奇安通道下轨,延后1个Bar Numeric BE1; Numeric BE2; Series<Numeric>RHbar; Series<Numeric>Hbar; Series<Numeric>ls1; Series<Numeric>A1; Series<Numeric>A2; Series<Numeric>A3; Series<Numeric>A4; Series<Numeric>ls2; Numeric ls3; Numeric rc; Series<Numeric>ls4; Series<Numeric>ls5; Numeric ls6; Array<Array<String>> rvalue; Numeric ls; 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,yhb); N = AvgTR[1]; TotalEquity = Portfolio_CurrentCapital() + Portfolio_UsedMargin(); TurtleUnits = (TotalEquity*RiskRatio/100) /(N * ContractUnit()*BigPointValue()); TurtleUnits = IntPart(TurtleUnits); // 对小数取整 // 当不使用过滤条件,或者使用过滤条件并且条件为PreBreakoutFailure为True进行后续操作*/ DonchianLo = LowestFC(Low[1],teLength); PlotNumeric("10日最低",DonchianLo); YA=XAverage(CLOSE,yha); YB=XAverage(((LinearRegSlope(close,yhc)*yhb)+close),yhd); BA=(blb*CLOSE+HIGH+LOW)/blc; BB=XAverage(BA,blc); BC=XAverage(BB,blc); BD=XAverage(BC,blc); BE=(BD-BD[1])/BD[1]*100; BF=Average(BE,bla); BG=Average(BE,blb); ReadCSVFile("e://ls.csv", rvalue); ls=IIF((rvalue[0][0] == "1" and rvalue[0][1] == "1") ,1,0); bool cond1 = (CrossOver(BF[1],BG[1]) and be[1]<0); bool cond2 = CrossUnder(BF[1],BG[1]); Integer barOffset = nthcon(cond1,1); Commentary("barOffset="+Text(barOffset)); bool cond3 = (CrossUnder(BF[1],BG[1]) and be[1]>0); bool cond4 = CrossOver(BF[1],BG[1]); Integer barOffset1 = nthcon(cond3,1); Commentary("barOffset1="+Text(barOffset1));
if(barOffset==0) { A1=BE[1]; } Commentary("A1="+text(A1)); if(cond1) { ls1=1; ls2=0; } Commentary("ls1="+text(ls1)); if(cond2) { ls2=1; } Commentary("ls2="+text(ls2)); ls3=(ls1[1]+ls2[1])-(ls1+ls2); Commentary("ls3="+text(ls3)); if(barOffset1==0) { A3=BE[1]; } Commentary("A3="+text(A3)); if(cond3) { ls4=1; ls5=0; } Commentary("ls4="+text(ls4)); if(cond4) { ls5=1; } Commentary("ls5="+text(ls5)); ls6=(ls4[1]+ls5[1])-(ls4+ls5); Commentary("ls6="+text(ls6)); Commentary("ls="+text(ls)); Commentary("YA = " + Text(YA)); Commentary("YB = " + Text(YB)); Commentary("BE = " + Text(BE)); Commentary("N="+Text(N)); Commentary("preEntryPrice="+Text(preEntryPrice)); Commentary("快="+Text(BF)); Commentary("慢="+Text(BG)); range[1:1] { DonchianLo = LowestFC(Low[1],teLength); PlotNumeric("10日最低",DonchianLo); } range[2:2] { BA=(blb*CLOSE+HIGH+LOW)/blc; BB=XAverage(BA,blc); BC=XAverage(BB,blc); BD=XAverage(BC,blc); BE=(BD-BD[1])/BD[1]*100; BF=Average(BE,bla); BG=Average(BE,blb); Commentary("快="+Text(BF)); Commentary("慢="+Text(BG)); } If(MarketPosition == 0)//&&ls==1) { // 突破开仓 If(ls3==1 and A1>A1[1] &&TurtleUnits >= 1 ) { // 开仓价格取突破上轨+一个价位和最高价之间的较小值,这样能更接近真实情况,并能尽量保证成交&& data2.BF[1]>data2.bg[1] rc=close[1]; if(rc>data1.DonchianLo && open>data1.DonchianLo) {myEntryPrice =rc; myEntryPrice = IIF(myEntryPrice < Open, Open,myEntryPrice); // 大跳空的时候用开盘价代替 preEntryPrice = myEntryPrice; Buy(TurtleUnits,myEntryPrice); SendOrderThisBar = True; Commentary("preEntryPrice="+Text(preEntryPrice)); } } } If(MarketPosition == 1) // 有多仓的情况 { If(LOW<Data1.DonchianLo) //底仓止损点 { myExitPrice = max(Low, Data1.DonchianLo- MinPoint); myExitPrice = IIF(myExitPrice > Open, Open,myExitPrice); // 大跳空的时候用开盘价代替 Sell(0,myExitPrice); // 数量用0的情况下将全部平仓 Commentary("myExitPrice="+Text(myExitPrice)); }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(ls6==1 and A2<A2[1]) //出场信号 { myExitPrice = CLOSE[1]; myExitPrice = IIF(myExitPrice > Open, Open,myExitPrice); // 大跳空的时候用开盘价代替 Sell(0,myExitPrice); // 数量用0的情况下将全部平仓 Commentary("myExitPrice="+Text(myExitPrice)); } } Commentary("CurrentEntries = " + Text(CurrentEntries)); }
你的问题是什么,如果是不开仓,你就把你的开仓信号全都诊断一下,看看哪个写错了
下面出场信号写错了,已经好了,谢谢
回测的时候只在第一个止损位置出场,后面给你出场信号出现了都没有,只在第一个止损位置出场
建议贴代码,不是发截图。如果想给你复现一下问题还要自己重新输入一遍,那不是很浪费时间吗
Params
Numeric nEntries(3); // 最大建仓次数
Numeric RiskRatio(1); // % Risk Per N ( 0 - 100)
Numeric yha(2); //
Numeric yhb(20); //
Numeric yhc(21); //
Numeric yhd(42); //
Numeric bla(1); //
Numeric blb(2); //
Numeric blc(3); //
Numeric bld(13);
Numeric teLength(10); //
Vars
Numeric MinPoint; // 最小变动单位
Series<Numeric> AvgTR; // ATR
Numeric N; // N 值
Numeric TotalEquity; // 按最新收盘价计算出的总资产
Numeric TurtleUnits; // 交易单位
Series<Numeric> YA; //
Series<Numeric> YB; //
Series<Numeric>BA ; //
Series<Numeric>BB;
Series<Numeric>BC; //
Series<Numeric>BD;
Series<Numeric>BE;
Series<Numeric>BF;
Series<Numeric>BG;
Series<Numeric> DonchianLo; // 唐奇安通道下轨,延后1个Bar
Numeric BE1;
Numeric BE2;
Series<Numeric>RHbar;
Series<Numeric>Hbar;
Series<Numeric>ls1;
Series<Numeric>A1;
Series<Numeric>A2;
Series<Numeric>A3;
Series<Numeric>A4;
Series<Numeric>ls2;
Numeric ls3;
Numeric rc;
Series<Numeric>ls4;
Series<Numeric>ls5;
Numeric ls6;
Array<Array<String>> rvalue;
Numeric ls;
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,yhb);
N = AvgTR[1];
TotalEquity = Portfolio_CurrentCapital() + Portfolio_UsedMargin();
TurtleUnits = (TotalEquity*RiskRatio/100) /(N * ContractUnit()*BigPointValue());
TurtleUnits = IntPart(TurtleUnits); // 对小数取整
// 当不使用过滤条件,或者使用过滤条件并且条件为PreBreakoutFailure为True进行后续操作*/
DonchianLo = LowestFC(Low[1],teLength);
PlotNumeric("10日最低",DonchianLo);
YA=XAverage(CLOSE,yha);
YB=XAverage(((LinearRegSlope(close,yhc)*yhb)+close),yhd);
BA=(blb*CLOSE+HIGH+LOW)/blc;
BB=XAverage(BA,blc);
BC=XAverage(BB,blc);
BD=XAverage(BC,blc);
BE=(BD-BD[1])/BD[1]*100;
BF=Average(BE,bla);
BG=Average(BE,blb);
ReadCSVFile("e://ls.csv", rvalue);
ls=IIF((rvalue[0][0] == "1" and rvalue[0][1] == "1") ,1,0);
bool cond1 = (CrossOver(BF[1],BG[1]) and be[1]<0);
bool cond2 = CrossUnder(BF[1],BG[1]);
Integer barOffset = nthcon(cond1,1);
Commentary("barOffset="+Text(barOffset));
bool cond3 = (CrossUnder(BF[1],BG[1]) and be[1]>0);
bool cond4 = CrossOver(BF[1],BG[1]);
Integer barOffset1 = nthcon(cond3,1);
Commentary("barOffset1="+Text(barOffset1));
if(barOffset==0)
{
A1=BE[1];
}
Commentary("A1="+text(A1));
if(cond1)
{
ls1=1;
ls2=0;
}
Commentary("ls1="+text(ls1));
if(cond2)
{
ls2=1;
}
Commentary("ls2="+text(ls2));
ls3=(ls1[1]+ls2[1])-(ls1+ls2);
Commentary("ls3="+text(ls3));
if(barOffset1==0)
{
A3=BE[1];
}
Commentary("A3="+text(A3));
if(cond3)
{
ls4=1;
ls5=0;
}
Commentary("ls4="+text(ls4));
if(cond4)
{
ls5=1;
}
Commentary("ls5="+text(ls5));
ls6=(ls4[1]+ls5[1])-(ls4+ls5);
Commentary("ls6="+text(ls6));
Commentary("ls="+text(ls));
Commentary("YA = " + Text(YA));
Commentary("YB = " + Text(YB));
Commentary("BE = " + Text(BE));
Commentary("N="+Text(N));
Commentary("preEntryPrice="+Text(preEntryPrice));
Commentary("快="+Text(BF));
Commentary("慢="+Text(BG));
range[1:1]
{
DonchianLo = LowestFC(Low[1],teLength);
PlotNumeric("10日最低",DonchianLo);
}
range[2:2]
{
BA=(blb*CLOSE+HIGH+LOW)/blc;
BB=XAverage(BA,blc);
BC=XAverage(BB,blc);
BD=XAverage(BC,blc);
BE=(BD-BD[1])/BD[1]*100;
BF=Average(BE,bla);
BG=Average(BE,blb);
Commentary("快="+Text(BF));
Commentary("慢="+Text(BG));
}
If(MarketPosition == 0)//&&ls==1)
{
// 突破开仓
If(ls3==1 and A1>A1[1] &&TurtleUnits >= 1 )
{
// 开仓价格取突破上轨+一个价位和最高价之间的较小值,这样能更接近真实情况,并能尽量保证成交&& data2.BF[1]>data2.bg[1]
rc=close[1];
if(rc>data1.DonchianLo && open>data1.DonchianLo)
{myEntryPrice =rc;
myEntryPrice = IIF(myEntryPrice < Open, Open,myEntryPrice); // 大跳空的时候用开盘价代替
preEntryPrice = myEntryPrice;
Buy(TurtleUnits,myEntryPrice);
SendOrderThisBar = True;
Commentary("preEntryPrice="+Text(preEntryPrice));
}
}
}
If(MarketPosition == 1) // 有多仓的情况
{
If(LOW<Data1.DonchianLo) //底仓止损点
{
myExitPrice = max(Low, Data1.DonchianLo- MinPoint);
myExitPrice = IIF(myExitPrice > Open, Open,myExitPrice); // 大跳空的时候用开盘价代替
Sell(0,myExitPrice); // 数量用0的情况下将全部平仓
Commentary("myExitPrice="+Text(myExitPrice));
}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(ls6==1 and A2<A2[1]) //出场信号
{
myExitPrice = CLOSE[1];
myExitPrice = IIF(myExitPrice > Open, Open,myExitPrice); // 大跳空的时候用开盘价代替
Sell(0,myExitPrice); // 数量用0的情况下将全部平仓
Commentary("myExitPrice="+Text(myExitPrice));
}
}
Commentary("CurrentEntries = " + Text(CurrentEntries));
}
你的问题是什么,如果是不开仓,你就把你的开仓信号全都诊断一下,看看哪个写错了
下面出场信号写错了,已经好了,谢谢