
ٹریڈنگ میں تکنیکی تجزیہ کرتے وقت، تاجر سٹاک کی قیمت کے ڈیٹا کا تجزیہ اور مطالعہ کرتے ہیں جیسا کہ عام طور پر تقسیم کیے گئے ڈیٹا کی طرح ہوتا ہے۔ تاہم، اسٹاک کی قیمت کے اعداد و شمار کی تقسیم معیاری عام تقسیم کے مطابق نہیں ہے۔Fisher Transformationیہ ایک ایسا طریقہ ہے جو قیمت کے ڈیٹا کو عام تقسیم میں تبدیل کر سکتا ہے۔Fisher Transformationمارکیٹ کے اعداد و شمار کو ہموار کریں اور کچھ تیز چھوٹے چکروں کو ختم کریں۔ موجودہ دن اور پچھلے دن کے اشارے کے کراس اوور کا استعمال کرکے تجارتی سگنل تیار کیے جا سکتے ہیں۔
کے بارے میںFisher TransformBaidu اور Zhihu کے بارے میں بہت ساری معلومات ہیں، اس لیے میں یہاں تفصیلات میں نہیں جاؤں گا۔
mid=(low + high) / 2
lowestLow = 周期内最低价,highestHigh = 周期内最高价。
ratio0 اور 1 کے درمیان ایک مستقل ہے، مثال کے طور پر، 0.5 یا 0.33):
xاستعمال کریںFisherبدلنا، حاصل کرناFisherاشاریہ:
اشارے الگورتھم کے مطابق اسے مرحلہ وار لاگو کریں۔ واضح رہے کہ یہ الگورتھم ایک تکراری الگورتھم ہے۔preX,preFishابتدائی طور پر 0 پر سیٹ کیا گیا۔ کے لیےMath.logیعنی فطری مستقل ای کے ساتھ لوگارتھم کو بنیاد کے طور پر تلاش کرنا ہے۔ اس کے علاوہ، مندرجہ بالا الگورتھم میں x کی اصلاح کا ذکر نہیں ہے، اور میں نے اسے لکھتے وقت تقریباً اس مسئلے کو نظر انداز کر دیا:
x کی قدر درست کریں اگر یہ 0.99 سے زیادہ ہے تو اسے 0.999 پر مجبور کیا جائے گا۔ اگر یہ -0.99 سے کم ہے تو وہی لاگو ہوتا ہے۔
if (x > 0.99) {
x = 0.999
} else if (x < -0.99) {
x = -0.999
}
پہلی بار جب میں نے اس الگورتھم اور اشارے کو دیکھا، میں نے الگورتھم کے مطابق ان کی پیوند کاری کی۔ میں نے اس نفاذ کی تصدیق نہیں کی ہے جو طلباء تحقیق میں دلچسپی رکھتے ہیں وہ اس بات کی تصدیق کر سکتے ہیں کہ آیا اس میں کوئی خامی ہے۔ غلطی کی نشاندہی کرنے کا بہت شکریہ۔
Fisher Transformاشارے الگورتھم سورس کوڈ:
function getHighest(arr, period) {
if (arr.length == 0 || arr.length - period < 0) {
return null
}
var beginIndex = arr.length - period
var ret = arr[beginIndex].High
for (var i = 0 ; i < arr.length - 1 ; i++) {
if (arr[i + 1].High > ret) {
ret = arr[i + 1].High
}
}
return ret
}
function getLowest(arr, period) {
if (arr.length == 0 || arr.length - period < 0) {
return null
}
var beginIndex = arr.length - period
var ret = arr[beginIndex].Low
for (var i = 0 ; i < arr.length - 1 ; i++) {
if (arr[i + 1].Low < ret) {
ret = arr[i + 1].Low
}
}
return ret
}
function calcFisher(records, ratio, period) {
var preFish = 0
var preX = 0
var arrFish = []
// 当K线长度不足,不满足周期时
if (records.length < period) {
for (var i = 0 ; i < records.length ; i++) {
arrFish.push(0)
}
return arrFish
}
// 遍历K线
for (var i = 0 ; i < records.length ; i++) {
var fish = 0
var x = 0
var bar = records[i]
var mid = (bar.High + bar.Low) / 2
// 当前BAR不足period计算时
if (i < period - 1) {
fish = 0
preFish = 0
arrFish.push(fish)
continue
}
// 计算周期内最高价和最低价
var bars = []
for (var j = 0 ; j <= i ; j++) {
bars.push(records[j])
}
var lowestLow = getLowest(bars, period)
var highestHigh = getHighest(bars, period)
// 价变参数
x = ratio * 2 * ((mid - lowestLow) / (highestHigh - lowestLow) - 0.5) + (1 - ratio) * preX
if (x > 0.99) {
x = 0.999
} else if (x < -0.99) {
x = -0.999
}
preX = x
fish = 0.5 * Math.log((1 + x) / (1 - x)) + 0.5 * preFish
preFish = fish
arrFish.push(fish)
}
return arrFish
}
FMZ پر ڈرائنگ بہت آسان ہے، اسٹریٹجی اسکوائر:https://www.fmz.com/squareحوالہ یا تلاش کے لیے اوپر بہت سی مثالیں موجود ہیں۔
مضمون کی طوالت کی وجہ سے، درج ذیل ڈرائنگ ٹیسٹ کوڈ کو چلنے سے پہلے مندرجہ بالا calcFisher فنکشن کے نفاذ کو شامل کرنے کی ضرورت ہے۔
var cfg = { // 用来初始化设置图表的对象(即图表设置)
plotOptions: {
candlestick: {
color: '#d75442', // 颜色值
upColor: '#6ba583' // 颜色值
}
},
title: { text: 'Fisher Transform'}, //标题
subtitle: {text: ''}, //副标题
plotOptions: {
candlestick: {
tooltip: {
pointFormat:
'<span style="color:{point.color}">\u25CF</span> <b> {series.name}</b><br/>' +
'开盘: {point.open}<br/>' +
'最高: {point.high}<br/>' +
'最低: {point.low}<br/>' +
'收盘: {point.close}<br/>'
}
}
},
yAxis: [{
title: {
text: 'K线行情'
},
height: '70%',
lineWidth: 1
}, {
title: {
text: 'Fisher Transform'
},
top: '75%',
height: '30%',
offset: 0,
lineWidth: 1
}],
series: [//系列
{
type: 'candlestick',
yAxis: 0,
name: 'K线',
id: 'KLine',
// 控制走势为跌的蜡烛颜色
color: 'green',
lineColor: 'green',
// 控制走势为涨的蜡烛颜色
upColor: 'red',
upLineColor: 'red',
data: []
},{
type: 'line', // 设置当前的数据序列 类型为: 线
yAxis: 1, // 使用的y轴 为索引为 0 的y轴(highcharts 图表 可以有 多个 y 坐标轴,这里指定索引0的y轴)
showInLegend: true, //
name: 'fish', // 根据 函数传入的 参数 label 设置
lineWidth: 1,
data: [], // 数据序列的数据项
tooltip: { // 工具提示
valueDecimals: 2 // 值的小数点 保留5位
}
},{
type: 'line', // 设置当前的数据序列 类型为: 线
yAxis: 1, // 使用的y轴 为索引为 0 的y轴(highcharts 图表 可以有 多个 y 坐标轴,这里指定索引0的y轴)
showInLegend: true, //
name: 'preFish', // 根据 函数传入的 参数 label 设置
lineWidth: 1,
data: [], // 数据序列的数据项
tooltip: { // 工具提示
valueDecimals: 2 // 值的小数点 保留5位
}
}
]
}
var chart = Chart(cfg)
function main() {
var ts = 0
chart.reset()
while (true) {
var r = exchange.GetRecords()
var fisher = calcFisher(r, 0.33, 10)
if (!r || !fisher) {
Sleep(500)
continue
}
for (var i = 0; i < r.length; i++){
if (ts == r[i].Time) {
chart.add([0,[r[i].Time, r[i].Open, r[i].High, r[i].Low, r[i].Close], -1])
chart.add([1,[r[i].Time, fisher[i]], -1])
if (i - 1 >= 0) {
chart.add([2,[r[i].Time, fisher[i - 1]], -1])
}
}else if (ts < r[i].Time) {
chart.add([0,[r[i].Time, r[i].Open, r[i].High, r[i].Low, r[i].Close]])
chart.add([1,[r[i].Time, fisher[i]]])
if (i - 1 >= 0) {
chart.add([2,[r[i].Time, fisher[i - 1]]])
}
ts = r[i].Time
}
}
}
}

لہذا، FMZ پر ڈیٹا، ڈسپلے گرافکس، اور ڈیزائن کی حکمت عملیوں کا مطالعہ کرنا بہت آسان ہے۔ یہ صرف ایک نقطہ آغاز ہے، اور اساتذہ اور طلباء تبصرے چھوڑنے کا خیرمقدم کرتے ہیں۔