सिस्टम का वर्तमान संस्करण संख्या लौटाता है.
वर्तमान प्रणाली संस्करण संख्या, जैसे3.6
.
स्ट्रिंग
संस्करण
function main() {
Log("version:", Version())
}
def main():
Log("version:", Version())
void main() {
Log("version:", Version());
}
सिस्टम संस्करण संख्या डॉकर के प्रोग्राम का संस्करण संख्या है।
नींद का कार्य, जिससे प्रोग्राम कुछ समय के लिए रुक जाता है।
नींद (मिलीसेकंड)
..millisecond
पैरामीटर का उपयोग नींद की अवधि और मिलीसेकंड की संख्या निर्धारित करने के लिए किया जाता है।
मिलीसेकंड
सच
संख्या
function main() {
Sleep(1000 * 10) // Wait for 10 seconds
Log("Waited for 10 seconds")
}
def main():
Sleep(1000 * 10)
Log("Waited for 10 seconds")
void main() {
Sleep(1000 * 10);
Log("Waited for 10 seconds");
}
उदाहरण के लिए,Sleep(1000)
यह 1 मिलीसेकंड से कम समय के साथ संचालन का समर्थन करता है, उदाहरण के लिए सेटिंगSleep(0.1)
. यह न्यूनतम पैरामीटर का समर्थन करता है0.000001
, यानी नैनो सेकंड हिबरनेशन, जहां 1 नैनो सेकंड के बराबर है1e-6
मिलीसेकंड।
रणनीति लिखने के समयPython
भाषा,Sleep(millisecond)
मतदान अंतराल, समय-से-प्रतीक्षा संचालन के लिए उपयोग किया जाना चाहिए।time.sleep(second)
कार्यPython
हैtime
पुस्तकालय. यह है क्योंकिtime.sleep(second)
एक रणनीति में कार्य रणनीति कार्यक्रम वास्तव में समय की एक अवधि के लिए इंतजार करता है जब बैकटेस्टिंग (बैकटेस्टिंग प्रणाली की समय श्रृंखला पर छोड़ने नहीं), तो यह रणनीति बहुत धीरे-धीरे बैकटेस्ट करने के लिए कारण बनता है।
यह निर्धारित करें कि क्या रणनीति का परिचालन वातावरण बैकटेस्टिंग प्रणाली है।
रणनीति एक वास्तविक मूल्य लौटाता है, उदाहरण के लिएःtrue
जब बैकटेस्टिंग सिस्टम वातावरण में चलाया जाता है। रणनीति एक गलत मान लौटाता है, उदाहरण के लिएःfalse
जब यह प्रत्यक्ष व्यापारिक वातावरण में चलाया जाता है।
बोल
आभासी है
function main() {
if (IsVirtual()) {
Log("The current backtest system environment.")
} else {
Log("The current live trading environment.")
}
}
def main():
if IsVirtual():
Log("The current backtest system environment.")
else:
Log("The current live trading environment.")
void main() {
if (IsVirtual()) {
Log("The current backtest system environment.");
} else {
Log("The current live trading environment.");
}
}
यह निर्धारित करें कि क्या वर्तमान चल रहे वातावरण एक बैकटेस्टिंग प्रणाली है, जिसका उपयोग बैकटेस्टिंग और लाइव ट्रेडिंग के बीच अंतर के साथ संगत होने के लिए किया जाता है।
एक ईमेल भेजें।
एक सफल ईमेल डिलीवरी एक वास्तविक मूल्य देता है, उदाहरण के लिए,true
, और एक असफल वितरण एक गलत मान देता है, उदाहरण के लिए,false
.
बोल
मेल ((smtpसर्वर, smtpउपयोगकर्ता नाम, smtpपासवर्ड, मेलTo, शीर्षक, शरीर)
निर्दिष्ट करने के लिए प्रयोग किया जाता हैSMTP
ईमेल प्रेषक का सेवा पता।
smtpसर्वर
सच
स्ट्रिंग
ईमेल प्रेषक का ईमेल पता निर्दिष्ट करने के लिए प्रयोग किया जाता है.
smtpउपयोगकर्तानाम
सच
स्ट्रिंग
दSMTP
ई-मेल भेजने वाले के मेलबॉक्स के लिए पासवर्ड।
smtpपासवर्ड
सच
स्ट्रिंग
ईमेल प्राप्तकर्ता का ईमेल पता निर्दिष्ट करने के लिए प्रयोग किया जाता है.
mailTo
सच
स्ट्रिंग
ई-मेल का शीर्षक।
शीर्षक
सच
स्ट्रिंग
ईमेल शरीर.
शरीर
सच
स्ट्रिंग
function main(){
Mail("smtp.163.com", "asdf@163.com", "password", "111@163.com", "title", "body")
}
def main():
Mail("smtp.163.com", "asdf@163.com", "password", "111@163.com", "title", "body")
void main() {
Mail("smtp.163.com", "asdf@163.com", "password", "111@163.com", "title", "body");
}
..smtpPassword
पैरामीटर पासवर्ड सेट करता हैSMTP
सेवा, मेल बॉक्स पासवर्ड नहीं।
सेट करते समयsmtpServer
पैरामीटर, अगर आप बंदरगाह को बदलने की जरूरत है, आप सीधे पैरामीटर में बंदरगाह संख्या जोड़ सकते हैंsmtpServer
उदाहरण के लिएः क्यूक्यू मेलsmtp.qq.com:587
, जो परीक्षण के लिए उपलब्ध है।
यदि कोई त्रुटि दर्ज की जाती हैःunencryped connection
, आपको संशोधित करने की आवश्यकता हैsmtpServer
केMail
पैरामीटर प्रारूप हैःssl://xxx.com:xxx
उदाहरण के लिए,ssl
विधिSMTP
क्यूक्यू मेल के लिएःssl://smtp.qq.com:465
याsmtp://xxx.com:xxx
.
यह बैकटेस्टिंग प्रणाली में काम नहीं करता है।
{@मज़ा/ग्लोबल/मेल_गो मेल_गो}
का असिंक्रोनस संस्करणMail
function.
..Mail_Go
फ़ंक्शन तुरंत एक समवर्ती वस्तु देता है, और आप उपयोग कर सकते हैंwait
मेल डिलीवरी का परिणाम प्राप्त करने के लिए उस समवर्ती ऑब्जेक्ट की विधि। एक सफल मेल डिलीवरी एक सही मान देता है, उदाहरण के लिए,true
, और एक असफल वितरण एक गलत मान देता है, उदाहरण के लिए,false
.
वस्तु
Mail_Go ((smtpServer, smtpUsername, smtpPassword, mailTo, शीर्षक, शरीर)
इसका प्रयोग निर्दिष्ट करने के लिए किया जाता हैSMTP
ई-मेल भेजने वाले का सेवा पता।
smtpसर्वर
सच
स्ट्रिंग
इसका प्रयोग ईमेल भेजने वाले का ईमेल पता निर्दिष्ट करने के लिए किया जाता है।
smtpउपयोगकर्तानाम
सच
स्ट्रिंग
दSMTP
ईमेल भेजने वाले के मेलबॉक्स के लिए पासवर्ड।
smtpपासवर्ड
सच
स्ट्रिंग
इसका उपयोग ईमेल प्राप्तकर्ता का ईमेल पता निर्दिष्ट करने के लिए किया जाता है।
mailTo
सच
स्ट्रिंग
ई-मेल का शीर्षक।
शीर्षक
सच
स्ट्रिंग
ईमेल शरीर.
शरीर
सच
स्ट्रिंग
function main() {
var r1 = Mail_Go("smtp.163.com", "asdf@163.com", "password", "111@163.com", "title", "body")
var r2 = Mail_Go("smtp.163.com", "asdf@163.com", "password", "111@163.com", "title", "body")
var ret1 = r1.wait()
var ret2 = r2.wait()
Log("ret1:", ret1)
Log("ret2:", ret2)
}
# Not supported.
// Not supported.
यह बैकटेस्टिंग प्रणाली में काम नहीं करता है।
{@मज़ा/ग्लोबल/मेल मेल}
फ़िल्टर त्रुटि लॉग.
SetErrorFilter (फ़िल्टर सेट करें)
नियमित अभिव्यक्ति स्ट्रिंग. फ़िल्टर सच स्ट्रिंग
function main() {
SetErrorFilter("502:|503:|tcp|character|unexpected|network|timeout|WSARecv|Connect|GetAddr|no such|reset|http|received|EOF|reused")
}
def main():
SetErrorFilter("502:|503:|tcp|character|unexpected|network|timeout|WSARecv|Connect|GetAddr|no such|reset|http|received|EOF|reused")
void main() {
SetErrorFilter("502:|503:|tcp|character|unexpected|network|timeout|WSARecv|Connect|GetAddr|no such|reset|http|received|EOF|reused");
}
सामान्य त्रुटियों को फ़िल्टर करना।
function main() {
// A random query for a non-existent order with an id of 123, allowing the interface to report an error deliberately
var order = exchange.GetOrder("123")
Log(order)
// Filter http502 errors, GetOrder interface errors, after setting the error filter, the second call to GetOrder will no longer report errors
SetErrorFilter("502:|GetOrder")
order = exchange.GetOrder("123")
Log(order)
}
def main():
order = exchange.GetOrder("123")
Log(order)
SetErrorFilter("502:|GetOrder")
order = exchange.GetOrder("123")
Log(order)
void main() {
TId orderId;
Order order = exchange.GetOrder(orderId);
Log(order);
SetErrorFilter("502:|GetOrder");
order = exchange.GetOrder(orderId);
Log(order);
}
इंटरफ़ेस त्रुटि संदेश फ़िल्टर करें.
इस नियमित अभिव्यक्ति से मेल खाने वाले त्रुटि लॉग लॉग सिस्टम में अपलोड नहीं किए जाएंगे. आप इसे कई बार (बारों की संख्या पर कोई सीमा नहीं) कई फ़िल्टर स्थितियों को सेट करने के लिए कॉल कर सकते हैं. कई बार सेट नियमित अभिव्यक्ति एकत्रित हो जाएगी और एक ही समय में प्रभावी हो जाएगी. आप त्रुटि लॉग को फ़िल्टर करने के लिए उपयोग की जाने वाली नियमित अभिव्यक्ति को रीसेट करने के लिए एक खाली स्ट्रिंग सेट कर सकते हैंःSetErrorFilter("")
फ़िल्टर किए गए लॉग अब डॉकर निर्देशिका में लाइव ट्रेडिंग आईडी के अनुरूप डेटाबेस फ़ाइल में नहीं लिखे जाते हैं ताकि डेटाबेस फ़ाइल को फुलाए जाने से लगातार त्रुटि रिपोर्टिंग को रोका जा सके।
लाइव ट्रेडिंग प्रक्रिया आईडी प्राप्त करें.
लाइव ट्रेडिंग प्रक्रिया आईडी लौटाएँ। स्ट्रिंग
GetPid()
function main(){
var id = GetPid()
Log(id)
}
def main():
id = GetPid()
Log(id)
void main() {
auto id = GetPid();
Log(id);
}
अंतिम त्रुटि संदेश प्राप्त करें.
अंतिम त्रुटि संदेश. स्ट्रिंग
GetLastError() प्राप्त करें
function main(){
// Because the order number 123 does not exist, so there will be an error.
exchange.GetOrder("123")
var error = GetLastError()
Log(error)
}
def main():
exchange.GetOrder("123")
error = GetLastError()
Log(error)
void main() {
// Order ID type: TId, so you can't pass in a string, we place an order that doesn't meet the exchange specification to trigger
exchange.GetOrder(exchange.Buy(1, 1));
auto error = GetLastError();
Log(error);
}
यह बैकटेस्टिंग प्रणाली में काम नहीं करता है।
रणनीति बातचीत कमांड प्राप्त करता है।
लौटा आदेश का स्वरूप हैControlName:Data
. ControlName
नियंत्रण का नाम है, औरData
यदि इंटरैक्टिव कंट्रोल में इनपुट बॉक्स, ड्रॉप-डाउन बॉक्स और अन्य घटक नहीं हैं (उदाहरण के लिए इनपुट बॉक्स के बिना बटन कंट्रोल) तो लौटाया गया कमांड प्रारूप हैControlName
, जो केवल नियंत्रण नाम लौटाता है.
स्ट्रिंग
कमांड प्राप्त करें()
function main(){
while(true) {
var cmd = GetCommand()
if (cmd) {
Log(cmd)
}
Sleep(1000)
}
}
def main():
while True:
cmd = GetCommand()
if cmd:
Log(cmd)
Sleep(1000)
void main() {
while(true) {
auto cmd = GetCommand();
if(cmd != "") {
Log(cmd);
}
Sleep(1000);
}
}
इंटरैक्शन कमांड का पता लगाता है और उपयोग करता हैLog
जब यह पता लगाया जाता है बातचीत आदेश आउटपुट करने के लिए समारोह.
function main() {
while (true) {
LogStatus(_D())
var cmd = GetCommand()
if (cmd) {
Log("cmd:", cmd)
var arr = cmd.split(":")
if (arr[0] == "buy") {
Log("Buy, the control without number")
} else if (arr[0] == "sell") {
Log("Sell, the control with the number of:", arr[1])
} else {
Log("Other controls trigger:", arr)
}
}
Sleep(1000)
}
}
def main():
while True:
LogStatus(_D())
cmd = GetCommand()
if cmd:
Log("cmd:", cmd)
arr = cmd.split(":")
if arr[0] == "buy":
Log("Buy, the control without number")
elif arr[0] == "sell":
Log("Sell, the control with the number of:", arr[1])
else:
Log("Other controls trigger:", arr)
Sleep(1000)
#include <iostream>
#include <sstream>
#include <string>
#include <vector>
using namespace std;
void split(const string& s,vector<string>& sv,const char flag = ' ') {
sv.clear();
istringstream iss(s);
string temp;
while (getline(iss, temp, flag)) {
sv.push_back(temp);
}
return;
}
void main() {
while(true) {
LogStatus(_D());
auto cmd = GetCommand();
if (cmd != "") {
vector<string> arr;
split(cmd, arr, ':');
if(arr[0] == "buy") {
Log("Buy, the control without number");
} else if (arr[0] == "sell") {
Log("Sell, the control with the number of:", arr[1]);
} else {
Log("Other controls trigger:", arr);
}
}
Sleep(1000);
}
}
उदाहरण के लिए, रणनीति इंटरैक्टिव नियंत्रण इनपुट बॉक्स के बिना एक नियंत्रण जोड़ता है, इंटरैक्टिव नियंत्रण का नाम हैःbuy
, नियंत्रण विवरण की जानकारी हैःbuy
, जो एक बटन नियंत्रण है। एक इनपुट बॉक्स के साथ एक नियंत्रण जोड़कर जारी रखें। इंटरैक्टिव नियंत्रण का नाम हैःsell
और नियंत्रण विवरण संदेश हैःsell
, जो एक इंटरैक्टिव नियंत्रण है जो एक बटन और एक इनपुट बॉक्स का संयोजन है। इंटरैक्शन कोड को विभिन्न इंटरैक्शन नियंत्रणों का जवाब देने के लिए रणनीति में डिज़ाइन किया गया हैः
यह बैकटेस्टिंग प्रणाली में काम नहीं करता है।
रणनीति पंजीकरण कोड उत्पन्न करते समय मेटा का मान लिखें.
Meta
डेटा।
स्ट्रिंग
मेटा प्राप्त करें
function main() {
// The maximum asset value of the denominated currency allowed by the strategy.
var maxBaseCurrency = null
// Get the metadata when creating the registration code.
var level = GetMeta()
// Detecting the conditions corresponding to Meta.
if (level == "level1") {
// -1 for unrestricted
maxBaseCurrency = -1
} else if (level == "level2") {
maxBaseCurrency = 10
} else if (level == "level3") {
maxBaseCurrency = 1
} else {
maxBaseCurrency = 0.5
}
while(1) {
Sleep(1000)
var ticker = exchange.GetTicker()
// Detect asset values
var acc = exchange.GetAccount()
if (maxBaseCurrency != -1 && maxBaseCurrency < acc.Stocks + acc.FrozenStocks) {
// Stop executing strategy trading logic
LogStatus(_D(), "level:", level, "Positions exceeding the usage limit of the registration code will no longer execute the strategy trading logic!")
continue
}
// Other trading logic
// Normal output of status bar information
LogStatus(_D(), "level:", level, "The strategy is working properly! ticker data: \n", ticker)
}
}
def main():
maxBaseCurrency = null
level = GetMeta()
if level == "level1":
maxBaseCurrency = -1
elif level == "level2":
maxBaseCurrency = 10
elif level == "level3":
maxBaseCurrency = 1
else:
maxBaseCurrency = 0.5
while True:
Sleep(1000)
ticker = exchange.GetTicker()
acc = exchange.GetAccount()
if maxBaseCurrency != -1 and maxBaseCurrency < acc["Stocks"] + acc["FrozenStocks"]:
LogStatus(_D(), "level:", level, "Positions exceeding the usage limit of the registration code will no longer execute the strategy trading logic!")
continue
# Other trading logic
# Normal output of status bar information
LogStatus(_D(), "level:", level, "The strategy is working properly! ticker data: \n", ticker)
void main() {
auto maxBaseCurrency = 0.0;
auto level = GetMeta();
if (level == "level1") {
maxBaseCurrency = -1;
} else if (level == "level2") {
maxBaseCurrency = 10;
} else if (level == "level3") {
maxBaseCurrency = 1;
} else {
maxBaseCurrency = 0.5;
}
while(1) {
Sleep(1000);
auto ticker = exchange.GetTicker();
auto acc = exchange.GetAccount();
if (maxBaseCurrency != -1 && maxBaseCurrency < acc.Stocks + acc.FrozenStocks) {
// Stop execution strategy trading logic.
LogStatus(_D(), "level:", level, "Positions exceeding the usage limit of the registration code will no longer execute the strategy trading logic!");
continue;
}
// Other trading logic
// Normal output of status bar information
LogStatus(_D(), "level:", level, "The strategy is working properly! ticker data: \n", ticker);
}
}
उदाहरण अनुप्रयोग परिदृश्यः उपयोगMeta
रणनीति द्वारा संचालित परिसंपत्तियों की मात्रा को सीमित करना।
आवेदन परिदृश्यः विभिन्न रणनीति किरायेदारों के लिए पूंजी सीमाएं करने की आवश्यकता है।Meta
पंजीकरण कोड उत्पन्न करते समय निर्धारित मूल्य 190 वर्णों से अधिक नहीं हो सकता है औरGetMeta()
यदि कोई मेटाडेटा नहीं है (Meta
) एक रणनीति पंजीकरण कोड उत्पन्न करते समय सेट किया जाता है,GetMeta()
यह बैकटेस्टिंग प्रणाली में काम नहीं करता है.
आदिम के लिएSocket
पहुँच, समर्थनtcp
, udp
, tls
, unix
प्रोटोकॉल. 4 लोकप्रिय संचार प्रोटोकॉल का समर्थनःmqtt
, nats
, amqp
, kafka
डेटाबेस से कनेक्ट करने के लिए समर्थनःsqlite3
, mysql
, postgres
, clickhouse
.
..Dial()
function null लौटाता है यदि यह समय समाप्त हो जाता है। एक सामान्य कॉल एक कनेक्शन ऑब्जेक्ट लौटाता है जिसमें तीन विधियां होती हैंःread
, write
औरclose
.read
विधि का उपयोग डेटा को पढ़ने के लिए किया जाता है,write
विधि का उपयोग डेटा भेजने औरclose
विधि का उपयोग कनेक्शन को बंद करने के लिए किया जाता है।
दread
विधि निम्नलिखित मापदंडों का समर्थन करती हैः
ws.read()
.ws.read(2000)
दो सेकंड (2000 मिलीसेकंड) का टाइमआउट निर्दिष्ट करता है।-1
इसका मतलब है कि फ़ंक्शन तुरंत संदेशों की उपस्थिति या अनुपस्थिति के बावजूद वापस करता है, उदाहरण के लिएःws.read(-1)
.
पैरामीटर पास करना-2
इसका अर्थ है कि फ़ंक्शन तुरंत संदेश के साथ या बिना संदेश लौटाता है, लेकिन केवल नवीनतम संदेश लौटाया जाता है, और बफर किया गया संदेश त्याग दिया जाता है। उदाहरण के लिए,ws.read(-2)
.read()
फ़ंक्शन बफर का वर्णनः
वेबसॉकेट प्रोटोकॉल द्वारा पुश किए जाने वाले आने वाले डेटा डेटा संचय का कारण बन सकते हैं यदि रणनीति के बीच समय अंतरालread()
फ़ंक्शन कॉल बहुत लंबा है. ये डेटा बफर में संग्रहीत होते हैं, जिसमें अधिकतम 2000 के साथ एक कतार की डेटा संरचना होती है। 2000 से अधिक होने के बाद, सबसे नया डेटा बफर में प्रवेश करता है और सबसे पुराना डेटा साफ़ किया जाता है।
परिदृश्य | कोई पैरामीटर नहीं | पैरामीटरः -1 | पैरामीटरः -2 | पैरामीटरः 2000 मिलीसेकंड में |
---|---|---|---|---|
पहले से ही बफर में डेटा | सबसे पुराना डेटा तुरंत लौटाएँ | सबसे पुराना डेटा तुरंत लौटाएँ | नवीनतम डेटा तुरंत लौटाएं | सबसे पुराना डेटा तुरंत लौटाएँ |
बफर में कोई डेटा नहीं | डेटा पर अवरुद्ध होने पर वापस लौटाएँ | तुरंत शून्य लौटाएँ | तुरंत शून्य लौटाएँ | 2000 एमएस प्रतीक्षा करें, यदि कोई डेटा नहीं है तो शून्य लौटाएं, यदि कोई डेटा है तो शून्य लौटाएं |
WebSocket कनेक्शन डिस्कनेक्ट या अंतर्निहित द्वारा फिर से कनेक्ट किया जाता है | read() फ़ंक्शन रिक्त स्ट्रिंग देता है, अर्थातः |
वस्तु
डायल करें (पते) डायल (पता, टाइमआउट)
अनुरोध पता। पता सच स्ट्रिंग टाइमआउट सेकंड, टाइमआउट झूठी संख्या
function main(){
// Dial supports tcp://,udp://,tls://,unix://protocol, you can add a parameter to specify the number of seconds for the timeout
var client = Dial("tls://www.baidu.com:443")
if (client) {
// write can be followed by a numeric parameter to specify the timeout, write returns the number of bytes successfully sent
client.write("GET / HTTP/1.1\nConnection: Closed\n\n")
while (true) {
// read can be followed by a numeric parameter specifying the timeout in milliseconds. Returning null indicates an error or timeout or that the socket has been closed
var buf = client.read()
if (!buf) {
break
}
Log(buf)
}
client.close()
}
}
def main():
client = Dial("tls://www.baidu.com:443")
if client:
client.write("GET / HTTP/1.1\nConnection: Closed\n\n")
while True:
buf = client.read()
if not buf:
break
Log(buf)
client.close()
void main() {
auto client = Dial("tls://www.baidu.com:443");
if(client.Valid) {
client.write("GET / HTTP/1.1\nConnection: Closed\n\n");
while(true) {
auto buf = client.read();
if(buf == "") {
break;
}
Log(buf);
}
client.close();
}
}
डायल फ़ंक्शन कॉल का उदाहरणः
function main() {
LogStatus("Connecting...")
// Accessing WebSocket interface of Binance
var client = Dial("wss://stream.binance.com:9443/ws/!ticker@arr")
if (!client) {
Log("Connection failed, program exited")
return
}
while (true) {
// read returns only the data retrieved after the read call
var buf = client.read()
if (!buf) {
break
}
var table = {
type: 'table',
title: 'Ticker Chart',
cols: ['Currency', 'Highest', 'Lowest', 'Buy 1', 'Sell 1', 'Last traded price', 'Volume', 'Update time'],
rows: []
}
var obj = JSON.parse(buf)
_.each(obj, function(ticker) {
table.rows.push([ticker.s, ticker.h, ticker.l, ticker.b, ticker.a, ticker.c, ticker.q, _D(ticker.E)])
})
LogStatus('`' + JSON.stringify(table) + '`')
}
client.close()
}
import json
def main():
LogStatus("Connecting...")
client = Dial("wss://stream.binance.com:9443/ws/!ticker@arr")
if not client:
Log("Connection failed, program exited")
return
while True:
buf = client.read()
if not buf:
break
table = {
"type" : "table",
"title" : "Ticker Chart",
"cols" : ['Currency', 'Highest', 'Lowest', 'Buy 1', 'Sell 1', 'Last traded price', 'Volume', 'Update time'],
"rows" : []
}
obj = json.loads(buf)
for i in range(len(obj)):
table["rows"].append([obj[i]["s"], obj[i]["h"], obj[i]["l"], obj[i]["b"], obj[i]["a"], obj[i]["c"], obj[i]["q"], _D(int(obj[i]["E"]))])
LogStatus('`' + json.dumps(table) + '`')
client.close()
void main() {
LogStatus("Connecting...");
auto client = Dial("wss://stream.binance.com:9443/ws/!ticker@arr");
if(!client.Valid) {
Log("Connection failed, program exited");
return;
}
while(true) {
auto buf = client.read();
if(buf == "") {
break;
}
json table = R"({
"type" : "table",
"title" : "Ticker Chart",
"cols" : ["Currency", "Highest", "Lowest", "Buy 1", "Sell 1", "Last traded price", "Volume", "Update time"],
"rows" : []
})"_json;
json obj = json::parse(buf);
for(auto& ele : obj.items()) {
table["rows"].push_back({ele.value()["s"], ele.value()["h"], ele.value()["l"], ele.value()["b"], ele.value()["a"], ele.value()["c"],
ele.value()["q"], _D(ele.value()["E"])});
}
LogStatus("`" + table.dump() + "`");
}
client.close();
}
बिनेंस के वेबसॉकेट टिकर इंटरफ़ेस तक पहुँचने के लिएः
var ws = null
function main(){
var param = {
"op": "subscribe",
"args": [{
"channel": "tickers",
"instId": "BTC-USDT"
}]
}
// When calling Dial function, specify reconnect=true to set reconnection mode and payload to be the message sent when reconnecting. When the WebSocket connection is disconnected, it will reconnect and send messages automatically.
ws = Dial("wss://ws.okx.com:8443/ws/v5/public|compress=gzip_raw&mode=recv&reconnect=true&payload="+ JSON.stringify(param))
if(ws){
var pingCyc = 1000 * 20
var lastPingTime = new Date().getTime()
while(true){
var nowTime = new Date().getTime()
var ret = ws.read()
Log("ret:", ret)
if(nowTime - lastPingTime > pingCyc){
var retPing = ws.write("ping")
lastPingTime = nowTime
Log("Send : ping", "#FF0000")
}
LogStatus("Current time:", _D())
Sleep(1000)
}
}
}
function onexit() {
ws.close()
Log("exit")
}
import json
import time
ws = None
def main():
global ws
param = {
"op": "subscribe",
"args": [{
"channel": "tickers",
"instId": "BTC-USDT"
}]
}
ws = Dial("wss://ws.okx.com:8443/ws/v5/public|compress=gzip_raw&mode=recv&reconnect=true&payload=" + json.dumps(param))
if ws:
pingCyc = 1000 * 20
lastPingTime = time.time() * 1000
while True:
nowTime = time.time() * 1000
ret = ws.read()
Log("ret:", ret)
if nowTime - lastPingTime > pingCyc:
retPing = ws.write("ping")
lastPingTime = nowTime
Log("Send: ping", "#FF0000")
LogStatus("Current time:", _D())
Sleep(1000)
def onexit():
ws.close()
Log("exit")
auto objWS = Dial("wss://ws.okx.com:8443/ws/v5/public|compress=gzip_raw&mode=recv&reconnect=true");
void main() {
json param = R"({
"op": "subscribe",
"args": [{
"channel": "tickers",
"instId": "BTC-USDT"
}]
})"_json;
objWS.write(param.dump());
if(objWS.Valid) {
uint64_t pingCyc = 1000 * 20;
uint64_t lastPingTime = Unix() * 1000;
while(true) {
uint64_t nowTime = Unix() * 1000;
auto ret = objWS.read();
Log("ret:", ret);
if(nowTime - lastPingTime > pingCyc) {
auto retPing = objWS.write("ping");
lastPingTime = nowTime;
Log("Send: ping", "#FF0000");
}
LogStatus("Current time:", _D());
Sleep(1000);
}
}
}
void onexit() {
objWS.close();
Log("exit");
}
OKX
var ws = null
function main(){
var param = {"sub": "market.btcusdt.detail", "id": "id1"}
ws = Dial("wss://api.huobi.pro/ws|compress=gzip&mode=recv&reconnect=true&payload="+ JSON.stringify(param))
if(ws){
while(1){
var ret = ws.read()
Log("ret:", ret)
// Respond to heartbeat packet operations
try {
var jsonRet = JSON.parse(ret)
if(typeof(jsonRet.ping) == "number") {
var strPong = JSON.stringify({"pong" : jsonRet.ping})
ws.write(strPong)
Log("Respond to ping, send pong:", strPong, "#FF0000")
}
} catch(e) {
Log("e.name:", e.name, "e.stack:", e.stack, "e.message:", e.message)
}
LogStatus("Current time:", _D())
Sleep(1000)
}
}
}
function onexit() {
ws.close()
Log("Execute the ws.close() function")
}
import json
ws = None
def main():
global ws
param = {"sub" : "market.btcusdt.detail", "id" : "id1"}
ws = Dial("wss://api.huobi.pro/ws|compress=gzip&mode=recv&reconnect=true&payload=" + json.dumps(param))
if ws:
while True:
ret = ws.read()
Log("ret:", ret)
# Respond to heartbeat packet operations
try:
jsonRet = json.loads(ret)
if "ping" in jsonRet and type(jsonRet["ping"]) == int:
strPong = json.dumps({"pong" : jsonRet["ping"]})
ws.write(strPong)
Log("Respond to ping, send pong:", strPong, "#FF0000")
except Exception as e:
Log("e:", e)
LogStatus("Current time:", _D())
Sleep(1000)
def onexit():
ws.close()
Log("Execute the ws.close() function")
using namespace std;
void main() {
json param = R"({"sub" : "market.btcusdt.detail", "id" : "id1"})"_json;
auto ws = Dial("wss://api.huobi.pro/ws|compress=gzip&mode=recv&reconnect=true&payload=" + param.dump());
if(ws.Valid) {
while(true) {
auto ret = ws.read();
Log("ret:", ret);
// Respond to heartbeat packet operations
try
{
auto jsonRet = json::parse(ret);
if(jsonRet["ping"].is_number()) {
json pong = R"({"pong" : 0})"_json;
pong["pong"] = jsonRet["ping"];
auto strPong = pong.dump();
ws.write(strPong);
Log("Respond to ping, send pong:", strPong, "#FF0000");
}
} catch(exception &e)
{
Log("e:", e.what());
}
LogStatus("Current time:", _D());
Sleep(1000);
}
}
}
void onexit() {
// ws.close();
Log("Execute the ws.close() function");
}
Huobi
function getLogin(pAccessKey, pSecretKey, pPassphrase) {
// Signature function for login
var ts = (new Date().getTime() / 1000).toString()
var login = {
"op": "login",
"args":[{
"apiKey" : pAccessKey,
"passphrase" : pPassphrase,
"timestamp" : ts,
"sign" : exchange.HMAC("sha256", "base64", ts + "GET" + "/users/self/verify", pSecretKey) // exchange.HMAC has been deprecated and is temporarily supported. Please use the latest exchange.Encode function instead.
}]
}
return login
}
var client_private = null
function main() {
// Because the read function uses a timeout setting, filtering the timeout reports errors that would otherwise be output with redundant errors
SetErrorFilter("timeout")
// Position channel subscription information
var posSubscribe = {
"op": "subscribe",
"args": [{
"channel": "positions",
"instType": "ANY"
}]
}
var accessKey = "xxx"
var secretKey = "xxx"
var passphrase = "xxx"
client_private = Dial("wss://ws.okx.com:8443/ws/v5/private")
client_private.write(JSON.stringify(getLogin(accessKey, secretKey, passphrase)))
Sleep(3000) // When logging in, you cannot subscribe to private channels immediately, you need to wait for server response
client_private.write(JSON.stringify(posSubscribe))
if (client_private) {
var lastPingTS = new Date().getTime()
while (true) {
var buf = client_private.read(-1)
if (buf) {
Log(buf)
}
// Detect disconnection, reconnect
if (buf == "" && client_private.write(JSON.stringify(posSubscribe)) == 0) {
Log("Disconnection detected, close connection, reconnect")
client_private.close()
client_private = Dial("wss://ws.okx.com:8443/ws/v5/private")
client_private.write(JSON.stringify(getLogin(accessKey, secretKey, passphrase)))
Sleep(3000)
client_private.write(JSON.stringify(posSubscribe))
}
// Send heartbeat packets
var nowPingTS = new Date().getTime()
if (nowPingTS - lastPingTS > 10 * 1000) {
client_private.write("ping")
lastPingTS = nowPingTS
}
}
}
}
function onexit() {
var ret = client_private.close()
Log("Close the connection!", ret)
}
import json
import time
def getLogin(pAccessKey, pSecretKey, pPassphrase):
ts = str(time.time())
login = {
"op": "login",
"args":[{
"apiKey" : pAccessKey,
"passphrase" : pPassphrase,
"timestamp" : ts,
"sign" : exchange.HMAC("sha256", "base64", ts + "GET" + "/users/self/verify", pSecretKey)
}]
}
return login
client_private = None
def main():
global client_private
SetErrorFilter("timeout")
posSubscribe = {
"op": "subscribe",
"args": [{
"channel": "positions",
"instType": "ANY"
}]
}
accessKey = "xxx"
secretKey = "xxx"
passphrase = "xxx"
client_private = Dial("wss://ws.okx.com:8443/ws/v5/private")
client_private.write(json.dumps(getLogin(accessKey, secretKey, passphrase)))
Sleep(3000)
client_private.write(json.dumps(posSubscribe))
if client_private:
lastPingTS = time.time() * 1000
while True:
buf = client_private.read(-1)
if buf:
Log(buf)
if buf == "" and client_private.write(json.dumps(posSubscribe)) == 0:
Log("Disconnection detected, close connection, reconnect")
ret = client_private.close()
client_private = Dial("wss://ws.okx.com:8443/ws/v5/private")
client_private.write(json.dumps(getLogin(accessKey, secretKey, passphrase)))
Sleep(3000)
client_private.write(json.dumps(posSubscribe))
nowPingTS = time.time() * 1000
if nowPingTS - lastPingTS > 10 * 1000:
client_private.write("ping")
lastPingTS = nowPingTS
def onexit():
ret = client_private.close()
Log("Close the connection!", ret)
auto client_private = Dial("wss://ws.okx.com:8443/ws/v5/private");
json getLogin(string pAccessKey, string pSecretKey, string pPassphrase) {
auto ts = std::to_string(Unix());
json login = R"({
"op": "login",
"args": [{
"apiKey": "",
"passphrase": "",
"timestamp": "",
"sign": ""
}]
})"_json;
login["args"][0]["apiKey"] = pAccessKey;
login["args"][0]["passphrase"] = pPassphrase;
login["args"][0]["timestamp"] = ts;
login["args"][0]["sign"] = exchange.HMAC("sha256", "base64", ts + "GET" + "/users/self/verify", pSecretKey);
return login;
}
void main() {
SetErrorFilter("timeout");
json posSubscribe = R"({
"op": "subscribe",
"args": [{
"channel": "positions",
"instType": "ANY"
}]
})"_json;
auto accessKey = "xxx";
auto secretKey = "xxx";
auto passphrase = "xxx";
client_private.write(getLogin(accessKey, secretKey, passphrase).dump());
Sleep(3000);
client_private.write(posSubscribe.dump());
if (client_private.Valid) {
uint64_t lastPingTS = Unix() * 1000;
while (true) {
auto buf = client_private.read(-1);
if (buf != "") {
Log(buf);
}
if (buf == "") {
if (client_private.write(posSubscribe.dump()) == 0) {
Log("Disconnection detected, close connection, reconnect");
client_private.close();
client_private = Dial("wss://ws.okx.com:8443/ws/v5/private");
client_private.write(getLogin(accessKey, secretKey, passphrase).dump());
Sleep(3000);
client_private.write(posSubscribe.dump());
}
}
uint64_t nowPingTS = Unix() * 1000;
if (nowPingTS - lastPingTS > 10 * 1000) {
client_private.write("ping");
lastPingTS = nowPingTS;
}
}
}
}
void onexit() {
client_private.close();
Log("exit");
}
OKX
var client = null
function main() {
// client = Dial("sqlite3://:memory:") // Using an in-memory database
client = Dial("sqlite3://test1.db") // Open/connect to the database file in the docker's directory
// record handle
var sqlite3Handle = client.fd()
Log("sqlite3Handle:", sqlite3Handle)
// Querying tables in the database
var ret = client.exec("SELECT name FROM sqlite_master WHERE type='table'")
Log(ret)
}
function onexit() {
Log("Execute client.close()")
client.close()
}
// Not supported
// Not supported
एक डेटाबेस से कनेक्ट करते समय डायल फ़ंक्शन द्वारा लौटाए गए कनेक्शन ऑब्जेक्ट में दो विधि फ़ंक्शन होते हैं जो इसके लिए अद्वितीय होते हैंः
exec(sqlString)
: SQL कथन को निष्पादित करने के लिए उपयोग किया जाता हैDBExec()
function.fd()
:fd()
फ़ंक्शन एक हैंडल (जैसे, हैंडल चर हैडल है) वापस करता है जिसका उपयोग अन्य थ्रेडों द्वारा फिर से कनेक्ट करने के लिए किया जाएगा (भले ही डायल द्वारा बनाई गई ऑब्जेक्ट को पहले ही निष्पादन द्वारा बंद कर दिया गया हो)close()
कनेक्शन को बंद करने के लिए कार्य) हैंडल कोDial()
उदाहरण के लिए,Dial(handle)
पुनः उपयोग कनेक्शन।
निम्नलिखित डायल फ़ंक्शन का एक उदाहरण है जो एकsqlite3
database.विवरणaddress
पैरामीटर, द्वारा अलग|
सामान्य पते के बाद प्रतीक:wss://ws.okx.com:8443/ws/v5/public
यदि कोई है।|
पैरामीटर स्ट्रिंग में वर्ण, तो||
विभाजक चिह्न के रूप में प्रयोग किया जाता है. इसके बाद का हिस्सा कुछ समारोह पैरामीटर सेटिंग्स है, और प्रत्येक पैरामीटर के साथ जुड़ा हुआ है&
उदाहरण के लिए,ss5
प्रॉक्सी और संपीड़न मापदंडों को एक साथ निम्नानुसार सेट किया जा सकता हैःDial("wss://ws.okx.com:8443/ws/v5/public|proxy=socks5://xxx:9999&compress=gzip_raw&mode=recv")
डायल फ़ंक्शन के पते पैरामीटर द्वारा समर्थित फ़ंक्शन | पैरामीटर का वर्णन |
---|---|
वेबसॉकेट प्रोटोकॉल डेटा संपीड़न से संबंधित पैरामीटरः compress=parameter value | compress संपीड़न विधि है, संपीड़न पैरामीटर विकल्प हैंः gzip_raw, gzip, आदि यदि gzip विधि मानक gzip नहीं है, तो आप विस्तारित विधि का उपयोग कर सकते हैंः gzip_raw |
वेबसॉकेट प्रोटोकॉल डेटा संपीड़न से संबंधित पैरामीटरः मोड=पैरामीटर मान | मोड संपीड़न मोड है, मोड पैरामीटर दोहरी हो सकती है, भेजें, recv. दोहरी दो तरफा संपीड़न है, संपीड़ित डेटा भेजें, संपीड़ित डेटा प्राप्त करें. send संपीड़ित डेटा भेजें है. recv संपीड़ित डेटा प्राप्त करें, स्थानीय decompression है. |
वेबसॉकेट प्रोटोकॉल अंतर्निहित ऑटो-पुनः कनेक्ट संबंधित पैरामीटर सेट करता हैः reconnect=parameter value | reconnect reconnect सेट करना है, reconnect=true reconnect सक्षम करना है। डिफ़ॉल्ट रूप से यह पैरामीटर सेट नहीं होने पर कोई reconnect नहीं है. |
वेबसॉकेट प्रोटोकॉल अंतर्निहित ऑटो-पुनः कनेक्ट संबंधित मापदंडों को सेट करता हैः अंतराल=पैरामीटर मान | अंतराल पुनः प्रयास अंतराल है, मिलीसेकंड में, अंतराल=10000 10 सेकंड का पुनः प्रयास अंतराल है, डिफ़ॉल्ट 1 सेकंड है जब यह सेट नहीं है, यानी अंतराल=1000. |
वेबसॉकेट प्रोटोकॉल अंतर्निहित ऑटो-पुनः कनेक्ट संबंधित मापदंडों को सेट करता हैः पेलोड=पैरामीटर मान | पेलोड वह सब्सक्रिप्शन संदेश है जिसे वेबसॉकेट को फिर से कनेक्ट करने पर भेजना आवश्यक है, उदाहरण के लिएः पेलोड=ओकोकोक. |
Socks5 प्रॉक्सी से संबंधित पैरामीटर: proxy=पैरामीटर मान | प्रॉक्सी ss5 प्रॉक्सी सेटिंग है, पैरामीटर मान प्रारूपः socks5://name:pwd@192.168.0.1:1080, नाम ss5 सर्वर उपयोगकर्ता नाम है, pwd ss5 सर्वर लॉगिन पासवर्ड है, 1080 ss5 सेवा पोर्ट है. |
..Dial()
फ़ंक्शन केवल लाइव ट्रेडिंग के लिए समर्थित है.
डायल फ़ंक्शन का उपयोग करके डेटाबेस से कनेक्ट करते समय, कनेक्शन स्ट्रिंग प्रत्येक डेटाबेस के लिए go भाषा ड्राइवर प्रोजेक्ट के संदर्भ में लिखी जाती है.
समर्थित डेटाबेस | ड्राइविंग परियोजनाएं | कनेक्शन स्ट्रिंग | टिप्पणी |
---|---|---|---|
स्क्लाइट3 | github.com/mattn/go-sqlite3 | sqlite3://file:test.db?cache=shared&mode=memory फ़ाइलःtest.db?cache=shared&mode=memory फ़ाइलःtest.db?cache=shared&mode=memory | ..sqlite3:// उपसर्ग इंगित करता है कि एक sqlite3 डेटाबेस का उपयोग किया जा रहा है, उदाहरण कॉलःDial("sqlite3://test1.db") |
mysql | github.com/go-sql-driver/mysql | mysql://username:yourpassword@tcp(localhost:3306) /आपका डेटाबेस?charset=utf8mb4 | – |
उपजाऊ | github.com/lib/pq | postgres://user=postgres dbname=yourdatabase sslmode=disable password=yourpassword होस्ट=localhost पोर्ट=5432 | – |
क्लिकहाउस | github.com/ClickHouse/clickhouse-go | क्लिकहाउस://tcp://host:9000?username=username&password=yourpassword&database=youdatabase | – |
कृपया ध्यान दें कि जबpayload
सामग्री में सेटaddress
पैरामीटर में वर्ण होते हैं=
या अन्य विशेष वर्ण, यह पार्सिंग को प्रभावित कर सकता हैaddress
पैरामीटरDial
कार्य, जैसे कि निम्नलिखित उदाहरण।
backPack Exchange वेबसॉकेट निजी इंटरफ़ेस कॉल उदाहरणः
var client = null
function main() {
// Base64-encoded public key of the key pair, i.e. the access key configured on FMZ
var base64ApiKey = "xxx"
var ts = String(new Date().getTime())
var data = "instruction=subscribe×tamp=" + ts + "&window=5000"
// Since signEd25519 returns a base64 encoding, it contains the character "="
var signature = signEd25519(data)
// The payload may contain the character "=" after being encoded by JSON
payload = {
"method": "SUBSCRIBE",
"params": ["account.orderUpdate"],
"signature": [base64ApiKey, signature, ts, "5000"]
}
client = Dial("wss://ws.backpack.exchange")
client.write(JSON.stringify(payload))
if (!client) {
Log("Connection failed, program exited")
return
}
while (true) {
var buf = client.read()
Log(buf)
}
}
function onexit() {
client.close()
}
function signEd25519(data) {
return exchange.Encode("ed25519.seed", "raw", "base64", data, "base64", "{{secretkey}}")
}
कोड में निम्नलिखित कॉल ठीक काम करता हैः
client = Dial("wss://ws.backpack.exchange")
client.write(JSON.stringify(payload))
यदि आप इसे सीधे में लिखते हैंpayload
, यह ठीक से काम नहीं करेगा, उदाहरण के लिएः
client = Dial("wss://ws.backpack.exchange|payload=" + JSON.stringify(payload))
वर्तमान में, केवल जावास्क्रिप्ट का उपयोग करने का समर्थन करता हैmqtt
, nats
, amqp
, औरkafka
डायल फ़ंक्शन में संचार प्रोटोकॉल। चार प्रोटोकॉल के उपयोग को दिखाने के लिए जावास्क्रिप्ट भाषा रणनीति कोड का उपयोग एक उदाहरण के रूप में किया जाता हैःmqtt
, nats
, amqp
, औरkafka
:
// We need to configure and deploy proxy servers for each protocol first.
// For the sake of demonstration, the subscription (read operation) and publishing (write operation) of the topic test_topic are all performed in the current strategy.
var arrConn = []
var arrName = []
function main() {
LogReset(1)
conn_nats = Dial("nats://admin@127.0.0.1:4222?topic=test_topic")
conn_mqtt = Dial("mqtt://127.0.0.1:1883?topic=test_topic")
conn_amqp = Dial("amqp://q:admin@127.0.0.1:5672/?queue=test_Queue")
conn_kafka = Dial("kafka://localhost:9092/test_topic")
arrConn = [conn_nats, conn_amqp, conn_mqtt, conn_kafka]
arrName = ["nats", "amqp", "mqtt", "kafka"]
while (true) {
for (var i in arrConn) {
var conn = arrConn[i]
var name = arrName[i]
// Write data
conn.write(name + ", time: " + _D() + ", test msg.")
// Read data
var readMsg = conn.read(1000)
Log(name + " readMsg: ", readMsg, "#FF0000")
}
Sleep(1000)
}
}
function onexit() {
for (var i in arrConn) {
arrConn[i].close()
Log("close", arrName[i], "connect")
}
}
विस्तृत प्रलेखन संदर्भःएफएमजेड का अन्वेषण: लाइव ट्रेडिंग रणनीतियों के बीच संचार प्रोटोकॉल का अभ्यास
HTTP अनुरोध भेजें.
अनुरोध के प्रतिक्रिया डेटा को लौटाता है. यदि लौटा मूल्य एक हैJSON
स्ट्रिंग, यह द्वारा पार्स किया जा सकता हैJSON.parse()
कार्य मेंJavaScript
भाषा रणनीति, औरjson::parse()
कार्य मेंC++
यदि विकल्प संरचना में डिबग सही पर सेट है, तो रिटर्न मान एक ऑब्जेक्ट (JSON) है; यदि डिबग गलत पर सेट है, तो रिटर्न मान एक स्ट्रिंग है.
स्ट्रिंग, ऑब्जेक्ट
HttpQuery (URL) HttpQuery ((url, विकल्प)
Http अनुरोध यूआरएल. यूआरएल सच स्ट्रिंग उदाहरण के लिए, Http अनुरोध से संबंधित सेटिंग्स को इस प्रकार संरचित किया जा सकता हैः
{
method: "POST",
body: "a=10&b=20&c=30",
charset: "UTF-8",
cookie: "session_id=12345; lang=en",
profile: "chrome_103",
debug: false,
headers: {"TEST-HTTP-QUERY": "123"},
timeout: 1000
}
tls
उंगलियों के निशान.
समर्थित सेटिंग्स में निम्नलिखित विकल्प शामिल हैंः
chrome_:"chrome_103"
, "chrome_104"
, "chrome_105"
, "chrome_106"
, "chrome_107"
, "chrome_108"
, "chrome_109"
, "chrome_110"
, "chrome_111"
, "chrome_112"
, "chrome_117"
,
सफारी_:"safari_15_6_1"
, "safari_16_0"
, "safari_ipad_15_6"
, "safari_ios_15_5"
, "safari_ios_15_6"
, "safari_ios_16_0"
,
फ़ायरफ़ॉक्सः"firefox_102"
, "firefox_104"
, "firefox_105"
, "firefox_106"
, "firefox_108"
, "firefox_110"
, "firefox_117"
,
opera_:"opera_89"
, "opera_90"
, "opera_91"
,
zalando_:"zalando_android_mobile"
, "zalando_ios_mobile"
,
नाइकी_:"nike_ios_mobile"
, "nike_android_mobile"
,
बादलबिहार:"cloudscraper"
,
mms_:"mms_ios"
,
जाल_:"mesh_ios"
, "mesh_ios_1"
, "mesh_ios_2"
, "mesh_android"
, "mesh_android_1"
, "mesh_android_2"
,
पुष्टि_:"confirmed_ios"
, "confirmed_android"
,
ठीक है."okhttp4_android_7"
, "okhttp4_android_8"
, "okhttp4_android_9"
, "okhttp4_android_10"
, "okhttp4_android_11"
, "okhttp4_android_12"
, "okhttp4_android_13"
,true
,HttpQuery
फ़ंक्शन कॉल पूर्ण उत्तर संदेश लौटाता है.false
, केवल डेटाBody
के उत्तर संदेश को वापस कर दिया जाता है।profile
क्षेत्र को छोड़ दिया जा सकता है।विकल्प झूठी वस्तु
function main(){
// An example of GET access without parameters
var info = JSON.parse(HttpQuery("https://www.okx.com/api/v5/public/time"))
Log(info)
// An example of GET access with parameters
var ticker = JSON.parse(HttpQuery("https://www.okx.com/api/v5/market/books?instId=BTC-USDT"))
Log(ticker)
}
import json
import urllib.request
def main():
# HttpQuery does not support Python, you can use the urllib/urllib2 library instead
info = json.loads(urllib.request.urlopen("https://www.okx.com/api/v5/public/time").read().decode('utf-8'))
Log(info)
ticker = json.loads(urllib.request.urlopen("https://www.okx.com/api/v5/market/books?instId=BTC-USDT").read().decode('utf-8'))
Log(ticker)
void main() {
auto info = json::parse(HttpQuery("https://www.okx.com/api/v5/public/time"));
Log(info);
auto ticker = json::parse(HttpQuery("https://www.okx.com/api/v5/market/books?instId=BTC-USDT"));
Log(ticker);
}
ओकेएक्स सार्वजनिक टिकर एपीआई इंटरफ़ेस तक पहुँचने का एक उदाहरण।
function main() {
// Setting proxy and sending an http request for this time, no username, no password, this http request will be sent through the proxy
HttpQuery("socks5://127.0.0.1:8889/http://www.baidu.com/")
// Setting proxy and sending an http request for this time, enter the user name and password, only the current call to HttpQuery takes effect, and then call HttpQuery again ("http://www.baidu.com") so that the proxy will not be used.
HttpQuery("socks5://username:password@127.0.0.1:8889/http://www.baidu.com/")
}
# HttpQuery does not support Python, you can use the urllib/urllib2 library instead
void main() {
HttpQuery("socks5://127.0.0.1:8889/http://www.baidu.com/");
HttpQuery("socks5://username:password@127.0.0.1:8889/http://www.baidu.com/");
}
HttpQuery फ़ंक्शन प्रॉक्सी सेटिंग्स का उपयोग करता है.
..HttpQuery()
कार्य केवल समर्थन करता हैJavaScript
, C++
भाषा,Python
भाषा का उपयोग कर सकते हैंurllib
लाइब्रेरी सीधे HTTP अनुरोध भेजने के लिए.HttpQuery()
मुख्य रूप से एक्सचेंज के उन इंटरफेस तक पहुंचने के लिए उपयोग किया जाता है जिन्हें हस्ताक्षर की आवश्यकता नहीं होती है, जैसे कि सार्वजनिक इंटरफेस जैसे कि टिकर जानकारी।HttpQuery()
अनुरोध भेजने के लिए बैकटेस्टिंग प्रणाली में इस्तेमाल किया जा सकता है (केवलGET
डेटा प्राप्त करने के लिए बैकटेस्टिंग 20 विज़िट के उपयोग तक सीमित है।URLs
, औरHttpQuery()
यात्राओं डेटा कैश होगा.URL
दूसरी बार एक्सेस किया जाता है, तोHttpQuery()
फ़ंक्शन कैश किए गए डेटा को लौटाता है और कोई और वास्तविक नेटवर्क अनुरोध नहीं होता है।
{@fun/Global/HttpQuery_Go HttpQuery_Go}
एक HTTP अनुरोध भेजता है, जो कि एक असिंक्रोनस संस्करण हैHttpQuery
function.
..HttpQuery_Go()
फ़ंक्शन तुरंत एक समवर्ती ऑब्जेक्ट लौटाता है जिसका उपयोग HTTP अनुरोध का परिणाम प्राप्त करने के लिए किया जा सकता हैwait
विधि की विधिJSON.parse()
फ़ंक्शन का उपयोग किया जा सकता हैJSON.parse()
कार्य मेंJavaScript
भाषा की रणनीति।
वस्तु
HttpQuery_Go ((url) HttpQuery_Go ((url, विकल्प)
Http अनुरोध यूआरएल. यूआरएल सच स्ट्रिंग उदाहरण के लिए, Http अनुरोध से संबंधित सेटिंग्स को इस प्रकार संरचित किया जा सकता हैः
{
method: "POST",
body: "a=10&b=20&c=30",
charset: "UTF-8",
cookie: "session_id=12345; lang=en",
// profile: "",
debug: false,
headers: {"TEST-HTTP-QUERY": "123"},
timeout: 1000
}
tls
fingerprints.true
, यहHttpQuery_Go
फ़ंक्शन कॉल पूर्ण उत्तर संदेश लौटाता है.false
, केवल डेटाBody
के उत्तर संदेश को वापस कर दिया जाता है।profile
क्षेत्र को छोड़ दिया जा सकता है।विकल्प झूठी वस्तु
function main() {
// Create the first asynchronous thread
var r1 = HttpQuery_Go("https://www.okx.com/api/v5/market/tickers?instType=SPOT")
// Create the second asynchronous thread
var r2 = HttpQuery_Go("https://api.huobi.pro/market/tickers")
// Get the return value of the first asynchronous thread call
var tickers1 = r1.wait()
// Get the return value of the second asynchronous thread call
var tickers2 = r2.wait()
// Print results
Log("tickers1:", tickers1)
Log("tickers2:", tickers2)
}
# Not supported
// Not supported
एकत्रित टिकर डेटा के लिए एक्सचेंज के सार्वजनिक इंटरफेस तक असिंक्रोनस पहुंच।
..HttpQuery_Go()
कार्य केवल समर्थन करता हैJavaScript
,Python
भाषा का प्रयोगurllib
लाइब्रेरी सीधे HTTP अनुरोध भेजने के लिए.HttpQuery_Go()
मुख्य रूप से उन इंटरफेस तक पहुंचने के लिए उपयोग किया जाता है जिन्हें एक्सचेंज पर हस्ताक्षर की आवश्यकता नहीं होती है, जैसे कि सार्वजनिक इंटरफेस जैसे कि टिकर जानकारी।HttpQuery_Go
कार्य बैकटेस्टिंग प्रणाली में समर्थित नहीं है।
{@fun/Global/HttpQuery HttpQuery}
यह फ़ंक्शन पास किए गए मापदंडों के अनुसार डेटा को कोड करता है।
..Encode
फ़ंक्शन एन्कोडिंग और एन्क्रिप्शन के बाद डेटा लौटाता है.
स्ट्रिंग
एन्कोड (अल्गो, इनपुटफ़ॉर्मेट, आउटपुटफ़ॉर्मेट, डेटा) एन्कोड ((algo, inputFormat, outputFormat, data, keyFormat, key)
पैरामीटरalgo
एन्कोडिंग गणना में प्रयुक्त एल्गोरिथ्म है। समर्थन सेटिंग हैःraw
(कोई एल्गोरिथ्म उपयोग नहीं किया जाता है), "चिह्न", algo
यह भी समर्थन करता हैः algo
algo
ed25519.seed
गणना।
कुछ
सच
स्ट्रिंग
डेटा प्रारूप को निर्दिष्ट करने के लिए प्रयोग किया जाता हैdata
पैरामीटर।inputFormat
पैरामीटर निम्न में से किसी एक के रूप में सेट किया जा सकता हैःraw
, hex
, base64
, string
. hex
एन्कोडेड, base64
एन्कोडेड है, और outputFormat
पैरामीटर निम्न में से किसी एक के रूप में सेट किया जा सकता हैःraw
, hex
, base64
, string
. hex
एन्कोडेड, base64
एन्कोडेड है, और data
संसाधित किए जाने वाले डेटा हैं।
आंकड़ा
सच
स्ट्रिंग
डेटा प्रारूप को निर्दिष्ट करने के लिए प्रयोग किया जाता हैkey
पैरामीटर।key
पैरामीटर निम्न में से किसी एक के रूप में सेट किया जा सकता हैःraw
, hex
, base64
, string
. hex
एन्कोडेड, base64
एन्कोडेड है, और key
के लिए इस्तेमाल किया गुप्त कुंजी हैHMAC
एन्क्रिप्शन. पैरामीटरkey
आवश्यक है जब पैरामीटरalgo
पर सेट हैsign
याsignTx
.key
पैरामीटर का उपयोग नहीं किया जाता हैHMAC
एन्क्रिप्शनalgo
पैरामीटर
function main() {
Log(Encode("raw", "raw", "hex", "example", "raw", "123")) // 6578616d706c65
Log(Encode("raw", "raw", "hex", "example")) // 6578616d706c65
Log(Encode("sha256", "raw", "hex", "example", "raw", "123")) // 698d54f0494528a759f19c8e87a9f99e75a5881b9267ee3926bcf62c992d84ba
Log(Encode("sha256", "raw", "hex", "example", "", "123")) // 50d858e0985ecc7f60418aaf0cc5ab587f42c2570a884095a9e8ccacd0f6545c
Log(Encode("sha256", "raw", "hex", "example", null, "123")) // 50d858e0985ecc7f60418aaf0cc5ab587f42c2570a884095a9e8ccacd0f6545c
Log(Encode("sha256", "raw", "hex", "example", "string", "123")) // 698d54f0494528a759f19c8e87a9f99e75a5881b9267ee3926bcf62c992d84ba
Log(Encode("raw", "raw", "hex", "123")) // 313233
Log(Encode("raw", "raw", "base64", "123")) // MTIz
Log(Encode("sha256", "raw", "hex", "example", "hex", "313233")) // 698d54f0494528a759f19c8e87a9f99e75a5881b9267ee3926bcf62c992d84ba
Log(Encode("sha256", "raw", "hex", "example", "base64", "MTIz")) // 698d54f0494528a759f19c8e87a9f99e75a5881b9267ee3926bcf62c992d84ba
}
def main():
Log(Encode("raw", "raw", "hex", "example", "raw", "123")) # 6578616d706c65
Log(Encode("raw", "raw", "hex", "example", "", "")) # 6578616d706c65
Log(Encode("sha256", "raw", "hex", "example", "raw", "123")) # 698d54f0494528a759f19c8e87a9f99e75a5881b9267ee3926bcf62c992d84ba
Log(Encode("sha256", "raw", "hex", "example", "", "123")) # 50d858e0985ecc7f60418aaf0cc5ab587f42c2570a884095a9e8ccacd0f6545c
Log(Encode("sha256", "raw", "hex", "example", "string", "123")) # 698d54f0494528a759f19c8e87a9f99e75a5881b9267ee3926bcf62c992d84ba
Log(Encode("raw", "raw", "hex", "123", "", "")) # 313233
Log(Encode("raw", "raw", "base64", "123", "", "")) # MTIz
Log(Encode("sha256", "raw", "hex", "example", "hex", "313233")) # 698d54f0494528a759f19c8e87a9f99e75a5881b9267ee3926bcf62c992d84ba
Log(Encode("sha256", "raw", "hex", "example", "base64", "MTIz")) # 698d54f0494528a759f19c8e87a9f99e75a5881b9267ee3926bcf62c992d84ba
void main() {
Log(Encode("raw", "raw", "hex", "example", "raw", "123")); // 6578616d706c65
Log(Encode("raw", "raw", "hex", "example")); // 6578616d706c65
Log(Encode("sha256", "raw", "hex", "example", "raw", "123")); // 698d54f0494528a759f19c8e87a9f99e75a5881b9267ee3926bcf62c992d84ba
Log(Encode("sha256", "raw", "hex", "example", "", "123")); // 50d858e0985ecc7f60418aaf0cc5ab587f42c2570a884095a9e8ccacd0f6545c
Log(Encode("sha256", "raw", "hex", "example", "string", "123")); // 698d54f0494528a759f19c8e87a9f99e75a5881b9267ee3926bcf62c992d84ba
Log(Encode("raw", "raw", "hex", "123")); // 313233
Log(Encode("raw", "raw", "base64", "123")); // MTIz
Log(Encode("sha256", "raw", "hex", "example", "hex", "313233")); // 698d54f0494528a759f19c8e87a9f99e75a5881b9267ee3926bcf62c992d84ba
Log(Encode("sha256", "raw", "hex", "example", "base64", "MTIz")); // 698d54f0494528a759f19c8e87a9f99e75a5881b9267ee3926bcf62c992d84ba
}
एन्कोड फ़ंक्शन कॉल का उदाहरण.
function main(){
var ret1 = Encode("text.encoder.utf8", "raw", "hex", "hello") // e4bda0e5a5bd
Log(ret1)
var ret2 = Encode("text.decoder.utf8", "hex", "string", ret1)
Log(ret2)
var ret3 = Encode("text.encoder.gbk", "raw", "hex", "hello") // c4e3bac3
Log(ret3)
var ret4 = Encode("text.decoder.gbk", "hex", "string", ret3)
Log(ret4)
}
def main():
ret1 = Encode("text.encoder.utf8", "raw", "hex", "hello", "", "") # e4bda0e5a5bd
Log(ret1)
ret2 = Encode("text.decoder.utf8", "hex", "string", ret1, "", "")
Log(ret2)
ret3 = Encode("text.encoder.gbk", "raw", "hex", "hello", "", "") # c4e3bac3
Log(ret3)
ret4 = Encode("text.decoder.gbk", "hex", "string", ret3, "", "")
Log(ret4)
void main(){
auto ret1 = Encode("text.encoder.utf8", "raw", "hex", "hello"); // e4bda0e5a5bd
Log(ret1);
auto ret2 = Encode("text.decoder.utf8", "hex", "string", ret1);
Log(ret2);
auto ret3 = Encode("text.encoder.gbk", "raw", "hex", "hello"); // c4e3bac3
Log(ret3);
auto ret4 = Encode("text.decoder.gbk", "hex", "string", ret3);
Log(ret4);
}
पैरामीटरalgo
स्ट्रिंग को एन्कोड और डिकोड करने के लिए
..Encode()
फ़ंक्शन केवल लाइव ट्रेडिंग के लिए समर्थित है.key
औरkeyFormat
मापदंडों पारित नहीं कर रहे हैं, तोkey
एन्क्रिप्शन का प्रयोग नहीं किया जाता है।
वर्तमान क्षण का नैनो सेकंड टाइमस्टैम्प प्राप्त करें।
..UnixNano()
फ़ंक्शन नैनो सेकंड टाइमस्टैम्प लौटाता है.
संख्या
यूनिक्स नैनो
function main() {
var time = UnixNano() / 1000000
Log(_N(time, 0))
}
def main():
time = UnixNano()
Log(time)
void main() {
auto time = UnixNano();
Log(time);
}
यदि आपको मिलीसेकंड के टाइमस्टैम्प प्राप्त करने की आवश्यकता है, तो आप निम्न कोड का उपयोग कर सकते हैंः
{@fun/Global/Unix यूनिक्स}
दूसरे स्तर पर वर्तमान क्षण का समय प्राप्त करें।
दूसरे स्तर का समय मुहर लौटाता है. संख्या
यूनिक्स
function main() {
var t = Unix()
Log(t)
}
def main():
t = Unix()
Log(t)
void main() {
auto t = Unix();
Log(t);
}
{@fun/Global/UnixNano यूनिक्स नैनो}
डिवाइस की सिस्टम जानकारी प्राप्त करें जहां डॉकर स्थित है.
प्रणाली की जानकारी। स्ट्रिंग
GetOS()
function main() {
Log("GetOS:", GetOS())
}
def main():
Log("GetOS:", GetOS())
void main() {
Log("GetOS:", GetOS());
}
उदाहरण के लिए,GetOS()
एक डॉकर के लिए कार्यमैक ओएसऑपरेटिंग सिस्टम वापस आ सकता हैःdarwin/amd64
. क्योंकि एप्पल कंप्यूटर में कई हार्डवेयर आर्किटेक्चर हैं.darwin
का नाम हैमैक ओएस system.
पैरामीटर के एमडी5 हैश की गणना करता हैdata
.
एमडी5 हैश मान. स्ट्रिंग
MD5 (डेटा)
MD5 गणना की आवश्यकता है कि डेटा. आंकड़ा सच स्ट्रिंग
function main() {
Log("MD5", MD5("hello world"))
}
def main():
Log("MD5", MD5("hello world"))
void main() {
Log("MD5", MD5("hello world"));
}
बुला रहा हैMD5("hello world")
फ़ंक्शन, रिटर्न मान हैः5eb63bbbe01eeed093cb22bb8f5acdc3
.
{@fun/Global/EncodeEncode} {@fun/Global/EncodeEncode} {@fun/Global/EncodeEncode}
डेटाबेस इंटरफ़ेस कार्य।
एक वस्तु जिसमें एक निष्पादन का परिणाम होता हैस्क्वायरबयान, उदाहरण के लिएः
{"columns":["TS","HIGH","OPEN","LOW","CLOSE","VOLUME"],"values":[[1518970320000,100,99.1,90,100,12345.6]]}
वस्तु
DBExec ((sql)
स्क्वायरकथन स्ट्रिंग. स्क्वायर सच स्ट्रिंग
function main() {
var strSql = [
":CREATE TABLE TEST_TABLE(",
"TS INT PRIMARY KEY NOT NULL,",
"HIGH REAL NOT NULL,",
"OPEN REAL NOT NULL,",
"LOW REAL NOT NULL,",
"CLOSE REAL NOT NULL,",
"VOLUME REAL NOT NULL)"
].join("")
var ret = DBExec(strSql)
Log(ret)
// Add a piece of data
Log(DBExec(":INSERT INTO TEST_TABLE (TS, HIGH, OPEN, LOW, CLOSE, VOLUME) VALUES (1518970320000, 100, 99.1, 90, 100, 12345.6);"))
// Query data
Log(DBExec(":SELECT * FROM TEST_TABLE;"))
}
def main():
arr = [
":CREATE TABLE TEST_TABLE(",
"TS INT PRIMARY KEY NOT NULL,",
"HIGH REAL NOT NULL,",
"OPEN REAL NOT NULL,",
"LOW REAL NOT NULL,",
"CLOSE REAL NOT NULL,",
"VOLUME REAL NOT NULL)"
]
strSql = ""
for i in range(len(arr)):
strSql += arr[i]
ret = DBExec(strSql)
Log(ret)
# Add a piece of data
Log(DBExec(":INSERT INTO TEST_TABLE (TS, HIGH, OPEN, LOW, CLOSE, VOLUME) VALUES (1518970320000, 100, 99.1, 90, 100, 12345.6);"))
# Query data
Log(DBExec(":SELECT * FROM TEST_TABLE;"))
void main() {
string strSql = ":CREATE TABLE TEST_TABLE(\
TS INT PRIMARY KEY NOT NULL,\
HIGH REAL NOT NULL,\
OPEN REAL NOT NULL,\
LOW REAL NOT NULL,\
CLOSE REAL NOT NULL,\
VOLUME REAL NOT NULL)";
auto ret = DBExec(strSql);
Log(ret);
// Add a piece of data
Log(DBExec(":INSERT INTO TEST_TABLE (TS, HIGH, OPEN, LOW, CLOSE, VOLUME) VALUES (1518970320000, 100, 99.1, 90, 100, 12345.6);"));
// Query data
Log(DBExec(":SELECT * FROM TEST_TABLE;"));
}
स्मृति में डेटाबेस का समर्थन, के लिएDBExec
कार्य पैरामीटर, यदिस्क्वायरकथन के साथ शुरू होता है:
तब इन-मेमोरी डेटाबेस में ऑपरेट करें, यह फ़ाइलों को लिखने के बिना तेज़ होगा। यह डेटाबेस संचालन के लिए उपयुक्त है जिन्हें लगातार सहेजने की आवश्यकता नहीं है, उदाहरण के लिएः
function main() {
var strSql = [
"CREATE TABLE TEST_TABLE(",
"TS INT PRIMARY KEY NOT NULL,",
"HIGH REAL NOT NULL,",
"OPEN REAL NOT NULL,",
"LOW REAL NOT NULL,",
"CLOSE REAL NOT NULL,",
"VOLUME REAL NOT NULL)"
].join("")
var ret = DBExec(strSql)
Log(ret)
}
def main():
arr = [
"CREATE TABLE TEST_TABLE(",
"TS INT PRIMARY KEY NOT NULL,",
"HIGH REAL NOT NULL,",
"OPEN REAL NOT NULL,",
"LOW REAL NOT NULL,",
"CLOSE REAL NOT NULL,",
"VOLUME REAL NOT NULL)"
]
strSql = ""
for i in range(len(arr)):
strSql += arr[i]
ret = DBExec(strSql)
Log(ret)
void main() {
string strSql = "CREATE TABLE TEST_TABLE(\
TS INT PRIMARY KEY NOT NULL,\
HIGH REAL NOT NULL,\
OPEN REAL NOT NULL,\
LOW REAL NOT NULL,\
CLOSE REAL NOT NULL,\
VOLUME REAL NOT NULL)";
auto ret = DBExec(strSql);
Log(ret);
}
एक मेज बनाओ।
function main() {
var strSql = [
"CREATE TABLE TEST_TABLE(",
"TS INT PRIMARY KEY NOT NULL,",
"HIGH REAL NOT NULL,",
"OPEN REAL NOT NULL,",
"LOW REAL NOT NULL,",
"CLOSE REAL NOT NULL,",
"VOLUME REAL NOT NULL)"
].join("")
Log(DBExec(strSql))
// Add a piece of data
Log(DBExec("INSERT INTO TEST_TABLE (TS, HIGH, OPEN, LOW, CLOSE, VOLUME) VALUES (1518970320000, 100, 99.1, 90, 100, 12345.6);"))
// Query data
Log(DBExec("SELECT * FROM TEST_TABLE;"))
// Modify data
Log(DBExec("UPDATE TEST_TABLE SET HIGH=? WHERE TS=?", 110, 1518970320000))
// Delete data
Log(DBExec("DELETE FROM TEST_TABLE WHERE HIGH=?", 110))
}
def main():
arr = [
"CREATE TABLE TEST_TABLE(",
"TS INT PRIMARY KEY NOT NULL,",
"HIGH REAL NOT NULL,",
"OPEN REAL NOT NULL,",
"LOW REAL NOT NULL,",
"CLOSE REAL NOT NULL,",
"VOLUME REAL NOT NULL)"
]
strSql = ""
for i in range(len(arr)):
strSql += arr[i]
Log(DBExec(strSql))
# Add a piece of data
Log(DBExec("INSERT INTO TEST_TABLE (TS, HIGH, OPEN, LOW, CLOSE, VOLUME) VALUES (1518970320000, 100, 99.1, 90, 100, 12345.6);"))
# Query data
Log(DBExec("SELECT * FROM TEST_TABLE;"))
# Modify data
Log(DBExec("UPDATE TEST_TABLE SET HIGH=? WHERE TS=?", 110, 1518970320000))
# Delete data
Log(DBExec("DELETE FROM TEST_TABLE WHERE HIGH=?", 110))
void main() {
string strSql = "CREATE TABLE TEST_TABLE(\
TS INT PRIMARY KEY NOT NULL,\
HIGH REAL NOT NULL,\
OPEN REAL NOT NULL,\
LOW REAL NOT NULL,\
CLOSE REAL NOT NULL,\
VOLUME REAL NOT NULL)";
Log(DBExec(strSql));
// Add a piece of data
Log(DBExec("INSERT INTO TEST_TABLE (TS, HIGH, OPEN, LOW, CLOSE, VOLUME) VALUES (1518970320000, 100, 99.1, 90, 100, 12345.6);"));
// Query data
Log(DBExec("SELECT * FROM TEST_TABLE;"));
// Modify data
Log(DBExec("UPDATE TEST_TABLE SET HIGH=? WHERE TS=?", 110, 1518970320000));
// Delete data
Log(DBExec("DELETE FROM TEST_TABLE WHERE HIGH=?", 110));
}
तालिका में रिकॉर्ड जोड़ें, हटाएं, जांचें और बदलें.
कार्यDBExec()
लाइव ट्रेडिंग डेटाबेस (SQLite डेटाबेस) को पैरामीटर पास करके संचालित कर सकते हैं। लाइव ट्रेडिंग डेटाबेस में डेटा जोड़ने, हटाने, जांचने और बदलने के संचालन को महसूस कर सकते हैं,एसक्यूलाइटव्याकरण. प्रणाली लाइव ट्रेडिंग डेटाबेस में आरक्षित तालिकाओंःkvdb
, cfg
, log
, profit
, chart
, इन टेबलों पर काम न करें।लेनदेनसमर्थित नहीं हैं और इस तरह के कार्यों को करने की अनुशंसा नहीं की जाती है, जो सिस्टम में संघर्ष का कारण बन सकता है।DBExec()
यह फ़ंक्शन केवल लाइव ट्रेडिंग के लिए समर्थित है.
{@fun/Global/_G _G}
एक UUID बनाएँ.
32-बिट UUID. स्ट्रिंग
UUID (()
function main() {
var uuid1 = UUID()
var uuid2 = UUID()
Log(uuid1, uuid2)
}
def main():
uuid1 = UUID()
uuid2 = UUID()
Log(uuid1, uuid2)
void main() {
auto uuid1 = UUID();
auto uuid2 = UUID();
Log(uuid1, uuid2);
}
..UUID()
फ़ंक्शन केवल लाइव ट्रेडिंग का समर्थन करता है।
घटनाओं के लिए सुनने के लिए, यह वापस आता है जब कोई हैWebSocket
पठनीय डेटा या समवर्ती कार्य, जैसेexchange.Go()
, HttpQuery_Go()
, आदि पूर्ण हो गए हैं।
यदि लौटी वस्तु शून्य मूल्य नहीं है, तोEvent
रिटर्न सामग्री में निहित घटना ट्रिगर प्रकार है। उदाहरण के लिए निम्न रिटर्न मान संरचनाः
{"Seq":1,"Event":"Exchange_GetTrades","ThreadId":0,"Index":3,"Nano":1682068771309583400}
वस्तु
इवेंट लूप घटना लूप (टाइमआउट)
पैरामीटरtimeout
मिलीसेकंड में टाइमआउट सेटिंग है। पैरामीटरtimeout
यदि यह 0 पर सेट किया गया है तो वापस आने से पहले किसी घटना के होने की प्रतीक्षा करता है, यदि यह 0 से अधिक है, तो यह घटना को टाइमआउट की प्रतीक्षा करने के लिए सेट करता है, और यदि यह 0 से कम है तो सबसे हालिया घटना को तुरंत लौटाता है।
टाइमआउट
झूठी
संख्या
function main() {
var routine_getTicker = exchange.Go("GetTicker")
var routine_getDepth = exchange.Go("GetDepth")
var routine_getTrades = exchange.Go("GetTrades")
// Sleep(2000), if the Sleep statement is used here, it will cause the subsequent EventLoop function to miss the previous events, because after waiting for 2 seconds, the concurrent function has received the data, and the subsequent EventLoop listening mechanism started, it misses these events.
// These events will not be missed unless EventLoop(-1) is called at the beginning of the first line of code to first initialize the EventLoop's listening mechanism.
// Log("GetDepth:", routine_getDepth.wait()) If the wait function is called in advance to retrieve the result of a concurrent call to the GetDepth function, the event that the GetDepth function receives the result of the request will not be returned in the EventLoop function.
var ts1 = new Date().getTime()
var ret1 = EventLoop(0)
var ts2 = new Date().getTime()
var ret2 = EventLoop(0)
var ts3 = new Date().getTime()
var ret3 = EventLoop(0)
Log("The first concurrent task completed was:", _D(ts1), ret1)
Log("The second concurrent task completed was:", _D(ts2), ret2)
Log("The third concurrent task completed was:", _D(ts3), ret3)
Log("GetTicker:", routine_getTicker.wait())
Log("GetDepth:", routine_getDepth.wait())
Log("GetTrades:", routine_getTrades.wait())
}
import time
def main():
routine_getTicker = exchange.Go("GetTicker")
routine_getDepth = exchange.Go("GetDepth")
routine_getTrades = exchange.Go("GetTrades")
ts1 = time.time()
ret1 = EventLoop(0)
ts2 = time.time()
ret2 = EventLoop(0)
ts3 = time.time()
ret3 = EventLoop(0)
Log("The first concurrent task completed was:", _D(ts1), ret1)
Log("The second concurrent task completed was:", _D(ts2), ret2)
Log("The third concurrent task completed was:", _D(ts3), ret3)
Log("GetTicker:", routine_getTicker.wait())
Log("GetDepth:", routine_getDepth.wait())
Log("GetTrades:", routine_getTrades.wait())
void main() {
auto routine_getTicker = exchange.Go("GetTicker");
auto routine_getDepth = exchange.Go("GetDepth");
auto routine_getTrades = exchange.Go("GetTrades");
auto ts1 = Unix() * 1000;
auto ret1 = EventLoop(0);
auto ts2 = Unix() * 1000;
auto ret2 = EventLoop(0);
auto ts3 = Unix() * 1000;
auto ret3 = EventLoop(0);
Log("The first concurrent task completed was:", _D(ts1), ret1);
Log("The second concurrent task completed was:", _D(ts2), ret2);
Log("The third concurrent task completed was:", _D(ts3), ret3);
Ticker ticker;
Depth depth;
Trades trades;
routine_getTicker.wait(ticker);
routine_getDepth.wait(depth);
routine_getTrades.wait(trades);
Log("GetTicker:", ticker);
Log("GetDepth:", depth);
Log("GetTrades:", trades);
}
पहली कॉलEventLoop()
कोड में फ़ंक्शन उस सुनी घटना के लिए तंत्र आरंभ करता है, और अगर पहलीEventLoop()
कॉल घटना callback के बाद शुरू होता है, यह पिछली घटनाओं को याद करेगा. अंतर्निहित प्रणाली एक कतार संरचना को लपेटती है जो अधिकतम 500 घटना callbacks कैश करती है. यदिEventLoop()
समारोह को समय में नहीं बुलाया जाता है उन्हें कार्यक्रम निष्पादन के दौरान बाहर ले जाने के लिए, बाद में घटना 500 कैश के बाहर callbacks खो जाएगा.EventLoop()
कार्य अंतर्निहित प्रणाली वेबसॉकेट के कैश कतार या समवर्ती कार्यों के कैश को प्रभावित नहीं करता है जैसे किexchange.Go()
. इन कैश के लिए, अभी भी डेटा पुनर्प्राप्त करने के लिए संबंधित विधियों का उपयोग करना आवश्यक है।EventLoop()
फ़ंक्शन के लिए डेटा है कि पहले प्राप्त किया गया हैEventLoop()
मुख्य उद्देश्यEventLoop()
कार्य रणनीति परत को सूचित करना है कि नए नेटवर्क डेटा को अंतर्निहित प्रणाली द्वारा प्राप्त किया गया है। पूरी रणनीति घटनाओं से प्रेरित है।EventLoop()
फ़ंक्शन एक घटना लौटाता है, बस सभी डेटा स्रोतों को पार करता है. उदाहरण के लिए, वेबसॉकेट कनेक्शन, द्वारा बनाई गई वस्तुओंexchange.Go()
डेटा प्राप्त करने की कोशिश करें।EventLoop()
फ़ंक्शन केवल लाइव ट्रेडिंग का समर्थन करता है।
मुख्य फ़ंक्शन से बुलाए जाने पर मुख्य थ्रेड में घटनाओं के लिए सुनेंmain()
. में लिखी रणनीतियों मेंJavaScript
भाषा,threading.Thread()
फ़ंक्शन एक थ्रेड बनाता है, जिसे वर्तमान थ्रेड में घटनाओं के लिए सुनने के लिए थ्रेड
{@fun/Global/Dial Dial}, {@fun/Trade/exchange.Go exchange.Go}, {@fun/Global/HttpQuery_Go HttpQuery_Go}
..__Serve
function का उपयोग Http सेवा, TCP सेवा और Websocket सेवा (Http प्रोटोकॉल पर आधारित) बनाने के लिए किया जाता है।
एक स्ट्रिंग लौटाता है जो बनाई गई सेवा के आईपी पते और पोर्ट को रिकॉर्ड करता है. उदाहरण के लिएः127.0.0.1:8088
, [::]:8089
.
स्ट्रिंग
__Serve ((serveURI, हैंडलर) __Serve ((serveURI, हैंडलर,...args)
..serveURI
पैरामीटर का उपयोग प्रोटोकॉल, आईपी पते, पोर्ट और सेवा बाध्यता की अन्य सेटिंग्स को कॉन्फ़िगर करने के लिए किया जाता है, जैसे किhttp://0.0.0.0:8088?gzip=true
, यानी,http://:8088?gzip=true
.
serveURI
पैरामीटर सेटिंग, जैसेtcp://127.0.0.1:6666?tls=true
; आप प्रमाणपत्र और निजी कुंजी जोड़ सकते हैं, जैसे किtls=true&cert_pem=xxxx&cert_key_pem=xxxx
.serveURI
पैरामीटर सेटिंग्स, जैसेhttp://127.0.0.1:6666?gzip=true
; आप संपीड़न सेटिंग्स सेट कर सकते हैंःgzip=true
.
दserveURI
पैरामीटर Https के लिए प्रयोग किया जाता है, जैसे किhttps://127.0.0.1:6666?tls=true&gzip=true
; आप जोड़ सकते हैंcert_pem
औरcert_key_pem
प्रमाणपत्र को लोड करने के लिए पैरामीटर।serveURI
सच
स्ट्रिंग
दhandler
पैरामीटर का प्रयोग रूटिंग प्रोसेसिंग फंक्शन (Http प्रोटोकॉल), मैसेज प्रोसेसिंग फंक्शन (TCP प्रोटोकॉल), और स्ट्रीम प्रोसेसिंग फंक्शन (वेबसोकेट) में पास करने के लिए किया जाता है।
पैरामीटर द्वारा पास किया गया कॉलबैक फ़ंक्शनhandler
कई मापदंडों को परिभाषित कर सकते हैं, पहला मापदंड ctx ऑब्जेक्ट (संदर्भ ऑब्जेक्ट) है।
संचालक
सच
कार्य
कॉलबैक फ़ंक्शन का वास्तविक पैरामीटर पैरामीटर के रूप में पारित कियाhandler
. कई मापदंड हो सकते हैंarg
उदाहरण के लिए:
__Serve("http://:8088", function(ctx, a, b, c) {
Log(`ctx.host():`, ctx.host(), ", a=", a, ", b=", b, ", c=", c)
}, 1, 2, 3)
मापदंड1
, 2
, 3
में पारित किया जब कॉल__Serve()
समारोह पैरामीटर के अनुरूपa
, b
, c
कॉलबैक फ़ंक्शन में पारित किया।
आर्ग झूठी string, number, bool, object, array, function, null value और सिस्टम द्वारा समर्थित अन्य प्रकार
function main() {
let httpServer = __Serve("http://:8088?gzip=true", function (ctx) {
Log("http connect from: ", ctx.remoteAddr(), "->", ctx.localAddr())
let path = ctx.path()
if (path == "/") {
ctx.write(JSON.stringify({
path: ctx.path(),
method: ctx.method(),
headers: ctx.headers(),
cookie: ctx.header("Cookie"),
remote: ctx.remoteAddr(),
query: ctx.rawQuery()
}))
} else if (path == "/tickers") {
let ret = exchange.GetTickers()
if (!ret) {
ctx.setStatus(500)
ctx.write(GetLastError())
} else {
ctx.write(JSON.stringify(ret))
}
} else if (path == "/wss") {
if (ctx.upgrade("websocket")) { // upgrade to websocket
while (true) {
let r = ctx.read(10)
if (r == "") {
break
} else if (r) {
if (r == "ticker") {
ctx.write(JSON.stringify(exchange.GetTicker()))
} else {
ctx.write("not support")
}
}
}
Log("websocket closed", ctx.remoteAddr())
}
} else {
ctx.setStatus(404)
}
})
let echoServer = __Serve("tcp://:8089", function (ctx) {
Log("tcp connect from: ", ctx.remoteAddr(), "->", ctx.localAddr())
while (true) {
let d = ctx.read()
if (!d) {
break
}
ctx.write(d)
}
Log("connect closed")
})
Log("http serve on", httpServer, "tcp serve on", echoServer)
for (var i = 0; i < 5; i++) {
if (i == 2) {
// test Http
var retHttp = HttpQuery("http://127.0.0.1:8088?num=123&limit=100", {"debug": true})
Log("retHttp:", retHttp)
} else if (i == 3) {
// test TCP
var tcpConn = Dial("tcp://127.0.0.1:8089")
tcpConn.write("Hello TCP Server")
var retTCP = tcpConn.read()
Log("retTCP:", retTCP)
} else if (i == 4) {
// test Websocket
var wsConn = Dial("ws://127.0.0.1:8088/wss|compress=gzip")
wsConn.write("ticker")
var retWS = wsConn.read(1000)
Log("retWS:", retWS)
// no depth
wsConn.write("depth")
retWS = wsConn.read(1000)
Log("retWS:", retWS)
}
Sleep(1000)
}
}
# Unsupported
// Unsupported
Websocket
सेवा HTTP प्रोटोकॉल के आधार पर लागू किया जाता है. आप पथ में एक रूटिंग शाखा सेट कर सकते हैं और के लिए कार्यान्वयन कोड डिजाइनWebsocket
आप इस अनुभाग में नमूने कोड का संदर्भ ले सकते हैं।पैरामीटर द्वारा पास किया गया कॉलबैक फ़ंक्शनhandler
प्राप्त करता हैctx
पैरामीटर।ctx
पैरामीटर एक संदर्भ वस्तु है जिसका उपयोग डेटा प्राप्त करने और लिखने के लिए किया जाता है, निम्नलिखित विधियों के साथः
HTTP/1.1
, tcp
.http://127.0.0.1:8088?num=123
, और पैरामीटर द्वारा पारित कॉलबैक प्रसंस्करण समारोहhandler
रिटर्न"123"
कबctx.query("num")
कहा जाता है।User-Agent
वर्तमान अनुरोध के शीर्षकों मेंःctx.header("User-Agent")
.GET
, POST
आदि।ctx
वेबसॉकेट प्रोटोकॉल के लिए संदर्भ वस्तु; यदि स्विच सफल होता है तो एक बूलियन मान (सही) और यदि यह विफल होता है तो एक बूलियन मान (गलत) लौटाता है।read
विधि साधारण HTTP प्रोटोकॉल में समर्थित नहीं है. आप समय सीमा पैरामीटर निर्दिष्ट कर सकते हैंtimeout_ms
मिलीसेकंड में।JSON.stringify()
JSON ऑब्जेक्ट को एक स्ट्रिंग में एन्कोड करने के लिए और फिर इसे लिखने के लिए.WebSocket
प्रोटोकॉल, आप क्लाइंट को एन्कोडेड स्ट्रिंग पास करने के लिए इस विधि का उपयोग कर सकते हैं.{@fun/Global/HttpQuery HttpQuery}, {@fun/Global/HttpQuery_Go HttpQuery_Go}
लगातार डेटा सहेजें, फ़ंक्शन एक वैश्विक शब्दकोश फ़ंक्शन को लागू करता है जिसे सहेजा जा सकता है। डेटा संरचना एक KV तालिका है जिसे स्थायी रूप से डॉकर की स्थानीय डेटाबेस फ़ाइल में सहेजा जाता है।
में स्थायी रूप से सहेजे गए कुंजी-मूल्य डेटाk-v
कुंजी-मूल्य जोड़े।
स्ट्रिंग, संख्या, बूल, ऑब्जेक्ट, सरणी, शून्य मान
_G() _G(k) _G(k, v)
पैरामीटरk
सहेजे गए कुंजी-मूल्य जोड़ी में कुंजी का नाम है, और यह केस-सेंसिटिव नहीं है।
क
झूठी
स्ट्रिंग, शून्य मान
पैरामीटरv
सहेजे गए कुंजी-मूल्य जोड़ी में कुंजी मान है, जो किसी भी डेटा हो सकता है कि किया जा सकता हैJSON
श्रृंखलाबद्ध।
v
झूठी
स्ट्रिंग, संख्या, बूल, ऑब्जेक्ट, सरणी, शून्य मान
function main(){
// Set a global variable num with a value of 1
_G("num", 1)
// Change a global variable num to the value of the string ok
_G("num", "ok")
// Delete the global variable num
_G("num", null)
// Returns the value of the global variable num
Log(_G("num"))
// Delete all global variables
_G(null)
// Return to live trading ID
var robotId = _G()
}
def main():
_G("num", 1)
_G("num", "ok")
_G("num", None)
Log(_G("num"))
_G(None)
robotId = _G()
void main() {
_G("num", 1);
_G("num", "ok");
_G("num", NULL);
Log(_G("num"));
_G(NULL);
// Not support auto robotId = _G();
}
प्रत्येक प्रत्यक्ष व्यापार के लिए एक अलग डेटाबेस,_G()
यदि रणनीति को फिर से शुरू किया जाता है या डॉकर चलाना बंद कर देता है तो फ़ंक्शन हमेशा मौजूद रहेगा। यदि बैकटेस्टिंग समाप्त हो जाती है, तो बैकटेस्टिंग सिस्टम में सहेजे गए डेटा को डॉकर द्वारा हटा दिया जाता है।_G()
कार्य को साफ़ कर दिया जाएगा।_G()
सहेजे गए डेटा को बनाए रखने के लिए, इसका उपयोग हार्डवेयर डिवाइस की मेमोरी और हार्ड डिस्क स्थान के अनुसार उचित रूप से किया जाना चाहिए, और इसका दुरुपयोग नहीं किया जाना चाहिए।
जब कॉल_G()
एक लाइव व्यापार में कार्य और कोई पैरामीटर पारित कर रहे हैं,_G()
फ़ंक्शन रिटर्नId
वर्तमान लाइव ट्रेडिंग के._G()
कार्य, पैरामीटरv
शून्य के रूप में पारित किया जाता हैk-v
कुंजी-मूल्य जोड़ी._G()
फ़ंक्शन, केवल पैरामीटरk
स्ट्रिंग में पारित किया जाता है, और_G()
फ़ंक्शन सहेजे गए पैरामीटर के अनुरूप कुंजी मान देता हैk
._G()
फ़ंक्शन, केवल पैरामीटरk
शून्य मान में पारित किया जाता है, यह दर्शाता है कि सभी रिकॉर्डk-v
कुंजी-मूल्य जोड़ी हटाया जाता है.k-v
कुंजी-मूल्य जोड़े लगातार सहेजे गए हैं,_G()
फ़ंक्शन को फिर से बुलाया जाता है, जो कि पैरामीटर के रूप में लगातार सहेजी गई कुंजी के नाम में गुजरता हैk
. पैरामीटर के रूप में नया कुंजी मान पास करनाv
अद्यतन करेगा किk-v
कुंजी-मूल्य जोड़ी।
{@fun/Global/DBExec DBExec}
मिलीसेकंड टाइमस्टैम्प याDate
समय स्ट्रिंग्स के लिए वस्तुओं.
समय स्ट्रिंग। स्ट्रिंग
_D() _D (समय) _D ((समयमुद्रण, fmt)
मिलीसेकंड का टाइमस्टैम्प याDate
वस्तु।
समय-छाप
झूठी
संख्या, उद्देश्य
स्वरूपण स्ट्रिंग,JavaScript
भाषा का डिफ़ॉल्ट प्रारूपःyyyy-MM-dd hh:mm:ss
; Python
भाषा का डिफ़ॉल्ट प्रारूपः%Y-%m-%d %H:%M:%S
; C++
भाषा का डिफ़ॉल्ट प्रारूपः%Y-%m-%d %H:%M:%S
.
fmt
झूठी
स्ट्रिंग
function main(){
var time = _D()
Log(time)
}
def main():
strTime = _D()
Log(strTime)
void main() {
auto strTime = _D();
Log(strTime);
}
वर्तमान समय स्ट्रिंग प्राप्त करें और प्रिंट करें:
function main() {
Log(_D(1574993606000))
}
def main():
# Running this code on a server in Beijing time: 2019-11-29 10:13:26 , a docker on another server in another region results in: 2019-11-29 02:13:26
Log(_D(1574993606))
void main() {
Log(_D(1574993606000));
}
समय-स्टैम्प 1574993606000 है, कोड रूपांतरण का उपयोग करकेः
function main() {
Log(_D(1574993606000, "yyyy--MM--dd hh--mm--ss")) // 2019--11--29 10--13--26
}
def main():
# 1574993606 is timestamped in seconds.
Log(_D(1574993606, "%Y--%m--%d %H--%M--%S")) # 2019--11--29 10--13--26
void main() {
Log(_D(1574993606000, "%Y--%m--%d %H--%M--%S")); // 2019--11--29 10--13--26
}
पैरामीटर के साथ स्वरूपणfmt
के लिए अलग हैJavaScript
, Python
, औरC++
भाषाओं, जैसा कि निम्नलिखित उदाहरणों में दिखाया गया हैः
किसी भी पैरामीटर को पारित किए बिना वर्तमान समय स्ट्रिंग लौटाता है._D()
कार्य मेंPython
रणनीति, आपको पता होना चाहिए कि पारित मापदंडों दूसरे स्तर के टाइमस्टैम्प हैं (जावास्क्रिप्ट और सी ++ रणनीतियों में मिलीसेकंड स्तर के टाइमस्टैम्प, जहां 1 सेकंड 1000 मिलीसेकंड के बराबर है) ।_D()
लाइव ट्रेडिंग में पठनीय टाइमस्टैम्प के साथ एक समय स्ट्रिंग को पार्स करने के लिए, आपको ऑपरेटिंग सिस्टम के समय क्षेत्र और समय सेटिंग पर ध्यान देने की आवश्यकता है जहां डॉकर प्रोग्राम स्थित है।_D()
फ़ंक्शन डॉकर
{@fun/Global/UnixNano UnixNano}, {@fun/Global/Unix Unix}
एक फ्लोटिंग पॉइंट नंबर प्रारूपित करें.
परिशुद्धता सेटिंग के अनुसार प्रारूपित फ्लोटिंग कॉमन नंबर। संख्या
_N() _N(num) _N ((num, सटीकता)
फ्लोटिंग कॉमन नंबर जिसे स्वरूपित किया जाना है.
संख्या
सच
संख्या
स्वरूपण के लिए परिशुद्धता सेटिंग, पैरामीटरprecision
एक पूर्णांक है, और पैरामीटरprecision
डिफ़ॉल्ट 4 पर सेट करता है।
परिशुद्धता
झूठी
संख्या
function main(){
var i = 3.1415
Log(i)
var ii = _N(i, 2)
Log(ii)
}
def main():
i = 3.1415
Log(i)
ii = _N(i, 2)
Log(ii)
void main() {
auto i = 3.1415;
Log(i);
auto ii = _N(i, 2);
Log(ii);
}
उदाहरण के लिए,_N(3.1415, 2)
के बाद मान को मिटा देगा3.1415
दो दशमलव स्थानों और समारोह लौटाता है3.14
.
function main(){
var i = 1300
Log(i)
var ii = _N(i, -3)
// Check the logs and see that it is 1000
Log(ii)
}
def main():
i = 1300
Log(i)
ii = _N(i, -3)
Log(ii)
void main() {
auto i = 1300;
Log(i);
auto ii = _N(i, -3);
Log(ii);
}
यदि आपको दशमलव बिंदु के बाईं ओर सभी एन अंकों को 0 में बदलने की आवश्यकता है, तो आप इसे इस तरह लिख सकते हैंः
पैरामीटरprecision
एक सकारात्मक पूर्णांक, नकारात्मक पूर्णांक हो सकता है.
{@fun/Trade/exchange.SetPrecision exchange.SetPrecision} {@fun/Trade/exchange.SetPrecision exchange.SetPrecision} {@trade/exchange.SetPrecision exchange.SetPrecision} {@fun/Trade.
इंटरफ़ेस दोष सहिष्णुता के लिए पुनः प्रयास करें।
कॉलबैक फ़ंक्शन का रिटर्न वैल्यू जब यह निष्पादित किया जाता है। सभी प्रकार सिस्टिम द्वारा समर्थित हैं सिवायतार्किक झूठा मानऔरशून्य मान.
_C(pfn) _C ((pfn,...args)
पैरामीटरpfn
एक फ़ंक्शन संदर्भ है, जो एक हैकॉलबैक फ़ंक्शन.
पीएफएन
सच
कार्य
पैरामीटरकॉलबैक फ़ंक्शन, एक से अधिक पैरामीटर हो सकते हैंarg
. मापदंडों का प्रकार और संख्याarg
पर निर्भर करता हैकॉलबैक फ़ंक्शन.
आर्ग
झूठी
string, number, bool, object, array, function, सभी प्रकार सिस्टम द्वारा समर्थित हैं, जैसे शून्य मान
function main(){
var ticker = _C(exchange.GetTicker)
// Adjust _C() function retry interval to 2 seconds
_CDelay(2000)
var depth = _C(exchange.GetDepth)
Log(ticker)
Log(depth)
}
def main():
ticker = _C(exchange.GetTicker)
_CDelay(2000)
depth = _C(exchange.GetDepth)
Log(ticker)
Log(depth)
void main() {
auto ticker = _C(exchange.GetTicker);
_CDelay(2000);
auto depth = _C(exchange.GetDepth);
Log(ticker);
Log(depth);
}
पैरामीटर के बिना त्रुटि-सहिष्णुता कार्यों के लिएः
function main(){
var records = _C(exchange.GetRecords, PERIOD_D1)
Log(records)
}
def main():
records = _C(exchange.GetRecords, PERIOD_D1)
Log(records)
void main() {
auto records = _C(exchange.GetRecords, PERIOD_D1);
Log(records);
}
परिमाणों के साथ कार्यों के लिए जो त्रुटि सहिष्णु हैंः
var test = function(a, b){
var time = new Date().getTime() / 1000
if(time % b == 3){
Log("Eligible!", "#FF0000")
return true
}
Log("Retry!", "#FF0000")
return false
}
function main(){
var ret = _C(test, 1, 5)
Log(ret)
}
import time
def test(a, b):
ts = time.time()
if ts % b == 3:
Log("Eligible!", "#FF0000")
return True
Log("Retry!", "#FF0000")
return False
def main():
ret = _C(test, 1, 5)
Log(ret)
// C++ does not support fault tolerance for custom functions in this way
यह कस्टम कार्यों के दोष सहिष्णुता के लिए भी इस्तेमाल किया जा सकता हैः
.._C()
function निर्दिष्ट फ़ंक्शन को तब तक कॉल करता रहेगा जब तक कि यह सफलतापूर्वक वापस न आ जाए (पैरामीटर द्वारा संदर्भित फ़ंक्शनpfn
रिटर्नशून्ययाझूठीजब बुलाया जाता है तो फिर से कॉल करने का प्रयास करेगाpfn
) उदाहरण के लिए_C(exchange.GetTicker)
. डिफ़ॉल्ट पुनः प्रयास अंतराल 3 सेकंड है, आप कॉल कर सकते हैं_CDelay()
पुनः प्रयास अंतराल सेट करने के लिए समारोह. उदाहरण के लिए,_CDelay(1000)
के पुनः प्रयास के अंतराल को बदलने का साधन है_C()
1 सेकंड के लिए कार्य।
दोष सहिष्णुता निम्नलिखित कार्यों के लिए की जा सकती है, लेकिन यह सीमित नहीं है:
exchange.GetTicker()
exchange.GetDepth()
exchange.GetTrades()
exchange.GetRecords()
exchange.GetAccount()
exchange.GetOrders()
exchange.GetOrder()
exchange.GetPositions()
सभी को बुलाया जा सकता है_C()
दोष सहिष्णुता के लिए कार्य।_C()
समारोह उपरोक्त सूचीबद्ध समारोह दोष सहिष्णुता तक सीमित नहीं है, पैरामीटरpfn
एक फ़ंक्शन कॉल के बजाय एक फ़ंक्शन संदर्भ है.
ध्यान दें कि यह है_C(exchange.GetTicker)
, नहीं_C(exchange.GetTicker())
.सरणी के प्रतिच्छेदन काल की संख्या देता हैarr1
और सरणीarr2
.
सरणी के क्रॉस पीरियड्स की संख्याarr1
और सरणीarr2
.
संख्या
_क्रॉस ((arr1, arr2)
तत्व प्रकार के सरणी हैंnumber
.
arr1
सच
सरणी
तत्व प्रकार के सरणी हैंnumber
.
arr2
सच
सरणी
// Fast line indicator
var arr1 = [1,2,3,4,5,6,8,8,9]
// Slow line indicator
var arr2 = [2,3,4,5,6,7,7,7,7]
function main(){
Log("_Cross(arr1, arr2) : ", _Cross(arr1, arr2))
Log("_Cross(arr2, arr1) : ", _Cross(arr2, arr1))
}
arr1 = [1,2,3,4,5,6,8,8,9]
arr2 = [2,3,4,5,6,7,7,7,7]
def main():
Log("_Cross(arr1, arr2) : ", _Cross(arr1, arr2))
Log("_Cross(arr2, arr1) : ", _Cross(arr2, arr1))
void main() {
vector<double> arr1 = {1,2,3,4,5,6,8,8,9};
vector<double> arr2 = {2,3,4,5,6,7,7,7,7};
Log("_Cross(arr1, arr2) : ", _Cross(arr1, arr2));
Log("_Cross(arr2, arr1) : ", _Cross(arr2, arr1));
}
_Cross ((Arr1, Arr2) फ़ंक्शन का परीक्षण करने के लिए डेटा का एक सेट सिमुलेट किया जा सकता हैः
यदि रिटर्न मान_Cross()
यदि फलन एक सकारात्मक संख्या है, तो यह ऊपर की ओर प्रवेश करने की अवधि को दर्शाता है, यदि यह एक नकारात्मक संख्या है, तो यह नीचे की ओर प्रवेश करने की अवधि को दर्शाता है, 0 का अर्थ वर्तमान मूल्य के समान है। उपयोग के लिए विशिष्ट निर्देशःअंतर्निहित कार्य के बारे में विश्लेषण और उपयोग के निर्देश _क्रॉस.
कार्यJSONParse()
पार्स करने के लिए प्रयोग किया जाता हैJSON
strings.
JSON
वस्तु।
वस्तु
JSONParse ((s)
JSON
स्ट्रिंग।
s
सच
स्ट्रिंग
function main() {
let s1 = '{"num": 8754613216564987646512354656874651651358}'
Log("JSON.parse:", JSON.parse(s1)) // JSON.parse: {"num":8.754613216564988e+39}
Log("JSONParse:", JSONParse(s1)) // JSONParse: {"num":"8754613216564987646512354656874651651358"}
let s2 = '{"num": 123}'
Log("JSON.parse:", JSON.parse(s2)) // JSON.parse: {"num":123}
Log("JSONParse:", JSONParse(s2)) // JSONParse: {"num":123}
}
import json
def main():
s1 = '{"num": 8754613216564987646512354656874651651358}'
Log("json.loads:", json.loads(s1)) # json.loads: map[num:8.754613216564987e+39]
Log("JSONParse:", JSONParse(s1)) # JSONParse: map[num:8754613216564987646512354656874651651358]
s2 = '{"num": 123}'
Log("json.loads:", json.loads(s2)) # json.loads: map[num:123]
Log("JSONParse:", JSONParse(s2)) # JSONParse: map[num:123]
void main() {
auto s1 = "{\"num\":8754613216564987646512354656874651651358}";
Log("json::parse:", json::parse(s1));
// Log("JSONParse:", JSONParse(s1)); // The function is not supported.
auto s2 = "{\"num\":123}";
Log("json::parse:", json::parse(s2));
// Log("JSONParse:", JSONParse(s2)); // The function is not supported.
}
बड़े मानों के साथ JSON स्ट्रिंग्स को सही ढंग से पार्स किया जा सकता है, और यह स्ट्रिंग प्रकार के रूप में बड़े मानों को पार्स करेगा.JSONParse()
कार्य बैकटेस्ट प्रणाली में समर्थित नहीं है।