[TOC] इस ट्यूटोरियल में एपीआई परिचय, बैकटेस्ट, चार्ट और अधिक सहित रणनीति लेखन के बुनियादी ज्ञान शामिल हैं। इस बुनियादी ट्यूटोरियल को सीखने के बाद, उपयोगकर्ता बुनियादी एपीआई का कुशलता से उपयोग करने और एक स्थिर बॉट रणनीति लिखने में सक्षम होंगे। ट्यूटोरियल सीखने से पहले, आपको यह सीखने की आवश्यकता है कि इसका उपयोग कैसे करेंएफएमजेड क्वांट प्लेटफार्म प्रारंभ करें.
पुराने संस्करण ट्यूटोरियलःFMZ क्वांट (FMZ.COM) रणनीति लेखन मैनुअल 2.0 (ट्यूटोरियल)ट्यूटोरियल में कई पोस्ट इंडेक्स हैं, जिन्हें पढ़ने की सलाह दी जाती है।
प्रोग्राम ट्रेडिंग में एपीआई के माध्यम से प्लेटफार्मों से कनेक्ट करने के लिए प्रोग्राम का उपयोग करना होता है ताकि डिजाइन इरादे के अनुसार स्वचालित खरीद और बिक्री या अन्य कार्यों को प्राप्त किया जा सके। एपीआई एप्लिकेशन प्रोग्रामिंग इंटरफेस का प्रतिनिधित्व करता है।
वर्तमान में, क्रिप्टोक्यूरेंसी प्लेटफार्मों के लिए दो मुख्य इंटरफ़ेस प्रोटोकॉल हैंः REST और Websocket। प्रत्येक बार जब REST प्रोटोकॉल डेटा प्राप्त करता है, तो इसे एक बार एक्सेस करने की आवश्यकता होती है। आइए एक उदाहरण के रूप में अनुकरणीय मंच
{"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 के नवीनतम बाजार उद्धरणों के बाद ट्रेडिंग, हर बार ताज़ा होने पर बदल जाएगी;
एफएमजेड क्वांट ट्रेडिंग प्लेटफ़ॉर्म प्रत्येक प्लेटफ़ॉर्म के आरईएसटी इंटरफ़ेस को शामिल करता है, और कॉल करने के लिए एक एकीकृत तरीके और एक एकीकृत डेटा प्रारूप का उपयोग करता है, जिससे रणनीति लेखन सरल और अधिक सामान्य हो जाता है। वेबसॉकेट को आसानी से एफएमजेड प्लेटफ़ॉर्म पर समर्थित किया जा सकता है, जिसे अगले ट्यूटोरियल में विस्तार से पेश किया जाएगा।
एफएमजेड प्लेटफॉर्म एपीआई दस्तावेज़ के अधिकांश भागों में जावास्क्रिप्ट का उपयोग उदाहरण के रूप में किया जाता है, लेकिन कैप्सुलेशन के कारण, विभिन्न भाषाओं के बीच लगभग कोई अंतर नहीं है, और आपको केवल वाक्यविन्यास के मुद्दों पर ध्यान देने की आवश्यकता है।
चूंकि पायथन के विभिन्न संस्करण हैं, इसलिए इसे कार्यक्रम की शुरुआत में निर्दिष्ट किया जा सकता है, जैसे कि#!Python2
और#!Python3
. ध्यान दें कि जावास्क्रिप्ट ने हाल ही में अपने ES6 सिंटैक्स को अपग्रेड किया है, और जो लोग रुचि रखते हैं वे इसके बारे में सीख सकते हैं। एक ही कार्यों के साथ पायथन और जावास्क्रिप्ट कोड नीचे दिखाए गए हैं। यह देखा जा सकता है कि केवल सिंटैक्स अंतर हैं, इसलिए एपीआई दस्तावेज़ केवल जावास्क्रिप्ट के उदाहरण देता है, और यह ट्यूटोरियल पायथन के विशेष उपयोग मामलों को भी ध्यान में रखेगा।
#python code
def main():
while True:
Log(exchange.GetAccount().Balance)
Sleep(2000)
#the corresponding Js code
function main(){
while(true){
Log(exchange.GetAccount().Balance)
Sleep(2000)
}
}
एफएमजेड क्वांट प्लेटफॉर्म
रणनीति कार्यक्रम एक सामान्य कार्यक्रम के समान है, जिसे कोड आदेशों में निष्पादित किया जाता है। विशेष भाग यह है कि एक
विशेष क्रियाओं वाले अन्य कार्य निम्नानुसार दर्शाए गए हैंः
function onTick(){
var ticker = exchange.GetTicker()
var account = exchange.GetAccount()
//write the strategy logic here, and it will be called ever 6 seconds
}
function main(){
while(true){
onTick()
Sleep(6000)
}
}
पिछले उदाहरण में, यदि नेटवर्क एक्सेस में त्रुटि है, तो रणनीति सीधे बंद हो सकती है। यदि आप एक ऐसी रणनीति चाहते हैं जो स्वचालित पुनरारंभ के समान है और बंद नहीं होगी, तो आप बॉट रणनीति में
function onTick(){
var ticker = exchange.GetTicker()
var account = exchange.GetAccount()
//write the strategy logic here, and it will be called ever 6 seconds
}
function main(){
try{
while(true){
onTick()
Sleep(6000)
}
}catch(err){
Log(err)
}
}
किसी भी प्लेटफ़ॉर्म से संबंधित एपीआई को कॉल करते समय, आपको प्लेटफ़ॉर्म और ट्रेडिंग जोड़ी निर्दिष्ट करने की आवश्यकता होती है. यदि केवल एक exchange
उदाहरण के लिए, क्याexchange.GetTicker()
इस
एफएमजेड क्वांट प्लेटफ़ॉर्म एक ही समय में कई exchanges
उन्हें प्रतिनिधित्व करने के लिए सरणी, अर्थात्exchanges[0]
औरexchanges[1]
... और इतने पर, जोड़ने क्रम के अनुसार जब बॉट बनाया जाता है. व्यापार जोड़ी के प्रारूप में, जैसे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)
}
}
जैसा कि पिछले उदाहरण में उल्लेख किया गया है, बाजार इंटरफ़ेस आम तौर पर एक सार्वजनिक इंटरफ़ेस है, जिसे हर कोई एक्सेस कर सकता है। सामान्य बाजार इंटरफ़ेस हैंः GetTicker, GetDepth, GetRecords और GetTrades। बाजार उद्धरण ट्रेडिंग निर्णय लेने के लिए रणनीति का आधार है। बाद में, मैं उन्हें एक-एक करके पेश करूंगा। उन्हें
प्रत्येक इंटरफ़ेस में आम तौर पर एकInfo
फ़ील्ड, जो प्लेटफ़ॉर्म द्वारा लौटाई गई मूल डेटा स्ट्रिंग का प्रतिनिधित्व करता है, और जिसका उपयोग अतिरिक्त जानकारी को पूरक करने के लिए किया जा सकता है। उपयोग से पहले इसे पार्स करने की आवश्यकता है। जावास्क्रिप्ट का उपयोग करता हैJSON.parse()
, जबकि पायथन json पुस्तकालय का उपयोग करता है.Time
इस फ़ील्ड में अनुरोध का समय-स्टैम्प दिया गया है, जिसका उपयोग देरी का आकलन करने के लिए किया जा सकता है।
बॉट में किसी भी एपीआई का उपयोग करते समय, पहुँच विफल हो सकती है और वापस आ सकती हैnull
, और पायथन लौटाता हैNone
. इस समय, उपयोग में डेटा एक त्रुटि की रिपोर्ट करेगा और बॉट को रोकने के लिए कारण होगा, इसलिए त्रुटि सहिष्णुता बहुत महत्वपूर्ण है. यह ट्यूटोरियल विशेष रूप से त्रुटि सहिष्णुता का परिचय देगा.
GetTicker शायद सबसे अधिक उपयोग किया जाने वाला इंटरफ़ेस है। आप अंतिम बार निष्पादित मूल्य, buy1 मूल्य और sell1 मूल्य, और नवीनतम ट्रेडिंग वॉल्यूम पा सकते हैं। ऑर्डर देने से पहले, निष्पादित मूल्य को टिकर जानकारी के अनुसार निर्धारित किया जा सकता है। बॉट रिटर्न का एक उदाहरणः{"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 in the debugging tool, and you can see the specific result
Log('Last time executed price:',ticker.Last, 'Buy1 price:', ticker.Buy)
}
लंबित आदेशों की गहराई की जानकारी प्राप्त करने के लिए GetDepth। हालांकि GetTicker में buy 1 और sell1 की कीमतें शामिल हैं, यदि आप अधिक गहरे लंबित आदेशों को क्वेरी करना चाहते हैं, तो आप इस इंटरफ़ेस का उपयोग कर सकते हैं, आम तौर पर 200 लंबित आदेशों को ऊपर और नीचे की जाँच करने के लिए। इस इंटरफ़ेस का उपयोग करके सदमे की कीमतों की गणना की जा सकती है। नीचे एक वास्तविक रिटर्न परिणाम है। उनमें से,
{
"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
}
पूछताछ और बोली के लिए GetDepth का उपयोग करने का उदाहरणः
function main() {
var depth = exchange.GetDepth()
Log('Buy 1 price:', depth.Bids[0].Price, 'Sell 1 price:', depth.Asks[0].Price)
}
GetRecords सबसे अधिक उपयोग किए जाने वाले इंटरफेस में से एक है, एक समय में एक लंबी अवधि में मूल्य जानकारी वापस कर सकता है, जो विभिन्न संकेतकों की गणना का आधार है। यदि K-लाइन अवधि निर्दिष्ट नहीं है, तो इसका मतलब है कि बॉट जोड़ने पर डिफ़ॉल्ट अवधि का उपयोग करना। K-लाइन की लंबाई निर्दिष्ट नहीं की जा सकती है, और यह समय के साथ बढ़ती रहेगी। अधिकतम संख्या 2000 है, और पहली कॉल में संख्या लगभग 200 है (अलग-अलग प्लेटफॉर्म अलग-अलग नंबर वापस करते हैं) । अंतिम K-लाइन नवीनतम K-लाइन है, इसलिए बाजार उद्धरण बदलते हैं, डेटा बदल जाएगा; पहली K-लाइन सबसे पुराना डेटा है।
exchange.SetMaxBarLen(Len)
पहली बार प्राप्त की गई K-लाइनों की संख्या (कुछ प्लेटफार्मों द्वारा समर्थित) और अधिकतम K-लाइनों की संख्या सेट कर सकते हैं।जैसे: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 मिनट के तहत के-लाइन को GetTrades))) के माध्यम से संश्लेषित किया जाएगा, और कमोडिटी वायदा टिक के अनुसार संश्लेषित किया जाएगा।ध्यान दें कि अन्य पूर्ण बड़े अक्षर चर भी हैं जैसे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
}
GetTrades एक निश्चित समय सीमा के भीतर ट्रेडिंग डेटा प्राप्त करता है (आपके स्वयं के ट्रेडिंग डेटा नहीं), जो कुछ प्लेटफार्मों द्वारा समर्थित नहीं है। यह आम तौर पर उपयोग नहीं किया जाता है, और आप एपीआई दस्तावेज़ में विस्तृत परिचय की जांच कर सकते हैं।
ये इंटरफेस खाते से संबंधित हैं, इसलिए उन्हें सीधे प्राप्त नहीं किया जा सकता है। उन्हें प्राप्त करने के लिए, आपको साइन इन करने के लिए एपीआई-की का उपयोग करने की आवश्यकता है। एफएमजेड प्लेटफॉर्म के एकीकृत स्वचालित पृष्ठभूमि प्रसंस्करण के बाद, आप उन्हें सीधे उपयोग कर सकते हैं।
खाता जानकारी प्राप्त करने के लिए GetAccount प्राप्त करें. सबसे अधिक उपयोग किए जाने वाले इंटरफेस में से एक के रूप में, इसे आदेश देने से पहले बुलाया जाना चाहिए, ताकि अपर्याप्त संतुलन से बचा जा सके। रिटर्न परिणाम इस तरह हैः{"Stocks":0.38594816,"FrozenStocks":0,"Balance":542.858308,"FrozenBalance":0,"Info":{}}
जहां 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)
, जिसमें null
यदि आदेश सफल नहीं होता है तो वापस कर दिया जाएगा, जिसका उपयोग आदेश की स्थिति की क्वेरी करने के लिए किया जाता है।
यदि आप बाजार मूल्य पर एक खरीद आदेश रखना चाहते हैं, exchange.Buy(-1, 0.5)
; यदि व्यापारिक जोड़ीETH_BTC
, जिसका अर्थ है कि बाजार मूल्य पर 0.5BTC ईटीएच खरीदें। कुछ प्लेटफार्म बाजार आदेशों का समर्थन नहीं करते हैं, न ही वायदा बैकटेस्ट करते हैं।
कुछ प्लेटफार्मों में कीमत और राशि के लिए सटीक आवश्यकताएं हैं जिन्हें सटीक कार्य के साथ नियंत्रित किया जा सकता है_N()
फ्यूचर्स ट्रेडिंग के लिए
एक बार प्रासंगिक मूल्य तक पहुँचने पर खरीद का एक उदाहरणः
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')
}
बिक्री आदेश. पैरामीटर exchange.Sell(-1, 0.2)
, का अर्थ है बाजार मूल्य पर 0.2ETH बेचना।
GetOrder आदेश आईडी के आधार पर आदेश जानकारी प्राप्त करता है. जब यह आम इंटरफ़ेस विधि को कॉल करता हैexchange.GetOrder(OrderId)
, Type
और आदेश का वास्तविक मूल्यStatus
FMZ इन मूल्यों का प्रतिनिधित्व करने के लिए वैश्विक स्थिरांक का उपयोग करता है। उदाहरण के लिए,Status
एक अधूरे आदेश का मान 0 है, जो कि के बराबर हैORDER_STATE_PENDING
. इन सभी वैश्विक स्थिरांक दस्तावेज में देखा जा सकता है... रिटर्न परिणामः
{
"Id":125723661, //Order id
"Amount":0.01, //Order ammount
"Price":7000, //Order price
"DealAmount":0, //Executed amount
"AvgPrice":0, //executed average price
"Status":0, //0: not completely executed; 1: executed; 2: canceled
"Type":1,//Order type; 0: buy order; 1: sell order
"ContractType":"",//contract type, used in futures trading
"Info":{} //the platform returns the raw information
}
}
मुद्रा की एक निर्दिष्ट राशि खरीदने की रणनीतिः
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){ //Here you can aslo use "status == ORDER_STATE_PENDING" to judge
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
. स्पॉट ट्रेडिंग जोड़े के विपरीत, वायदा अनुबंध अक्सर BTC जैसी ट्रेडिंग मुद्रा का उपयोग मार्जिन के रूप में करते हैं। एक ट्रेडिंग जोड़ी में BTC जोड़ना आमतौर पर BTC_USD ट्रेडिंग जोड़ी का प्रतिनिधित्व करता है जो BTC को मार्जिन के रूप में उपयोग करता है। यदि USDT के साथ वायदा अनुबंध है, तो मार्जिन के रूप में BTC_USDT ट्रेडिंग जोड़ी जोड़ने के लिए एक बॉट बनाने की आवश्यकता होती है। उदाहरण के लिए, बिनेंस ओकेएक्स फ्यूचर्स जैसे स्थायी अनुबंध, क्रिप्टो-मार्जिन और USDT-मार्जिन दोनों अनुबंधों के साथ।ट्रेडिंग जोड़ी सेट करने के बाद, आपको विशिष्ट अनुबंध प्रकार भी सेट करना होगा, जैसे कि स्थायी, साप्ताहिक, अगले सप्ताह, आदि। अनुबंध सेट करने के बाद, आप बाजार उद्धरण प्राप्त करने, खरीदने और बेचने जैसे संचालन कर सकते हैं।
Binance, OKEX, HuobiDM, आदि में क्रिप्टो-मार्जिन और USDT-मार्जिन दोनों अनुबंध हैं, जिन्हें बॉट जोड़ने और अनुबंध सेट करने पर अलग करने की आवश्यकता होती है। विशिष्ट सेटिंग्स निम्नानुसार हैंः
//OKEX Futures
exchange.SetContractType("swap") // set to perpetual contract
exchange.SetContractType("this_week") // set to weekly contract
exchange.SetContractType("next_week") // set to next week contract
exchange.SetContractType("quarter") // set to quarterly contract
//HuobiDM
exchange.SetContractType("this_week") // set to weekly contract
exchange.SetContractType("next_week") // set to next week contract
exchange.SetContractType("quarter") // set to quarterly contract
exchange.SetContractType("swap") // set to perpetual contract
//Binance Futures
exchange.SetContractType("swap") // set to perpetual contract, and notice that crypto-margined and USDT-margined contracts are all in the perpetual contract
exchange.SetContractType("quarter") // set to quarterly contract
exchange.SetContractType("next_quarter") // set to next quarter contract
//BitMEX
exchange.SetContractType("XBTUSD") // set to perpetual contract
exchange.SetContractType("XBTM19") // the contract settled at a specific time; for more details, please log in BitMEX to check each contract code
//GateIO
exchange.SetContractType("swap") // set to perpetual contract, and do not set the default as swap perpetual contract
//Deribit
exchange.SetContractType("BTC-27APR18") // the contract settled at a specific time; for more details, please log in Deribit to check out
वर्तमान स्थिति सूचना सूची प्राप्त करने के लिए, OKEX (OKCOIN) वायदा प्राप्त करने के लिए अनुबंध प्रकार निर्दिष्ट करने के लिए एक पैरामीटर में पारित कर सकते हैं। एक खाली सूची लौटाएँ[]
, यदि कोई स्थिति नहीं है। स्थिति की जानकारी निम्नानुसार लौटाई जाती है। बहुत सी विशिष्ट जानकारी है, जिसका विश्लेषण ट्रेडिंग जोड़ी के साथ संयोजन में करने की आवश्यकता है।
डेटा प्रकार | चर का नाम | विवरण |
---|---|---|
वस्तु | जानकारी | कच्ची संरचना जो मंच लौटाता है |
संख्या | मार्जिन लेवल | लीवरेज आकार; OKCoin 10 या 20 है, और OK वायदा के पार पद 10 (फिक्स्ड) देता है, कच्चे एपीआई के लिए समर्थन नहीं करता |
संख्या | राशि | स्थिति राशि; OKCoin अनुबंध मात्रा (पूर्णांक 1 से अधिक) दर्शाता है |
संख्या | जमे हुए राशि | जमे हुए पद की राशि |
संख्या | मूल्य | स्थिति की औसत कीमत |
संख्या | मार्जिन | जमे हुए मार्जिन |
संख्या | लाभ | कमोडिटी फ्यूचर्सः बाजार के लिए स्थिति का लाभ और हानि चिह्न; क्रिप्टोक्यूरेंसीः क्रिप्टोक्यूरेंसी इकाईः बीटीसी / एलटीसी, पारंपरिक वायदा इकाईः आरएमबी (नोटःओकेकोइन वायदा की क्रॉसिंग स्थिति के मामले में, यह स्थिति के लाभ और हानि को नहीं, बल्कि प्राप्त लाभ और हानि को संदर्भित करता है। अलग स्थिति के तहत, यह स्थिति के लाभ और हानि को संदर्भित करता है।) |
कंस्ट | प्रकार | PD_LONG लंबी स्थिति है (CTP एक स्थिति को बंद करने के लिए |
स्ट्रिंग | अनुबंध प्रकार | कमोडिटी वायदा अनुबंध कोड हैं, और स्टॉक हैं |
function main(){
exchange.SetContractType("this_week");
var position = exchange.GetPosition();
if(position.length>0){ //especially pay attention to judging the length of position before call, or an error will occur
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)
, जहां exchange.SetDirection(Direction)
, जो खुली और बंद पोजीशनों से मेल खाती है।वायदा के विपरीत, यदि एक स्थायी अनुबंध एक ही समय में लंबे और छोटे की अवधारणाओं को नहीं रखता है, यानी एक एकल स्थिति की अनुमति नहीं है। जब आप एक लंबी स्थिति पर खुले शॉर्ट संचालित करते हैं, तो लंबी स्थिति स्वचालित रूप से बंद हो जाएगी, इसलिए आपको केवल सेट करने की आवश्यकता हैbuy
औरsell
. यह दो तरफा पदों का समर्थन करता है, तो आप सेट करने की जरूरत हैclosebuy
, closesell
.विशिष्ट संबंध:
ऑपरेशन | SetDirection पैरामीटर | आदेश देने का कार्य |
---|---|---|
खुली लंबी स्थिति | exchange.SetDirection (( |
विनिमय.खरीदें() |
लंबी स्थिति बंद करें | exchange.SetDirection (( |
विनिमय.बिक्री() |
खुली छोटी स्थिति | exchange.SetDirection (( |
विनिमय.बिक्री() |
लघु स्थिति बंद करें | exchange.SetDirection (( |
विनिमय.खरीदें() |
अंत में, खुले और बंद पदों के लिए विशिष्ट कोड है। रखे गए आदेशों की मात्रा प्लेटफ़ॉर्म से प्लेटफ़ॉर्म में भिन्न होती है। उदाहरण के लिए, Huobi वायदा अनुबंध मात्रा की संख्या पर आधारित होते हैं, और एक अनुबंध 100 अमेरिकी डॉलर है। ध्यान दें कि वायदा बैकटेस्ट बाजार आदेशों का समर्थन नहीं करता है।
function main(){
exchange.SetContractType("this_week") // for example, set OKEX futures to weekly contract
price = exchange.GetTicker().Last
exchange.SetMarginLevel(10) // set to 10 times of leverage
exchange.SetDirection("buy") // set the order type as buy long
exchange.Buy(price+10, 20) // set contract quantity as 20 orders
pos = exchange.GetPosition()
Log(pos)
Log(exchange.GetOrders()) // check out if there is any unfinished order
exchange.SetDirection("closebuy"); // if it is a perpetual contract, directly set exchange.SetDirection("sell")
exchange.Sell(price-10, 20)
}
पूर्ण बंद पदों का एक विशिष्ट रणनीतिक उदाहरण निम्नानुसार दें:
function main(){
while(true){
var pos = exchange.GetPosition()
var ticker = exchange.GetTicekr()
if(!ticker){
Log('not able to obtain ticker')
return
}
if(!pos || pos.length == 0 ){
Log('no position')
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") सामान्य खाता मोड पर वापस स्विच करने के लिए।
समर्थित प्लेटफ़ॉर्मः
कमोडिटी फ्यूचर्स ट्रेडिंग और क्रिप्टोक्यूरेंसी फ्यूचर्स ट्रेडिंग काफी अलग हैं। सबसे पहले, कमोडिटी फ्यूचर्स का ट्रेडिंग समय बहुत कम है, लेकिन क्रिप्टोक्यूरेंसी का व्यापार 24 घंटे के लिए किया जाता है; कमोडिटी फ्यूचर्स का प्रोटोकॉल एक आम तौर पर उपयोग किया जाने वाला REST एपीआई नहीं है; कमोडिटी फ्यूचर्स की ट्रेडिंग आवृत्ति और लंबित ऑर्डर राशि सीमित हैं, लेकिन क्रिप्टोक्यूरेंसी के बहुत ढीले हैं, और इसी तरह। इसलिए, कमोडिटी फ्यूचर्स ट्रेडिंग करते समय कई बिंदुओं पर विशेष ध्यान देने की आवश्यकता होती है, और यह उन लोगों के लिए अनुशंसित है जिनके पास मैनुअल संचालन में समृद्ध अनुभव है। एफएमजेड अब कमोडिटी फ्यूचर्स सिमुलेटेड बॉट का समर्थन करता है, और आप संदर्भित कर सकते हैंःhttps://www.fmz.com/bbs-topic/325कमोडिटी वायदा कंपनियों को जोड़ने के लिएःhttps://www.fmz.com/bbs-topic/371
कमोडिटी फ्यूचर्स ने जून 2019 में पारदर्शी पर्यवेक्षण लागू किया है; व्यक्तिगत कार्यक्रम के लिए, व्यक्तिगत उपयोगकर्ताओं को वायदा दलालों के लिए प्राधिकरण कोड के लिए आवेदन करने के लिए एक खाता खोलने की आवश्यकता होती है (विशिष्ट आवेदन सूचना टेम्पलेट को वीचैट समूह या क्यूक्यू समूह में भेजा जा सकता है), जिसमें आम तौर पर 4-5 दिन लगते हैं; प्रक्रियाएं काफी जटिल होती हैं। एक प्रोग्रामेटिक ट्रेडिंग प्रदाता के रूप में, एफएमजेड प्लेटफॉर्म ने विभिन्न वायदा सेवा प्रदाताओं से सॉफ्टवेयर प्राधिकरण कोड के लिए आवेदन किया है। उपयोगकर्ता आवेदन किए बिना सीधे उनका उपयोग कर सकते हैं। वायदा दलाल जोड़ते समय, एफएमजेड ने आवेदन की सूची देखने के लिए
एफएमजेड क्वांट प्लेटफॉर्म संरचना के फायदे के कारण, उपयोगकर्ता कई वायदा ब्रोकर खातों को भी जोड़ सकते हैं, और कुछ कार्यों को लागू कर सकते हैं जो अन्य कमोडिटी वायदा कार्यक्रम ट्रेडिंग सॉफ्टवेयर पूरा नहीं कर सकते हैं, जैसे कि उच्च आवृत्ति टिक का संश्लेषण; आप संदर्भित कर सकते हैंःhttps://www.fmz.com/bbs-topic/1184
सबसे पहले, चूंकि यह 24 घंटे का ट्रेडिंग नहीं है और लॉगिन ऑपरेशन की आवश्यकता है, इसलिए ट्रेडिंग से पहले लिंक की स्थिति का न्याय करना आवश्यक है।exchange.IO("status")
हैtrue
, जो मंच के लिए सफल कनेक्शन को इंगित करता है। यदि लॉगिन सफल नहीं होने पर एपीआई को बुलाया जाता है, तो _C(exchange.SetContractType,"MA888")
, जो सफल लॉगिन सुनिश्चित करेगा।
कमोडिटी फ्यूचर्स के मार्केट कोटेशन अधिग्रहण और ट्रेडिंग कोड क्रिप्टोक्यूरेंसी फ्यूचर्स के समान हैं। यहां हम अंतर और बिंदुओं को पेश करेंगे जिन पर ध्यान देने की आवश्यकता है।
function main(){
_C(exchange.SetContractType,"MA888") //If you do not log in successfully, you cannot subscribe to the contract, so better to try again
while(true){
if(exchange.IO("status")){
var ticker = exchange.GetTicker()
Log("MA888 ticker:", ticker)
LogStatus(_D(), "Already connected with CTP !")//_D obtain event
} else {
LogStatus(_D(), "Not connected with CTP !")
Sleep(1000)
}
}
}
ट्रेडिंग के लिए कमोडिटी फ्यूचर्स लाइब्रेरी (जो बाद में वर्णित की जाएगी) का उपयोग करने की सिफारिश की जाती है, कोड इस समय बहुत सरल होगा, और थकाऊ विवरणों से निपटने की आवश्यकता नहीं है। स्रोत कोड कॉपी पताःhttps://www.fmz.com/strategy/57029
function main() {
// Use the CTA strategy framework of commodity futures library
$.CTA(Symbols, function(st) {
var r = st.records
var mp = st.position.amount
var symbol = st.symbol
/*
"r" represents K-line, "mp" indicates the position amount of the current variety; positive number means long position, negative number means short position, and 0 means no position; "symbol" is the variety name
if the return value is n:
n = 0 : full close positions (no matter now they are long or short)
n > 0 : if right now long positions are held, add n long positions; if now they are short positions, close n short posiitons; if n is over the position amount right now, reverse to open long positions
n < 0 : if right now short positions are held, add n short positions; if now they are long positions, close n long posiitons; if -n is over the position amount right now, reverse to open short positions
*/
if (r.length < SlowPeriod) {
return
}
var cross = _Cross(TA.EMA(r, FastPeriod), TA.EMA(r, SlowPeriod));
if (mp <= 0 && cross > ConfirmPeriod) {
Log(symbol, "Golden Cross Period", cross, "the moment position", mp);
return Lots * (mp < 0 ? 2 : 1)
} else if (mp >= 0 && cross < -ConfirmPeriod) {
Log(symbol, "Death Cross Period", cross, "the moment position", 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")
, और लौटाया गया
बाजार के टिक परिवर्तनों का धक्काः{Event:"tick", Index: platform index (in the order of the platforms added in the bot), Nano: event of nanosecond-level time, Symbol: contract name}
आदेश पुश करेंः{Event:"order", Index:Exchange index, Nano:Event of nanosecond-level time, Order:Order information (same as 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")){ //Judge the link status
exchange.IO("mode", 0)
_C(exchange.SetContractType, "MA888")//Subscribe to MA; only the subscription request for the first time is ture, and the later ones are program switches, which do not consume time
_C(exchange.SetContractType, "rb888")//Subscribe to 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)
}
}
}
कमोडिटी फ्यूचर्स और क्रिप्टोक्यूरेंसी प्लेटफार्मों के बीच अंतर भी ध्यान दें। उदाहरण के लिए,
exchange.IO("इंस्ट्रूमेंट्स"): यह प्लैटफॉर्म पर सभी अनुबंधों की सूची {अनुबंध नामः विवरण} शब्दकोश के रूप में लौटाता है, और केवल बॉट्स का समर्थन करता है।exchange.IO("उत्पाद"): यह शब्दकोश के रूप में प्लेटफ़ॉर्म {अनुबंध नामः विवरण} पर सभी वस्तुओं की सूची लौटाता है, और केवल बॉट्स का समर्थन करता है।exchange.IO("सब्सक्राइब किया गया"): यह प्लेटफॉर्म पर डिक्शनरी के रूप में सब्सक्राइब किए गए मार्केट कोट्स को रिटर्न करता है, और केवल बॉट्स को सपोर्ट करता है।
..ContractType
पारंपरिक सीटीपी वायदा का संदर्भ अनुबंध आईडी, जो केस-संवेदनशील है।exchange.SetContractType("au1506")
. अनुबंध को सफलतापूर्वक सेट करने के बाद, यह अनुबंध की विस्तृत जानकारी लौटाएगा, जैसे कि न्यूनतम खरीद राशि, सेवा शुल्क, वितरण समय, आदि। जब कई अनुबंधों की सदस्यता लेते हैं, तो केवल पहली बार सदस्यता अनुरोध वास्तव में भेजा जाता है, और फिर ट्रेडिंग जोड़ी को कोड स्तर पर स्विच किया जाता है, जिसमें समय नहीं लगता है। मुख्य निरंतर अनुबंध कोड 888 है, जैसे MA888, निरंतर दर अनुबंध 000, जैसे MA000; 888 और 000 आभासी अनुबंध ट्रेड हैं जो केवल बैकटेस्ट का समर्थन करते हैं, और वास्तविक बॉट केवल बाजार उद्धरण का समर्थन करते हैं।हालांकि, माइलैंग्वेज मुख्य अनुबंध का संचालन कर सकता है, और कार्यक्रम स्वचालित रूप से पदों को बदल देगा, अर्थात गैर-मुख्य पदों को बंद कर देगा और मुख्य पदों पर नई स्थिति खोलेगा।
असफल लॉगिन अनुबंध सेट नहीं कर सकता है, लेकिन तुरंत वापस आ जाएगा, इसलिए आप
SetDirection
चार मापदंड प्राप्त कर सकते हैंःbuy, closebuy, sell, closesell
कमोडिटी वायदा अधिक हैclosebuy_today
औरclosesell_today
, वर्तमान पदों को बंद करने का संकेत देता है; डिफ़ॉल्ट हैclosebuy/ closesell
, जो कल की स्थिति को बंद करने का संकेत देता है; केवल शंघाई फ्यूचर्स एक्सचेंज की किस्मों को आज और कल बंद करने में विभाजित किया गया है, जो सेवा शुल्क को प्रभावित कर सकता है, इसलिए कल की स्थिति को बंद करने को प्राथमिकता देना आवश्यक है। सीटीपी पारंपरिक वायदा के लिए, आप दूसरा पैरामीटर
ऑपरेशन | 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 ? "Close today" : "Close yesterday", '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 ? "Close today" : "Close yesterday", 'Ask', depth.Asks[0]);
}
}
}
कमोडिटी फ्यूचर्स कस्टम ऑर्डर प्रकारों (बॉट के लिए समर्थन, लेकिन बैकटेस्ट के लिए नहीं) का समर्थन करते हैं, जो प्रत्यय द्वारा निर्दिष्ट होते हैं, जो
exchange.SetDirection("buy_ioc");
exchange.SetDirection("sell_gtd-20170111")
विशिष्ट प्रत्यय:
डिफ़ॉल्ट रूप से, कमोडिटी वायदा दलालों में खोले गए इंटरफेस सभी सीटीपी इंटरफेस हैं। यदि आवश्यक हो, तो उन्हें एसुनी इंटरफेस द्वारा प्रतिस्थापित किया जा सकता है। एफएमजेड के कैप्सुलेशन के माध्यम से, बुलाई विधि समान है। अंतर यह है कि खाते, ऑर्डर और पद सभी पुश मोड में हैं, इसलिए डॉकर इन डेटा को स्थानीय रूप से बनाए रखेगा, और संबंधित इंटरफ़ेस को बुलाए जाने पर तुरंत वापस आ जाएगा, बिना वास्तव में अनुरोध किए।
एसुनी प्रोटोकॉल कस्टम ऑर्डर प्रकार हैंः
जब बॉट इंटरफेस पर लॉग रिकॉर्ड लॉग करते हैं, और स्ट्रिंग के बाद वर्ण Log('Push to WeChat@')
.
लॉग रंग भी अनुकूलित किया जा सकता है, जैसे किLog('this is a log in red font #ff0000')
.
#ff0000
आरजीबी रंग का हेक्साडेसिमल है, यह दर्शाता है कि सभी लॉग फ़ाइलें उस निर्देशिका में बॉट के एसक्यूएलआईटी डेटाबेस में संग्रहीत हैं जहां डॉकर स्थित है, जिसे डेटाबेस सॉफ़्टवेयर के साथ डाउनलोड और खोला जा सकता है, या बैकअप कॉपी करने और पुनर्स्थापित करने के लिए इस्तेमाल किया जा सकता है (डेटाबेस नाम और बॉट आईडी समान हैं) ।
यह लाभों को रिकॉर्ड करता है, और बॉट इंटरफ़ेस पर लाभ वक्र खींचता है, जिसे बॉट को पुनरारंभ करने के बाद बरकरार रखा जा सकता है।LogProfit(1000)
. ध्यान दें कि पैरामीटरLogProfit
लाभ नहीं है, और यह कोई भी संख्या हो सकती है और इसे स्वयं भरने की आवश्यकता है।
यदि बॉट स्थिति, चूंकि लॉग पहले सहेजा जाएगा और लगातार ताज़ा किया जाएगा, केवल प्रदर्शन के लिए जानकारी की जरूरत है नहीं सहेजने के लिए, आप उपयोग कर सकते हैंLogStatus
कार्य के पैरामीटरLogStatus
स्ट्रिंग हैं, जिनका उपयोग तालिका की जानकारी का प्रतिनिधित्व करने के लिए भी किया जा सकता है।
एक विशिष्ट वास्तविक बॉट स्थिति प्रदर्शन तालिका का एक उदाहरणः
var table = {type: 'table', title: 'position information', cols: ['Column1', 'Column2'], rows: [ ['abc', 'def'], ['ABC', 'support color #ff0000']]};
LogStatus('`' + JSON.stringify(table) + '`'); // After serialization, JSON will be added the character "'" on both sides, which is regarded as a comlpex messag format (now supporting tables)
LogStatus('The first line information\n`' + JSON.stringify(table) + '`\nthe third line information'); // the table information can be displayed in multiple lines
LogStatus('`' + JSON.stringify([table, table]) + '`'); // Multiple tables are supported to be displayed at the same time, which will be displayed in one group by TAB
LogStatus('`' + JSON.stringify(tab1) + '`\n' + '`' + JSON.stringify(tab2) + '`\n'); // Multiple tables are displayed up and down by arrangement
इसका पैरामीटर मिलीसेकंड की संख्या है, जैसे किSleep(1000)
सभी प्लेटफार्मों की सीमित पहुंच आवृत्ति के कारण, सामान्य रणनीतियों में अनंत लूप में नींद का समय जोड़ा जाना चाहिए।
बोट फिर से शुरू होने के बाद, कार्यक्रम फिर से शुरू हो जाएगा. यदि आप कुछ स्थायी जानकारी सहेजना चाहते हैं,_G
बहुत सुविधाजनक और व्यावहारिक है, और यह JSON सीरियल सामग्री को बचा सकता है।_G
फ़ंक्शन में लिखा गया हैonexit()
, ताकि हर बार जब रणनीति रोक दी जाती है, तो आवश्यक जानकारी स्वचालित रूप से सहेजी जाएगी।
यदि आप अधिक स्वरूपित डेटा सहेजना चाहते हैं, तो _G फ़ंक्शन उपयुक्त नहीं है, लेकिन