matlab均线程序化交易,Matlab量化交易策略之 BOLL择时策略(附源码)

策略原理:

选股标的:沪深300所有成分股

买入信号:价格上穿布林带中轨

资金分配:等权重买入

卖出信号:当股价跌破上轨或中轨时卖出

回测曲线(由Auto-Trader提供回测报告)

9b20b8da13aabc429601315dc3e1fe74.png

BOLL.png (66.21 KB, 下载次数: 12)

2017-3-15 16:31 上传

策略源码:

function BOLL1(n1,n2,n4) % BOLL布林线.%获取目标资产信息targetList = traderGetTargetList(); % 在RunBackTest中选择好的标的.%获取账户信息HandleList = traderGetHandleList();%=================================================================% RunBackTest的参数设置% n1=20; % 中线的均线参数% n2=2; % 标准差倍数% 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/300initial=100000000;initialeach=initial/length(targetList);k1=0;%------------------------------------------------------------------------------------------------------------------------------------------------------------------------------for i = 1:length(targetList) % 每个股票过一遍        % lags为策略需要往前获取多少天    lags=n1+n2;    %策略中每次取数据的长度    barnum=traderGetCurrentBar(targetList(i).Market,targetList(i).Code); % K线的序号,后面会增加,前面的值对应的日期固定.    % 数据长度限制,排除了前lags根k线    if(barnum=datenum('1-Jan-2014')        if length(close)mid(end);        if a            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    endend%--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------% 判断股票池里面的股票是否要买入,买入多少手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-2014')            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    endend%--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------% 出场设置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)upper(end-1) && close(end)mid(end-1) && close(end)>mid(end);        exitlong2=b1 || b2;        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

更多免费策略源码下载请登录DigQuant社区-策略资源下载,ww w.digquant.com.cn/stra.php

在编写一个基于VNPy 3.9的期货15分钟Bollinger Bands(布林带)和RSI(相对强弱指数)的交易策略时,首先我们需要确保你已经安装了VNPy库并且熟悉其基本架构。以下是一个简单的示例策略,展示了如何结合这两个技术指标进行入场和退出信号的生成: ```python from vnpy.trader.constant import Direction, Offset, Exchange from vnpy.trader.object import TickData, BarData from vnpy.strategy.backtesting import BacktestingEngine, OptimizationSetting from vnpy.indicator import BollingerBands, RSI import pandas as pd class BollRsiStrategy(object): def __init__(self, strategy_name, vt_symbol, setting): self.name = strategy_name self.vt_symbol = vt_symbol self.bbands = BollingerBands(self.on_bar) self.rsi = RSI(self.on_bar) self.position = 0 self.entry_price = None self.exit_price = None self.stop_loss = None self.trailing_stop = False def on_init(self): pass def on_start(self): pass def on_tick(self, tick: TickData): if not self.inited: return # 计算当前的布林带宽度 lower_band, middle_band, upper_band = self.bbands.get_boll() rsi_value = self.rsi[-1] # 如果满足买入条件(例如超买或下穿下轨) if rsi_value > 70 and tick.last_price < lower_band: self.buy(tick.last_price) def on_bar(self, bar: BarData): # 更新布林带和RSI值 self.bbands.update(bar.close_price) rsi_value = self.rsi[-1] # 如果持有位置,检查是否达到卖出条件(例如超卖或上穿上轨) if self.position == 1 and rsi_value < 30 and bar.close_price > upper_band: self.sell(bar.close_price, lock=True) # 使用lock=True防止滑点 # 停损设置 if self.position == 1 and self.stop_loss is None: self.stop_loss = bar.close_price - (bar.high_price - bar.low_price) * 0.1 # 10%风险止损 # 追踪止损 if self.position == 1 and self.trailing_stop: if bar.close_price > self.exit_price: self.exit_price = bar.close_price def on_order(self, order: OrderData): pass def on_trade(self, trade: TradeData): pass def on_stop_order(self, stop_order: StopOrderData): pass def run_strategy(strategy_class, vt_symbols, start_date, end_date, optimize=False): engine = BacktestingEngine() engine.add_strategy(strategy_class, vt_symbols=vt_symbols, setting={}) if optimize: optimization_setting = OptimizationSetting( start=start_date, end=end_date, interval=60*15, # 指定为15分钟 rate=0.001, # 手续费比例 slippage=0.01, # 滑点 size=1, # 合约大小 pricetick=0.1, # 最小价格变动 capital=1_000_000 # 初始资金 ) engine.run_optimization(optimization_setting) else: engine.load_data(vt_symbols, start=start_date, end=end_date) engine.run_backtesting() engine.calculate_result() engine.show_chart() # 使用策略并回测 strategy_name = "Boll_RSI" vt_symbol = "your_vt_symbol" # 替换为你想测试的具体合约代码 start_date = '2022-01-01' # 开始日期 end_date = '2022-12-31' # 结束日期 run_strategy(BollRsiStrategy, [vt_symbol], start_date, end_date) ``` 请注意,这个例子是一个基础模板,实际使用时可能需要根据具体的市场数据和交易规则进行调整。你还需要设置适当的参数,如入场、出场、止损和止盈条件。另外,优化部分可根据需求开启,但通常在回测过程中不会启用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值