2.7 संकेतक का उपयोग

लेखक:छोटे सपने, बनाया गयाः 2016-11-10 16:19:36, अद्यतन किया गयाः 2019-08-01 09:25:06

संकेतक का उपयोग


  • TA - ऑप्टिमाइज़ेड रीराइटिंग पार्ट्स कॉमन इंडिकेटर फ़ंक्शनरी

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

मैकड का उपयोग करके एक परीक्षण लिखने का प्रयास करें, लेकिन इससे पहले कि हम एपीआई दस्तावेज में मैकड टैग खोलते हैं, विवरण देखें।

img

यदि आप डीआईएफ, डीईए, संकेतक एल्गोरिदम आदि में रुचि रखते हैं, तो आप Baidu पर 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

जैसा कि आप देख सकते हैं, गणना किए गए सभी मानकों की शुरुआत शून्य से होती है, और बाद के डेटा की शुरुआत में एक विशिष्ट संख्या होती है, क्योंकि मानकों के पैरामीटर द्वारा निर्दिष्ट गणना चक्र के कारण, मानकों की गणना तब तक नहीं की जा सकती है जब तक कि डेटा की मात्रा ((records डेटा) इस चक्र को पूरा नहीं करती है। इस प्रकार, किसी सूचक का उपयोग करने से पहले सूचक का विवरण समझना आवश्यक है. और सूचक की गणना के लिए उपयोग किए जाने वाले 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

जैसा कि चित्र से देखा जा सकता है आविष्कारक द्वारा क्वांटिफाइड रोबोट द्वारा संचालित गणना की गई डीआईएफ लगभग 2.729 है, डीईए लगभग 2.646 MACD मात्रा स्तंभ लगभग 0.0831 वास्तविक ओकेकोइन एक्सचेंज चाल चार्ट डीआईएफ 2.73 दिखाता है, डीईए 2.65 MACD मात्रा स्तंभ 0.17 जैसा कि आप देख सकते हैं, पहले दो डीआईएफ, डीईए में बहुत कम अंतर है, ओकेसीओएन ने चार-पांच किया है, और एमएसीडी लगभग दोगुना है, क्योंकि ओकेसीओएन इस तरह से गणना करता हैः (DIF - DEA) * 2, आमतौर पर DIF - DEA = 2.729 - 2.646 = 0.083, यदि इसे 2 से गुणा किया जाए तो 0.166 लगभग 0.17 के बराबर है।

अन्य संकेतकों का उपयोग करने का तरीका काफी समान है।

  • तालिब -http://ta-lib.org/

    तालिब के पास तालिब के अलावा कई अन्य सूचकांक हैं। उदाहरण के लिए, हम talib.STOCHRSI का उपयोग करने का प्रयास करते हैं, और एपीआई दस्तावेज़ के विवरण को देखेंः
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 लाइन निश्चित होती है। मैं समझ नहीं पा रहा हूँ, क्या K-रेखा के डेटा को `GetRecords (() ` के माध्यम से प्राप्त नहीं किया गया है? `records [length -1] ` का मतलब है कि वर्तमान समय के साथ K-रेखा के डेटा को सीधे चार्ट में चित्रित किया जा सकता है, नए समय के साथ K-रेखा के डेटा को चार्ट के अंतिम तत्व में जोड़ा जा सकता है, है ना?

शान्दियनलीयूक्या TA.ATR (records, 14) के बारे में कोई और विस्तृत विवरण है, जो मुझे BotVS के एपीआई दस्तावेज, वीडियो और पूर्ण उपयोग मैनुअल में नहीं मिला है? जब मैं TA.ATR (records, 14) को कॉल करता हूं (पैरामीटर 30 मिनट की k-लाइन है), तो यह 177 की लंबाई का एक सरणी लौटाता है। यह सरणी का क्या अर्थ है?

फंगबेईपायथन संस्करण https://dn-filebox.qbox.me/b5d2b0ecc1e196a6bfc68eb45cd818c50d279915.png https://dn-filebox.qbox.me/157db5e2659fd13bcf552cd82fe456ba469939f8.png

फंगबेईपायथन संस्करण def main (: while true: records = _C ((exchange.GetRecords); # K-लाइन डेटा प्राप्त करता है, जो कि नीति इंटरफ़ेस के लिए डिफ़ॉल्ट रूप से सेट किए गए K-लाइन चक्र को मानता है, _C एक त्रुटि-सहिष्णु अंतर्निहित फ़ंक्शन है। macd = TA.MACD ((records); # यदि कोई पैरामीटर नहीं है, तो डिफ़ॉल्ट पैरामीटर 12, 26, 9 का उपयोग करें लॉग (("macd[0]", macd[0]); # डीआईएफ लॉग (("macd[1]", macd[1]); # डीईए लॉग (("macd[2]", macd[2]); # MACD लॉग (("macd[0] लंबाई", len ((macd[0])); # डीआईएफ लंबाई लॉग (("macd[1] लंबाई", len ((macd[1])); # डीईए लंबाई लॉग (("macd[2] लंबाई", len ((macd[2])); # MACD लंबाई Log (("records लंबाईः", len ((records)); # रिकॉर्ड की लंबाई दिखाएं。 Sleep ((1000 * 60 * 5);

छोटे सपनेK-लाइन बार का समय-सीमा यह है कि बार का आरंभ समय वास्तविक समय नहीं है, और बार का आरंभ समय अपरिवर्तित है।

होक्सहेलाटोओह, मैं पहले गलतफहमी समझता था कि यह K-लाइन के समय पर था। डिबगिंग के बाद, मैंने पाया कि BotVS का तंत्र इस तरह दिखता है, उदाहरण के लिए, आप कहते हैं कि K-लाइनः यदि मैं 1 मार्च के लिए उस दिन के लिए K-लाइन डेटा प्राप्त करना चाहता हूं, तो GetRecords (D1) को कॉल करने से कई रिकॉर्ड वापस आ जाएंगे, लेकिन उनके सभी समय सारिणी एक ही हैं। इसका मतलब यह है कि अगर मैंने 1 मार्च को 10 बजे `GetRecords(D1) ` पर कॉल किया, तो भी K लाइन का समय-सीमा 2018-03-01 **00**:00:00‬ है। इसलिए आपके द्वारा बताई गई अंतिम पंक्ति अनिश्चित होगी, जब तक कि नया समय-सीमा नहीं है, यानी 2018-03-**02** 00:00:00:00, तो 1 मार्च का समय-सीमा निश्चित नहीं है। मेरी पहली गलतफहमी यह थी कि मैंने सोचा था कि मैं 1 मार्च को 1 बजे, 2 बजे और 3 बजे कॉल करने के बाद अलग-अलग समय पर वापस आऊंगा, यानी 2018-03-01 **01**:00:00, 2018-03-01 **02**:00:00, 2018-03-01 **03**:00:00:00।

छोटे सपनेGetRecords प्राप्त K-लाइन डेटा के अलावा, शेष निश्चित है (क्योंकि चक्र समाप्त हो गया है), लेकिन यह अनिश्चित है क्योंकि चक्र समाप्त नहीं हुआ है और बंद हो रहा है। उदाहरण के लिए, दैनिक K-लाइन, वर्तमान दैनिक K-लाइन स्तंभ, जब आज समाप्त नहीं होता है, तो कोई नहीं जानता कि आज का अंत कितना होगा।

छोटे सपनेअशिष्ट!

शान्दियनलीयूसमझ गया, बहुत बहुत धन्यवाद!

छोटे सपनेहाँ, पहले K रेखा के लिए बराबर है।

शान्दियनलीयूठीक है, आपके उत्तर के लिए बहुत बहुत धन्यवाद. अंत में, पुष्टि करें, var a = TA.ATR ((records, 14)), a[a.length-1] यह हाल के k-string डेटा का एटीआर है, है ना?

छोटे सपनेहां, यह एक्सचेंज के लिए है, इसलिए एक्सचेंज आमतौर पर सीमित डेटा प्रदान करता है।

शान्दियनलीयूयह मैं समझता हूँ, टीए.एटीआर ()) मूल रूप से इनपुट रिकॉर्ड के लिए एक गणितीय ऑपरेशन है. मैं पहले स्पष्ट नहीं था, मैं पूछना चाहता था कि क्या एक्सचेंज.गेट रिकॉर्ड्स ()) फ़ंक्शन के साथ k स्ट्रिंग डेटा प्राप्त करने पर रिटर्न की लंबाई एक्सचेंज द्वारा निर्धारित की जाती है?

छोटे सपनेयह इंडिकेटर फ़ंक्शन कितना डेटा लौटाता है, जो कि K-लाइन डेटा या records के बराबर होता है, आप जो records एंटर कर रहे हैं, वे कितने लम्बे होते हैं, और वे कितने लम्बे होते हैं।

शान्दियनलीयूक्षमा करें, मैं अभी भी समझ में नहीं आया, मेरा मतलब है, यदि इस फ़ंक्शन को बुलाया जाता है, तो क्या एक्सचेंज द्वारा दिए गए डेटा की लंबाई लौटाई जाएगी? मैंने पाया कि विभिन्न समय पर इस फ़ंक्शन को बुलाया जाता है, यहां तक कि यदि पैरामीटर समान हैं, तो लौटाए जाने वाले डेटा की लंबाई अलग हो सकती है।

छोटे सपनेयह K रेखा की लंबाई द्वारा निर्धारित किया जाता है ^^

शान्दियनलीयूआपके उत्तर के लिए धन्यवाद, यह स्पष्ट है, और मैं पूछना चाहता हूं कि 117 की लंबाई क्या निर्धारित करती है?

छोटे सपनेउदाहरण के लिए, इनपुट किए गए रिकॉर्ड के लिए एक दिन के लाइन है, और गणना की गई एटीआर एक समकक्ष है, और इस समकक्ष का पहला घटाव तत्व उस दिन के लिए एक एटीआर संकेतक है। इस प्रकार, 30 मिनट के लाइन, 15 मिनट के लाइन। आप 177 की गणना करते हैं, जो कि प्रत्येक केबीआर लाइन के लिए 177 के लाइन चक्रों के लिए एटीआर संकेतक है।

छोटे सपनेएक खजूर उठाओ यदि अब K-लाइन डेटा में केवल 10 बार हैं, तो मैं MA ((15) या 15 चक्र औसत रेखा के लिए पूछता हूं, तो यह निश्चित रूप से बाहर नहीं निकल सकता है, क्योंकि केवल 10 चक्र हैं, 15 चक्रों का औसत गणना करने में असमर्थ हैं।

फंगबेईइसके अलावा, मैंने वास्तविक डिस्क स्तर पर टिक रीसेट किया, और कोई डेटा वापस नहीं आया।

फंगबेईयह एक बहुत ही अच्छा तरीका है, लेकिन यह एक बहुत ही अच्छा तरीका है।

छोटे सपनेयह उदाहरण बहुत अच्छा है, लेकिन वास्तविक उपयोग में, नवीनतम सूचक डेटा सरणी के अंत में है, जो कि सूचकांक -1 के तत्व है। इस लेख में हम आपको कुछ उपयोगी आंकड़ों के बारे में बताएंगे, जैसेः https://dn-filebox.qbox.me/b7837ea30e5d8396ffa91c48204f2fbc9a7f4504.png