金钱豹软件提供了一种自由的架构,可以在上面实现很多语言编写和程序设计,其中包括matlab。 金钱豹同时提供了交易全球市场的一个综合性平台。 使用金钱豹可以让你用自己熟悉的语言,快速实现你程序化交易梦想。 下面,我们给出一个程序化交易设计的示例。 本程序的交易理念与海龟交易法则有点相似。细心的朋友可以通过研读,发现策略秘密,这里就不做文字性解释了。 示例软件分成主程序MatlabDaily.m 和一个子程序 MatlabDaily1.m 首先,你要安装有matlab和金钱豹软件 其次,将软件中的matlabfiles解压,然后将下面的两个文件代码分别加入到该文件夹。 然后,在软件的 设置》交易模型设计中选择加载,详细方法见说明书。选择matlab引擎,加载 close,high,low,open 输出:quxian 保存后。 打开 工具》matlab命令窗口 选择一个你想分析的品种,选择“天”周期 下面,就会得到分析图形和开平仓信号。如下: http://jemnbo.photo.hexun.com/76500224_d.html 在comman 窗口,输入 》Report 得到分析报表如下: Report = tilt: {'单利结算报表,现有持仓未计入核算'} winnums: 11 % 获胜次数 winprofit: 2.3822 % 获胜得利 lossnums: 12 % 损失次数 lossprofit: -0.5956 % 损失所得 totalnums: 23 % 总成交次数 totalprofit: 1.7866 % 总利润 fees: 0.0690 % 费率 netprofit: 1.7176 %净利润 BuyandHold: 1.6412 % 买入持有所得 maxprofit: 0.5070 % 最大单次获利 maxloss: -0.0680 % 最大单次亏损 maxdrawback: -0.1500 % 最大利润回吐 meanprofit: 0.0777 % 平均收益 stdprofit: 0.1726 % 收益波动 Sharpe: 0.4501 % Sharpe比 winprob: 47.8261 % 胜率 floatprofit: 0 % 未平持仓浮动收益 附件: 代码: Code: [output,Report]=MatlabDaily1(open, high,low ,close); hold on candle(high', low', close', open'); grid on plot(output(:,1),'rs','LineWidth',1,... 'MarkerEdgeColor','k',... 'MarkerFaceColor','r',... 'MarkerSize',5); plot(output(:,2),'gs','LineWidth',1,... 'MarkerEdgeColor','k',... 'MarkerFaceColor','g',... 'MarkerSize',5); plot(output(:,3),'ro','LineWidth',1,... 'MarkerEdgeColor','k',... 'MarkerFaceColor','g',... 'MarkerSize',5); plot(output(:,4),'go','LineWidth',1,... 'MarkerEdgeColor','k',... 'MarkerFaceColor','r',... 'MarkerSize',5); title('红色为做多,绿色为做空;方块为开仓,圆点为平仓'); hold off 下面为子函数: Code: function [output,Report]=MatlabDaily1(open, high,low ,close) %{ 已经输入的数据: label 品种代码 int32 close 收盘价格 single open 开盘价格 single high 最高价格 single low 最低价格 single jqbhistory 历史数据 single 7行多列,每行依次对应收、开、高、低、量、额 、时,类似jqbhistory(1,:) 访问收盘价格 %} %{ 输入介绍完毕,可以发挥您的智慧,在下面添加您自己的分析代码了! % 下面是您所需要回传的数据,请在末尾或者上面添加的代码中赋予对应的数值,金钱豹会自动将下面的数据从Matlab传递到金钱豹! %绘制多条曲线 数组第一行为第一条曲线的数据,依次类推 % point =single([1,2,3,4,5]); %绘制多点 %} KLine=[open',high',low',close']; PreConditionValue=0.10; PreConditionNum=40; PosConditionNum=20; OpenCritical=0.01; CloseCritical=0.08; StopLoss=-0.05; MaxDrawDown=-0.08; %% Col=size(KLine,1); ConditionValue=zeros(Col,1); MaxHigh=zeros(Col,1); MinLow=zeros(Col,1); if size(KLine,1)>=PreConditionNum for i=PreConditionNum:Col ConditionValue(i,1)=abs(KLine(i,4)-KLine(i-PreConditionNum+1,1))/sum(abs(diff(KLine(i-PreConditionNum+1:i,[1 4]),1,2))); end else end if size(KLine,1)>=PosConditionNum for j=PosConditionNum:Col MaxHigh(j,1)=max(KLine(j-PosConditionNum+1:j,2)); MinLow(j,1)=min(KLine(j-PosConditionNum+1:j,3)); end else end Position=zeros(1,3); winprofit=0; lossprofit=0; winnums=0; lossnums=0; recordsignal.buyopen=repmat(NaN,Col,1); recordsignal.sellopen=repmat(NaN,Col,1); recordsignal.buyclear=repmat(NaN,Col,1); recordsignal.sellclear=repmat(NaN,Col,1); recordsignal.output=[]; for k=PreConditionNum:Col-1 buyclear=KLine(k,3); buyclearTh=max([MinLow(k-1,1)*(1+CloseCritical),KLine(k,3)]); sellclear=KLine(k,2); sellclearTh=min([MaxHigh(k-1,1)*(1-CloseCritical),KLine(k,2)]); buy=KLine(k,2); buyTh=max([MaxHigh(k-1,1)*(1+OpenCritical),KLine(k,3)]); sell=KLine(k,3); sellTh=min([MinLow(k-1,1)*(1-OpenCritical),KLine(k,2)]); PreJudge=ConditionValue(k-1,1); if Position(1,1)==1 if sellclear<=sellclearTh profit=sellclearTh/Position(1,2)-1; if profit>=0 winprofit=winprofit+profit; winnums=winnums+1; else lossprofit=lossprofit+profit; lossnums=lossnums+1; end Position(1,:)=zeros(1,3); recordsignal.sellclear(k,1)=sellclearTh; recordsignal.output=[recordsignal.output;[1,profit]]; elseif buy/Position(1,2)-1<=StopLoss lossprofit=lossprofit+StopLoss; lossnums=lossnums+1; recordsignal.sellclear(k,1)=Position(1,2)*(1+StopLoss); Position(1,:)=zeros(1,3); recordsignal.output=[recordsignal.output;[1,StopLoss]]; else end end if Position(1,1)==-1 if buyclear>=buyclearTh profit=Position(1,2)/buyclearTh-1; if profit>=0 winprofit=winprofit+profit; winnums=winnums+1; else lossprofit=lossprofit+profit; lossnums=lossnums+1; end Position(1,:)=zeros(1,3); recordsignal.buyclear(k,1)=buyclearTh; recordsignal.output=[recordsignal.output;[-1,profit]]; elseif Position(1,2)/sell-1<=StopLoss lossprofit=lossprofit+StopLoss; lossnums=lossnums+1; recordsignal.buyclear(k,1)=Position(1,2)*(1-StopLoss); Position(1,:)=zeros(1,3); recordsignal.output=[recordsignal.output;[-1,StopLoss]]; else end end if PreJudge>=PreConditionValue if buy>=buyTh && Position(1,1)==0 Position(1,1)=1; Position(1,2)=buyTh; recordsignal.buyopen(k,1)=buyTh; end if sell<=sellTh && Position(1,1)==0 Position(1,1)=-1; Position(1,2)=sellTh; recordsignal.sellopen(k,1)=sellTh; end end end if Position(1,1)==1 floatprofit=close(end)/Position(1,2)-1; elseif Position(1,1)==-1 floatprofit=Position(1,2)/close(end)-1; else floatprofit=0; end output=[recordsignal.buyopen,... recordsignal.sellopen,... recordsignal.buyclear,... recordsignal.sellclear]; Report.tilt={'单利结算报表,现有持仓未计入核算'}; Report.winnums=winnums; Report.winprofit=winprofit; Report.lossnums=lossnums; Report.lossprofit=lossprofit; Report.totalnums=winnums+lossnums; Report.totalprofit=(winprofit+lossprofit); Report.fees=0.003*Report.totalnums; Report.netprofit=Report.totalprofit-Report.fees; Report.BuyandHold=close(end)/close(1)-1; Report.maxprofit=max(recordsignal.output(:,2)); Report.maxloss=min(recordsignal.output(:,2)); cumsumprofit=cumsum(recordsignal.output(:,2)); if size(recordsignal.output,1)>=2 recordsignal.output(1,3)=cumsumprofit(1,1); for l=2:size(recordsignal.output,1) recordsignal.output(l,3)=cumsumprofit(l,1)-max(cumsumprofit(1:l-1,1)); end else recordsignal.output=zeros(1,3); end Report.maxdrawback=min(recordsignal.output(:,3)); Report.meanprofit=mean(recordsignal.output(:,2)); Report.stdprofit=std(recordsignal.output(:,2)); Report.Sharpe=mean(recordsignal.output(:,2))/std(recordsignal.output(:,2)); Report.winprob=100*Report.winnums/Report.totalnums; Report.floatprofit=floatprofit;
感谢JEMNBO的介绍!对金钱豹很感兴趣 请问laserhz版主: 金钱豹系统几个问题: 1)与TWS连接后,自动交易效率如何? 支持的交易频率最快是多少(理论和实际每秒几次)? 2)支持多交易策略叠加吗? 即同一品种多交易策略运行,各策略能够独立查询未成交回报吗? 3)能编制多交易策略叠加的整体交易测评报告吗? 谢谢!
更新程序,将报告输出到文档: 输出打开文档,结果如下: ———————————————————————— ************************************************** ----------策略参数-------------------------------- 参数: 0.100 参数核算区间长度: 40 判断样本量 20 开仓参数:悬殊百分比 0.010 平仓参数:悬殊百分比 0.080 止损阀值: -0.030 策略允许的最大浮动利润回撤: 0.080 ----------统计报表-------------------------------- 盈利次数: 18 获胜盈利所得 : 3.422 亏损次数: 13 亏损总额 : -0.454 总交易次数 : 31 总获利(单利): 2.968 总获利(复利): 8.868 交易费用: 0.093 净利润(单利): 2.875 净利润(复利): 7.990 对象买入持有应该能得收益: 2.837 最大资金回撤(单利): -0.120 最大资金回撤(复利): -0.482 单次最大获利 : 1.215 单次最大亏损: -0.076 平均每笔利润: 0.096 获胜平均每笔利润: 0.190 亏损平均每笔利润: -0.035 每笔交易波动: 0.248 Sharper比值: 0.386 获胜比例: 0.581 现有持仓浮动收益: 0.164
1:效率还不错,外盘频率建议不要太高,服务器在国外,通信不如国内理想的; 2:金钱豹方式不同,在一个模型中可以自由添加很多指标,同时对全球市场品种下单 3:模型评测暂时未实现,近期已经在规划功能中,有详细需求可以单独贴出来,或者告诉我!