आपको रणनीतियाँ लिखने के लिए सिखाएं -- MyLanguage रणनीति प्रत्यारोपित करें (उन्नत)

लेखक:लिडिया, बनाया गयाः 2022-12-26 18:56:00, अद्यतन किया गयाः 2023-09-20 09:46:34

img

आपको रणनीतियाँ लिखने के लिए सिखाएं MyLanguage रणनीति प्रत्यारोपित करें (उन्नत)

पिछले लेख मेंआपको रणनीतियाँ लिखने के लिए सिखाएँ -- MyLanguage रणनीति प्रत्यारोपित करें, एक सरल MyLanguage रणनीति प्रत्यारोपण के लिए परीक्षण किया गया है। यदि यह एक अधिक जटिल MyLanguage है, यह एक जावास्क्रिप्ट भाषा रणनीति में कैसे प्रत्यारोपित किया जा सकता है? क्या कौशल वहाँ हैं?

आइए पहले प्रत्यारोपित करने की रणनीति पर एक नज़र डालें:

(*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... *)MyLanguage रणनीति की शुरुआत में बैकटेस्टिंग सेटिंग्स के लिए कॉन्फ़िगरेशन कोड है। तुलना की सुविधा के लिए, एक एकीकृत बैकटेस्टिंग कॉन्फ़िगरेशन सेट किया गया है। यह रणनीति भी एक यादृच्छिक है, जो बहुत जटिल नहीं है (पिछले लेख की तुलना में अधिक जटिल) । यह एक प्रतिनिधि रणनीति है। एक MyLanguage रणनीति को प्रत्यारोपित करने के लिए, आपको पहले पूरी रणनीति को देखना चाहिए। रणनीति का कोड संक्षिप्त है, और आपको समग्र रणनीति की कुछ समझ हो सकती है। इस रणनीति के लिए हमने देखा है कि कई संकेतक कार्य करते हैं।EMA, SMAका प्रयोग किया गया है:

पहले एक पहिया बनाओ

  • ईएमए संकेतक समारोह, जावास्क्रिप्ट भाषा में रणनीतियों को लिखने के लिए एफएमजेड प्लेटफॉर्म में सीधे उपलब्ध तैयार संकेतक पुस्तकालय कार्य हैं। अर्थात्ःTA.MA.

  • एसएमए हमें जो करना है वह हैSMAसूचक, जो हम पाया था में एफएमजेड के टीए लाइब्रेरी का समर्थन नहीं करता SMA सूचक समारोह, और वहाँ के बीच अंतर हैं SMA सूचक तालिब लाइब्रेरी में और एक में MyLanguage.

img

जैसा कि हम देख सकते हैं, पैरामीटर अनुभाग अवधि पैरामीटर के अलावा एक भार पैरामीटर है.

एफएमजेड एपीआई प्रलेखन में तालिब पुस्तकालय में एसएमए संकेतक समारोह का वर्णन इस प्रकार किया गया हैः

img

यह देखा जा सकता है किtalib.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
}

भरा हुआ अनुभाग लिखें

रणनीतिक ढांचे का उपयोग उसी ढांचे का उपयोग करता है जैसा कि लेख में हैआपको रणनीतियाँ लिखने के लिए सिखाएँ -- MyLanguage रणनीति प्रत्यारोपित करेंऔर मुख्य रूप से दो भागों में भरा हुआ हैः

सबसे पहले, टिकर डेटा प्रोसेसिंग और इंडेक्स गणना करें।

img

चलो MyLanguage के इस हिस्से को एक समय में एक वाक्य, फ़ंक्शन द्वारा फ़ंक्शन लेते हैंः

    1. AP:=(HIGH+LOW+CLOSE)/3;

यह समझा जा सकता है कि K पंक्ति के डेटा में प्रत्येक BAR का उच्चतम मूल्य, निम्नतम मूल्य और समापन मूल्य जोड़ा जाना चाहिए और फिर औसत मूल्य की गणना करने के लिए 3 से विभाजित किया जाना चाहिए, और फिर प्रत्येक BAR के अनुरूप एक-एक करके एक सरणी के रूप में सहेजा जाना चाहिए। इसे इस प्रकार संसाधित किया जा सकता हैः

function CalcAP (r) {   // AP:=(HIGH+LOW+CLOSE)/3;
    var arrAP = []      // Declare an empty array

    for (var i = 0; i < r.length; i++) {      // r is the incoming K-line data, which is an array, use for to traverse this array.
        v = (r[i].High + r[i].Low + r[i].Close) / 3      // Calculate the average value.
        arrAP.push(v)                                    // Add to the end of the arrAP array, the end is the first when arrAP is empty.
    }  

    return arrAP     // Returns this average array, i.e., the AP calculated in the MyLanguage 
}

इस फ़ंक्शन को मुख्य लूप OnTick फ़ंक्शन में बुलाया जा सकता है, उदाहरण के लिएः

// Calculation of indicators
// AP
var ap = CalcAP(records)
    1. पीए गणना पूरी होने के बाद, गणना करने के लिए आगे बढ़ेंESA:=EMA(AP,N1);:

यहाँ, हम ईएसए की गणना करने के लिए पिछले चरण में गणना की गई एपी के डेटा का उपयोग करेंगे। वास्तव में, ईएसए एपी का घातीय चलती औसत है, अर्थात ईएमए संकेतक। इसलिए हम ईएमए संकेतक की गणना करने के लिए डेटा के रूप में एपी और एन 1 के रूप में ईएमए संकेतक के पैरामीटर का उपयोग करेंगे।

function CalcESA (ap, n1) {   // ESA:=EMA(AP,N1);
    if (ap.length <= n1) {    // If the AP length is less than the indicator parameter, valid data cannot be calculated. At this time, let the function return false.
        return false
    }  

    return TA.EMA(ap, n1)
}
    1. 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++) {
        // When calculating the value of the indicator, it is necessary to determine the validity of the data, because the first few EMA calculations may be the beginning of the array of data is NaN, or null.
        // So it must be judged that the data involved in the calculation are all valid values to proceed, and if there are any invalid values, they are filled with NaN to arrABS_APminusESA.
        // The data thus calculated, each position corresponds to the previous data one by one, without misalignment.
        if (ap[i] && esa[i] && !isNaN(ap[i]) && !isNaN(esa[i])) {
            v = Math.abs(ap[i] - esa[i])     // According to ABS(AP-ESA), the specific value is calculated and put into the arrABS_APminusESA array.
            arrABS_APminusESA.push(v)
        } else {
            arrABS_APminusESA.push(NaN)
        }
    }  

    if (arrABS_APminusESA.length <= n1) {
        return false
    }  

    return TA.EMA(arrABS_APminusESA, n1)    // Calculate the EMA indicator of the array arrABS_APminusESA and get the data D (array structure).
}
    1. 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:=EMACI,N2); बस CI सरणी के लिए ईएमए संकेतक की गणना करें।
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)   // The SMA indicator for wt1 is calculated by using our own implementation of the SMA function.
}

ट्रेडिंग संकेतों का ट्रांसप्लेट करना बहुत सरल है।

AA:=CROSS(WT1,WT2);
BB:=CROSSDOWN(WT1,WT2);
REF(AA,1),BPK;
REF(BB,1),SPK;

MyLanguage के इन कोडों को पढ़ने के बाद, हम देख सकते हैं कि WT1 और WT2 के गोल्डन क्रॉस और बेरीश क्रॉसओवर का उपयोग शुरुआती शर्तों के रूप में किया जाता है। यह ध्यान दिया जाना चाहिए कि पिछले क्रॉस सिग्नल का उपयोग किया जाता है। सीधे MyLanguage रणनीति बैकटेस्ट का उपयोग करते हुए, हम देखते हैं किः

img

यह MyLanguage रणनीति के वास्तविक संचालन के अवलोकन से देखा जा सकता है कि जब एक संकेत खोलने की स्थिति में पता लगाया जाता है, तो यह वास्तव में पता लगाने के लिए है कि क्या खोलने के बिंदु पर BAR की स्थिति 2 BAR आगे गिनती एक गोल्डन क्रॉस है। उपरोक्त चित्र स्पष्ट रूप से दिखाता है किः

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")    // test
    }
    if (_State == SHORT) {
        _State = COVERSHORT
        Log("COVERSHORT")  // test
    }
    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")  // test
    }
    if (_State == LONG) {
        _State = COVERLONG
        Log("COVERLONG")  // test
    }
    isOK = false   
}

यहाँ आप सोच सकते हैं कि क्यों MyLanguage के SPK और BPK निर्देशों को उपरोक्त कोड के साथ लागू किया जा सकता है।

बैकटेस्ट

बैकटेस्ट कॉन्फ़िगरेशनः

img

MyLanguage में बैकटेस्टः

img

जावास्क्रिप्ट संस्करण में बैकटेस्टः

img img

OnTick फ़ंक्शन की शुरुआत में कोड का उपयोग बैकटेस्टिंग को तेज़ करने के लिए किया जाता है. इसका उपयोग बार मॉडल के आधार पर रणनीति चलाने के लिए किया जाता है. यदि आप रुचि रखते हैं, तो आप इसका विस्तार से विश्लेषण कर सकते हैं.

function OnTick(){
    // The ticker processing part of the driving strategy.
    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

पढ़ने के लिए धन्यवाद।


अधिक