पिछले लेख मेंआपको रणनीतियाँ लिखने के लिए सिखाएँ -- 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.
जैसा कि हम देख सकते हैं, पैरामीटर अनुभाग अवधि पैरामीटर के अलावा एक भार पैरामीटर है.
एफएमजेड एपीआई प्रलेखन में तालिब पुस्तकालय में एसएमए संकेतक समारोह का वर्णन इस प्रकार किया गया हैः
यह देखा जा सकता है किtalib.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
}
रणनीतिक ढांचे का उपयोग उसी ढांचे का उपयोग करता है जैसा कि लेख में हैआपको रणनीतियाँ लिखने के लिए सिखाएँ -- MyLanguage रणनीति प्रत्यारोपित करेंऔर मुख्य रूप से दो भागों में भरा हुआ हैः
सबसे पहले, टिकर डेटा प्रोसेसिंग और इंडेक्स गणना करें।
चलो MyLanguage के इस हिस्से को एक समय में एक वाक्य, फ़ंक्शन द्वारा फ़ंक्शन लेते हैंः
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)
ESA:=EMA(AP,N1);
:यहाँ, हम ईएसए की गणना करने के लिए पिछले चरण में गणना की गई एपी के डेटा का उपयोग करेंगे। वास्तव में, ईएसए एपी का
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)
}
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).
}
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) // 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 रणनीति बैकटेस्ट का उपयोग करते हुए, हम देखते हैं किः
यह MyLanguage रणनीति के वास्तविक संचालन के अवलोकन से देखा जा सकता है कि जब एक संकेत खोलने की स्थिति में पता लगाया जाता है, तो यह वास्तव में पता लगाने के लिए है कि क्या खोलने के बिंदु पर BAR की स्थिति 2 BAR आगे गिनती एक गोल्डन क्रॉस है। उपरोक्त चित्र स्पष्ट रूप से दिखाता है किः
सिग्नल डिटेक्शन भाग का भरने का कोड इस प्रकार लिखा जा सकता हैः
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 निर्देशों को उपरोक्त कोड के साथ लागू किया जा सकता है।
बैकटेस्ट कॉन्फ़िगरेशनः
MyLanguage में बैकटेस्टः
जावास्क्रिप्ट संस्करण में बैकटेस्टः
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