संसाधन लोड हो रहा है... लोड करना...

विश्वव्यापी

संस्करण

सिस्टम का वर्तमान संस्करण संख्या लौटाता है.

वर्तमान प्रणाली संस्करण संख्या, जैसे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.

यह बैकटेस्टिंग प्रणाली में काम नहीं करता है।

{@मज़ा/ग्लोबल/मेल मेल}

सेटErrorFilter

फ़िल्टर त्रुटि लॉग.

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

लाइव ट्रेडिंग प्रक्रिया आईडी प्राप्त करें.

लाइव ट्रेडिंग प्रक्रिया आईडी लौटाएँ। स्ट्रिंग

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() फ़ंक्शन रिक्त स्ट्रिंग देता है, अर्थातः , और write() फ़ंक्शन 0 देता है। स्थिति का पता लगाया जाता है। आप close() फ़ंक्शन का उपयोग करके कनेक्शन बंद कर सकते हैं, या यदि आपने स्वचालित पुनः कनेक्शन सेट किया है, तो आपको इसे बंद करने की आवश्यकता नहीं है, अंतर्निहित सिस्टम इसे स्वचालित रूप से फिर से जोड़ देगा।

वस्तु

डायल करें (पते) डायल (पता, टाइमआउट)

अनुरोध पता। पता सच स्ट्रिंग टाइमआउट सेकंड, टाइमआउट झूठी संख्या

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&timestamp=" + 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")
    }
}

विस्तृत प्रलेखन संदर्भःएफएमजेड का अन्वेषण: लाइव ट्रेडिंग रणनीतियों के बीच संचार प्रोटोकॉल का अभ्यास

HttpQuery

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",
  • debug: जब यह सेट किया जाता हैtrue,HttpQueryफ़ंक्शन कॉल पूर्ण उत्तर संदेश लौटाता है.false, केवल डेटाBodyके उत्तर संदेश को वापस कर दिया जाता है।
  • टाइमआउट: टाइमआउट सेटिंग, सेट 1000 का अर्थ है 1 सेकंड का टाइमआउट।
  • charset: यह अनुरोधित प्रतिक्रिया डेटा के ट्रांसकोडिंग का समर्थन करता है, जैसे कि GB18030. यह सामान्य एन्कोडिंग का समर्थन करता है. इस संरचना में सभी क्षेत्र वैकल्पिक हैं, उदाहरण के लिए,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}

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.
  • debug: जब यह सेट किया जाता हैtrue, यहHttpQuery_Goफ़ंक्शन कॉल पूर्ण उत्तर संदेश लौटाता है.false, केवल डेटाBodyके उत्तर संदेश को वापस कर दिया जाता है।
  • टाइमआउट: टाइमआउट सेटिंग, सेट 1000 का अर्थ है 1 सेकंड का टाइमआउट। इस संरचना में सभी क्षेत्र वैकल्पिक हैं, उदाहरण के लिए,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(कोई एल्गोरिथ्म उपयोग नहीं किया जाता है), "चिह्न", signTx, md4, md5, sha256, sha512, sha1, keccak256, sha3.224, sha3.256, sha3.384, sha3.512, sha3.keccak256, sha3.keccak512, sha512.384, sha512.256, sha512.224, ripemd160, blake2b.256, 2b.512, blake2s.128, blake2s.256 पैरामीटर।algoयह भी समर्थन करता हैः text.encoder.utf8, text.decoder.utf8, text.encoder.gbk, text.decoder.gbk, एन्कोड और डिकोड स्ट्रिंग्स। पैरामीटरalgoed25519 एल्गोरिथ्म का भी समर्थन करता है। विभिन्न हैश एल्गोरिदम के उपयोग का समर्थन करता है, उदाहरण के लिए पैरामीटरalgoed25519.md5, ed25519.sha512, आदि के रूप में लिखा जा सकता है। यह समर्थन करता हैed25519.seedगणना। कुछ सच स्ट्रिंग डेटा प्रारूप को निर्दिष्ट करने के लिए प्रयोग किया जाता हैdataपैरामीटर।inputFormatपैरामीटर निम्न में से किसी एक के रूप में सेट किया जा सकता हैःraw, hex, base64, string. raw का अर्थ है डेटा कच्चे डेटा है, hex का अर्थ है डेटा हैhexएन्कोडेड, base64 का अर्थ है कि डेटा हैbase64एन्कोडेड है, और string का मतलब है कि डेटा एक स्ट्रिंग है। इनपुटफ़ॉर्मेट सच स्ट्रिंग आउटपुट के डेटा प्रारूप को निर्दिष्ट करने के लिए प्रयोग किया जाता है।outputFormatपैरामीटर निम्न में से किसी एक के रूप में सेट किया जा सकता हैःraw, hex, base64, string. raw का अर्थ है डेटा कच्चे डेटा है, hex का अर्थ है डेटा हैhexएन्कोडेड, base64 का अर्थ है कि डेटा हैbase64एन्कोडेड है, और string का मतलब है कि डेटा एक स्ट्रिंग है। आउटपुटफ़ॉर्मेट सच स्ट्रिंग पैरामीटरdataसंसाधित किए जाने वाले डेटा हैं। आंकड़ा सच स्ट्रिंग डेटा प्रारूप को निर्दिष्ट करने के लिए प्रयोग किया जाता हैkeyपैरामीटर।keyपैरामीटर निम्न में से किसी एक के रूप में सेट किया जा सकता हैःraw, hex, base64, string. raw का अर्थ है डेटा कच्चे डेटा है, hex का अर्थ है डेटा हैhexएन्कोडेड, base64 का अर्थ है कि डेटा हैbase64एन्कोडेड है, और string का मतलब है कि डेटा एक स्ट्रिंग है। keyफ़ॉर्मेट झूठी स्ट्रिंग पैरामीटरkeyके लिए इस्तेमाल किया गुप्त कुंजी हैHMACएन्क्रिप्शन. पैरामीटरkeyआवश्यक है जब पैरामीटरalgoपर सेट हैsignयाsignTx.keyपैरामीटर का उपयोग नहीं किया जाता हैHMACएन्क्रिप्शनalgoपैरामीटर raw पर सेट है (क्योंकि HMAC एन्क्रिप्शन के लिए एल्गोरिथ्म निर्दिष्ट किया जाना चाहिए) । कुंजी झूठी स्ट्रिंग

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स्ट्रिंग को एन्कोड और डिकोड करने के लिए text.encoder.utf8, text.decoder.utf8, text.encoder.gbk, text.decoder.gbk का भी समर्थन करता है।

..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

डिवाइस की सिस्टम जानकारी प्राप्त करें जहां डॉकर स्थित है.

प्रणाली की जानकारी। स्ट्रिंग

GetOS()

function main() {
    Log("GetOS:", GetOS())
}
def main():
    Log("GetOS:", GetOS())
void main() {
    Log("GetOS:", GetOS());
}

उदाहरण के लिए,GetOS()एक डॉकर के लिए कार्यमैक ओएसऑपरेटिंग सिस्टम वापस आ सकता हैःdarwin/amd64. क्योंकि एप्पल कंप्यूटर में कई हार्डवेयर आर्किटेक्चर हैं.darwinका नाम हैमैक ओएस system.

एमडी5

पैरामीटर के एमडी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}

DBExec

डेटाबेस इंटरफ़ेस कार्य।

एक वस्तु जिसमें एक निष्पादन का परिणाम होता हैस्क्वायरबयान, उदाहरण के लिएः


{"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

एक 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}

__सेवा करें

..__Servefunction का उपयोग 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पैरामीटर एक संदर्भ वस्तु है जिसका उपयोग डेटा प्राप्त करने और लिखने के लिए किया जाता है, निम्नलिखित विधियों के साथः

  • ctx.proto (() Http/TCP प्रोटोकॉल पर लागू, कॉल करने पर प्रोटोकॉल का नाम लौटाता है। उदाहरण के लिएःHTTP/1.1, tcp.
  • ctx.host() एचटीटीपी प्रोटोकॉल पर लागू, यह आईपी पते और बंदरगाह को बुलाते समय मेजबान जानकारी लौटाता है।
  • ctx.path (() Http प्रोटोकॉल पर लागू किया जाता है, जब बुलाया जाता है तो अनुरोध पथ लौटाता है.
  • ctx.query(key) HTTP प्रोटोकॉल पर लागू किया जाता है, अनुरोध में क्वेरी में कुंजी के अनुरूप मान लौटाता है जब बुलाया जाता है। उदाहरण के लिए, भेजा गया अनुरोध हैःhttp://127.0.0.1:8088?num=123, और पैरामीटर द्वारा पारित कॉलबैक प्रसंस्करण समारोहhandlerरिटर्न"123"कबctx.query("num")कहा जाता है।
  • ctx.rawQuery() Http प्रोटोकॉल पर लागू, जब बुलाया जाता है, तो अनुरोध में मूल क्वेरी (Http अनुरोध की क्वेरी) लौटाता है।
  • ctx.headers (() Http प्रोटोकॉल पर लागू किया जाता है, और अनुरोध में अनुरोध हेडर जानकारी लौटाता है जब बुलाया जाता है.
  • ctx.header ((कुंजी) HTTP प्रोटोकॉल पर लागू, यह कहा जाता है जब निर्दिष्ट अनुरोध हेडर में एक कुंजी का मूल्य देता है. उदाहरण के लिए, प्राप्तUser-Agentवर्तमान अनुरोध के शीर्षकों मेंःctx.header("User-Agent").
  • ctx.method (() Http प्रोटोकॉल पर लागू किया जाता है, जब बुलाया जाता है तो अनुरोध विधि लौटाता है, जैसे किGET, POSTआदि।
  • ctx.body ((() Http प्रोटोकॉल के POST अनुरोध पर लागू किया जाता है, और बुलाए जाने पर अनुरोध का शरीर लौटाता है.
  • ctx.setHeader ((कुंजी, मान) उत्तर संदेश की अनुरोध हेडर जानकारी सेट करने के लिए HTTP प्रोटोकॉल पर लागू किया गया।
  • ctx.setStatus (कोड) Http प्रोटोकॉल पर लागू, Http संदेश स्थिति कोड सेट करें. आमतौर पर, Http स्थिति कोड रूटिंग शाखा के अंत में सेट किया जाता है. डिफ़ॉल्ट मान 200 है.
  • ctx.remoteAddr() Http/TCP प्रोटोकॉल पर लागू, रिमोट क्लाइंट का पता और अनुरोध में पोर्ट वापस करता है जब बुलाया जाता है.
  • ctx.localAddr() Http/TCP प्रोटोकॉल पर लागू, सेवा के स्थानीय पते और बंदरगाह को वापस करता है जब बुलाया जाता है।
  • ctx.upgrade ((वेबसोकेट) HTTP प्रोटोकॉल के आधार पर वेबसॉकेट प्रोटोकॉल कार्यान्वयन के लिए लागू किया, स्विचिंगctxवेबसॉकेट प्रोटोकॉल के लिए संदर्भ वस्तु; यदि स्विच सफल होता है तो एक बूलियन मान (सही) और यदि यह विफल होता है तो एक बूलियन मान (गलत) लौटाता है।
  • ctx.read ((timeout_ms) HTTP प्रोटोकॉल पर आधारित वेबसॉकेट प्रोटोकॉल कार्यान्वयन/टीसीपी प्रोटोकॉल पर लागू, वेबसॉकेट कनेक्शन और टीसीपी कनेक्शन का डेटा पढ़ता है।readविधि साधारण HTTP प्रोटोकॉल में समर्थित नहीं है. आप समय सीमा पैरामीटर निर्दिष्ट कर सकते हैंtimeout_msमिलीसेकंड में।
  • ctx.write ((s) HTTP/TCP प्रोटोकॉल के लिए लागू, स्ट्रिंग डेटा लिखने के लिए इस्तेमाल किया. आप उपयोग कर सकते हैंJSON.stringify()JSON ऑब्जेक्ट को एक स्ट्रिंग में एन्कोड करने के लिए और फिर इसे लिखने के लिए.WebSocketप्रोटोकॉल, आप क्लाइंट को एन्कोडेड स्ट्रिंग पास करने के लिए इस विधि का उपयोग कर सकते हैं.

{@fun/Global/HttpQuery HttpQuery}, {@fun/Global/HttpQuery_Go HttpQuery_Go}

_G

लगातार डेटा सहेजें, फ़ंक्शन एक वैश्विक शब्दकोश फ़ंक्शन को लागू करता है जिसे सहेजा जा सकता है। डेटा संरचना एक 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}

_D

मिलीसेकंड टाइमस्टैम्प या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() _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

इंटरफ़ेस दोष सहिष्णुता के लिए पुनः प्रयास करें।

कॉलबैक फ़ंक्शन का रिटर्न वैल्यू जब यह निष्पादित किया जाता है। सभी प्रकार सिस्टिम द्वारा समर्थित हैं सिवायतार्किक झूठा मानऔरशून्य मान.

_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

कार्य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()कार्य बैकटेस्ट प्रणाली में समर्थित नहीं है।

लॉग