
پچھلا مضمونآپ کو مرحلہ وار حکمت عملی لکھنے کا طریقہ سکھائیں - میری زبان کی حکمت عملی کو ٹرانسپلانٹ کریں۔مضمون میں، ہم نے ایک سادہ مائی زبان کی حکمت عملی پر ایک ٹرانسپلانٹیشن ٹیسٹ کیا ہے، اگر یہ ایک قدرے پیچیدہ مائی زبان کی حکمت عملی ہے، تو اس کے لیے کیا تکنیکیں ہیں؟
آئیے پہلے اس بار پیوند کاری کی حکمت عملی دیکھتے ہیں:
(*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:
EMA
FMZ پلیٹ فارم پر JavaScript زبان میں حکمت عملی لکھتے وقت اس اشارے کی فنکشن میں ریڈی میڈ انڈیکیٹر لائبریری فنکشن ہوتا ہے۔ ابھی:TA.MA
SMA
ہمیں کیا کرنے کی ضرورت ہے۔SMAہم نے پایا کہ FMZ کی TA لائبریری میں SMA اشارے کا فنکشن تعاون یافتہ نہیں ہے، طالب لائبریری اور مائی زبان میں SMA اشارے کے درمیان بھی فرق ہے۔
جیسا کہ آپ دیکھ سکتے ہیں، پیریڈ پیرامیٹر کے علاوہ، پیرامیٹر کے حصے میں وزن کا پیرامیٹر بھی ہوتا ہے۔
FMZ API دستاویزات میں talib لائبریری میں SMA اشارے کے فنکشن کی تفصیل یہ ہے:

نظر آنے والاtalib.SMAایک سادہ موونگ ایوریج انڈیکیٹر ہے۔
اس طرح، آپ صرف ایک خود سے لاگو کر سکتے ہیں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
}
پالیسی فریم ورک کا استعمالآپ کو مرحلہ وار حکمت عملی لکھنے کا طریقہ سکھائیں - میری زبان کی حکمت عملی کو ٹرانسپلانٹ کریں۔مضمون میں ایک ہی فریم ورک بنیادی طور پر دو حصوں کو بھرتا ہے:

سب سے پہلے، مارکیٹ ڈیٹا پروسیسنگ اور اشارے کا حساب کتاب کریں۔

ہم مائی زبان کے افعال کو ایک ایک کرکے نمٹائیں گے:
AP:=(HIGH+LOW+CLOSE)/3;اس جملے کو K-line ڈیٹا میں ہر 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)
ESA:=EMA(AP,N1);:یہاں ہمیں ESA کا حساب لگانے کے لیے پچھلے مرحلے میں شمار کیے گئے AP ڈیٹا کو استعمال کرنے کی ضرورت ہے۔ EMA اشارے کا حساب لگانے کے لیے EMA اشارے کا پیرامیٹر۔
function CalcESA (ap, n1) { // ESA:=EMA(AP,N1);
if (ap.length <= n1) { // 如果AP的长度小于指标参数,是无法计算出有效数据的,这个时候让函数返回false。
return false
}
return TA.EMA(ap, n1)
}
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(数组结构)
}
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
}
function CalcTCI (ci, n2) { // TCI:=EMA(CI,N2);
if (ci.length <= n2) {
return false
}
return TA.EMA(ci, n2)
}
یہ آخری مرحلہ وہیل استعمال کرتا ہے جسے ہم نے پہلے بنایا تھا۔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 کے گولڈن کراس اور ڈیڈ کراس ججمنٹ کو پوزیشن کھولنے کی شرائط کے طور پر استعمال کیا جاتا ہے۔
مائیکروفون کی زبان کے ساتھ حکمت عملی کو براہ راست بیک ٹیسٹ کریں، اور ہم مشاہدہ کرتے ہیں:

Mai Language Strategy کے اصل آپریشن کے ذریعے، یہ دیکھا جا سکتا ہے کہ جب افتتاحی مقام پر سگنل کا پتہ چلتا ہے، تو یہ دراصل پتہ لگا رہا ہوتا ہے کہ آیا ابتدائی نقطہ سے پہلے کی پوزیشن 2 BARs گولڈن کراس ہے۔ مندرجہ بالا تصویر سے یہ واضح طور پر دیکھا جا سکتا ہے:

سگنل کا پتہ لگانے والے حصے کا فلنگ کوڈ اس طرح لکھا جا سکتا ہے:
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
}
یہاں ہم اس بارے میں سوچ سکتے ہیں کہ مائی زبان کے SPK اور BPK ہدایات کو مذکورہ کوڈ کے ساتھ کیوں لاگو کیا جا سکتا ہے۔
بیک ٹیسٹ کنفیگریشن:

مائی زبان کے ورژن کا بیک ٹیسٹ:

جاوا اسکرپٹ ورژن بیک ٹیسٹ:

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