[TOC] इस ट्यूटोरियल में नीति लेखन के बारे में प्रारंभिक ज्ञान शामिल है, जिसमें एपीआई परिचय, पुनरावलोकन, चार्ट आदि शामिल हैं। इस बुनियादी ट्यूटोरियल को सीखने के बाद, उपयोगकर्ता बुनियादी एपीआई का कुशलता से उपयोग करने में सक्षम होंगे और स्थिर वास्तविक रणनीति लिख सकते हैं। इस ट्यूटोरियल को सीखने से पहले सीखने की आवश्यकता है।FMZ के आविष्कारक क्वांटिफाइंग प्लेटफॉर्म का उपयोग करते हैं 。
पुराने ट्यूटोरियलःआविष्कारक मात्रा ((FMZ.COM) रणनीति पूरी तरह से मैनुअल 2.0 ((ट्यूटोरियल) का उपयोग कर लिखा गया हैइस ट्यूटोरियल में कई पोस्ट इंडेक्स सूचीबद्ध हैं, और यह देखने की सिफारिश की जाती है।
प्रोग्रामेटिक ट्रेडिंग एक ऐसा उपकरण है जो एपीआई और एक्सचेंज के माध्यम से कनेक्ट होता है ताकि स्वचालित रूप से खरीदारी या अन्य कार्यों को पूरा किया जा सके। एपीआई को एप्लीकेशन प्रोग्रामिंग इंटरफेस कहा जाता है।
वर्तमान में डिजिटल मुद्रा विनिमय में मुख्य रूप से दो इंटरफ़ेस प्रोटोकॉल हैंः REST और Websocket;; REST प्रोटोकॉल को प्रत्येक डेटा प्राप्त करने के लिए एक बार एक्सेस करने की आवश्यकता होती है;; एनालॉग एक्सचेंज wex.app के एपीआई का उदाहरण लें, सीधे ब्राउज़र में https://api.wex.app/api/v1/public/ticker?market=BTC_USDT खोलें, परिणामः
{"data:{"buy":"11351.73","high":"11595.77","last":"11351.85","low":"11118.45","open":"11358.74","quoteVol":"95995607137.00903936","sell":"11356.02","time":1565593489318,"vol":"3552.5153"}}
यह आपको BTC_USDT के साथ ट्रेडिंग के नवीनतम बाजारों को दिखाता है, जो हर बार अपडेट होने पर बदलते हैं।market=
इसके बाद विशिष्ट लेन-देन के लिए पैरामीटर हैं, जिन्हें अन्य लेनदेन के लिए डेटा प्राप्त करने के लिए संशोधित किया जा सकता है। बाजार जैसे सार्वजनिक इंटरफेस के लिए, सभी को एक्सेस किया जा सकता है, इसलिए सत्यापन की आवश्यकता नहीं है, जबकि कुछ इंटरफेस के लिए उपयोगकर्ता की पहचान की आवश्यकता होती है, इस समय एपीआई-की का उपयोग करके हस्ताक्षर करने की आवश्यकता होती है। वेबसॉकेट एक सदस्यता मोड है, जिसमें सदस्यता की आवश्यकता होने वाली सामग्री भेजने के बाद, एक्सचेंज प्रोग्राम को अपडेट किए गए डेटा भेजता है, इसलिए हर बार फिर से प्रवेश करने की आवश्यकता नहीं होती है, इसलिए अधिक कुशल होता है।
एफएमजेड क्वांटिफाइड ट्रेडिंग प्लेटफॉर्म ने विभिन्न एक्सचेंजों के आरईएसटी इंटरफेस को शामिल किया है, जो एक समान तरीके से कॉल और डेटा प्रारूप का उपयोग करता है, जिससे रणनीतियों को लिखना अधिक सरल और सार्वभौमिक हो जाता है। एफएमजेड प्लेटफॉर्म पर वेबसॉकेट का समर्थन करना सुविधाजनक है, जिसे अगले ट्यूटोरियल में विस्तार से बताया जाएगा।
एफएमजेड प्लेटफॉर्म एपीआई दस्तावेज ज्यादातर जावास्क्रिप्ट का उदाहरण है, लेकिन पैकेजिंग के कारण, अलग-अलग भाषाओं में कोई अंतर नहीं है, बस सिंटेक्स के मुद्दों पर ध्यान देना आवश्यक है; सी ++ थोड़ा विशेष है, बाद के ट्यूटोरियल में एक विशेष परिचय होगा; क्योंकि जेएस अपेक्षाकृत सरल है और कोई संगतता समस्या नहीं है, नवोदितों का उपयोग करने के लिए अनुशंसित है; एफएमजेड क्वांटिफाइंग प्लेटफॉर्म पूर्ण पायथन का समर्थन करता है, विभिन्न प्रकार के मुफ्त इंस्टॉलेशन पैक का समर्थन करता है, एक निश्चित प्रोग्रामिंग आधार का उपयोग करने के लिए अनुशंसित है; जो उपयोगकर्ता प्रोग्रामिंग भाषा नहीं सीखना चाहते हैं, केवल एक त्वरित रणनीति लिखना चाहते हैं, एफएमजेड प्लेटफॉर्म भी म्यूर भाषा का समर्थन करता है, मूल रूप से संगत है।
पायथन के विभिन्न संस्करणों के कारण, प्रोग्राम के प्रारंभ में निर्दिष्ट किया जा सकता है, जैसे कि#!Python2
,#!Python3
⇒ ध्यान दें कि जावास्क्रिप्ट ने हाल ही में ईएस 6 सिंटेक्स को अपग्रेड किया है, यह जानना दिलचस्प होगा ⇒ नीचे समान कार्य करने वाले पायथन और जावास्क्रिप्ट कोड दिखाए गए हैं, केवल सिंटेक्स अंतर दिखाई देते हैं, इसलिए एपीआई दस्तावेज़ केवल जावास्क्रिप्ट के उदाहरण देते हैं, यह ट्यूटोरियल पायथन के विशेष उपयोग के उदाहरणों को भी ध्यान में रखेगा ⇒
#python代码
def main():
while True:
Log(exchange.GetAccount().Balance)
Sleep(2000)
#相应的Js代码
function main(){
while(true){
Log(exchange.GetAccount().Balance)
Sleep(2000)
}
}
एफएमजेड क्वांटिफाइंग प्लेटफॉर्म एपीआई इंटरफेस को डीबग करने के लिए डीबगिंग टूल प्रदान करता है।https://www.fmz.com/m/debug⇒ डिबगिंग टूल केवल जावास्क्रिप्ट का समर्थन करता है, केवल कुछ समय के लिए निष्पादित किया जा सकता है, एक्सचेंज इंटरफेस को डिस्क बनाने की आवश्यकता के बिना डिबग किया जा सकता है. ⇒ रिटर्न का डेटा परिणाम के रूप में वापस आ जाएगा, डिबगिंग टूल का कोड सहेजा नहीं जाएगा. इस ट्यूटोरियल में, आप डिबगिंग टूल का उपयोग करके एक साथ परीक्षण कर सकते हैं।
नीति कार्यक्रम, सामान्य कार्यक्रमों की तरह, कोड के क्रम में निष्पादित होते हैं, विशेष रूप से एक मुख्य फ़ंक्शन होना चाहिए; क्योंकि नीति को निरंतर चलाने की आवश्यकता होती है, आमतौर पर एक लूप के साथ-साथ एक नींद की आवश्यकता होती है; क्योंकि लेनदेन के सभी एपीआई तक पहुंच की आवृत्ति सीमित होती है, इसलिए नींद के समय को समायोजित करने की आवश्यकता होती है। यह वास्तुकला एक विशिष्ट निश्चित अंतराल निष्पादन है, और वेबसॉकेट का उपयोग करके घटना-संचालित नीति लिखने के लिए भी किया जा सकता है, जैसे कि जब भी गहराई में परिवर्तन होता है, तो इसे तुरंत निष्पादित किया जाता है, जो कि उन्नत ट्यूटोरियल में पेश किया जाएगा।
अन्य विशेष कार्यों में शामिल हैंः
function onTick(){
var ticker = exchange.GetTicker()
var account = exchange.GetAccount()
//在这里写策略逻辑,将会每6s调用一次
}
function main(){
while(true){
onTick()
Sleep(6000)
}
}
पिछले उदाहरण में, यदि कोई नेटवर्क एक्सेस त्रुटि है, तो यह नीति सीधे बंद हो सकती है, यदि आप एक ऐसी नीति चाहते हैं जो स्वचालित रूप से पुनरारंभ नहीं होगी, तो आप वास्तविक डिस्क नीति का उपयोग करके त्रुटि लॉग को पकड़ सकते हैं। बेशक, यह केवल तभी किया जाना चाहिए जब नीति स्थिर हो, अन्यथा सभी त्रुटियों को गलत नहीं किया जाएगा, और नीति की समस्या को क्रमबद्ध करना मुश्किल होगा।
function onTick(){
var ticker = exchange.GetTicker()
var account = exchange.GetAccount()
//在这里写策略逻辑,将会每6s调用一次
}
function main(){
try{
while(true){
onTick()
Sleep(6000)
}
}catch(err){
Log(err)
}
}
किसी भी एक्सचेंज से संबंधित एपीआई को कॉल करने पर एक्सचेंज और लेनदेन जोड़ी को स्पष्ट करना आवश्यक है। यदि केवल एक एक्सचेंज-लेनदेन जोड़ी को वास्तविक में जोड़ा जाता है, तो एक एक्सचेंज-लेनदेन जोड़ी के रूप में, एक एक्सचेंज-लेनदेन जोड़ी के रूप में, एक एक्सचेंज-लेनदेन जोड़ी के रूप में, एक एक्सचेंज-लेनदेन जोड़ी के रूप में, एक एक्सचेंज-लेनदेन जोड़ी के रूप में, एक एक्सचेंज-लेनदेन जोड़ी के रूप में।exchange
इस ऑब्जेक्ट का प्रतिनिधित्व करता है, जैसेexchange.GetTicker()
एक बार जब आप एक एक्सचेंज के लिए एक ट्रेडिंग टिकर प्राप्त करते हैं, तो आप एक एक्सचेंज-ट्रेडिंग जोड़ी के लिए एक ट्रेडिंग टिकर प्राप्त करते हैं।
एफएमजेड प्लेटफॉर्म एक साथ कई एक्सचेंज-ट्रेडिंग जोड़े जोड़ने का समर्थन करता है, जैसे कि एक ही एक्सचेंज खाते में एक साथ संचालित बीटीसी और ईटीएच, और एक एक्सचेंज के बीटीसी और दूसरे एक्सचेंज के ईटीएच का भी संचालित किया जा सकता है। ध्यान दें कि एक ही एक्सचेंज में अलग-अलग खाते भी एक साथ जोड़े जा सकते हैं, जो एफएमजेड वेबसाइट में जोड़े गए लेबल के आधार पर भिन्न होते हैं। जब कई एक्सचेंज-ट्रेडिंग जोड़े होते हैं, तो उपयोग किया जाता है।exchanges
Arrays का अर्थ है कि वे वास्तविक डिस्क के निर्माण के क्रम में जोड़े जाते हैंexchanges[0]
、exchanges[1]
... और इसी तरह। व्यापारिक जोड़े के प्रारूप जैसेBTC_USDT
पहले BTC एक लेन-देन मुद्रा है, और USDT एक मूल्य निर्धारण मुद्रा है।
जाहिर है, अगर हम बहुत सारे लेन-देन का संचालन करते हैं, तो यह समस्याग्रस्त हो जाएगा, और इस समय हम सेट करेंसी के साथ लेन-देन के जोड़े को बदल सकते हैं, जैसे किexchange.SetCurrency("BTC_USDT")
इस समय,exchange
बंधे हुए लेन-देन के लिए जोड़े बदल जाते हैंBTC_USDT
इस प्रकार, एक बार जब आप किसी भी प्रकार के लेन-देन को बदलते हैं, तो यह अगले कॉल तक प्रभावी रहेगा।ध्यान दें कि रीसेट नवीनतम समर्थन स्विच लेनदेन जोड़े⇒ नीचे एक विशिष्ट उदाहरण दिया गया है।
var symbols = ["BTC_USDT", "LTC_USDT", "EOS_USDT", "ETH_USDT"]
var buyValue = 1000
function main(){
for(var i=0;i<symbols.length;i++){
exchange.SetCurrency(symbols[i])
var ticker = exchange.GetTicker()
var amount = _N(buyValue/ticker.Sell, 3)
exchange.Buy(ticker.Sell, amount)
Sleep(1000)
}
}
जैसा कि ऊपर दिए गए उदाहरणों में दिखाया गया है, बाजार इंटरफेस आम तौर पर सार्वजनिक हैं और सभी के लिए उपलब्ध हैं। सामान्य बाजार इंटरफेस में शामिल हैंः व्यापार टिकर प्राप्त करें, गहराई की गहराई प्राप्त करें, के लाइन रिकॉर्ड प्राप्त करें, लेनदेन रिकॉर्ड ट्रेड प्राप्त करें। बाजार व्यापार निर्णय लेने के लिए रणनीतियों का आधार है, नीचे एक-एक करके पेश किया जाएगा, सबसे अच्छा है कि आप डिबगिंग टूल में खुद का प्रयास कर सकें, विस्तृत स्पष्टीकरण के लिए एपीआई दस्तावेज देखें।
और हर इंटरफेस के पास आमतौर परInfo
एक फ़ील्ड, जो एक्सचेंज द्वारा लौटाए गए मूल डेटा स्ट्रिंग का प्रतिनिधित्व करता है, जो अतिरिक्त जानकारी के साथ जोड़ा जा सकता है, जिसे पहले हल करने की आवश्यकता होती है, जावास्क्रिप्ट का उपयोग किया जाता हैJSON.parse()
पायथन json लाइब्रेरी का उपयोग करता है.Time
यह फ़ील्ड अनुरोध के समय को दर्शाता है, जिसका उपयोग देरी का निर्धारण करने के लिए किया जा सकता है।
वास्तविक डिस्क पर एपीआई इंटरफ़ेस का उपयोग करने के लिए संभव है कि पहुँच विफल हो जाए और वापस आ जाएnull
पायथन वापस आ गया है।None
इस प्रकार, यदि आप अपने डिवाइस के साथ एक त्रुटि का सामना कर रहे हैं, तो यह महत्वपूर्ण है कि आप अपने डिवाइस के डेटा का उपयोग करते समय त्रुटि का सामना करें और डिस्क को बंद कर दें।
वर्तमान बाजार की स्थिति प्राप्त करना, शायद सबसे आम उपयोग किया जाने वाला इंटरफ़ेस है, जो पिछले लेनदेन की कीमत, खरीद-फरोख्त की कीमत, हाल के लेनदेन की मात्रा आदि की जानकारी प्राप्त कर सकता है। आदेश देने से पहले टिकर जानकारी के आधार पर लेनदेन की कीमत निर्धारित की जा सकती है। एक वास्तविक प्लेट रिटर्न का उदाहरण।{"Info:{}, "High":5226.69, "Low":5086.37,"Sell":5210.63, "Buy":5208.5, "Last":5208.51, "Volume":1703.1245, "OpenInterest":0, "Time":1554884195976}
。
function main() {
var ticker = exchange.GetTicker()
Log(ticker) //在调试工具中 return ticker 。可以看到具体的结果。
Log('上次成交价: ',ticker.Last, '买一价: ', ticker.Buy)
}
लंबित सूची की गहराई का पता लगाएं. यद्यपि GetTicker में एक खरीद और एक बिक्री शामिल है, लेकिन यदि आप अधिक गहरी सूची की जांच करना चाहते हैं, तो आप इस इंटरफ़ेस का उपयोग कर सकते हैं, आमतौर पर शीर्ष 200 लंबित सूची तक पहुंच सकते हैं। आप इस इंटरफ़ेस का उपयोग कर सकते हैं। नीचे एक वास्तविक रिटर्न परिणाम है। जिसमें Asks बिक्री सूची को दर्शाता है, जो कि क्रमशः एक-बिक्री, एक-बिक्री, एक-बिक्री... इसलिए मूल्य क्रमशः बढ़ता है।
{
"Info":null,
"Asks":[
{"Price":5866.38,"Amount":0.068644},
{"Price":5866.39,"Amount":0.263985},
......
]
"Bids":[
{"Price":5865.13,"Amount":0.001898},
{"Price":5865,"Amount":0.085575},
......
],
"Time":1530241857399
}
एक उदाहरण के रूप में, हम नीचे दिए गए उदाहरणों में से कुछ का उपयोग कर सकते हैंः
function main() {
var depth = exchange.GetDepth()
Log('买一价个: ', depth.Bids[0].Price, '卖一价格: ', depth.Asks[0].Price)
}
K-लाइन प्राप्त करें, सबसे आम उपयोग किए जाने वाले इंटरफेस में से एक, एक बार में लंबे समय तक मूल्य जानकारी लौटाता है, विभिन्न संकेतकों के आधार पर गणना करता है। K-लाइन चक्र यदि निर्दिष्ट नहीं किया जाता है तो डिफ़ॉल्ट चक्र का उपयोग किया जाएगा जब वास्तविक डिस्क जोड़ा जाएगा। K-लाइन की लंबाई निर्दिष्ट नहीं की जा सकती है, जो समय के साथ बढ़ती रहती है, अधिकतम 2000 बिट्स, पहली बार कॉल करने पर लगभग 200 बिट्स ((विभिन्न एक्सचेंजों की वापसी अलग होती है) । अंतिम K-लाइन नवीनतम K-लाइन है, इसलिए डेटा लगातार बदलता रहता है, पहली K-लाइन सबसे पुरानी डेटा है।
exchange.SetMaxBarLen(Len)
पहली बार के-लाइन प्राप्त करने की संख्या (कुछ एक्सचेंजों द्वारा समर्थित) सेट की जा सकती है और अधिकतम के-लाइन की संख्या सेट की जाती है।उदाहरण के लिएःexchange.SetMaxBarLen(500)
GetRecords अवधि निर्दिष्ट कर सकता हैः PERIOD_M1:1 मिनट, PERIOD_M5:5 मिनट, PERIOD_M15:15 मिनट, PERIOD_M30:30 मिनट, PERIOD_H1:1 घंटे, PERIOD_D1:1 दिन.exchange.GetRecords(PERIOD_M1)
⇒ नवीनतम प्रदाता को अपग्रेड करने के बाद, कस्टम चक्रों का समर्थन किया जाएगा, सीधे चक्र सेकंड संख्या को पैरामीटर के रूप में चलाया जाएगा, मिनट स्तर का कस्टम 1 मिनट के आधार पर संकलित किया जाएगा, 1 मिनट से कम के आधार पर संकलित किया जाएगा।ध्यान दें कि आपको ट्यूटोरियल में भी इसी तरह के प्रश्नों का सामना करना पड़ेगा।PERIOD_M1
इस तरह के सभी बड़े अक्षरों वाले चर, वे FMZ के डिफ़ॉल्ट वैश्विक चर हैं, जो रुचि रखते हैं, वे अपने स्वयं के लॉग इन कर सकते हैं उनके विशिष्ट मूल्य, सामान्य रूप से सीधे उपयोग करने के लिए।
डेटा का उदाहरण लौटाएंः
[
{"Time":1526616000000,"Open":7995,"High":8067.65,"Low":7986.6,"Close":8027.22,"Volume":9444676.27669432},
{"Time":1526619600000,"Open":8019.03,"High":8049.99,"Low":7982.78,"Close":8027,"Volume":5354251.80804935},
{"Time":1526623200000,"Open":8027.01,"High":8036.41,"Low":7955.24,"Close":7955.39,"Volume":6659842.42025361},
......
]
K-रेखा के उदाहरणः
function main(){
var close = []
var records = exchange.GetRecords(PERIOD_H1)
Log('total bars: ', records.length)
for(var i=0;i<records.length;i++){
close.push(records[i].Close)
}
return close
}
कुछ एक्सचेंजों में कुछ समय सीमा (जो स्वयं के लेनदेन डेटा नहीं हैं) के लिए लेनदेन डेटा प्राप्त करने का समर्थन नहीं किया जाता है। यह अपेक्षाकृत कम उपयोग किया जाता है, एपीआई दस्तावेजों में अधिक जानकारी के लिए जांच की जा सकती है।
इन इंटरफेस को सीधे खाते से संबंधित होने के कारण एक्सेस नहीं किया जा सकता है और एपीआई-की हस्ताक्षर की आवश्यकता होती है। एफएमजेड प्लेटफॉर्म ने बैकग्राउंड में एकीकरण को स्वचालित रूप से संसाधित किया है और इसे सीधे उपयोग किया जा सकता है।
खाता जानकारी प्राप्त करना. सबसे आम इंटरफेस में से एक, जिसे कम शेष राशि से बचने के लिए ऑर्डर करने से पहले कॉल करना आवश्यक है.{"Stocks":0.38594816,"FrozenStocks":0,"Balance":542.858308,"FrozenBalance":0,"Info":{}}
⇒ स्टॉक्स ट्रेडिंग जोड़ी के लिए ट्रेड करेंसी का उपलब्ध शेष है, फ्रोजन स्टॉक्स अप्रतिबंधित ऑर्डर के लिए फ्रीज बैलेंस है, बैलेंस मूल्य निर्धारण मुद्रा का उपलब्ध राशि है, और फ्रोजन बैलेंस ट्रेडिंग जोड़ी के लिए फ्रीज बैलेंस है।BTC_USDT
स्टॉक्स का मतलब BTC है और बैलेंस का मतलब USDT है।
ध्यान दें कि रिटर्न परिणाम निर्दिष्ट लेन-देन जोड़े के परिणाम हैं, लेन-देन खाते में अन्य मुद्राओं के बारे में जानकारी सूचना क्षेत्र में है, कई लेनदेन जोड़े को संचालित करने के लिए कई बार कॉल करने की आवश्यकता नहीं है।
एक वास्तविक प्लेट जो वर्तमान लेनदेन के लिए कुल मूल्य को लगातार प्रिंट करती हैः
function main(){
while(true){
var ticker = exchange.GetTicker()
var account = exchange.GetAccount()
var price = ticker.Buy
var stocks = account.Stocks + account.FrozenStocks
var balance = account.Balance + account.FrozenBalance
var value = stocks*price + balance
Log('Account value is: ', value)
LogProfit(value)
Sleep(3000)//sleep 3000ms(3s), A loop must has a sleep, or the rate-limit of the exchange will be exceed
//when run in debug tool, add a break here
}
}
भुगतान करना.exchange.Buy(Price, Amount)
याexchange.Buy(Price, Amount, Msg)
,Price कीमत है,Amount मात्रा है,Msg एक अतिरिक्त स्ट्रिंग है जिसे वास्तविक डिस्क लॉग में दिखाया जा सकता है, यह आवश्यक नहीं है. इस तरह से एक लंबित ऑर्डर है, यदि तुरंत पूरी तरह से लेनदेन नहीं किया जा सकता है, तो एक अपूर्ण ऑर्डर उत्पन्न होता है, आदेश सफलतापूर्वक ऑर्डर आईडी के रूप में परिणाम लौटाता है, विफलता के लिएnull
, ऑर्डर की स्थिति की जांच करने के लिए प्रयोग किया जाता है.
यदि आप बाजार मूल्य के लिए भुगतान करना चाहते हैं, तो मूल्य -1 है, राशि आदेश मूल्य के लिए है, जैसे किexchange.Buy(-1, 0.5)
सौदा सही है।ETH_BTC
...................................................
सभी कीमतों और मात्राओं के लिए सटीकता आवश्यकताओं के लिए उपलब्ध_N()
सटीकता फ़ंक्शन को नियंत्रित करने के लिए. वायदा व्यापार के लिए Buy और Sell का एक और अर्थ है, जिसे अलग से पेश किया जाएगा.
एक उदाहरण के रूप में, एक व्यक्ति ने खरीदारी के लिए एक उचित मूल्य पर खरीदारी कीः
function main(){
while(true){
var ticker = exchange.GetTicker()
var price = ticker.Sell
if(price >= 7000){
exchange.Buy(_N(price+5,2), 1, 'BTC-USDT')
break
}
Sleep(3000)//Sleep 3000ms
}
Log('done')
}
नीचे बेचने का आदेश↑ पैरामीटर Buy के समान है↑ बाजार मूल्य सूची के पैरामीटर का अर्थ अलग है, बाजार मूल्य बिक्री आदेश जैसेexchange.Sell(-1, 0.2)
इस तरह की एक बड़ी संख्या में लोगों ने इस तरह की एक बड़ी संख्या में पैसे कमाए हैं।
ऑर्डर आईडी के आधार पर ऑर्डर जानकारी प्राप्त करें.exchange.GetOrder(OrderId)
ऑर्डर आईडी ऑर्डर आईडी है, जो ऑर्डर करते समय लौटाया जाता है।आदेश के प्रकार पर ध्यान देंType
फ़ील्ड और ऑर्डर की स्थितिStatus
वास्तविक मान संख्याएं हैं, जो विभिन्न अर्थों का प्रतिनिधित्व करती हैं, लेकिन यह याद रखने के लिए प्रतिकूल है, एफएमजेड इन मानों को वैश्विक स्थिरांक के साथ दर्शाता है, जैसे कि अनदेखी किए गए ऑर्डर।Status
और यह शून्य है.ORDER_STATE_PENDING
, इन सभी सार्वभौमिक स्थिरांकों को दस्तावेज़ में देखा जा सकता है.⇒ परिणाम लौटाता हैः
{
"Id":125723661, //订单id
"Amount":0.01, //订单数量
"Price":7000, //订单价格
"DealAmount":0, //已成交数量
"AvgPrice":0, //成交均价
"Status":0, // 0:未完全成交, 1:已成交, 2:已撤单
"Type":1,// 订单类型,0:买单, 1:卖单
"ContractType":"",//合约类型,用于期货交易
"Info":{} //交易所返回原始信息
}
}
एक रणनीति जो एक निश्चित संख्या में मुद्राओं को खरीदती हैः
function main(){
while(true){
var amount = exchange.GetAccount().Stocks
var ticker = exchange.GetTicker()
var id = null
if(5-amount>0.01){
id = exchange.Buy(ticker.Sell, Math.min(5-amount,0.2))
}else{
Log('Job completed')
return //return the main function, bot will stop
}
Sleep(3000) //Sleep 3000ms
if(id){
var status = exchange.GetOrder(id).Status
if(status == 0){ //这里也可以用 status == ORDER_STATE_PENDING 来判断。
exchange.CancelOrder(id)
}
}
}
}
वर्तमान लेन-देन प्राप्त करें सभी अधूरे आदेशों के लिए सूची। यदि कोई अधूरा आदेश नहीं है तो रिक्त सरणी लौटाएं। आदेश सूची के विशिष्ट परिणाम जैसे कि GetOrder।
सभी आदेशों के लिए वर्तमान लेनदेन को रद्द करने के उदाहरणः
function CancelAll(){
var orders = exchange.GetOrders()
for(var i=0;i<orders.length;i++){
exchange.CancelOrder(orders[i].Id) // cancel order by orderID
}
}
function main(){
CancelAll()
while(true){
//do something
Sleep(10000)
}
}
ऑर्डर आईडी के आधार पर रद्द किए गए ऑर्डर।exchange.CancelOrder(OrderId)
⇒ रद्द करने में सफलता सही लौटाता है, अन्यथा गलत लौटाता है. ⇒ ध्यान दें कि ऑर्डर पूरी तरह से लेनदेन में है, तो रद्द करने में विफलता होगी.
डिजिटल मुद्रा वायदा व्यापार और नकदी व्यापार अलग है, ऊपर नकदी व्यापार के कार्य के लिए भी लागू होते हैं, वायदा, एकल वायदा व्यापार के लिए एक विशेष कार्य है. डिजिटल मुद्रा वायदा प्रोग्रामेटिक व्यापार करने से पहले, वेबसाइट पर मैनुअल ऑपरेशन से परिचित होना चाहिए, बुनियादी अवधारणाओं को समझना चाहिए, जैसे कि खोलने की स्थिति, समतल स्थिति, पूर्ण स्थिति, प्रति स्थिति, उत्तोलन, समतल स्थिति, फ्लोटिंग लाभ, गारंटी राशि आदि और संबंधित गणना सूत्रों को समझना चाहिए। विभिन्न वायदा एक्सचेंजों में संबंधित ट्यूटोरियल मिल सकते हैं, जिन्हें स्वयं सीखने की आवश्यकता है।
स्थायी अनुबंध और वायदा अनुबंध समान हैं, लेकिन एक ही समय में कई रिक्त स्थान रखने का कोई विचार नहीं है।
यदि एक्सचेंज एक ही समय में ओकेएक्स और हुओबी फ्यूचर्स का समर्थन करता है, तो एक्सचेंज इंटरफ़ेस में अलग से ओकेएक्स फ्यूचर्स कैन और एफएमजेड में हुओबी फ्यूचर्स कैन का चयन करने की आवश्यकता होती है।
फ्यूचर्स ट्रेडिंग का पहला कदम है ट्रेड करने के लिए कॉन्ट्रैक्ट सेट करना, उदाहरण के लिए ओकेएक्स फ्यूचर्स, वास्तविक प्लेट या रीट्वीट बनाते समय बीटीसी ट्रेडिंग जोड़े का चयन करना, और कोड में सेट करने की आवश्यकता होती है। यदि सेट नहीं किया जाता है तो संकेत दिया जाएगा।invalid contract type
。प्रत्यक्ष व्यापार के विपरीत, फ्यूचर्स कॉन्ट्रैक्ट्स अक्सर व्यापारिक मुद्राओं जैसे बीटीसी के साथ लेनदेन करते हैं, जो आमतौर पर बीटीसी के साथ लेनदेन करते हैं। बीटीसी_यूएसडी व्यापारिक जोड़े जो आमतौर पर बीटीसी के साथ लेनदेन करते हैं।ट्रेडिंग जोड़े को सेट करने के बाद, आपको विशिष्ट अनुबंध प्रकार सेट करने होंगे, जैसे कि स्थायी, उसी सप्ताह, अगले सप्ताह, आदि। अनुबंध सेट करने के बाद, खरीद, बिक्री आदि संचालन किए जा सकते हैं।
बिनान, ओकेएक्स, हुओबीडीएम और अन्य ऐसे कॉन्ट्रैक्ट हैं जो बिनान और यूएसडीटी के बीच मौजूद हैं, जिन्हें वास्तविक सेटअप कॉन्ट्रैक्ट जोड़ने पर अलग करना आवश्यक है। विशिष्ट सेटिंग्स नीचे दी गई हैं।
//OKEX期货
exchange.SetContractType("swap") // 设置为永续合约
exchange.SetContractType("this_week") // 设置为当周合约
exchange.SetContractType("next_week") // 设置为次周合约
exchange.SetContractType("quarter") // 设置为季度合约
//HuobiDM
exchange.SetContractType("this_week") // 设置为当周合约
exchange.SetContractType("next_week") // 设置为次周合约
exchange.SetContractType("quarter") // 设置为季度合约
exchange.SetContractType("swap") // 设置为永续合约
//币安期货
exchange.SetContractType("swap") // 设置为永续合约,注意币本位和USDT本位都存在永续
exchange.SetContractType("quarter") // 设置为当季合约
exchange.SetContractType("next_quarter") // 设置为次季合约
//BitMEX
exchange.SetContractType("XBTUSD") // 设置为永续合约
exchange.SetContractType("XBTM19") // 具体某个时间结算的合约,详情登录BitMEX查询各个合约代码
//GateIO
exchange.SetContractType("swap") // 设置为永续合约,不设置默认为swap永续合约。
//Deribit
exchange.SetContractType("BTC-27APR18") // 具体某个时间结算的合约,详情参看Deribit官网。
वर्तमान होल्डिंग सूचना सूची प्राप्त करें, OKEX ((OKCOIN) फ्यूचर्स एक पैरामीटर में पारित किया जा सकता है, जो प्राप्त करने के लिए अनुबंध के प्रकार को निर्दिष्ट करता है। यदि कोई होल्डिंग नहीं है तो रिक्त सूची लौटाता है[]
⇒ स्टॉक की जानकारी नीचे दी गई है, बहुत अधिक विशिष्ट जानकारी है, और लेनदेन के लिए विशिष्ट विश्लेषण के साथ संयोजन की आवश्यकता है।
डेटा प्रकार | चर नाम | स्पष्टीकरण |
---|---|---|
वस्तु | जानकारी | एक्सचेंजों का मूल ढांचा वापस |
संख्या | मार्जिन लेवल | लीवर का आकार, OKCoin 10 या 20 है, OK वायदा के पूर्ण स्टॉक मोड में वापस 10 के रूप में फिक्स्ड है क्योंकि मूल एपीआई समर्थन नहीं करता है |
संख्या | राशि | ओकेकोइन के लिए, यह अनुबंध का हिस्सा है (पूर्णांक और 1 से अधिक) |
संख्या | जमे हुए राशि | स्थिति में जमे हुए मात्रा |
संख्या | मूल्य | स्टॉक की औसत कीमत |
संख्या | मार्जिन | जमानत फ्रीज |
संख्या | लाभ | कमोडिटी फ्यूचर्सः होल्डिंग स्टॉक मार्केट घाटा, डिजिटल मुद्राः ((डिजिटल मुद्रा इकाईः बीटीसी/एलटीसी, पारंपरिक फ्यूचर्स इकाईः आरएमबी, नोटः ओकेकोइन फ्यूचर्स पूर्ण स्टॉक के मामले में अधिशेष प्राप्त करने के लिए संदर्भित करते हैं, न कि होल्डिंग स्टॉक घाटा, प्रत्येक स्टॉक के तहत होल्डिंग स्टॉक घाटे को संदर्भित करते हैं) |
कंस्ट | प्रकार | पीडी_लॉन्ग (सीटीपी में closebuy_today के साथ), पीडी_शॉर्ट (सीटीपी में closesell_today के साथ) और पीडी_लॉन्ग (सीटीपी में closebuy_today के साथ) कल की स्थिति (सीटीपी वायदा) |
स्ट्रिंग | अनुबंध प्रकार | कमोडिटी फ्यूचर्स के लिए कॉन्ट्रैक्ट कोड, स्टॉक के लिए एक्सचेंज कोड _ स्टॉक कोड के लिए कोड, विशिष्ट पैरामीटर SetContractType के लिए इनपुट प्रकार |
function main(){
exchange.SetContractType("this_week");
var position = exchange.GetPosition();
if(position.length>0){ //特别要注意引用前要先判断position长度再引用,否则会出错
Log("Amount:", position[0].Amount, "FrozenAmount:", position[0].FrozenAmount, "Price:",
position[0].Price, "Profit:", position[0].Profit, "Type:", position[0].Type,"ContractType:", position[0].ContractType)
}
}
सबसे पहले, लीवर का आकार सेट करें और कॉल कैसे करेंःexchange.SetMarginLevel(10)
10 का मतलब है 10 गुना लीवरेज, और विशिष्ट समर्थन वाले लीवरेज का आकार संबंधित एक्सचेंजों को देखें।ध्यान दें कि लीवरेज को एक्सचेंजों पर सेट किया जाना चाहिए, कोड में एक्सचेंजों के सेट के अनुरूप होना चाहिए, अन्यथा त्रुटि होगी।⇒ आप डिफ़ॉल्ट लीवर का उपयोग करके इसे अनसेट भी कर सकते हैं.
फिर लेनदेन की दिशा सेट करें, कॉल करेंःexchange.SetDirection(Direction)
, जो कि ओपन पोजिशनिंग के अनुरूप है, ** वायदा के विपरीत, यदि स्थायी अनुबंध में एक ही समय में बहु-अवकाश अवधारणा नहीं है, यानी एक एकल स्थिति को रखने की अनुमति नहीं है, तो अधिक समय खुला रहने से स्वचालित रूप से बहु-अवकाश हो जाएगा, सभी को केवल सेट करने की आवश्यकता हैbuy
औरsell
हाँ. अगर आप दो तरफा स्टोरेज का समर्थन करते हैं, तो इसे सेट करना होगा.closebuy
,closebuy
◊** विशिष्ट संबंधः
संचालन | SetDirection के पैरामीटर | उपवर्गीय फ़ंक्शन |
---|---|---|
कई दुकानें | exchange.SetDirection (( |
विनिमय.खरीदें() |
बहुस्तरीय | exchange.SetDirection (( |
विनिमय.बिक्री() |
खाली भंडार | exchange.SetDirection (( |
विनिमय.बिक्री() |
खाली भंडार | exchange.SetDirection (( |
विनिमय.खरीदें() |
अंत में, एक विशिष्ट स्टॉप स्टॉप कोड है, जो विभिन्न एक्सचेंजों पर अलग-अलग मात्रा में होता है, जैसे कि हुओबी वायदा 100 डॉलर का एक वायदा होता है।
function main(){
exchange.SetContractType("this_week") // 举例设置 为OKEX期货 当周合约
price = exchange.GetTicker().Last
exchange.SetMarginLevel(10) //设置杠杆为10倍
exchange.SetDirection("buy") //设置下单类型为做多
exchange.Buy(price+10, 20) // 合约数量为20下单
pos = exchange.GetPosition()
Log(pos)
Log(exchange.GetOrders()) //查看是否有未成交订单
exchange.SetDirection("closebuy"); //如果是永续合约,直接设置exchange.SetDirection("sell")
exchange.Sell(price-10, 20)
}
नीचे दिए गए हैं एक विशिष्ट उदाहरण के लिए रणनीति के लिए सभी पक्की स्थिति
function main(){
while(true){
var pos = exchange.GetPosition()
var ticker = exchange.GetTicekr()
if(!ticker){
Log('无法获取ticker')
return
}
if(!pos || pos.length == 0 ){
Log('已无持仓')
return
}
for(var i=0;i<pos.length;i++){
if(pos[i].Type == PD_LONG){
exchange.SetContractType(pos[i].ContractType)
exchange.SetDirection('closebuy')
exchange.Sell(ticker.Buy, pos[i].Amount - pos[i].FrozenAmount)
}
if(pos[i].Type == PD_SHORT){
exchange.SetContractType(pos[i].ContractType)
exchange.SetDirection('closesell')
exchange.Buy(ticker.Sell, pos[i].Amount - pos[i].FrozenAmount)
}
}
var orders = exchange.Getorders()
Sleep(500)
for(var j=0;j<orders.length;j++){
if(orders[i].Status == ORDER_STATE_PENDING){
exchange.CancelOrder(orders[i].Id)
}
}
}
}
कोड में लीवरेज खाते में स्विच करने की आवश्यकता होती है, जो कि नकदी लेनदेन के समान है।
उपयोगexchange.IO("trade_margin") एक जमा खाता मोड में स्विच करें, ऑर्डर दें, खाता संपत्ति प्राप्त करें और एक्सचेंज के लीवरेज इंटरफ़ेस तक पहुंचें। उपयोगexchange.IO("trade_normal") सामान्य खाता मोड पर स्विच करें.
समर्थित एक्सचेंजोंः
कमोडिटी वायदा व्यापार और डिजिटल मुद्रा वायदा व्यापार में बहुत अंतर है. सबसे पहले, कमोडिटी वायदा व्यापार का समय छोटा है, डिजिटल मुद्रा 24h व्यापार; कमोडिटी वायदा के लिए प्रोटोकॉल भी आम तौर पर उपयोग नहीं किया जाता है REST एपीआई; कमोडिटी वायदा व्यापार की आवृत्ति और संलग्नक संख्या पर प्रतिबंध, डिजिटल मुद्राओं के लिए बहुत लचीला है, आदि. इसलिए व्यापार कमोडिटी वायदा के लिए कई जगहों पर विशेष ध्यान देने की जरूरत है, यह सलाह दी जाती है कि संचालित करने के लिए एक समृद्ध अनुभव है। FMZ simnow कमोडिटी वायदा सिम्युलेटर का समर्थन करता है, संदर्भ के लिएःhttps://www.fmz.com/bbs-topic/325❖ कमोडिटी फ्यूचर्स कंपनी ने जोड़ाःhttps://www.fmz.com/bbs-topic/371
कमोडिटी फ्यूचर्स और जून 2019 में प्रक्रियात्मक विनियमन लागू किया गया, व्यक्तिगत प्रक्रियात्मक व्यक्तिगत उपयोगकर्ताओं की आवश्यकता के लिए फ्यूचर्स के लिए लाइसेंस कोड का आवेदन (विशिष्ट आवेदन के लिए आवश्यक जानकारी टेम्पलेट वीटेक समूह या क्यूक्यू समूह में भेजा जा सकता है), आम तौर पर 4-5 दिन लगते हैं, कदम अधिक बोझिल होते हैं। एफएमजेड क्वांटिफाइड प्लेटफॉर्म प्रक्रियात्मक व्यापार प्रदाता के रूप में विभिन्न फ्यूचर्स सेवा प्रदाताओं से सॉफ्टवेयर लाइसेंस कोड का आवेदन करता है, उपयोगकर्ता सीधे आवेदन किए बिना इसका उपयोग कर सकते हैं।https://www.fmz.com/bbs-topic/3860; यदि आपका फ्यूचर्स अब सूची में नहीं है, तो आप केवल अपने आप आवेदन कर सकते हैं, या समर्थित व्यापारियों में फिर से खोलने के लिए, आम तौर पर 2 दिन लगते हैं. FMZ के पास कुछ सेवा प्रदाताओं के साथ गहन सहयोग संबंध हैं, जैसे कि किंग तायक्वोंग मैक्रोसोर्स फ्यूचर्स, जिन्होंने FMZ प्लेटफॉर्म का संस्थागत संस्करण खरीदा है, जो उपयोगकर्ताओं के लिए उपलब्ध है, जो स्वचालित रूप से वीआईपी बन जाते हैं, और प्रसंस्करण शुल्क न्यूनतम है.https://www.fmz.com/bbs-topic/506 。
एफएमजेड प्लेटफ़ॉर्म के आर्किटेक्चर के फायदे के कारण, उपयोगकर्ता कई फ्यूचर्स अकाउंट भी जोड़ सकते हैं और कुछ ऐसी सुविधाओं को पूरा कर सकते हैं जो अन्य कमोडिटी फ्यूचर्स प्रोग्रामेटिक ट्रेडिंग सॉफ़्टवेयर द्वारा नहीं की जा सकती हैं, जैसे कि उच्च-आवृत्ति टिक का संश्लेषण।https://www.fmz.com/bbs-topic/1184
सबसे पहले, चूंकि यह 24 घंटे का लेन-देन नहीं है और लॉग इन ऑपरेशन की आवश्यकता है, इसलिए लेन-देन करने से पहले लिंक की स्थिति का निर्धारण करना आवश्यक है।exchange.IO("status")
के लिएtrue
यदि लॉग इन सफल नहीं हुआ तो एपीआई को कॉल करें, लॉग इन बटन के बिना संकेत नहीं दिया गया है। नीति शुरू होने के बाद स्लीप ((2000), लॉग इन करने के लिए एक निश्चित समय दे सकते हैं। या फिर से सदस्यता का प्रयास कर सकते हैं।_C(exchange.SetContractType,"MA888")
इस तरह से हम सफल लैंडिंग सुनिश्चित कर सकते हैं।
कमोडिटी फ्यूचर्स के लिए बाजार अधिग्रहण और ट्रेडिंग कोड डिजिटल मुद्रा फ्यूचर्स के समान हैं, यहां अंतर और ध्यान देने योग्य स्थानों का परिचय दिया जाएगा।
function main(){
_C(exchange.SetContractType,"MA888") //没登陆成功是无法订阅合约的,最好重试一下
while(true){
if(exchange.IO("status")){
var ticker = exchange.GetTicker()
Log("MA888 ticker:", ticker)
LogStatus(_D(), "已经连接CTP !")//_D获取事件
} else {
LogStatus(_D(), "未连接CTP !")
Sleep(1000)
}
}
}
कमोडिटी फ्यूचर्स कैटलॉग ट्रेडिंग का उपयोग करने की सलाह दी जाती है (अधिक जानकारी नीचे दी गई है), इस समय कोड बहुत सरल होगा, बोझिल विवरणों को संभालने की आवश्यकता नहीं होगी। स्रोत कोड कॉपी पताःhttps://www.fmz.com/strategy/57029
function main() {
// 使用了商品期货类库的CTA策略框架
$.CTA(Symbols, function(st) {
var r = st.records
var mp = st.position.amount
var symbol = st.symbol
/*
r为K线, mp为当前品种持仓数量, 正数指多仓, 负数指空仓, 0则不持仓, symbol指品种名称
返回值如为n:
n = 0 : 指全部平仓(不管当前持多持空)
n > 0 : 如果当前持多仓,则加n个多仓, 如果当前为空仓则平n个空仓,如果n大于当前持仓, 则反手开多仓
n < 0 : 如果当前持空仓,则加n个空仓, 如果当前为多仓则平n个多仓,如果-n大于当前持仓, 则反手开空仓
无返回值表示什么也不做
*/
if (r.length < SlowPeriod) {
return
}
var cross = _Cross(TA.EMA(r, FastPeriod), TA.EMA(r, SlowPeriod));
if (mp <= 0 && cross > ConfirmPeriod) {
Log(symbol, "金叉周期", cross, "当前持仓", mp);
return Lots * (mp < 0 ? 2 : 1)
} else if (mp >= 0 && cross < -ConfirmPeriod) {
Log(symbol, "死叉周期", cross, "当前持仓", mp);
return -Lots * (mp > 0 ? 2 : 1)
}
});
}
कमोडिटी फ्यूचर्स का उपयोग सीटीपी प्रोटोकॉल द्वारा किया जाता है, सभी बाजारों और ऑर्डर लेनदेन को केवल परिवर्तन के बाद सूचित किया जाता है, जबकि ऑर्डर, खाता, होल्डिंग का पता लगाने के लिए सक्रिय पूछताछ होती है। इसलिए यह घटना-संचालित उच्च-आवृत्ति रणनीतियों के लिए उपयुक्त है। डिफ़ॉल्ट मोड बाजारों के लिए इंटरफ़ेस प्राप्त करता है जैसे किGetTicker
、GetDepth
、GetRecords
सभी डेटा कैश किए गए हैं ताकि नवीनतम डेटा प्राप्त किया जा सके, कोई डेटा नहीं होने पर डेटा का इंतजार किया जा सकता है, इसलिए रणनीति को नींद से बाहर रखा जा सकता है। जब कोई बाजार परिवर्तन होता है, तो टिकर, गहराई और रिकॉर्ड अपडेट किए जाते हैं, इस समय कॉल किए गए किसी भी इंटरफ़ेस को तुरंत वापस कर दिया जाता है, कॉल किए गए इंटरफ़ेस की स्थिति को अपडेट मोड के लिए प्रतीक्षा में रखा जाता है, अगली बार उसी इंटरफ़ेस को कॉल करने पर, नए डेटा के लौटने का इंतजार किया जाता है। कुछ ठंडे दरवाजे के अनुबंध या डूबने की स्थिति में लंबे समय तक व्यापार नहीं होता है, जो रणनीति को लंबे समय तक कैद करने के लिए सामान्य है।
यदि आप चाहते हैं कि हर बार जब आप बाजार प्राप्त करते हैं तो डेटा प्राप्त करें, यहां तक कि पुराने डेटा को भी, आप बाजार के तत्काल अद्यतन मोड पर स्विच कर सकते हैं।exchange.IO("mode", 0)
इस बिंदु पर, नीति को घटना-संचालित नहीं लिखा जा सकता है, और एक स्लीप घटना को जोड़ने की आवश्यकता होती है, जिससे तेजी से मृत चक्र से बचा जा सकता है। कुछ कम आवृत्ति वाली रणनीतियों को इस पैटर्न का उपयोग करना संभव है, और रणनीति का डिजाइन सरल है।exchange.IO("mode", 1)
आप डिफ़ॉल्ट कैशिंग मोड को वापस कर सकते हैं।
एकल अनुबंधों का संचालन करते समय, डिफ़ॉल्ट मोड का उपयोग करना संभव है; लेकिन यदि कई अनुबंध हैं, तो एक अनुबंध के लिए कोई बाजार अद्यतन नहीं हो सकता है, जिससे बाजार इंटरफ़ेस को प्राप्त करने में बाधा आती है, और अन्य अनुबंध बाजार अद्यतन भी प्राप्त नहीं हो सकते हैं। इस समस्या को हल करने के लिए, आप तत्काल अद्यतन मोड का उपयोग कर सकते हैं, लेकिन उच्च आवृत्ति नीति नहीं लिख सकते हैं। इस मामले में आप घटना पुश मोड का उपयोग कर सकते हैं, आदेश और बाजार के पुश को प्राप्त कर सकते हैं।exchange.IO("wait")
; यदि कई एक्सचेंज ऑब्जेक्ट जोड़े जाते हैं, तो यह कमोडिटी वायदा में दुर्लभ है, और इसका उपयोग किया जा सकता हैexchange.IO("wait_any")
, इस समय लौटाया गया Index लौटाए गए एक्सचेंज के सूचकांक को दर्शाता है.
एक बार फिर, हम एक बार फिर से शुरू करते हैं।{Event:"tick", Index:交易所索引(按实盘上交易所添加顺序), Nano:事件纳秒级时间, Symbol:合约名称}
ऑर्डर भेजने के लिएः{Event:"order", Index:交易所索引, Nano:事件纳秒级时间, Order:订单信息(与GetOrder获取一致)}
इस बिंदु पर रणनीति संरचना को इस तरह लिखा जा सकता हैः
function on_tick(symbol){
Log("symbol update")
exchange.SetContractType(symbol)
Log(exchange.GetTicker())
}
function on_order(order){
Log("order update", order)
}
function main(){
while(true){
if(exchange.IO("status")){ //判断链接状态
exchange.IO("mode", 0)
_C(exchange.SetContractType, "MA888")//订阅MA,只有第一次是真正的发出订阅请求,接下来都是程序切换,不耗时间。
_C(exchange.SetContractType, "rb888")//订阅rb
while(true){
var e = exchange.IO("wait")
if(e){
if(e.event == "tick"){
on_tick(e.Symbol)
}else if(e.event == "order"){
on_order(e.Order)
}
}
}
}else{
Sleep(10*1000)
}
}
}
यह भी ध्यान दिया जाना चाहिए कि वस्तुओं के वायदा और डिजिटल मुद्रा विनिमय के बीच अंतर है; जैसे कि GetDepth वास्तव में केवल एक ही फाइल गहराई है ((5 फाइल गहराई शुल्क महंगा है), GetTrades भी लेनदेन इतिहास प्राप्त नहीं करता है ((सभी स्टॉक परिवर्तन के आधार पर नकली हैं, कोई वास्तविक लेनदेन रिकॉर्ड नहीं है) । वस्तुओं के वायदा में उतार-चढ़ाव की सीमा है, जब बंद हो जाता है, तो गहराई से बेचने और बेचने की कीमत बंद हो जाती है, ऑर्डर की मात्रा 0 होती है, जब बंद हो जाती है, तो खरीदने और खरीदने की कीमत बंद हो जाती है, ऑर्डर की मात्रा 0 होती है। इसके अलावा वस्तुओं के वायदा में पूछताछ इंटरफ़ेस की आवृत्ति है, और खाते, ऑर्डर, स्थानों को प्राप्त करने की सीमा भी है, जैसे कि सख्त सीमा, आमतौर पर 2s। वस्तुओं की अवधि के लिए आदेश वापस लेने की सीमा आदि।
exchange.IO("इंस्ट्रूमेंट्स"): एक्सचेंज पर सभी अनुबंधों की सूची {अनुबंध नामः विवरण} शब्दकोश प्रारूप में लौटाता है, केवल वास्तविक प्लेट का समर्थन करता है।exchange.IO("products"): एक्सचेंज में सभी उत्पादों की सूची {उत्पाद नामः विवरण} शब्दकोश प्रारूप में लौटाता है, केवल वास्तविक प्लेटों का समर्थन करता है।exchange.IO("subscribed"): अनुबंधों को वापस करने के लिए जो पहले से ही अनुबंधित हैं, एक ही प्रारूप में, केवल वास्तविक प्लेट का समर्थन करते हैं।
पारंपरिक सीटीपी वायदाContractType
इस तरह के अनुबंधों के लिए, एक अनुबंध आईडी का उपयोग किया जाता है, जिसमें बड़े और छोटे अक्षरों का अंतर होता है।exchange.SetContractType("au1506")
⇒ अनुबंध सेटअप सफल होने के बाद अनुबंध के विवरण जैसे कि कम से कम एक बार कितना खरीदें, परिचालन शुल्क, वितरण समय आदि लौटते हैं. ⇒ कई अनुबंधों को सब्सक्राइब करते समय, केवल पहली बार एक वास्तविक सदस्यता अनुरोध भेजा जाता है, और फिर केवल कोड स्तर पर लेनदेन को स्विच किया जाता है, समय नहीं लगता है. ⇒ मुख्य अनुक्रमिक अनुबंध कोड 888 जैसे MA888 है, निरंतर सूचकांक अनुबंध जैसे 000 जैसे MA000, 888 और 000 केवल आभासी अनुबंधों के लिए लेनदेन का समर्थन करते हैं, वास्तविक डिस्क केवल लेनदेन प्राप्त करने का समर्थन करता है. ⇒लेकिन मैक भाषा मुख्य अनुबंधों को संचालित कर सकती है, और प्रोग्राम स्वचालित रूप से पदों को बदल देता है, यानी गैर-मुख्य पदों को समतल करता है और मुख्य पदों पर नए पदों को खोलता है।
बिना लॉग इन किए सफलतापूर्वक अनुबंध स्थापित नहीं किया जा सकता है, लेकिन यह तुरंत वापस आ जाता है, इसलिए आप _C का उपयोग करके पुनः प्रयास कर सकते हैं और जानते हैं कि सीटीपी लॉग इन पूरा हो गया है। लॉग इन सफल होने के बाद, अनुबंध को फिर से स्थापित करना समय लेने वाला नहीं है और वास्तविक नेटवर्क पहुंच का उत्पादन नहीं करेगा।
SetDirection
दिशा का उपयोग कर सकते हैंbuy, closebuy, sell, closesell
चार पैरामीटर, अधिक कमोडिटी वायदाclosebuy_today
के साथclosesell_today
हम इस बात पर सहमत नहीं हैं कि यह सही है।closebuy/closesell
समकालीन वायदा के लिए, केवल पिछली अवधि के प्रकारों को समकालीन और समकालीन के बीच अलग किया जा सकता है, जो प्रसंस्करण शुल्क को प्रभावित कर सकता है, इसलिए समकालीन वायदा को प्राथमिकता दी जानी चाहिए। पारंपरिक वायदा के लिए, दूसरा पैरामीटर सेट किया जा सकता है, या तो 1 या 2 या 3 सेट करें, क्रमशः सट्टेबाजी सट्टेबाजी, सट्टेबाजी लाभ सट्टेबाजी, सट्टेबाजी सुरक्षा, डिफ़ॉल्ट रूप से सट्टेबाजी नहीं करना।विशिष्ट लेनदेन जैसे कि खरीदारी, पदों का अधिग्रहण, आदेश प्राप्त करना, निकासी, खाता प्राप्त करना, और अन्य, डिजिटल मुद्रा वायदा लेनदेन के समान हैं।
संचालन | SetDirection के पैरामीटर | उपवर्गीय फ़ंक्शन |
---|---|---|
कई दुकानें | exchange.SetDirection (( |
विनिमय.खरीदें() |
बहुस्तरीय | exchange.SetDirection (( |
विनिमय.बिक्री() |
खाली भंडार | exchange.SetDirection (( |
विनिमय.बिक्री() |
खाली भंडार | exchange.SetDirection (( |
विनिमय.खरीदें() |
नीचे दिया गया उदाहरण एक विशिष्ट समतलता फ़ंक्शन है, ध्यान दें कि यह उदाहरण बहुत सरल है, लेकिन यह भी विचार करने के लिए कि क्या यह लेनदेन के समय में है, कैसे एक पूर्ण लेनदेन को फिर से शुरू करने के लिए, अधिकतम ऑर्डर मात्रा क्या है, क्या आवृत्ति बहुत अधिक है, विशेष रूप से स्लाइड मूल्य या डिलीवरी आदि के बारे में एक श्रृंखला के प्रश्नों के लिए है। केवल संदर्भ के लिए।वास्तविक प्लेटफ़ॉर्म के लिए, यह सलाह दी जाती है कि आप प्लेटफ़ॉर्म के लिए अच्छी तरह से पैक किए गए क्लासरूम का उपयोग करें।https://www.fmz.com/strategy/12961│ कक्षाओं के अध्याय में विशिष्ट परिचय है, और कक्षाओं के स्रोत कोड को सीखने की सलाह दी जाती है.
function Cover(contractType, amount, slide) {
for (var i = 0; i < positions.length; i++) {
if (positions[i].ContractType != contractType) {
continue;
}
var depth = _C(e.GetDepth);
if (positions[i].Type == PD_LONG || positions[i].Type == PD_LONG_YD) {
exchange.SetDirection(positions[i].Type == PD_LONG ? "closebuy_today" : "closebuy");
exchange.Sell(depth.Bids[0]-slide, amount, contractType, positions[i].Type == PD_LONG ? "平今" : "平昨", 'Bid', depth.Bids[0]);
} else {
exchange.SetDirection(positions[i].Type == PD_SHORT ? "closesell_today" : "closesell");
exchange.Buy(depth.Asks[0]+slide, amount, contractType, positions[i].Type == PD_SHORT ? "平今" : "平昨", 'Ask', depth.Asks[0]);
}
}
}
कमोडिटी फ्यूचर्स कस्टम ऑर्डर प्रकारों का समर्थन करता है (वास्तविक समर्थन, रीमेटिंग समर्थन नहीं) जो कि एक पिन के बाद निर्दिष्ट होते हैं, जैसे कि पिन_पिन के बाद
exchange.SetDirection("buy_ioc");
exchange.SetDirection("sell_gtd-20170111")
इस तरह की घटनाओं के पीछे कुछ खास कारण हैं:
कमोडिटी फ्यूचर्स ट्रेडरों में डिफ़ॉल्ट रूप से CTP इंटरफेस खोला जाता है, यदि कोई अनुरोध होता है, तो इसे ईसीएसई इंटरफेस में बदल दिया जा सकता है। FMZ के माध्यम से पैकेजिंग, कॉल करने का तरीका समान है। अंतर यह है कि खाता, ऑर्डर और होल्डिंग दोनों पुश मोड हैं, इसलिए संरक्षक इन डेटा को स्थानीय रूप से बनाए रखते हैं, जब संबंधित इंटरफ़ेस को बुलाया जाता है तो तुरंत वापस आ जाता है, वास्तव में अनुरोध नहीं किया जाता है।
ईएसआईसी प्रोटोकॉल के अनुसार, कस्टम ऑर्डर के प्रकार इस प्रकार हैंः
लॉग एक लॉग है, स्ट्रिंग के बाद @ वर्ण जोड़ा जाता है, संदेश को पुश कतार में भेजा जाता है, और वीकेएमएस या टेलीग्राम को बांधने के बाद सीधे पुश किया जाता है।Log('推送到微信@')
लॉग का रंग भी अनुकूलित किया जा सकता हैLog('这是一个红色字体的日志 #ff0000')
。#ff0000
आरजीबी रंगों के लिए 16 इंटीग्रेटेड प्रतिनिधित्व
सभी लॉग फ़ाइलें होस्ट की निर्देशिका में स्थित डिस्क पर स्थित sqlit डेटाबेस में मौजूद हैं, जिन्हें डेटाबेस सॉफ़्टवेयर का उपयोग करके खोला जा सकता है, या बैकअप को पुनः प्राप्त करने के लिए इस्तेमाल किया जा सकता है ((डेटाबेस नाम और डिस्क आईडी समान हैं) ।) ।
रिचार्ज रिकॉर्ड करें और रिचार्ज इंटरफेस पर रिचार्ज की गई आय को बनाए रखें।LogProfit(1000)
सावधान रहें.LogProfit
यदि आप अपने आप को एक संख्या के रूप में परिभाषित करते हैं, तो आप अपने आप को एक संख्या के रूप में परिभाषित कर सकते हैं।
वास्तविक डिस्क स्थिति, क्योंकि लॉग लॉग को पहले सहेजा जाता है और लगातार ताज़ा किया जाता है, यदि आपको केवल एक जानकारी दिखाने की आवश्यकता है जो सहेजी नहीं गई है, तो इसका उपयोग किया जा सकता हैLogStatus
फ़ंक्शन ।LogStatus
एक पैरामीटर एक स्ट्रिंग है, जिसे तालिका जानकारी का प्रतिनिधित्व करने के लिए भी इस्तेमाल किया जा सकता है।
एक विशिष्ट वास्तविक डिस्क स्थिति स्थान प्रदर्शित करने वाली तालिका का उदाहरणः
var table = {type: 'table', title: '持仓信息', cols: ['列1', '列2'], rows: [ ['abc', 'def'], ['ABC', 'support color #ff0000']]};
LogStatus('`' + JSON.stringify(table) + '`'); // JSON序列化后两边加上`字符, 视为一个复杂消息格式(当前支持表格)
LogStatus('第一行消息\n`' + JSON.stringify(table) + '`\n第三行消息'); // 表格信息也可以在多行中出现
LogStatus('`' + JSON.stringify([table, table]) + '`'); // 支持多个表格同时显示, 将以TAB显示到一组里
LogStatus('`' + JSON.stringify(tab1) + '`\n' + '`' + JSON.stringify(tab2) + '`\n'); // 上下排列显示多个表
पैरामीटर मिलीसेकंड है, जैसेSleep(1000)
एक सेकंड के लिए सो जाओ. व्यापार के सभी एक्सेस आवृत्तियों की सीमाओं के कारण, सामान्य रणनीति में मृत चक्र में एक सो समय शामिल करना है।
जब डिस्क रीबूट हो जाती है, तो प्रोग्राम फिर से शुरू हो जाता है, और यदि आप कुछ स्थायी जानकारी सहेजना चाहते हैं, तो आप इसे डाउनलोड कर सकते हैं।_G
यह बहुत आसान है और JSON क्रमबद्ध सामग्री को संग्रहीत करने में मदद करता है।_G
यह फ़ंक्शन लिखा हैonexit()
इस प्रकार, हर बार जब आप नीति को रोकते हैं, तो आवश्यक जानकारी स्वचालित रूप से सहेजी जाती है।
यदि आप अधिक स्वरूपित डेटा को सहेजना चाहते हैं, तो _G फ़ंक्शन बहुत उपयोगी नहीं है, आप सीधे पायथन का उपयोग करके डेटाबेस में लिख सकते हैं।
function onexit(){
_G('profit', profit)
}
function main(){
_G("num", 1); // 设置一个全局变量num, 值为1 s
_G("num", "ok"); // 更改一个全局变量num, 值为字符串ok
_G("num", null); // 删除全局变量 num
_G("num"); // 返回全局变量num的值,如果不存在返回null
var profit = 0
if(_G('profit')){
profit = _G('profit')
}
}
आदेश देने के समय, अक्सर मूल्य और मात्रा की सटीकता को नियंत्रित करने के लिए, FMZ ने _N फ़ंक्शन को अंतर्निहित किया है, जो कि अल्पविराम अंकों को संग्रहीत करने के लिए निर्धारित करता है, जैसे कि_N(4.253,2)
परिणाम 4.25 है।
एक्सचेंज एपीआई को कॉल करने के लिए, हर बार पहुंच सफल होने की गारंटी नहीं है, _C एक स्वचालित पुनः प्रयास फ़ंक्शन है। निर्दिष्ट फ़ंक्शन को सफलतापूर्वक वापस आने तक कॉल किया जाएगा (फ़ंक्शन null या false लौटाता है, पुनः प्रयास करता है, जैसे)_C(exchange.GetTicker)
, डिफ़ॉल्ट रूप से 3 सेकंड का पुनः परीक्षण अंतराल है, पुनः परीक्षण अंतराल को नियंत्रित करने के लिए _CDelay फ़ंक्शन को कॉल किया जा सकता है, उदाहरण के लिए _CDelay ((1000), यह सुझाव दिया जाता है कि _C फ़ंक्शन को 1 सेकंड के लिए पुनः परीक्षण अंतराल में बदलें।GetTicker()
,exchange.GetDepth
,GetTrade
,GetRecords
,GetAccount
,GetOrders
, GetOrder
सभी _C के साथ त्रुटि क्षमा करते हैं, जो पहुँच विफलता के कारण कार्यक्रम को बाधित करने से रोकते हैं।
CancelOrder
_C फ़ंक्शन का उपयोग नहीं किया जा सकता है, क्योंकि निरस्त करने में विफलता के विभिन्न कारण हैं, यदि एक कक्ष पहले से ही लेनदेन कर चुका है, तो निरस्त करने के लिए विफलता वापस आ जाएगी, और _C फ़ंक्शन का उपयोग करने से लगातार पुनः प्रयास होगा।
_C फ़ंक्शन को पैरामीटर में भी डाला जा सकता है और इसे कस्टम फ़ंक्शन में भी इस्तेमाल किया जाता है।
function main(){
var ticker = _C(exchange.GetTicker)
var depth = _C(exchange.GetDepth)
var records = _C(exchange.GetRecords, PERIOD_D1) //传入参数
}
सीधे कॉल करें_D()
वर्तमान समय स्ट्रिंग लौटाता है, जैसेः2019-08-15 03:46:14
│ यदि पुनः परीक्षण में कॉल किया जाता है तो पुनः परीक्षण समय लौटता है│ समय का निर्धारण _D फ़ंक्शन द्वारा किया जा सकता है, जैसेः_D().slice(11) > '09:00:00':
_D(timestamp,fmt)
,ms समय स्ट्रिंग को समय स्ट्रिंग में बदल देता है, जैसे कि_D(1565855310002)
fmt पैरामीटर समय प्रारूप है, डिफ़ॉल्ट रूप सेyyyy-MM-dd hh:mm:ss
कुछ सामान्य रूप से उपयोग किए जाने वाले संकेतक कार्यों के लिए, जैसे कि सामान्य संकेतक जैसे कि MA\MACD\KDJ\BOLL, FMZ प्लेटफ़ॉर्म सीधे अंतर्निहित है, और विशिष्ट समर्थित संकेतक एपीआई दस्तावेज़ में देखे जा सकते हैं।
संकेतक फलन का उपयोग करने से पहले, K रेखा की लंबाई का निर्धारण करना सबसे अच्छा है। जब पिछले K रेखा की लंबाई गणना के लिए आवश्यक चक्र को पूरा नहीं कर सकती है, तो परिणाम हैnull
... यदि इनपुट की गई K लाइन की लंबाई 100 है और गणना की गई MA की अवधि 10 है, तो पहले 9 मान शून्य हैं, और बाद में सामान्य गणना होती है.
जावास्क्रिप्ट भी पूर्ण तालिब का समर्थन करता है, जो तीसरे पक्ष के पुस्तकालयों के रूप में समर्थित है, जैसे किtalib.CCI(records)
◄ संदर्भhttp://ta-lib.org/function.html⇒ पायथन के लिए, तालिब को स्वयं स्थापित किया जा सकता है, क्योंकि इसे संकलित करने की आवश्यकता होती है।
संकेतक फ़ंक्शन K-रेखा डेटा के अलावा किसी भी सरणी को भी संचालित कर सकता है
function main(){
var records = exchange.GetRecords(PERIOD_M30)
if (records && records.length > 9) {
var ma = TA.MA(records, 14)
Log(ma)
}
}
यहाँ कुछ सामान्य जावास्क्रिप्ट फ़ंक्शंस का परिचय दिया गया है।
Date.now()
वर्तमान समय की ओर लौटेंparseFloat()
एक स्ट्रिंग को एक संख्या में बदलना, जैसेparseFloat("123.21")
parseInt()
स्ट्रिंग को पूर्णांक में बदलेंnum.toString()
संख्याओं को स्ट्रिंग में परिवर्तित करें, num को संख्याओं के चर मेंJSON.parse()
Json स्ट्रिंग को स्वरूपित करें, जैसेJSON.parse(exchange.GetRawJSON())
Math.max()
,Math.abs()
उदाहरण के लिएःhttps://www.w3school.com.cn/jsref/jsref_obj_math.aspएक वास्तविक डिस्क रणनीति फ़ंक्शन लिखने के लिए बहुत सारी स्थितियों पर विचार करने की आवश्यकता है, जैसे कि 5 सिक्के खरीदने के लिए एक सरल फ़ंक्शन, हमें विचार करना चाहिएः क्या वर्तमान शेष पर्याप्त है? ऑर्डर करने की कीमत कितनी है? सटीकता क्या है? बाजार को प्रभावित करने से बचने के लिए ऑर्डर को विभाजित करने की आवश्यकता नहीं है? अधूरे ऑर्डर का निपटान कैसे किया जाता है? आदि विवरण। विभिन्न रणनीतियों में ये कार्य समान हैं, एक टेम्पलेट के रूप में किया जा सकता है। आधिकारिक टेम्पलेट की नकल करें, उपयोगकर्ता भी अपनी टेम्पलेट नीति लिख सकते हैं। यहां एफएमजेड आधिकारिक द्वारा कुछ बहुत आम टेम्पलेट लाइब्रेरी का परिचय दिया जाएगा, जिससे अपनी रणनीति जल्दी से लिखना आसान हो जाएगा।
जावास्क्रिप्ट डिजिटल मुद्रा व्यापार वर्ग और कमोडिटी फ्यूचर्स व्यापार वर्ग डिफ़ॉल्ट रूप से अंतर्निहित हैं, नकल की आवश्यकता नहीं है; अन्य टेम्पलेट वर्ग पुस्तकालय रणनीति स्क्वायर में पाए जा सकते हैंhttps://www.fmz.com/square/20/1⇒ टेम्पलेट क्लास लाइब्रेरी को कॉपी और सहेजें, और अपनी नीति बनाते समय उपयोग करने के लिए चयनित क्लास लाइब्रेरी का उपयोग करें.
जावास्क्रिप्ट टेम्पलेट फ़ंक्शन$
Python के साथ शुरू करने के लिएext
शुरू करना।
स्रोत कोड का पताःhttps://www.fmz.com/strategy/10989, अंतर्निहित है, प्रतिलिपि बनाने की आवश्यकता नहीं है. विशिष्ट फ़ंक्शन के कार्यान्वयन को सीधे स्रोत कोड से संदर्भित किया जा सकता है.
खाता खोलेंः
$.GetAccount(e)
Log($.GetAccount()); // 获取账户信息, 带容错功能
Log($.GetAcccount(exchanges[1]));
नीचे दिए गए नोटिस को वापस लिया गया हैः
$.Buy/Sell(e, amount)
$.Buy(0.3); // 主交易所买入0.3个币
$.Sell(0.2); // 主交易所卖出0.2个币
$.Sell(exchanges[1], 0.1); // 次交易所卖出0.1个币
$.CancelPendingOrders(e, orderType)
$.CancelPendingOrders(); // 取消主交易所所有委托单
$.CancelPendingOrders(ORDER_TYPE_BUY); // 取消主交易所所有的买单
$.CancelPendingOrders(exchanges[1]); // 取消第二个交易所所有订单
$.CancelPendingOrders(exchanges[1], ORDER_TYPE_SELL); // 取消第二个交易所所有的卖单
क्रॉस का फैसलाः
$.Cross(periodA, periodB) / $.Cross(arr1, arr2);
var n = $.Cross(15, 30);
var m = $.Cross([1,2,3,2.8,3.5], [3,1.9,2,5,0.6])
如果 n 等于 0, 指刚好15周期的EMA与30周期的EMA当前价格相等
如果 n 大于 0, 比如 5, 指15周期的EMA上穿了30周期的EMA 5个周期(Bar)
如果 n 小于 0, 比如 -12, 指15周期的EMA下穿了30周期的EMA 12个周期(Bar)
如果传给Cross不是数组, 则函数自动获取K线进行均线计算
如果传给Cross的是数组, 则直接进行比较
$.withdraw ((e, currency, address, amount, fee, password) निकासी फ़ंक्शनः
$.withdraw(exchange, "btc", "0x.........", 1.0, 0.0001, "***")
कमोडिटी फ्यूचर्स ट्रेडिंग लाइब्रेरी का उपयोग स्थिर है, इसका उपयोग करने की सिफारिश की जाती है। स्रोत कोड पताःhttps://www.fmz.com/strategy/12961◊ पहले से ही अंतर्निहित है, प्रतिलिपि बनाने की कोई आवश्यकता नहीं है.
सीटीए संग्रह
function main() {
$.CTA("rb000,M000", function(r, mp) {
if (r.length < 20) {
return
}
var emaSlow = TA.EMA(r, 20)
var emaFast = TA.EMA(r, 5)
var cross = $.Cross(emaFast, emaSlow);
if (mp <= 0 && cross > 2) {
Log("金叉周期", cross, "当前持仓", mp);
return 1
} else if (mp >= 0 && cross < -2) {
Log("死叉周期", cross, "当前持仓", mp);
return -1
}
});
}
क्लासरूम कॉल उदाहरण
function main() {
var p = $.NewPositionManager();
p.OpenShort("MA609", 1);
p.OpenShort("MA701", 1);
Log(p.GetPosition("MA609", PD_SHORT));
Log(p.GetAccount());
Log(p.Account());
Sleep(60000 * 10);
p.CoverAll("MA609");
LogProfit(p.Profit());
Log($.IsTrading("MA609"));
// 多品种时使用交易队列来完成非阻塞的交易任务
var q = $.NewTaskQueue();
q.pushTask(exchange, "MA701", "buy", 3, function(task, ret) {
Log(task.desc, ret)
})
while (true) {
// 在空闲时调用poll来完成未完成的任务
q.poll()
Sleep(1000)
}
}
चूंकि मूल ग्राफ फ़ंक्शन अपेक्षाकृत जटिल है, जो अगले ट्यूटोरियल में पेश किया जाएगा, इसलिए शुरुआती लोगों को सीधे ग्राफ लाइब्रेरी का उपयोग करने की सलाह दी जाती है, जो बहुत सरल ग्राफ लाइन, के लाइन, आदि है। एफएमजेड में एक सरल वर्ग लाइब्रेरी अंतर्निहित है, जिसे नीति संपादक पृष्ठ पर देखा जा सकता है, यदि कोई अंतर्निहित नहीं है, तो उपयोगकर्ता को स्वयं को कॉपी और सहेजने की आवश्यकता होती है ताकि नीति में संदर्भों का चयन किया जा सके।
जावास्क्रिप्ट प्रिंटआउट चित्रों की सूची को कॉपी करने का पताःhttps://www.fmz.com/strategy/27293पायथन प्रिंटलाइन क्लासरूम को कॉपी करने का पताःhttps://www.fmz.com/strategy/39066
उदाहरण के लिएः
function main() {
while (true) {
var ticker = exchange.GetTicker()
if (ticker) {
$.PlotLine('Last', ticker.Last) //可以同时画两条线,Last是这条线的名字
$.PlotLine('Buy', ticker.Buy)
}
Sleep(6000)
}
}
नीति संपादक के नीचे नीति पैरामीटर सेटिंग है, जो नीति के वैश्विक चर के बराबर है, जिसे कोड के किसी भी स्थान पर पहुँचा जा सकता है। नीति पैरामीटर को वास्तविक डिस्क इंटरफ़ेस में संशोधित किया जा सकता है, जो पुनः आरंभ पर प्रभावी हो जाता है। इसलिए कुछ चर को पैरामीटर के रूप में सेट किया जा सकता है, और बिना नीति को संशोधित किए पैरामीटर को बदला जा सकता है।
स्ट्रिंग प्रकार और संख्यात्मक प्रकार समझने में आसान हैं और सबसे अधिक उपयोग किए जाने वाले प्रकार हैं. ड्रॉपडाउन पैरामीटर इंटरफ़ेस में विकल्प ड्रॉपडाउन प्रदर्शित करेगा, जैसे कि ड्रॉपडाउन पैरामीटर का मान सेट करना।BTC|USDT|ETH
, यदि पैरामीटर पृष्ठ के ड्रॉपडाउन में USDT का चयन किया जाता है, तो नीति में SYMBOL का मान USDT का सूचकांक 1 होगा.
पैरामीटर और भी बहुत कुछ सेट कर सकते हैं।https://www.fmz.com/bbs-topic/1306
एक बार जब आप किसी रणनीति को क्वांटिफाइड कर लेते हैं, तो आप अपनी रणनीति को ऐतिहासिक डेटा के साथ परीक्षण कर सकते हैं और देख सकते हैं कि आपकी रणनीति ऐतिहासिक डेटा में कितना लाभान्वित हुई है। बेशक, पुनर्मूल्यांकन परिणाम केवल संदर्भ के लिए हैं। FMZ क्वांटिफाइड प्लेटफॉर्म डिजिटल मुद्राओं की वर्तमान, वायदा, BitMEX स्थायी अनुबंध वस्तुओं और वायदा के पुनर्मूल्यांकन का समर्थन करता है, जिनमें से डिजिटल मुद्राएं मुख्य रूप से मुख्यधारा की किस्मों का समर्थन करती हैं। जावास्क्रिप्ट रीसेट ब्राउज़र में किया जाता है, पायथन रीसेट होस्ट पर की आवश्यकता होती है, जो प्लेटफॉर्म का उपयोग करके सार्वजनिक होस्ट प्रदान करता है। मैक भाषा के रीसेट के लिए और अधिक पैरामीटर सेट करने की आवश्यकता होती है, विशेष रूप से मैक भाषा दस्तावेजों का संदर्भ लें।
onbar retracement mechanism K-line पर आधारित है, यानी प्रत्येक K-line एक retracement समय बिंदु उत्पन्न करता है, जिस पर वर्तमान K-line के उच्च-निम्न अधिग्रहण मूल्य, लेनदेन मात्रा आदि की जानकारी प्राप्त की जा सकती है, और उस समय से पहले।
गॉन्चेरएपीआई
विज्ञानस्थानीय रूप से नीति को कैसे लागू करें? मैंने एक सरल लॉग आउटपुट कथन लिखा है, और वाक्य के अंत में संचालन का पालन किया है। पहला कदम, सर्वर के रूप में एक लैपटॉप का उपयोग करके होस्टिंग प्रोग्राम चलाना है। दूसरा चरण, एक सरल लॉग आउटपुट जानकारी के लिए एक test.py प्रोग्राम लिखना (एफएमजेड के लिए एपीआई इंटरफ़ेस फ़ंक्शन); तीसरा चरण, पाठ के अंत में, एक runfile लिखें, जिसे run.py पर कॉल करके test.py चलाएं. /upload/asset/1add39483ef82d45b3ce3.png
ग्लिप9मैं नेटीजी क्लाउड क्वांटिफाइंग ट्रेडिंग कोर्स खरीदता हूं, अब मैं कहां जा रहा हूं?
मोनुराजकअनेक
मोनुराजकहाय
भाईसीखना
wqyएक छोटा सा टेक्स्ट त्रुटि है, GetAccount खाता प्राप्त करता है, और FrozenStocks के बारे में जानकारी में, फ्रीज बैलेंस होना चाहिए, उपलब्ध बैलेंस नहीं।
मेजर जयाgetorder outtime ऑर्डर आउटटाइम प्राप्त करें, ओकेएक्स के एक्सचेंजों, कैसे करें
उड़ी के 12 उच्च युक्तियाँगारंटीकृत परिसंपत्ति की दर 0% के लिए बाध्य बेंचमार्क की गारंटीकृत परिसंपत्ति की दर नहीं मिल सकता है
शिफेंग2020मैं 1 मिनट के स्ट्रिंग ऑपरेशन को देख रहा हूं, इसलिए पायथन के मृत चक्र के लिए नींद का समय 0.1s पर सेट किया जा सकता है, यानी नींद ((100) क्या मैंने देखा कि आपने इसमें एक नींद ((10) लिखी है, यानी 0.1s हुओबी एचएम के एपीआई सीमा से अधिक नहीं होगा?
पूर्वी वेंटिलेशनexchange.SetDirection (("closebuy"); // यदि स्थायी अनुबंध है, तो सीधे exchange.SetDirection (("sell") सेट करें यहाँ मैंने ओकेएक्स के स्थायी अनुबंध का परीक्षण किया है, अगर इसे बेचने के लिए सेट किया गया है, तो यह सीधे खाली हो जाता है, और यह बहुत सस्ता नहीं है।
पूर्वी वेंटिलेशनexchange.SetDirection (("closebuy"); // यदि स्थायी अनुबंध है, तो सीधे exchange.SetDirection (("sell") सेट करें यहाँ मैंने ओकेएक्स के स्थायी अनुबंध का परीक्षण किया है, अगर इसे बेचने के लिए सेट किया गया है, तो यह सीधे खाली हो जाता है, और यह बहुत सस्ता नहीं है।
पूर्वी वेंटिलेशनGetOrders के कोड में दो वर्तनी त्रुटियां हैं. एक function को fuction में लिखा गया है और दूसरा for लूप की शर्तों में लिखा गया है.
पूर्वी वेंटिलेशनयह मेरी गलती है। exchange.Buy ((-1, 0.5), ट्रेडिंग जोड़ी ETH_BTC है, और बाजार सूची 0.5BTC के लिए ETH खरीदने का प्रतिनिधित्व करती है exchange.Buy ((price, 0.5), यदि यह सीमा सूची है, तो यह मूल्य के साथ 0.5ETH खरीदने का प्रतिनिधित्व करता है
पूर्वी वेंटिलेशनexchange.Buy ((-1, 0.5), ट्रेडिंग जोड़ी ETH_BTC है, जो बाजार मूल्य पर 0.5BTC के ETH को खरीदने का प्रतिनिधित्व करती है यहाँ यह 0.5ETH के लिए बाजार मूल्य पर खरीदा जाना चाहिए।
ग्लिप9धन्यवाद.
घासयह सब नेट पर उपलब्ध है https://study.163.com/course/courseMain.htm?share=2&shareId=400000000602076&courseId=1006074239&_trace_c_p_k2_=c3f5d238efc3457d93c8b92c0398d2b2
घासहोम पेज पर WeChat जोड़ें, आपको समूह में लाएं
wqyकभी-कभी समस्याएं आती हैं और मुझे नहीं पता कि मुझे कहां पूछना है।
घासबदल गया
घासपुनः प्राप्त करें
घासआप GetRawJSON का उपयोग कर सकते हैं या फ़ील्ड में जानकारी देख सकते हैं
पूर्वी वेंटिलेशनबहुत बढ़िया, और मैनेजमेंट का जवाब भी। मुझे कोड में कई वर्तनी त्रुटियां मिली हैं, हाहा।
घासओह, यह सही है, गलतियों को इंगित करने के लिए धन्यवाद।
घासकुछ स्थायी अनुबंध दो तरफा होल्डिंग की अनुमति देते हैं, जिन्हें एक समतल सेटअप की आवश्यकता होती है। मैंने अपडेट किया, पहले केवल बिटमेक्स था।