پچھلا مضمونہاتھ جو آپ کو حکمت عملی لکھنے کا طریقہ سکھاتا ہے۔میں نے ایک سادہ مائی زبان کی حکمت عملی کے لئے نقل و حمل کا تجربہ کیا ہے، اگر یہ تھوڑا سا پیچیدہ مائی زبان ہے تو، میں جاوا اسکرپٹ کی حکمت عملی کو کیسے نقل کروں؟ یہاں کیا چالیں ہیں؟
ہم پہلے اس ٹرانسپلانٹ کی حکمت عملی پر نظر ڈالتے ہیں:
(*backtest
start: 2019-05-01 00:00:00
end: 2019-11-12 00:00:00
period: 1d
exchanges: [{"eid":"Futures_OKCoin","currency":"BTC_USD"}]
args: [["SlideTick",10,126961],["ContractType","quarter",126961]]
*)
N1:=10;
N2:=21;
AP:=(HIGH+LOW+CLOSE)/3;
ESA:=EMA(AP,N1);
D:=EMA(ABS(AP-ESA),N1);
CI:=(AP-ESA)/(0.015*D);
TCI:=EMA(CI,N2);
WT1:TCI;
WT2:SMA(WT1,4,1);
AA:=CROSS(WT1,WT2);
BB:=CROSSDOWN(WT1,WT2);
REF(AA,1),BPK;
REF(BB,1),SPK;
مائی زبان کی حکمت عملی کا آغاز(*backtest...*)
یہ حکمت عملی بھی بے ترتیب تلاش کرنے کے لئے ایک حکمت عملی ہے، اور یہ بہت پیچیدہ نہیں ہے (پچھلے مضمون میں نسبتا زیادہ پیچیدہ ہے) ، یہ زیادہ نمائندہ حکمت عملی ہے۔ میک زبان کی حکمت عملی کی نقل و حمل، سب سے پہلے اس کی مواد کو دیکھنے کے لئے، میک زبان کی حکمت عملی کا کوڈ نسبتا آسان ہے، بنیادی طور پر اس کی حکمت عملی کی مجموعی طور پر کچھ تفہیم حاصل کرنے کے لئے، اس حکمت عملی کو ہم نے دیکھا ہے کہ کئی اشارے کے افعال کا استعمال کرتے ہوئے.EMA
,SMA
:
ای ایم اے
یہ اشارے کا فنکشن ، جب ایف ایم زیڈ پلیٹ فارم جاوا اسکرپٹ زبان میں پالیسی لکھتا ہے تو براہ راست تیار کردہ اشارے کا فنکشن ہے۔ یعنی:TA.MA
ایس ایم اے
اور یہ کہ ہمیں کیا کرنا چاہئے.SMA
اس اشارے کو ہم نے FMZ کے ٹی اے بی بی میں پایا ہے جس میں ایس ایم اے اشارے کی حمایت نہیں کی گئی ہے، اور طالبان بی بی میں ایس ایم اے اشارے اور مائی زبان میں بھی اختلافات ہیں:جیسا کہ آپ دیکھ سکتے ہیں کہ پیرامیٹرز کے حصے میں دورانیہ پیرامیٹرز کے علاوہ ایک وزن پیرامیٹر بھی ہے۔
FMZ API دستاویزات میں طالب لائبریری میں SMA اشارے کی تقریب کی وضاحت:
دیکھ سکتے ہیںtalib.SMA
یہ ایک سادہ حرکت پذیر اوسط ہے۔
اس طرح آپ کو اپنے آپ کو ایک کام کرنے کی اجازت دی جائے گی.SMA
یہ بھی ایک ضروری مہارت ہے، کیونکہ جاوا اسکرپٹ زبان کا استعمال کرتے ہوئے حکمت عملی لکھنے والے ڈویلپرز کے طور پر، اگر آپ کے پاس تیار پہیے نہیں ہیں تو، گاڑی چلتی ہے.
اس کے علاوہ ، اس کے بارے میں کچھ بھی نہیں کہا جاسکتا ہے ، لیکن اس کے بارے میں کچھ بھی نہیں کہا جاسکتا ہے۔
اس کے علاوہ ، ہم نے اس بات کی تصدیق کی ہے کہ ہم نے پہلے ہی اس کے بارے میں بات کی ہے اور ہم نے اس کے بارے میں بات کی ہے۔
function SMA (arr, n, m) {
var sma = []
var currSMA = null
for (var i = 0; i < arr.length; i++) {
if (arr[i] && !isNaN(arr[i])) {
if (!currSMA) {
currSMA = arr[i]
sma.push(currSMA)
continue
}
// [M*C2+(N-M)*S1]/N
currSMA = (m * arr[i] + (n - m) * currSMA) / n
sma.push(currSMA)
} else {
sma.push(NaN)
}
}
return sma
}
حکمت عملی کے فریم ورک کا استعمالہاتھ جو آپ کو حکمت عملی لکھنے کا طریقہ سکھاتا ہے۔اس مضمون میں ایک ہی فریم ورک ہے، جس میں بنیادی طور پر دو حصے ہیں:
اس کے علاوہ ، ہم نے اپنے صارفین کے لئے ایک بہت اچھا کام کیا ہے۔
ہم مائی زبان کے اس حصے کی خصوصیات کو ایک ایک جملے کے ساتھ دیکھتے ہیں:
1、AP:=(HIGH+LOW+CLOSE)/3;
اس جملے کو یہ سمجھا جاسکتا ہے کہ K لائن کے اعداد و شمار میں ہر BAR کی سب سے زیادہ قیمت ، کم ترین قیمت ، اختتامی قیمت کو جمع کریں اور 3 سے تقسیم کریں ، اوسط کا حساب لگائیں ، اور پھر ایک صف کے طور پر محفوظ کریں ، ہر BAR کے لئے ایک کے مطابق۔ اس کے بارے میں مزید جانیں:
function CalcAP (r) { // AP:=(HIGH+LOW+CLOSE)/3;
var arrAP = [] // 声明一个空数组
for (var i = 0; i < r.length; i++) { // r为传入的K线数据,是一个数组,用for遍历这个数组
v = (r[i].High + r[i].Low + r[i].Close) / 3 // 计算 平均值
arrAP.push(v) // 添加在 arrAP数组的尾部,arrAP是空的时候尾部就是第一个。
}
return arrAP // 返回 这个平均值数组,即麦语言中计算的 AP
}
اس فنکشن کو مرکزی لوپ میں OnTick فنکشن میں بلایا جاسکتا ہے ، جیسے:
// 计算指标
// AP
var ap = CalcAP(records)
2، اے پی کے حساب کے بعد، پھر حساب.ESA:=EMA(AP,N1);
:
یہاں آپ کو پچھلے مرحلے میں شمار کیا گیا اے پی کا ڈیٹا استعمال کرنا ہے اور ای ایس اے کا حساب لگانا ہے، اور یہ ای ایس اے اے پی کا "انڈیکس موونگ ایوریج" ہے، یعنی ای ایم اے۔ لہذا ہم اے پی کو اعداد و شمار کے طور پر استعمال کرتے ہیں، اور این 1 کو ای ایم اے کے پیرامیٹرز کے طور پر استعمال کرتے ہیں، تاکہ ای ایم اے کا حساب لگایا جاسکے۔
function CalcESA (ap, n1) { // ESA:=EMA(AP,N1);
if (ap.length <= n1) { // 如果AP的长度小于指标参数,是无法计算出有效数据的,这个时候让函数返回false。
return false
}
return TA.EMA(ap, n1)
}
3、D:=EMA(ABS(AP-ESA),N1);
کا استعمال کرتے ہوئے حساب لگایاAP
、ESA
اعداد و شمارD
◄
یہاں آپ کوڈ کے تبصرے دیکھ سکتے ہیں، کچھ اشارے کے حساب کی تکنیک.
function CalcD (ap, esa, n1) { // D:=EMA(ABS(AP-ESA),N1);
var arrABS_APminusESA = []
if (ap.length != esa.length) {
throw "ap.length != esa.length"
}
for (var i = 0; i < ap.length; i++) {
// 计算指标数值时,必须判断一下数据的有效性,因为前几次EMA计算可能数组中的开始部分的数据是NaN,或者null
// 所以必须判断,参与计算的数据都是有效数值才能进行,如果有任何无效数值,就用NaN向arrABS_APminusESA填充
// 这样计算得到的数据,每个位置和之前的数据都是一一对应的,不会错位。
if (ap[i] && esa[i] && !isNaN(ap[i]) && !isNaN(esa[i])) {
v = Math.abs(ap[i] - esa[i]) // 根据ABS(AP-ESA) , 具体计算数值,然后放入arrABS_APminusESA数组
arrABS_APminusESA.push(v)
} else {
arrABS_APminusESA.push(NaN)
}
}
if (arrABS_APminusESA.length <= n1) {
return false
}
return TA.EMA(arrABS_APminusESA, n1) // 计算数组arrABS_APminusESA的EMA指标,得到数据D(数组结构)
}
4、CI:=(AP-ESA)/(0.015*D);
یہ حساب کتاب کا طریقہ قدم 1 کی طرح ہے، براہ راست کوڈ کو باہر نکالنے کے لئے.
function CalcCI (ap, esa, d) { // CI:=(AP-ESA)/(0.015*D);
var arrCI = []
if (ap.length != esa.length || ap.length != d.length) {
throw "ap.length != esa.length || ap.length != d.length"
}
for (var i = 0; i < ap.length; i++) {
if (ap[i] && esa[i] && d[i] && !isNaN(ap[i]) && !isNaN(esa[i]) && !isNaN(d[i])) {
v = (ap[i] - esa[i]) / (0.015 * d[i])
arrCI.push(v)
} else {
arrCI.push(NaN)
}
}
if (arrCI.length == 0) {
return false
}
return arrCI
}
TCI:=EMA ((CI،N2) ؛ یہ صرف سی آئی آر کے لئے ای ایم اے کا حساب لگاتا ہے۔
function CalcTCI (ci, n2) { // TCI:=EMA(CI,N2);
if (ci.length <= n2) {
return false
}
return TA.EMA(ci, n2)
}
WT2:SMA ((WT1,4,1) ؛
آخر میں، ہم نے پہیوں کا استعمال کیا جو ہم نے پہلے بنائے تھے.SMA
فنکشن۔
function CalcWT2 (wt1) { // WT2:SMA(WT1,4,1);
if (wt1.length <= 4) {
return false
}
return SMA(wt1, 4, 1) // 使用我们自己实现的SMA函数计算出wt1的SMA指标。
}
اس کے علاوہ ، یہ بھی ممکن ہے کہ آپ کو اپنے کاروبار کے بارے میں مزید جاننے کی ضرورت ہے۔
AA:=CROSS(WT1,WT2);
BB:=CROSSDOWN(WT1,WT2);
REF(AA,1),BPK;
REF(BB,1),SPK;
مائی زبان کے اس کوڈ کو پڑھنے سے معلوم ہوتا ہے کہ دو اشارے لائنوں WT1 ، WT2 کے لئے گولڈن فورک ، مردہ فورک کا فیصلہ ٹریڈنگ کھولنے کی شرط کے طور پر کیا جاتا ہے۔ یہ نوٹ کرنا ضروری ہے کہ پہلا کراس سگنل استعمال کیا جاتا ہے۔ اس کے علاوہ ، ہم نے اس کے بارے میں مزید معلومات حاصل کیں ، اور ہم نے اس کے بارے میں مزید معلومات حاصل کی۔
مائی زبان کی حکمت عملی کے ذریعے عملی طور پر چلانے کا مشاہدہ کیا جاسکتا ہے ، جب کھلنے والے مقام کا پتہ لگانے کا اشارہ ہوتا ہے تو ، یہ معلوم ہوتا ہے کہ کھلنے والے مقام کے پچھلے 2 باروں کے مقام کو گولڈن فورک کیا ہے۔ مندرجہ بالا گراف میں واضح طور پر دیکھا جاسکتا ہے۔
سگنل کا پتہ لگانے والے حصے کا بھرنے کا کوڈ لکھا جاسکتا ہے:
if ((_State == IDLE || _State == SHORT) && wt1[wt1.length - 4] < wt2[wt2.length - 4] && wt1[wt1.length - 3] > wt2[wt2.length - 3]) {
if (_State == IDLE) {
_State = OPENLONG
Log("OPENLONG") // 测试
}
if (_State == SHORT) {
_State = COVERSHORT
Log("COVERSHORT") // 测试
}
isOK = false
}
if ((_State == IDLE || _State == LONG) && wt1[wt1.length - 4] > wt2[wt2.length - 4] && wt1[wt1.length - 3] < wt2[wt2.length - 3]) {
if (_State == IDLE) {
_State = OPENSHORT
Log("OPENSHORT") // 测试
}
if (_State == LONG) {
_State = COVERLONG
Log("COVERLONG") // 测试
}
isOK = false
}
یہاں یہ سوچنے کی ضرورت ہے کہ مائی زبان میں ایس پی کے ، بی پی کے ہدایات کو مندرجہ بالا کوڈ کے ساتھ کیوں لاگو کیا جاسکتا ہے۔
دوبارہ ترتیب دیں:
مائی زبان کا ورژن:
جاوا اسکرپٹ ورژن کی جانچ پڑتال:
OnTick فنکشن کے شروعاتی حصے کا کوڈ ، جو ریٹریکٹ کی رفتار کو تھوڑا تیز کرنے کے لئے استعمال کیا جاتا ہے ، اس کی حکمت عملی کو بندش کی قیمت کے ماڈل پر چلنے کے لئے ہے ، جس کا مفاد تفصیل سے تجزیہ کیا جاسکتا ہے۔
function OnTick(){
// 驱动策略的行情处理部分
var records = _C(exchange.GetRecords)
if (records[records.length - 1].Time == preTime) {
if (isOK) {
Sleep(500)
return
}
} else {
preTime = records[records.length - 1].Time
}
...
..
.
مکمل تعلیمی حکمت عملی کا کوڈ:https://www.fmz.com/strategy/174457