700字范文,内容丰富有趣,生活中的好帮手!
700字范文 > matlab rsi 【每日一策】Matlab量化交易策略之 RSI择时

matlab rsi 【每日一策】Matlab量化交易策略之 RSI择时

时间:2021-11-18 21:58:15

相关推荐

matlab rsi 【每日一策】Matlab量化交易策略之  RSI择时

function RSI1(n1,n2,n4) % 威廉指标.

%获取目标资产信息

targetList = traderGetTargetList(); % 在RunBackTest中选择好的标的.

%获取账户信息

HandleList = traderGetHandleList();

%=================================================================

% RunBackTest的参数设置

% n1=12; % RSI的短期参数

% n2=24; % RSI的长期参数

% n4=2; % 几倍ATR

%=================================================================

% 定义持有的账户为全局变量

global holdingList;

if isempty(holdingList) % 判断cc是否为空值

holdingList(1).Market=0;

holdingList(1).Code=0;

holdingList(1).OpenBar=0;

holdingList(1).OpenPrice=0;

holdingList(1).Sharebum=0;

holdingList(1).StopLoss=0;

end

% 定义可用金额

global available;

if isempty(available) % 判断cc是否为空值

available=100000000;

end

% 定义初始金额,每只股票的最大仓位为初始资金的1/300

initial=100000000;

initialeach=initial/length(targetList);

k1=0;

%------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

for i = 1:length(targetList) % 每个股票过一遍

% lags为策略需要往前获取多少天

lags=n2+2;

%策略中每次取数据的长度

barnum=traderGetCurrentBar(targetList(i).Market,targetList(i).Code); % K线的序号,后面会增加,前面的值对应的日期固定.

% 数据长度限制,排除了前lags根k线

if(barnum

continue;

end

% 策略开始部分

[time,open,high,low,close,volume,turnover,openinterest] = traderGetKData(targetList(i).Market,targetList(i).Code,'day',1, 0-lags, 0,false,'FWard');

if length(close)

continue;

end

if time(end)>=datenum('1-Jan-')

if length(close)

continue;

end

% RSI

[SRSI]=traderRSI(n1,targetList(i).Market,targetList(i).Code,'day',1, 0-lags, 0,false,'FWard');

[LRSI]=traderRSI(n2,targetList(i).Market,targetList(i).Code,'day',1, 0-lags, 0,false,'FWard');

a1=SRSI(end)>LRSI(end) && SRSI(end-1)

a2=(SRSI(end)>50 && SRSI(end)<80) || (SRSI(end)<20);

buy1=a1 && a2;

if buy1

k1=k1+1;

stockList(k1).Market=targetList(i).Market;

stockList(k1).Code=targetList(i).Code;

stockList(k1).Price=close(end);

[ATR1, ~]=traderATR(14,targetList(i).Market,targetList(i).Code,'day',1,0-lags,0,false,'FWard');

stockList(k1).ATR=ATR1(end);

end

end

end

%--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

% 判断股票池里面的股票是否要买入,买入多少手

if k1~=0

for i=1:length(stockList)

% 等权重买入

sharenum=floor(initialeach/stockList(i).Price);

% 设置每只股票的交易手数,使得最大的亏损不大于初始账户的 n2%.

% sharenum=floor(stockList(i).Price*initialeach/stockList(i).ATR/10000);

% 获取当前bar序号

barnum=traderGetCurrentBar(stockList(i).Market,stockList(i).Code);

%获取当前仓位

[marketposition,~,~]=traderGetAccountPosition(HandleList(1),stockList(i).Market,stockList(i).Code);

if marketposition ==0 && (sharenum*stockList(i).Price)<=1*available && time(end)>=datenum('1-Jan-')

orderID1=traderBuy(HandleList(1),stockList(i).Market,stockList(i).Code,sharenum,0,'market','buy1'); % 开多单

if orderID1~=0

[~,~,price] = traderGetAccountPosition(HandleList(1),stockList(i).Market,stockList(i).Code); % 记录开仓的价格

available=available-sharenum*price;

if holdingList(1).Market==0

holdingList(1).Market=stockList(i).Market;

holdingList(1).Code=stockList(i).Code;

holdingList(1).OpenBar=barnum+1;

holdingList(1).OpenPrice=price;

holdingList(1).Sharebum=sharenum;

holdingList(1).StopLoss=price-n4*stockList(i).ATR;

else

holdingList1(1).Market=stockList(i).Market;

holdingList1(1).Code=stockList(i).Code;

holdingList1(1).OpenBar=barnum+1;

holdingList1(1).OpenPrice=price;

holdingList1(1).Sharebum=sharenum;

holdingList1(1).StopLoss=price-n4*stockList(i).ATR;

holdingList=[holdingList,holdingList1];

end

end

end

end

end

%--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

% 出场设置

if holdingList(1).Code~=0

for i=1:length(holdingList)

[ATR2, ~]=traderATR(14,holdingList(i).Market,holdingList(i).Code,'day',1,0-lags,0,false,'FWard');

[time1,open1,high1,low1,close1,volume1,turnover1,openinterest1] = traderGetKData(holdingList(i).Market,holdingList(i).Code,'day',1, 0-lags, 0,false,'FWard');

barnum=traderGetCurrentBar(holdingList(i).Market,holdingList(i).Code);

if barnum>holdingList(i).OpenBar && high1(end-1)>high1(end-2)

holdingList(i).StopLoss=high1(end-1)-n4*ATR2(end-1);

end

exitlong1=close1(end)

% RSI

[SRSI]=traderRSI(n1,holdingList(i).Market,holdingList(i).Code,'day',1, 0-lags, 0,false,'FWard');

[LRSI]=traderRSI(n2,holdingList(i).Market,holdingList(i).Code,'day',1, 0-lags, 0,false,'FWard');

a1=SRSI(end)LRSI(end-1);

% 卖出信号:

exitlong2=a1;

exitlong=exitlong1 || exitlong2;

if barnum>=holdingList(i).OpenBar && exitlong2

orderID2=traderPositionTo(HandleList(1),holdingList(i).Market,holdingList(i).Code,0,0,'market','sell1');

if orderID2~=0

exitprice=traderOrderFilledPrice(HandleList(1),orderID2);

available=available+exitprice*holdingList(i).Sharebum;

holdingList(i).Sharebum=0;

end

end

end

% 删除已经卖出的股票

holdingList2(1).Market=0;

holdingList2(1).Code=0;

holdingList2(1).OpenBar=0;

holdingList2(1).OpenPrice=0;

holdingList2(1).Sharebum=0;

holdingList2(1).StopLoss=0;

for i=1:length(holdingList)

if holdingList(i).Sharebum~=0

holdingList2=[holdingList2,holdingList(i)];

end

end

holdingList=holdingList2(2:end);

end

%--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

end

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。