- 精华
- 0
- 在线时间
- 9 小时
- UID
- 230921
- 积分
- 29
- 帖子
- 18
- 阅读权限
- 10
- 注册时间
- 2016-3-26
- 最后登录
- 2017-3-17
- 精华
- 0
- UID
- 230921
- 积分
- 29
- 帖子
- 18
- 主题
- 7
- 阅读权限
- 10
- 注册时间
- 2016-3-26
- 最后登录
- 2017-3-17
|
下面的程序能模拟交易,但是经常出现"下单之后讯号消失,可能会导致您持仓不匹配,请检查你的算法"之类的提示. 我找不出来哪里出错,还请高手帮忙修改一下.不胜感激,特此谢过!
//程序的意思很简单:开仓如果赚钱,上移止损后就加仓, 直到止盈为止. 开仓后如果亏损,若单个商品亏损达到2500或者所有商品总亏损达到9500就全部砍掉.是日内交易模型.由于尾盘清仓模块我是照抄的F1文档里的,所以本处先略去.请高手帮助检查错误之处!谢谢!
Params
Numeric TP(2); //止盈2%,若本值设为涨跌停板值,则表示当天不设止盈
Numeric BSx(10); //BS微调节器
Bool AllowedToAddLots(true); //允许加仓
Bool AllowedToBuy(True);
Bool AllowedToSell(True);
Vars
NumericSeries A;
Numeric UnitEquity(10000); //本策略本品种单位资金
Numeric UnitMargin;
Numeric Minpoint;
Numeric Lots;
Numeric myEntryPrice;
Numeric myExitPrice;
Numeric myExitPrice1;
Numeric myExitPrice2;
Bool EntryBuy;
Bool EntrySell;
Bool StopBuy;
Bool StopSell;
Numeric TurtleMA(60);
Numeric RiskRatio(1); //止损范围
Numeric ATR;
Numeric N;
Numeric n1(1);
NumericSeries HPAE; //HigherAfterEntry;开仓后出现的最高价
NumericSeries LPAE; //LowerAfterEntry; 开仓后出现的最低价
Numeric profit;
Begin
//初始化模块=============================================================
If(!CallAuctionFilter()||date<>date[1] && high==Low||CurrentTime<=0.0900 && High==Low) Return; // 集合竞价和小节休息过滤
//--------------------------------------------------------------------------------------------------
Minpoint=MinMove*PriceScale;
UnitMargin=ContractUnit*MarginRatio*Close;
lots=UnitEquity/UnitMargin;
Lots=Max(IntPart(lots/k),1); //取整数,最小值为1
//资金管理模块------------------------------------------------------------------------------
If(BarStatus==2)
{
If(ContractProfit/UnitMargin<=-2500) //每手亏损达到保证金的loss%或者亏损达到2500后强行平仓
//防止大亏
{
profit=PositionProfit;
Sell(0,Close);
BuyToCover(0,Close);
Commentary("资金管理 IS止损= "+Text(profit));
}
Else If(MarketPosition==1 && (Close-AvgEntryPrice)*CurrentContracts<=-2500)
{
Sell(0,Close);
Commentary("资金管理 IS止损");
}
Else If(MarketPosition==-1 && (AvgEntryPrice-Close)*CurrentContracts<=-2500)
{
BuyToCover(0,Close);
Commentary("资金管理 IS止损");
}
Else If(A_CurrentEquity-A_PreviousEquity<=-9500) //帐户总浮亏超过1万则全部砍仓
{
Sell(0,Close);
BuyToCover(0,Close);
Commentary("当日总浮亏超过1万,资金管理全部砍仓");
}
//正式策略模块,A引擎===============================================================================
A=OpenD(0)+(CloseD(1)-CloseD(2));
PlotNumeric("A",A);
//创新高且收阳线则作多,以免高开大阴线套牢
EntryBuy =C[1]>A[1] && H>H[1] && Close>Open;
EntrySell=C[1]<A[1] && L<L[1] && Close<Open;
//防止假突破,当盈利全部回吐,且被套同等程度时,不必等到趋势反转,直接 IS 砍掉
//防止假突破,分跳空和不跳空两种情况
StopBuy = (Close<2*H[1]-High) && Open<= H[1]||(Close<2*Open-High) && Open>H[1];
StopSell= (Close>2*L[1]-Low ) && Open>=L[1] ||(Close>2*Open-Low ) && Open<L[1];
//A引擎开仓和反手模块=========================================================
if(EntryBuy) //先平空,再做多,不加多
{
If(MarketPosition==-1)
{
BuyToCover(0,Max(Open,H[1]));
Commentary("空单平仓");
If(AllowedToBuy) //本节分开写的好处是为了防止在停板上禁止做多或做空功能后,原有仓单不会平仓
{
Buy(lots,Max(Open,H[1]));
Commentary("反手做多");
}
}
Else If(MarketPosition==0 && AllowedToBuy)
{
BuyToCover(0,Max(Open,H[1])); //确保信号消失时的空仓被平仓
//此处需要判断二次进场时不能追高
If(myExitPrice1==0)
Buy(lots,Max(Open,H[1])); //首次进场直接开仓做多
Else
If(Open<myExitPrice1) Buy(lots,Max(Open,H[1])); //在第一次顺利BS/TP之后,二次进场不愿意追高
Commentary("A引擎开仓做多");
}
Else If(MarketPosition==1 && AllowedToBuy)
{
lots=lots/(2^CurrentEntries); //金字塔式加仓
lots=Max(IntPart(lots),1);
//If(AllowedToAddLots) Buy(lots,Max(Open,H[1])));
//Commentary("A引擎加多");
}
}
if(EntrySell) //先平多,再做空,不加空
{
If(MarketPosition==1)
{
Sell(0,Min(Open,L[1]));
Commentary("多单平仓");
If(AllowedToSell)
{
SellShort(lots,Min(Open,L[1]));
Commentary("反手做空");
}
}
Else If(MarketPosition==0 && AllowedToSell)
{
Sell(0,Min(Open,L[1])); //确保信号消失时的多单被平仓
//此处若首次顺利BS/TP,则二次进场不愿意低空
If(myExitPrice2==0)
SellShort(lots,Min(Open,L[1])); //首次做空
Else
if(Open>myExitPrice2) SellShort(lots,Min(Open,L[1])); //二次逢高做空
Commentary("开仓做空");
}
Else If(MarketPosition==-1 && AllowedToSell)
{
lots=lots/(2^CurrentEntries); //金字塔式加仓
lots=Max(IntPart(lots),1);
//If(AllowedToAddLots) SellShort(lots,Min(Open,L[1])));
//Commentary("A引擎加空");
}
}
//IS止损模块--------------------------------------------------------
If(StopBuy)
{
If(MarketPosition==1) Commentary(Text(Time)+"假突破!多单已经IS");
If(Open<= H[1]) Sell(0,Min(2*H[1]-High,Close));
Else Sell(0,Min(2*Open-High,Close));
}
Else If(StopSell)
{
If(MarketPosition==-1) Commentary(Text(Time)+"假突破!空单已经IS");
If(Open>=L[1]) BuyToCover(0,Max(2*L[1]-Low,Close));
Else BuyToCover(0,Max(2*Open-Low,Close));
}
|
|