[TOC]

मात्रात्मक व्यापार में, पारंपरिक कैंडलस्टिक चार्ट सबसे अधिक इस्तेमाल किए जाने वाले डेटा प्रतिनिधित्व रूपों में से एक है, लेकिन इसमें कुछ सीमाएँ भी हैं, जैसे उतार-चढ़ाव या अत्यधिक शोर के प्रति असंवेदनशीलता। मूल्य प्रवृत्तियों को अधिक स्पष्ट रूप से देखने के लिए, व्यापारी अक्सर कुछ बेहतर चार्ट का उपयोग करते हैं, जैसे:
यह लेख एफएमजेड क्वांटिटेटिव ट्रेडिंग प्लेटफॉर्म पर साधारण के-लाइन के आधार पर ब्रिक चार्ट और औसत के-लाइन डेटा की गणना करने का तरीका बताएगा, तथा रणनीति डेवलपर्स को बाजार के रुझानों का अधिक सहजता से विश्लेषण करने में मदद करने के लिए ड्राइंग प्रभाव दिखाएगा।
रेन्को चार्ट “ईंटों” को इकाइयों के रूप में उपयोग करता है, और एक नई ईंट केवल तभी खींची जाती है जब कीमत एक निश्चित सीमा (जैसे $100) से अधिक उतार-चढ़ाव करती है।
ट्रेडिंग सिग्नल व्याख्या
मुख्य गणना तर्क:
ईंट आरेख (रेन्को) की गणना करें और कोड बनाएं:
/*backtest
start: 2025-05-01 00:00:00
end: 2025-06-06 00:00:00
period: 1h
basePeriod: 1m
exchanges: [{"eid":"Binance","currency":"ETH_USDT","balance":1000,"stocks":0.5}]
*/
let globalbricks = []
let lastBarTime = 0
function getBricks(r, brickSize, sourceAttribute, lastPrice) {
for (let i = 1; i < r.length; i++) {
let bar = r[i]
let price = bar[sourceAttribute]
let time = bar.Time
if (time < lastBarTime) {
continue
}
// 遍历原始K线数据
while (Math.abs(price - lastPrice) >= brickSize) {
if (globalbricks.length > 0 && time == globalbricks[globalbricks.length - 1].Time) {
time = globalbricks[globalbricks.length - 1].Time + 1000
}
// 构造砖块
let brick = {
Time: time,
Open: lastPrice,
Close: 0,
High: 0,
Low: 0
}
if (price > lastPrice) {
// 上涨砖块
lastPrice += brickSize
brick.Close = lastPrice
brick.High = lastPrice
brick.Low = brick.Open
} else {
// 下跌砖块
lastPrice -= brickSize
brick.Close = lastPrice
brick.High = brick.Open
brick.Low = lastPrice
}
// 放入数组
globalbricks.push(brick)
// time 累加1秒,防止一根BAR分成多块brick时断开
time += 1000
}
lastBarTime = bar.Time
}
return globalbricks
}
function getRenko(r, brickSize, sourceAttribute) {
// 原始K线数据如果不符合计算要求,直接返回
if (!r || r.length <= 0) {
return null
}
if (globalbricks.length == 0) {
return getBricks(r, brickSize, sourceAttribute, r[0][sourceAttribute])
} else {
return getBricks(r, brickSize, sourceAttribute, globalbricks[globalbricks.length - 1].Close)
}
}
function main() {
let c = KLineChart({
overlay: true
})
while (true) {
let r = _C(exchange.GetRecords)
let bricks = getRenko(r, 100, "Close")
bricks.forEach(function (brick, index) {
c.begin(brick)
c.close()
})
Sleep(1000)
}
}
बैकटेस्टिंग

हेइकिन आशी पारंपरिक के-लाइन की एक समतलीकरण प्रक्रिया है
गणना पद्धति इस प्रकार है:
HA_Close = (Open + High + Low + Close) / 4
HA_Open = (前一根 HA_Open + 前一根 HA_Close) / 2
HA_High = max(High, HA_Open, HA_Close)
HA_Low = min(Low, HA_Open, HA_Close)
Heikin Ashi 本质上是一种移动平均滤波的 K 线,具有趋势持续性更强的特点。
प्रवृत्ति निर्णय और संकेत पहचान
कार्यान्वयन कोड और ड्राइंग:
/*backtest
start: 2025-05-01 00:00:00
end: 2025-06-06 00:00:00
period: 1h
basePeriod: 1h
exchanges: [{"eid":"Binance","currency":"ETH_USDT","balance":1000,"stocks":0.5}]
*/
function toHeikinAshi(records) {
if (!records || records.length == 0) {
return null
}
let haRecords = []
for (let i = 0; i < records.length; i++) {
let r = records[i]
let ha = {}
ha.Time = r.Time
ha.Close = (r.Open + r.High + r.Low + r.Close) / 4
if (i === 0) {
// 第一根 Heikin Ashi 的开盘价用普通K线的开盘价和收盘价的均值
ha.Open = (r.Open + r.Close) / 2
} else {
// 后续每根的开盘价 = 上一根Heikin Ashi开盘价和收盘价均值
ha.Open = (haRecords[i - 1].Open + haRecords[i - 1].Close) / 2
}
ha.High = Math.max(r.High, ha.Open, ha.Close)
ha.Low = Math.min(r.Low, ha.Open, ha.Close)
haRecords.push(ha)
}
return haRecords
}
function main() {
let c = KLineChart({
overlay: true
})
while (true) {
let r = _C(exchange.GetRecords)
let heikinAshiRecords = toHeikinAshi(r)
heikinAshiRecords.forEach(function (bar, index) {
c.begin(bar)
c.close()
})
Sleep(1000)
}
}
बैकटेस्टिंग

रेन्को चार्ट और हेइकिन आशी ट्रेंड ट्रेडर्स के लिए शक्तिशाली उपकरण हैं:
बैकटेस्टिंग और वास्तविक समय सत्यापन को संयोजित करने, अपने स्वयं के ट्रेडिंग उत्पादों और चक्रों के अनुकूल चार्ट समाधान चुनने और एक व्यक्तिगत मात्रात्मक ट्रेडिंग प्रणाली बनाने की सिफारिश की जाती है।