ہینڈ ہیلپ آپ کو ایک مائی زبان کی نقل و حمل کی حکمت عملی سکھاتا ہے.

مصنف:چھوٹا سا خواب, تخلیق: 2019-11-13 09:15:56, تازہ کاری: 2023-10-17 21:23:21

img

ہینڈ ہیلپ آپ کو ایک مائی زبان کی نقل و حمل کی حکمت عملی سکھاتا ہے.

پچھلا مضمونہاتھ جو آپ کو حکمت عملی لکھنے کا طریقہ سکھاتا ہے۔میں نے ایک سادہ مائی زبان کی حکمت عملی کے لئے نقل و حمل کا تجربہ کیا ہے، اگر یہ تھوڑا سا پیچیدہ مائی زبان ہے تو، میں جاوا اسکرپٹ کی حکمت عملی کو کیسے نقل کروں؟ یہاں کیا چالیں ہیں؟

ہم پہلے اس ٹرانسپلانٹ کی حکمت عملی پر نظر ڈالتے ہیں:

(*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...*)یہ حکمت عملی بھی بے ترتیب تلاش کرنے کے لئے ایک حکمت عملی ہے، اور یہ بہت پیچیدہ نہیں ہے (پچھلے مضمون میں نسبتا زیادہ پیچیدہ ہے) ، یہ زیادہ نمائندہ حکمت عملی ہے۔ میک زبان کی حکمت عملی کی نقل و حمل، سب سے پہلے اس کی مواد کو دیکھنے کے لئے، میک زبان کی حکمت عملی کا کوڈ نسبتا آسان ہے، بنیادی طور پر اس کی حکمت عملی کی مجموعی طور پر کچھ تفہیم حاصل کرنے کے لئے، اس حکمت عملی کو ہم نے دیکھا ہے کہ کئی اشارے کے افعال کا استعمال کرتے ہوئے.EMASMA

پہیوں کی تخلیق

  • ای ایم اے یہ اشارے کا فنکشن ، جب ایف ایم زیڈ پلیٹ فارم جاوا اسکرپٹ زبان میں پالیسی لکھتا ہے تو براہ راست تیار کردہ اشارے کا فنکشن ہے۔ یعنی:TA.MA

  • ایس ایم اے اور یہ کہ ہمیں کیا کرنا چاہئے.SMAاس اشارے کو ہم نے FMZ کے ٹی اے بی بی میں پایا ہے جس میں ایس ایم اے اشارے کی حمایت نہیں کی گئی ہے، اور طالبان بی بی میں ایس ایم اے اشارے اور مائی زبان میں بھی اختلافات ہیں:imgجیسا کہ آپ دیکھ سکتے ہیں کہ پیرامیٹرز کے حصے میں دورانیہ پیرامیٹرز کے علاوہ ایک وزن پیرامیٹر بھی ہے۔

    FMZ API دستاویزات میں طالب لائبریری میں SMA اشارے کی تقریب کی وضاحت:img

    دیکھ سکتے ہیںtalib.SMAیہ ایک سادہ حرکت پذیر اوسط ہے۔ اس طرح آپ کو اپنے آپ کو ایک کام کرنے کی اجازت دی جائے گی.SMAیہ بھی ایک ضروری مہارت ہے، کیونکہ جاوا اسکرپٹ زبان کا استعمال کرتے ہوئے حکمت عملی لکھنے والے ڈویلپرز کے طور پر، اگر آپ کے پاس تیار پہیے نہیں ہیں تو، گاڑی چلتی ہے.

    اس کے علاوہ ، اس کے بارے میں کچھ بھی نہیں کہا جاسکتا ہے ، لیکن اس کے بارے میں کچھ بھی نہیں کہا جاسکتا ہے۔img

    اس کے علاوہ ، ہم نے اس بات کی تصدیق کی ہے کہ ہم نے پہلے ہی اس کے بارے میں بات کی ہے اور ہم نے اس کے بارے میں بات کی ہے۔

    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
    }
    

بھرنے کا حصہ لکھنا

حکمت عملی کے فریم ورک کا استعمالہاتھ جو آپ کو حکمت عملی لکھنے کا طریقہ سکھاتا ہے۔اس مضمون میں ایک ہی فریم ورک ہے، جس میں بنیادی طور پر دو حصے ہیں:img

اس کے علاوہ ، ہم نے اپنے صارفین کے لئے ایک بہت اچھا کام کیا ہے۔img

ہم مائی زبان کے اس حصے کی خصوصیات کو ایک ایک جملے کے ساتھ دیکھتے ہیں:

  • 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);

    کا استعمال کرتے ہوئے حساب لگایاAPESAاعداد و شمار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 کے لئے گولڈن فورک ، مردہ فورک کا فیصلہ ٹریڈنگ کھولنے کی شرط کے طور پر کیا جاتا ہے۔ یہ نوٹ کرنا ضروری ہے کہ پہلا کراس سگنل استعمال کیا جاتا ہے۔ اس کے علاوہ ، ہم نے اس کے بارے میں مزید معلومات حاصل کیں ، اور ہم نے اس کے بارے میں مزید معلومات حاصل کی۔img

مائی زبان کی حکمت عملی کے ذریعے عملی طور پر چلانے کا مشاہدہ کیا جاسکتا ہے ، جب کھلنے والے مقام کا پتہ لگانے کا اشارہ ہوتا ہے تو ، یہ معلوم ہوتا ہے کہ کھلنے والے مقام کے پچھلے 2 باروں کے مقام کو گولڈن فورک کیا ہے۔ مندرجہ بالا گراف میں واضح طور پر دیکھا جاسکتا ہے۔img img

سگنل کا پتہ لگانے والے حصے کا بھرنے کا کوڈ لکھا جاسکتا ہے:

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   
}

یہاں یہ سوچنے کی ضرورت ہے کہ مائی زبان میں ایس پی کے ، بی پی کے ہدایات کو مندرجہ بالا کوڈ کے ساتھ کیوں لاگو کیا جاسکتا ہے۔

دوبارہ جانچ پڑتال

دوبارہ ترتیب دیں:img

مائی زبان کا ورژن:img

جاوا اسکرپٹ ورژن کی جانچ پڑتال:img img

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

پڑھنے کا شکریہ


متعلقہ

مزید