2.7 指標の使用

作者: リン・ハーン小さな夢作成日:2016年11月10日 16:19:36 更新日:2019年8月1日 09時25分06秒

指標の使用


  • TA - 一般的な指数関数庫を部分的に書き換えることを最適化

TA 指标库
MACD       指数平滑异同平均线
KDJ        随机指标
RSI        强弱指标
ATR        平均真实波幅
OBV        能量潮
MA         移动平均线
EMA        指数平均数指标
BOLL       布林带
Alligator  Alligator Indicator
CMF        蔡金货币流量指标
Highest    周期最高价
Lowest     周期最低价

MACDの指標を使ってテストを書こうとすると,APIのドキュメントに MACDタグを開いて説明します.

img

DIF,DEA,指標アルゴリズムなどに興味のある生徒は,MACDアルゴリズムを百度で検索してください.

function main(){
    var records = null;
    var macd = null;
    while(true){
        records = _C(exchange.GetRecords);  // 获取K线数据 ,默认为策略界面设置的K线周期, _C 是一个容错的内置函数。
                                            // _C 详见 https://www.fmz.com/bbs-topic/320  问题7。
        macd = TA.MACD(records);   // 不加参数的话,使用的是默认参数  12, 26, 9
        Log("macd[0]", macd[0]);   // DIF
        Log("macd[1]", macd[1]);   // DEA
        Log("macd[2]", macd[2]);   // MACD 
        Log("macd[0]长度", macd[0].length);   // DIF 长度
        Log("macd[1]长度", macd[1].length);   // DEA 长度
        Log("macd[2]长度", macd[2].length);   // MACD 长度
        Log("records 长度:", records.length);  // 显示一下 records 的长度。
        Sleep(1000 * 60 * 5);
    }
}

アナログディスクのテスト結果:

img

計算された指標は全て null で始まり,その後のデータには特定の数値が開始されていることがわかります.これは指標パラメータが指定した計算周期のためであり,この周期を満たさない限り指標を計算することはできません. したがって,指標を使う前に指標の記述を理解し,指標を計算するために使用されるK線データの長さをプログラムで判断する.長さが不十分な場合は無効な値を計算し,無効な値を使用するとプログラムエラーが発生しないようにする.

グラフインターフェースを使って計算した指標をグラフに表示し,取引所のリアルディスクグラフ (リアルディスクでOKCoinを選択) と比較します. まずコードを見てください:

var ChartCfg = {
tooltip: {xDateFormat: '%Y-%m-%d %H:%M:%S, %A'},
    chart: { zoomType:'x',panning:true },//图表类型  
    title: { text: "K-macd"}, //标题
    rangeSelector: {
            buttons:  [{type: 'hour',count: 1, text: '1h'}, {type: 'hour',count: 3, text: '3h'}, {type: 'hour', count: 8, text: '8h'}, {type: 'all',text: 'All'}],
            selected: 0,
            inputEnabled: false
        },
    subtitle: {text: "测试macd"},//副标题
    xAxis:{type: 'datetime'},
    yAxis: [{
            title: {text: 'K线'},//标题
            style: {color: '#4572A7'},//样式 
            opposite: false  //生成右边Y轴
        },
       {
            title:{text: "macd"},
            opposite: true  //生成右边Y轴  ceshi
       }
    ],
    series: [//系列
        {type:'candlestick',yAxis:0,name:'K',id:'KLine',data:[]},
        {name:"DIF",type:'spline',yAxis:1,data:[]},
        {name:"DEA",type:'spline',yAxis:1,data:[]},
        {name:"MACD量柱",type:'spline',yAxis:1,data:[]},
        ]                  
};
function main(){
    var records = null;
    var macd = null;
    var perRecords = _C(exchange.GetRecords);
    var perRecordTime = perRecords[perRecords.length - 1].Time;
    var chart_obj = Chart(ChartCfg); // 初始化图表
    chart_obj.reset();
    while(true){
        records = _C(exchange.GetRecords);  // 获取K线数据 ,默认为策略界面设置的K线周期, _C 是一个容错的内置函数。
        if(!records && records.length < 26 ){
            continue;
        }
        macd = TA.MACD(records, 12, 26, 9);   // 不加参数的话,使用的是默认参数  12, 26, 9
        if(records[records.length - 1].Time !== perRecordTime){                                    // _C 详见 https://www.fmz.com/bbs-topic/320  问题7。
            //先更新,再添加K线
            chart_obj.add(0, [records[records.length - 2].Time, records[records.length - 2].Open, records[records.length - 2].High, records[records.length - 2].Low, records[records.length - 2].Close], -1);   // 跟新刚完成的bar。
            chart_obj.add(0, [records[records.length - 1].Time, records[records.length - 1].Open, records[records.length - 1].High, records[records.length - 1].Low, records[records.length - 1].Close]);       // 添加新出现的bar
            //先更新,添加指标线
            chart_obj.add(1, [records[records.length - 2].Time, macd[0][records.length - 2]], -1);   // 更新
            chart_obj.add(1, [records[records.length - 1].Time, macd[0][records.length - 1]]);
            
            chart_obj.add(2, [records[records.length - 2].Time, macd[1][records.length - 2]], -1);   // 更新
            chart_obj.add(2, [records[records.length - 1].Time, macd[1][records.length - 1]]);
            
            chart_obj.add(3, [records[records.length - 2].Time, macd[2][records.length - 2]], -1);   // 更新
            chart_obj.add(3, [records[records.length - 1].Time, macd[2][records.length - 1]]);
            
            perRecordTime = records[records.length - 1].Time;
        }else{
            //只更新当前的bar 和 线
            chart_obj.add(0, [records[records.length - 1].Time, records[records.length - 1].Open, records[records.length - 1].High, records[records.length - 1].Low, records[records.length - 1].Close], -1);
            chart_obj.add(1, [records[records.length - 1].Time, macd[0][records.length - 1]], -1);   // 更新
            chart_obj.add(2, [records[records.length - 1].Time, macd[1][records.length - 1]], -1);   // 更新
            chart_obj.add(3, [records[records.length - 1].Time, macd[2][records.length - 1]], -1);   // 更新
        }
        chart_obj.update(ChartCfg);
        Sleep(1000);
    }
}

ロボットのインターフェース上のK線周期パラメータは,1分に設定されている.効果を見るにはしばらく実行する必要があるため,少し小さい周期を選択する.

img img

図から見える 発明者による量化 ロボット操作 計算されたDIFは約2.729で,DEAは約2.646 MACD量柱 約0.0831 実際のOKCoin取引所行事図は,DIFが2.73で,DEAが2.65で,MACDの量列は0.17で示されている. OKCoinは4倍,MACDは2倍,OKCoinは2倍,DIFは2倍,DEAは3倍,OKCoinは4倍,MACDは3倍,DIFは4倍,DEAは4倍,OKCoinは4倍,MACDは4倍. (DIF - DEA) *2,通常はDIF - DEA = 2.729 - 2.646 = 0.083,また2で掛けると,0.166は約0.17になります.

他の指標の使用方法も基本的には類似している.

  • タリブ -http://ta-lib.org/

    タリブ図書館には,TA図書館でよく使われる指標に加えて,多くの指標があります. 例えば,talib.STOCHRSIという指標を使って,API文書の説明を見てみましょう.
STOCHRSI	Stochastic Relative Strength Index
STOCHRSI(Records[Close],Time Period = 14,Fast-K Period = 5,Fast-D Period = 3,Fast-D MA = 0) = [Array(outFastK),Array(outFastD)]

参数設定はtalib.STOCHRSI (records, 14, 14, 3, 3) であり,基本的には上部のMACDのようなコードであり,変更がいくつかあります.

var ChartCfg = {
tooltip: {xDateFormat: '%Y-%m-%d %H:%M:%S, %A'},
    chart: { zoomType:'x',panning:true },//图表类型  
    title: { text: "stochrsi"}, //标题
    rangeSelector: {
            buttons:  [{type: 'hour',count: 1, text: '1h'}, {type: 'hour',count: 3, text: '3h'}, {type: 'hour', count: 8, text: '8h'}, {type: 'all',text: 'All'}],
            selected: 0,
            inputEnabled: false
        },
    subtitle: {text: "测试stochrsi"},//副标题
    xAxis:{type: 'datetime'},
    yAxis: [{
            title: {text: 'K线'},//标题
            style: {color: '#4572A7'},//样式 
            opposite: false  //生成右边Y轴
        },
       {
            title:{text: "K-D"},
            opposite: true  //生成右边Y轴  ceshi
       }
    ],
    series: [//系列
        {type:'candlestick',yAxis:0,name:'K',id:'KLine',data:[]},
        {name:"K",type:'line',yAxis:1,data:[]},
        {name:"D",type:'line',yAxis:1,data:[]},
        ]                  
};
function main(){
    var records = null;
    //var macd = null;
    var stochrsi = null;
    var perRecords = _C(exchange.GetRecords);
    var perRecordTime = perRecords[perRecords.length - 1].Time;
    var chart_obj = Chart(ChartCfg); // 初始化图表
    chart_obj.reset();
    while(true){
        records = _C(exchange.GetRecords);  // 获取K线数据 ,默认为策略界面设置的K线周期, _C 是一个容错的内置函数。
        if(!records && records.length < 26 ){
            continue;
        }
        //macd = TA.MACD(records, 12, 26, 9);   // 不加参数的话,使用的是默认参数  12, 26, 9
        stochrsi = talib.STOCHRSI(records, 14, 5, 3, 0);
        if(records[records.length - 1].Time !== perRecordTime){                                    // _C 详见 https://www.fmz.com/bbs-topic/320  问题7。
            //添加K线
            chart_obj.add(0, [records[records.length - 2].Time, records[records.length - 2].Open, records[records.length - 2].High, records[records.length - 2].Low, records[records.length - 2].Close], -1);   // 跟新刚完成的bar。
            chart_obj.add(0, [records[records.length - 1].Time, records[records.length - 1].Open, records[records.length - 1].High, records[records.length - 1].Low, records[records.length - 1].Close]);       // 添加新出现的bar
            //添加指标线
            chart_obj.add(1, [records[records.length - 2].Time, stochrsi[0][records.length - 2]], -1);   // 更新
            chart_obj.add(1, [records[records.length - 1].Time, stochrsi[0][records.length - 1]]);
            
            chart_obj.add(2, [records[records.length - 2].Time, stochrsi[1][records.length - 2]], -1);   // 更新
            chart_obj.add(2, [records[records.length - 1].Time, stochrsi[1][records.length - 1]]);
            
            perRecordTime = records[records.length - 1].Time;
        }else{
            //只更新当前的bar 和 线
            chart_obj.add(0, [records[records.length - 1].Time, records[records.length - 1].Open, records[records.length - 1].High, records[records.length - 1].Low, records[records.length - 1].Close], -1);
            chart_obj.add(1, [records[records.length - 1].Time, stochrsi[0][records.length - 1]], -1);   // 更新
            chart_obj.add(2, [records[records.length - 1].Time, stochrsi[1][records.length - 1]], -1);   // 更新
        }
        chart_obj.update(ChartCfg);
        LogStatus("倒数第一组数据:", stochrsi[0][stochrsi[0].length - 1], stochrsi[1][stochrsi[1].length - 1], "    倒数第二组数据:", stochrsi[0][stochrsi[0].length - 2], stochrsi[1][stochrsi[1].length - 2]);
        Sleep(1000);
    }
}

OKCoinの公式の数字と違いがあるので,スクリーンショットを表示していません. BOSSは,タリブ庫の実装アルゴリズムがOKCoinと異なる可能性があると言います.STOCHRSI指標を理解するこの指針がどのように書かれているか見てみてください. これは最適化されていない,効率が低い,動作が遅い,学習する権利です.


もっと

ホクシェラト最後のK行は常に変化しているので,新しいK行が生まれたときに初めて最初のK行が確定するので,最後のK行は更新し追加する必要があります. `GetRecords (゚Д゚) `で得られたK線データは確定していないのか? `records (゚Д゚) `は,現在の時間軸のK線データを表示し,直接グラフに描画し,新しい時間軸のK線データをグラフの最後の要素に追加します.

シャンディアンリユTA.ATR (records, 14) に関する詳細な説明は,私はBotVSのAPIのドキュメント,ビデオ,および完全な使用マニュアルで見つかりませんでした. 私がTA.ATR (records, 14) を呼び出すとき (パラメータは30分k線) は,長さ177の配列が返されます. この配列の意味は,教えてください.

ファングベイPythonのバージョン https://dn-filebox.qbox.me/b5d2b0ecc1e196a6bfc68eb45cd818c50d279915.png https://dn-filebox.qbox.me/157db5e2659fd13bcf552cd82fe456ba469939f8.png

ファングベイPython のバージョン def main (ー) について: 偽物について records = _C ((exchange.GetRecords); # ポリシーのインターフェース設定でデフォルトでK行データを取得するK行周期, _Cはエラー容認の内置関数である. macd = TA.MACD ((records); # 参数を追加しない場合は,デフォルト参数 12, 26, 9 を使用します. ログ (("macd[0]", macd[0]); #DIF ログ (("macd[1]", macd[1]); # DEA ログ (("macd[2]", macd[2]); # MACD ログ (("macd[0]長さ", len ((macd[0])); #DIF長さ ログ (("macd[1] 長さ", len ((macd[1])); # DEA 長さ ログ (("macd[2]長さ", len ((macd[2])); # MACD長さ ログ (長さ:", len (長さ:", len (長さ: "レコード)); #長さを表示します. スリープ ((1000 * 60 * 5);

小さな夢K線Barの時間軸は,このBarの開始時間であり,リアルタイムではない. Barの開始時間は変化しない.

ホクシェラト間違いはKラインの時間軸にありました. 試行錯誤後,BotVSの仕組みがこんな感じだとわかりました. 3月1日のK線データを取得したい場合は,GetRecords (D1) を呼び出すと,多くのレコードが返されますが,すべての記録の時間軸は同じで,2018-03-01 00:00:00 です. つまり,3月1日の10時に『GetRecords (D1) 』を呼んだとしても,取得したK線時間軸は,まだ2018-03-01 **00**:00:00である.だから,あなたが言った最後の軸は,新しい時間軸 (2018-03-**02** 00:00:00:00) があるまで不確実である. 誤った理解は,私が3月1日1時,2時,3時に電話をした後に戻る時間が違うと考えていたことです. 2018-03-01 **01**:00:00、2018-03-01 **02**:00:00、2018-03-01 **03**:00:00、

小さな夢GetRecords ((() が取得したK線データは,倒数第1列を除いて,残りは確定 (→周期が完了したため),倒数第1列は不確定 (→周期が終わっていないため),Closeは常に変化している.例えば,日K線,現在の日K線柱は,今日が終わっていないとき,誰が今日が最終的にどの価格になるかは知らない.

小さな夢礼儀正しくない

シャンディアンリユ分かりました,本当にありがとうございました.

小さな夢はい,対応します. 最初のK線をマイナス数える Bar.

シャンディアンリユ確認してください. a[a.length-1]は最近のk線データATRを表示しています.

小さな夢はい 具体的には どれだけの返済額が取引所によって決まるかは 指定できません.したがって,取引所は 一般的に限られたデータしか提供しません.

シャンディアンリユこのTA.ATR (※) は,基本的に入力されたレコードに対して数学的な演算を行なうものです. 私は前にはっきりと表現しませんでしたが,質問したいのは,関数exchange.GetRecords (※) を使ってk行データを取得するときに,返回の長さは取引所によって決定されるかどうかです.

小さな夢この指標関数は,K線データ,つまり records に対応する,どれだけのデータを返します.

シャンディアンリユこの関数を呼び出すとき,返ってくるデータの長さは,交換所によって指定されているのでしょうか? この関数を呼び出すとき,パラメータが同じであっても,返ってくるデータの長さは異なる可能性があります.

小さな夢線の長さによって決定されます.

シャンディアンリユ答えに感謝します. 分かりました. また,この117の長さは,何によって決まるのか?

小さな夢例えば,入力されたレコードは日K線で,計算されたATRは数列であり,この数列の負数の最初の要素は,その日の (日K線最後の日付) ATR指標である.したがって,30分K線,15分K線を分類する.あなたが計算した177の数列は,各K線のATR指標に対応する177のK線周期である.

小さな夢栗をあげて もし現在K線データが10Barしかないとき,私はMA ((15) を要求し,つまり15サイクル平均線であるならば,それは確かに求められないでしょう.

ファングベイデータを返したこともありません.

ファングベイなぜ前述のデータは周期的な要求を満たさないのか?

小さな夢この例は,実用的な使用では,最新の指標データは,行列の最後に,すなわちインデックス−"の要素である. 前面は周期要件を満たしていない. 計算されたデータは,Noneである. この記事へのトラックバック一覧です. https://dn-filebox.qbox.me/b7837ea30e5d8396ffa91c48204f2fbc9a7f4504.png