matlab金钱豹交流帖

Discussion in '金钱豹智能客户端' started by jemnbo, Jan 21, 2010.

  1. 有哪些朋友已经开始在这方面进行研究的,请说说经验,能贴出一些示例更佳:)
     
  2. 金钱豹软件提供了一种自由的架构,可以在上面实现很多语言编写和程序设计,其中包括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;
    [​IMG]
     
    Last edited by a moderator: Jan 24, 2010
  3. 学习了。。。
     
  4. 向高人学习啊!
     
  5. 感谢JEMNBO的介绍!对金钱豹很感兴趣
    请问laserhz版主:
    金钱豹系统几个问题:
    1)与TWS连接后,自动交易效率如何? 支持的交易频率最快是多少(理论和实际每秒几次)?
    2)支持多交易策略叠加吗? 即同一品种多交易策略运行,各策略能够独立查询未成交回报吗?
    3)能编制多交易策略叠加的整体交易测评报告吗?
    谢谢!
     
  6. 更新程序,将报告输出到文档:
    输出打开文档,结果如下:
    ————————————————————————
    **************************************************
    ----------策略参数--------------------------------
    参数: 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
     
  7. 1:效率还不错,外盘频率建议不要太高,服务器在国外,通信不如国内理想的;
    2:金钱豹方式不同,在一个模型中可以自由添加很多指标,同时对全球市场品种下单
    3:模型评测暂时未实现,近期已经在规划功能中,有详细需求可以单独贴出来,或者告诉我!