是不
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));
}
你的问题是什么,如果是不开仓,你就把你的开仓信号全都诊断一下,看看哪个写错了
下面出场信号写错了,已经好了,谢谢
建议贴代码,不是发截图。如果想给你复现一下问题还要自己重新输入一遍,那不是很浪费时间吗
回测的时候只在第一个止损位置出场,后面给你出场信号出现了都没有,只在第一个止损位置出场