悬赏 8 个论坛币 未解决
求辅助添加止盈止损代码(基于布林通道和ROC指标的策略),没有止盈止损设置,收益率及夏普比率一直很不好,求大神补全止盈止损代码,具体代码如下:
MarketPosition:-1表示持有空头,0表示无持仓,1表示持有多头
Lots:交易手数 MarginRatio:保证金比例 OpenPosPrice:开仓价格 OpenPosNum:开仓序号
High(i)>=UpperLine(i-1):最高价大于布林通道上线 MyEntryPrice(i):建仓价格
for i=BollLength:length(data)
if MarketPosition==0
LongMargin(i)=0; %多头保证金
ShortMargin(i)=0; %空头保证金
StaticEquity(i)=StaticEquity(i-1); %静态权益
DynamicEquity(i)=StaticEquity(i); %动态权益
Cash(i)=DynamicEquity(i); %可用资金
end
if MarketPosition==1
LongMargin(i)=Close(i)*Lots*TradingUnits*MarginRatio;
StaticEquity(i)=StaticEquity(i-1);
DynamicEquity(i)=StaticEquity(i)+(Close(i)-OpenPosPrice(OpenPosNum))*TradingUnits*Lots;
Cash(i)=DynamicEquity(i)-LongMargin(i);
end
if MarketPosition==-1
ShortMargin(i)=Close(i)*Lots*TradingUnits*MarginRatio;
StaticEquity(i)=StaticEquity(i-1);
DynamicEquity(i)=StaticEquity(i)+(OpenPosPrice(OpenPosNum)-Close(i))*TradingUnits*Lots;
Cash(i)=DynamicEquity(i)-ShortMargin(i);
end
%开仓模块
%开多头
if MarketPosition~=1 && High(i)>=UpperLine(i-1) %用i-1,避免未来函数
%平空开多
if MarketPosition==-1
MarketPosition=1;
ShortMargin(i)=0; %平空后空头保证金为0了
MyEntryPrice(i)=UpperLine(i-1);
if Open(i)>MyEntryPrice(i) %考虑是否跳空
MyEntryPrice(i)=Open(i);
end
MyEntryPrice(i)=MyEntryPrice(i)+Slip*MinMove*PriceScale;%建仓价格(也是平空仓的价格)
ClosePosNum=ClosePosNum+1;
ClosePosPrice(ClosePosNum)=MyEntryPrice(i);%记录平仓价格
CloseDate(ClosePosNum)=Date(i);%记录平仓时间
OpenPosNum=OpenPosNum+1;
OpenPosPrice(OpenPosNum)=MyEntryPrice(i);%记录开仓价格
OpenDate(OpenPosNum)=Date(i);%记录开仓时间
Type(OpenPosNum)=1; %方向为多头
StaticEquity(i)=StaticEquity(i-1)+(OpenPosPrice(OpenPosNum-1)-ClosePosPrice(ClosePosNum))...
*TradingUnits*Lots-OpenPosPrice(OpenPosNum-1)*TradingUnits*Lots*TradingCost...
-ClosePosPrice(ClosePosNum)*TradingUnits*Lots*TradingCost;%平空仓时的静态权益
DynamicEquity(i)=StaticEquity(i)+(Close(i)-OpenPosPrice(OpenPosNum))*TradingUnits*Lots;
end
%空仓开多
if MarketPosition==0
MarketPosition=1;
MyEntryPrice(i)=UpperLine(i-1);
if Open(i)>MyEntryPrice(i) %考虑是否跳空
MyEntryPrice(i)=Open(i);
end
MyEntryPrice(i)=MyEntryPrice(i)+Slip*MinMove*PriceScale;%建仓价格
OpenPosNum=OpenPosNum+1;
OpenPosPrice(OpenPosNum)=MyEntryPrice(i);%记录开仓价格
OpenDate(OpenPosNum)=Date(i);%记录开仓时间
Type(OpenPosNum)=1; %方向为多头
StaticEquity(i)=StaticEquity(i-1);
DynamicEquity(i)=StaticEquity(i)+(Close(i)-OpenPosPrice(OpenPosNum))*TradingUnits*Lots;
end
LongMargin(i)=Close(i)*Lots*TradingUnits*MarginRatio; %多头保证金
Cash(i)=DynamicEquity(i)-LongMargin(i);
end
%开空头
%平多开空
if MarketPosition~=-1 && Low(i)<=LowerLine(i-1)
if MarketPosition==1
MarketPosition=-1;
LongMargin(i)=0; %平多后多头保证金为0了
MyEntryPrice(i)=LowerLine(i-1);
if Open(i)<MyEntryPrice(i)
MyEntryPrice(i)=Open(i);
end
MyEntryPrice(i)=MyEntryPrice(i)-Slip*MinMove*PriceScale;%建仓价格(也是平多仓的价格)
ClosePosNum=ClosePosNum+1;
ClosePosPrice(ClosePosNum)=MyEntryPrice(i);%记录平仓价格
CloseDate(ClosePosNum)=Date(i);%记录平仓时间
OpenPosNum=OpenPosNum+1;
OpenPosPrice(OpenPosNum)=MyEntryPrice(i);%记录开仓价格
OpenDate(OpenPosNum)=Date(i);%记录开仓时间
Type(OpenPosNum)=-1; %方向为空头
StaticEquity(i)=StaticEquity(i-1)+(ClosePosPrice(ClosePosNum)-OpenPosPrice(OpenPosNum-1))...
*TradingUnits*Lots-OpenPosPrice(OpenPosNum-1)*TradingUnits*Lots*TradingCost...
-ClosePosPrice(ClosePosNum)*TradingUnits*Lots*TradingCost;%平多仓时的静态权益,算法参考TB
DynamicEquity(i)=StaticEquity(i)+(OpenPosPrice(OpenPosNum)-Close(i))*TradingUnits*Lots;
end
%空仓开空
if MarketPosition==0
MarketPosition=-1;
MyEntryPrice(i)=LowerLine(i-1);
if Open(i)<MyEntryPrice(i)
MyEntryPrice(i)=Open(i);
end
MyEntryPrice(i)=MyEntryPrice(i)-Slip*MinMove*PriceScale;
OpenPosNum=OpenPosNum+1;
OpenPosPrice(OpenPosNum)=MyEntryPrice(i);
OpenDate(OpenPosNum)=Date(i);%记录开仓时间
Type(OpenPosNum)=-1; %方向为空头
StaticEquity(i)=StaticEquity(i-1);
DynamicEquity(i)=StaticEquity(i)+(OpenPosPrice(OpenPosNum)-Close(i))*TradingUnits*Lots;
end
ShortMargin(i)=Close(i)*Lots*TradingUnits*MarginRatio;
Cash(i)=DynamicEquity(i)-ShortMargin(i);
end
%如果最后一个Bar有持仓,则以收盘价平掉
if i==length(data)
%平多
if MarketPosition==1
MarketPosition=0;
LongMargin(i)=0;
ClosePosNum=ClosePosNum+1;
ClosePosPrice(ClosePosNum)=Close(i);%记录平仓价格
CloseDate(ClosePosNum)=Date(i);%记录平仓时间
StaticEquity(i)=StaticEquity(i-1)+(ClosePosPrice(ClosePosNum)-OpenPosPrice(OpenPosNum))...
*TradingUnits*Lots-OpenPosPrice(OpenPosNum)*TradingUnits*Lots*TradingCost...
-ClosePosPrice(ClosePosNum)*TradingUnits*Lots*TradingCost;%平多仓时的静态权益,算法参考TB
DynamicEquity(i)=StaticEquity(i);%空仓时动态权益和静态权益相等
Cash(i)=DynamicEquity(i); %空仓时可用资金等于动态权益
end
%平空
if MarketPosition==-1
MarketPosition=0;
ShortMargin(i)=0;
ClosePosNum=ClosePosNum+1;
ClosePosPrice(ClosePosNum)=Close(i);
CloseDate(ClosePosNum)=Date(i);
StaticEquity(i)=StaticEquity(i-1)+(OpenPosPrice(OpenPosNum)-ClosePosPrice(ClosePosNum))...
*TradingUnits*Lots-OpenPosPrice(OpenPosNum)*TradingUnits*Lots*TradingCost...
-ClosePosPrice(ClosePosNum)*TradingUnits*Lots*TradingCost;%平空仓时的静态权益,算法参考TB
DynamicEquity(i)=StaticEquity(i);%空仓时动态权益和静态权益相等
Cash(i)=DynamicEquity(i); %空仓时可用资金等于动态权益
end
end
pos(i)=MarketPosition;
end