TA 指标库
MACD 指数平滑异同平均线
KDJ 随机指标
RSI 强弱指标
ATR 平均真实波幅
OBV 能量潮
MA 移动平均线
EMA 指数平均数指标
BOLL 布林带
Alligator Alligator Indicator
CMF 蔡金货币流量指标
Highest 周期最高价
Lowest 周期最低价
আমরা MACD ইন্ডিকেটর নিয়ে একটি পরীক্ষা লিখতে চেষ্টা করছি, এর আগে আমরা API ডকুমেন্টেশনে MACD ট্যাগ খুলব এবং বিস্তারিত বর্ণনাটি দেখব।
ডিআইএফ, ডিইএ, ইন্ডিকেটর অ্যালগরিদম ইত্যাদিতে আগ্রহী শিক্ষার্থীরা বাইডোতে 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);
}
}
অ্যানালগ টেস্টের ফলাফলঃ
আপনি দেখতে পাচ্ছেন যে গণনা করা সূচকগুলি শুরুতে সমস্ত শূন্য এবং পরবর্তী ডেটা শুরুতে একটি নির্দিষ্ট সংখ্যা রয়েছে, কারণ সূচক প্যারামিটার দ্বারা নির্ধারিত গণনা চক্রের কারণে, রেকর্ড ডেটা এই চক্রটি পূরণ না করা পর্যন্ত সূচকগুলি গণনা করা যায় না। সুতরাং, সূচক ব্যবহারের আগে সূচকটির বর্ণনা জানা উচিত। এবং সূচক গণনা করার জন্য ব্যবহৃত 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 মিনিটের জন্য সেট করা হয়েছে, কারণ প্রভাব দেখতে কিছু সময় চালানো দরকার, তাই একটি ছোট চক্র নির্বাচন করুন। যেমনঃ
চিত্র থেকে দেখা যায়, উদ্ভাবক দ্বারা পরিমাণযুক্ত রোবট চালিত গণনা করা ডিআইএফ প্রায় ২.৭২৯, ডিইএ প্রায় ২.৬৪৬ ম্যাকড পরিমাণ স্তম্ভ প্রায় ০.০৮৩১ প্রকৃত OKCoin এক্সচেঞ্জের প্যাকেজ চার্ট DIF 2.73 দেখায়, DEA 2.65 MACD পরিমাণ স্তম্ভ 0.17 দেখায় আপনি দেখতে পাচ্ছেন যে প্রথম দুটি ডিআইএফ, ডিইএ খুব সামান্য পার্থক্য করেছে, ওকেকয়েন চার-পাঁচটি করেছে, এবং ম্যাকড প্রায় দ্বিগুণ, কারণ ওকেকয়েন এভাবে গণনা করেঃ (DIF-DEA) * 2, যা সাধারণত DIF-DEA = 2.729 - 2.646 = 0.083, যদি আবার 2 দ্বারা গুণিত হয় 0.166 প্রায় 0.17 এর সমান।
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 [length -1] ` বর্তমান সময়সীমার অধীনে K-রেখা ডেটা প্রতিনিধিত্ব করে, সরাসরি চার্টে অঙ্কিত হয়, নতুন সময়সীমার অধীনে K-রেখা ডেটা থাকে, এবং চার্টের শেষ উপাদানটিতে যুক্ত হয়, তাই না?
শানদিয়ানলিউদয়া করে TA.ATR ((records, 14) সম্পর্কে আরও বিস্তারিত ব্যাখ্যা আছে কি, যা আমি BotVS এর API ডকুমেন্টেশন, ভিডিও এবং সম্পূর্ণ ব্যবহারের নির্দেশিকায় খুঁজে পাইনি। যখন আমি TA.ATR ((records, 14) ((প্যারামিটারটি 30 মিনিটের k-লাইন) কল করি, তখন 177 এর দৈর্ঘ্যের একটি অ্যারে ফিরে আসে। দয়া করে এই অ্যারেটির অর্থ কী?
ফ্যাংবিপাইথন সংস্করণ https://dn-filebox.qbox.me/b5d2b0ecc1e196a6bfc68eb45cd818c50d279915.png https://dn-filebox.qbox.me/157db5e2659fdd13bcf552cd82fe456ba469939f8.png
ফ্যাংবিপাইথন সংস্করণ def main ((): while true: records = _C ((exchange.GetRecords); # K-লাইন ডেটা পান, নীতি ইন্টারফেসের ডিফল্ট সেটিং দ্বারা K-লাইন চক্র, _C একটি ত্রুটি-সহনশীল অন্তর্নির্মিত ফাংশন। macd = TA.MACD ((records); # যদি কোন প্যারামিটার যোগ না করা হয় তবে ডিফল্ট প্যারামিটার 12, 26, 9 ব্যবহার করা হয় Log (("macd[0]", macd[0]); # ডিআইএফ Log (("macd[1]", macd[1]); # DEA Log (("macd[2]", macd[2]); # MACD Log (("macd[0] দৈর্ঘ্য", len ((macd[0])); # ডিআইএফ দৈর্ঘ্য Log (("macd[1] দৈর্ঘ্য", len ((macd[1])); # DEA দৈর্ঘ্য Log (("macd[2] দৈর্ঘ্য", len ((macd[2])); # MACD দৈর্ঘ্য Log (("records দৈর্ঘ্যঃ", len ((records)); # রেকর্ডের দৈর্ঘ্য প্রদর্শন করুন。 Sleep ((1000 * 60 * 5);
উদ্ভাবকগণ - ক্যোটিফিকেশন - ছোট্ট স্বপ্নK-line Bar এর সময়সীমা হল এই Bar এর শুরু সময়, রিয়েল-টাইম নয়, Bar এর শুরু সময় পরিবর্তন হয় না।
হক্শেলাতোওহ, আমি আগে ভুল বুঝতে পেরেছিলাম যে এটি কে-লাইনের টাইমলাইনে ছিল। ডিবাগিংয়ের পরে, আমি দেখতে পেলাম যে বটভিএস এর প্রক্রিয়াটি এরকম, আপনার বলা কে-লাইনের উদাহরণঃ যদি আমি ১ মার্চ তারিখের জন্য K লাইন ডেটা পেতে চাই, তাহলে `GetRecords ((D1) ` কল করলে অনেক রেকর্ড ফিরে আসবে, কিন্তু তাদের ** সময়সীমা একই **, `2018-03-01 00:00:00 `. অর্থাৎ, আমি যদি ১ মার্চ ১০ টায় `GetRecords ((D1) ` কল করতাম, তাহলেও আমি পেয়ে যেতাম K লাইন টাইমফ্রেমটি ছিল ২০১৮-০৩-০১ **০০**০০ঃ০০। তাই আপনি যে শেষ লাইনটি বলেছেন তা অনিশ্চিত ছিল, নতুন টাইমফ্রেম না হওয়া পর্যন্ত, অর্থাৎ ২০১৮-০৩-**০২**০০ঃ০০ঃ০০, ১ মার্চ তারিখটি অনিশ্চিত ছিল। আমার আগে ভুল বোঝাবুঝি ছিল যে, আমি ভেবেছিলাম ১ মার্চ ১, ২, ৩ টায় কল করার পর আমি অন্য সময় ফিরে এসেছি, অর্থাৎ ২০১৮-০৩-০১ **01**:00:00,, ২০১৮-০৩-০১ **02**:00:00,, ২০১৮-০৩-০১ **03**:00:00:00।
উদ্ভাবকগণ - ক্যোটিফিকেশন - ছোট্ট স্বপ্নGetRecords (() থেকে প্রাপ্ত K-লাইন ডেটা ব্যতীত, বিয়োগের প্রথমটি, বাকিগুলি নিশ্চিত ((কারণ চক্রটি শেষ হয়েছে), বিয়োগের প্রথমটি অনিশ্চিত কারণ চক্রটি শেষ হয়নি, বন্ধটি সর্বদা পরিবর্তিত হয়। উদাহরণস্বরূপ, দৈনিক K-লাইন, বর্তমান দৈনিক K-লাইন স্তম্ভ, আজ শেষ না হলে, কেউ জানে না যে আজকের শেষ মূল্যটি কত হবে। বন্ধ।
উদ্ভাবকগণ - ক্যোটিফিকেশন - ছোট্ট স্বপ্নঅসাধারণ!
শানদিয়ানলিউআমি বুঝতে পেরেছি, অনেক ধন্যবাদ!
উদ্ভাবকগণ - ক্যোটিফিকেশন - ছোট্ট স্বপ্নহ্যাঁ সমতুল্য। প্রথম কে-লাইন বিয়োগ করুন।
শানদিয়ানলিউঠিক আছে, আপনার উত্তরের জন্য আপনাকে অনেক ধন্যবাদ। শেষ পর্যন্ত, নিশ্চিত করুন যে var a = TA.ATR ((records, 14)), a[a.length-1] এটি সর্বশেষ k-line তথ্যের ATR?
উদ্ভাবকগণ - ক্যোটিফিকেশন - ছোট্ট স্বপ্নহ্যাঁ, নির্দিষ্টভাবে, বিনিময়কে দেখলে কত ফেরত দেওয়া হয় তা নির্দিষ্ট করা যায় না; তাই বিনিময় সাধারণত সীমিত পরিমানের তথ্য প্রদান করে।
শানদিয়ানলিউআমি বুঝতে পারছি যে, TA.ATR (()) মূলত একটি গাণিতিক অপারেশন যা রেকর্ডগুলিকে প্রেরণ করা হয়। আমি আগে এটি পরিষ্কারভাবে প্রকাশ করি নি, আমি জিজ্ঞাসা করতে চাই যে ফাংশন exchange.GetRecords (()) ব্যবহার করে k স্ট্রিং ডেটা পাওয়ার সময়, ফিরে আসা দৈর্ঘ্যটি কি এক্সচেঞ্জ দ্বারা নির্ধারিত হয়?
উদ্ভাবকগণ - ক্যোটিফিকেশন - ছোট্ট স্বপ্নএই সূচক ফাংশনটি কত ডাটা ফেরত দেয় তা K-রেখা ডেটা বা records এর সাথে মিলে যায়, আপনি যে records অ্যারেটি প্রবেশ করেছেন তার দৈর্ঘ্য কত, এবং এটি কত দীর্ঘ?
শানদিয়ানলিউদুঃখিত, আমি এখনও বুঝতে পারছি না, আমি বলতে চাচ্ছি, যদি এই ফাংশনটি কল করা হয়, তাহলে কি তথ্যের দৈর্ঘ্য ফিরে আসবে যা এক্সচেঞ্জ দ্বারা দেওয়া হয়? আমি দেখতে পাচ্ছি যে বিভিন্ন সময়ে এই ফাংশনটি কল করার সময়, এমনকি যদি প্যারামিটারগুলি একই হয়, তবে তথ্যের দৈর্ঘ্য ফিরে আসতে পারে।
উদ্ভাবকগণ - ক্যোটিফিকেশন - ছোট্ট স্বপ্নএটা K এর দৈর্ঘ্যের উপর নির্ভর করে।
শানদিয়ানলিউআপনার উত্তরটির জন্য ধন্যবাদ, এখন এটা পরিষ্কার হয়ে গেছে, এবং আমি আপনাকে জিজ্ঞাসা করতে চাই, এই ১১৭ এর দৈর্ঘ্য কিসের দ্বারা নির্ধারিত হয়?
উদ্ভাবকগণ - ক্যোটিফিকেশন - ছোট্ট স্বপ্নউদাহরণস্বরূপ, ইনপুট করা রেকর্ডগুলি হল K-রেখা, এটি একটি অ্যারে যা গণনা করা হয়, এবং এর বিপরীতের প্রথম উপাদানটি হ'ল দিনের (যেমন, K-রেখা শেষ হওয়ার তারিখ) ATR সূচক। এটি 30 মিনিটের K-রেখা, 15 মিনিটের K-রেখা। আপনি 177 এর অ্যারে গণনা করেছেন যা 177 টি K-রেখা চক্র, প্রতিটি KBar রেখার ATR সূচক।
উদ্ভাবকগণ - ক্যোটিফিকেশন - ছোট্ট স্বপ্নএকটি পিঁয়াজ তুলুন। যদি এখন K-রেখা ডেটা মাত্র ১০ বার হয়, আমি MA ((১৫) অর্থাৎ ১৫টি চক্রের গড়রেখা চাই, তাহলে অবশ্যই বের করা সম্ভব হবে না, কারণ মাত্র ১০টি চক্র, ১৫টি চক্রের গড় গণনা করা সম্ভব নয়।
ফ্যাংবিএছাড়াও, আমি বাস্তব ডিস্ক স্তরের টিক রিসেট ব্যবহার করেছি, এবং কোন তথ্য ফিরে আসেনি।
ফ্যাংবিকিন্তু কেন পূর্ববর্তী তথ্যগুলি চক্রের প্রয়োজনীয়তা পূরণ করে না?
উদ্ভাবকগণ - ক্যোটিফিকেশন - ছোট্ট স্বপ্নএই উদাহরণটি বেশ ভাল, কিন্তু বাস্তব ব্যবহারে, সর্বশেষ সূচক তথ্যগুলি অ্যারেটির শেষের দিকে রয়েছে, যা সূচক -1 এর উপাদান। এই ভিডিওতে, আপনি দেখতে পাচ্ছেন যে, এই ভিডিওটি একটি অদ্ভুত ভিডিও। https://dn-filebox.qbox.me/b7837ea30e5d8396ffa91c48204f2fbc9a7f4504.png