وسائل لوڈ ہو رہے ہیں... لوڈنگ...

عالمی

ورژن

نظام کا موجودہ ورژن نمبر لوٹاتا ہے۔

موجودہ سسٹم ورژن نمبر، جیسے: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 سیکنڈ کے لئے سوتے گا. یہ 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پاس ورڈ، mailTo، عنوان، جسم)

مخصوص کرنے کے لئے استعمالSMTPای میل بھیجنے والے کا سروس ایڈریس۔ smtpسرور سچ سٹرنگ ای میل بھیجنے والے کا ای میل ایڈریس بتانے کے لئے استعمال کیا جاتا ہے۔ smtpصارف کا نام سچ سٹرنگ کےSMTPای میل بھیجنے والے کے میل باکس کا پاس ورڈ۔ smtp پاس ورڈ سچ سٹرنگ ای میل وصول کنندہ کا ای میل پتہ بتانے کے لئے استعمال کیا جاتا ہے۔ میل ٹو سچ سٹرنگ ای میل کا عنوان۔ عنوان سچ سٹرنگ ای میل جسم. جسم سچ سٹرنگ

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. یہ بیک ٹیسٹنگ سسٹم میں کام نہیں کرتا.

{@fun/Global/Mail_Go میل_Go}

میل_گو

کے asynchronous ورژنMail function.

کےMail_Goتقریب فوری طور پر ایک متوازی اعتراض واپس، اور آپ کو استعمال کر سکتے ہیںwaitمیل کی ترسیل کا نتیجہ حاصل کرنے کے لئے اس متوازی اعتراض کا طریقہ۔ ایک کامیاب میل کی ترسیل ایک حقیقی قدر واپس کرتی ہے ، مثال کے طور پر ،true، اور ایک ناکام ترسیل ایک غلط قدر لوٹاتا ہے، مثال کے طور پر،false. چیز

Mail_Go ((smtpسرور، smtpصارف نام، smtpپاس ورڈ، mailTo، عنوان، جسم)

یہ اس کی وضاحت کرنے کے لئے استعمال کیا جاتا ہےSMTPای میل بھیجنے والے کا سروس ایڈریس۔ smtpسرور سچ سٹرنگ یہ ای میل بھیجنے والے کے ای میل ایڈریس کی وضاحت کرنے کے لئے استعمال کیا جاتا ہے. smtpصارف کا نام سچ سٹرنگ کےSMTPای میل بھیجنے والے کے میل باکس کا پاس ورڈ۔ smtp پاس ورڈ سچ سٹرنگ یہ ای میل وصول کنندہ کے ای میل ایڈریس کی وضاحت کرنے کے لئے استعمال کیا جاتا ہے. میل ٹو سچ سٹرنگ ای میل کا عنوان۔ عنوان سچ سٹرنگ ای میل جسم. جسم سچ سٹرنگ

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(""). فلٹر شدہ لاگ اب ڈوکر ڈائرکٹری میں لائیو ٹریڈنگ ID کے مطابق ڈیٹا بیس فائل میں نہیں لکھے جاتے ہیں تاکہ ڈیٹا بیس فائل کو پھولنے سے اکثر غلطی کی اطلاع دینے سے بچایا جاسکے۔

گیٹ پیڈ

لائیو ٹریڈنگ کے عمل کی شناخت حاصل کریں.

لائیو ٹریڈنگ کے عمل کی شناخت واپس کریں۔ سٹرنگ

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ڈیٹا. سٹرنگ

GetMeta()

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()فنکشن null لوٹاتا ہے۔ یہ بیک ٹسٹنگ سسٹم میں کام نہیں کرتا ہے۔

ڈائل کریں

ابتدائی کے لئےSocketرسائی، حمایتtcp, udp, tls, unixپروٹوکول۔ 4 مقبول مواصلاتی پروٹوکول کی حمایت:mqtt, nats, amqp, kafkaڈیٹا بیس سے رابطہ قائم کرنے کی حمایت:sqlite3, mysql, postgres, clickhouse.

کےDial()اگر یہ ٹائم آؤٹ ہوتا ہے تو فنکشن 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، ملی سیکنڈ میں
ڈیٹا پہلے ہی بفر میں ہے فوری طور پر سب سے پرانے اعداد و شمار کو واپس کریں فوری طور پر سب سے پرانے اعداد و شمار کو واپس کریں فوری طور پر تازہ ترین ڈیٹا واپس کریں فوری طور پر سب سے پرانے اعداد و شمار کو واپس کریں
بفر میں کوئی ڈیٹا نہیں جب ڈیٹا کو بلاک کیا جائے تو واپس کریں فوری طور پر null لوٹائیں فوری طور پر null لوٹائیں انتظار کریں 2000 MS، null واپس اگر کوئی ڈیٹا نہیں ہے، null واپس اگر کوئی ڈیٹا ہے
WebSocket کنکشن منقطع یا بنیادی کی طرف سے دوبارہ منسلک کیا جاتا ہے read() فنکشن خالی سٹرنگ لوٹاتا ہے ، یعنی: ، اور لکھنا() فنکشن 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 کمپریس کمپریشن کا طریقہ ہے، کمپریس پیرامیٹر کے اختیارات ہیں: gzip_raw، gzip، وغیرہ. اگر gzip طریقہ معیاری gzip نہیں ہے، تو آپ توسیعی طریقہ استعمال کر سکتے ہیں: gzip_raw
ویب ساکٹ پروٹوکول ڈیٹا کمپریشن سے متعلق پیرامیٹرز: mode=parameter value موڈ کمپریشن موڈ ہے، موڈ پیرامیٹر دوہری ہو سکتا ہے، بھیجیں، recv. دوہری دو طرفہ کمپریشن ہے، کمپریسڈ ڈیٹا بھیجیں، کمپریسڈ ڈیٹا وصول کریں. بھیجنے کے کمپریسڈ ڈیٹا بھیجنے کے لئے ہے. recv کمپریسڈ ڈیٹا وصول کرنے کے لئے ہے، مقامی decompression.
ویب ساکٹ پروٹوکول بنیادی آٹو دوبارہ مربوط پیرامیٹرز مقرر کرتا ہے: reconnect=parameter value reconnect reconnect سیٹ کرنا ہے یا نہیں، reconnect=true reconnect کو فعال کرنا ہے۔ جب یہ پیرامیٹر سیٹ نہیں ہوتا ہے تو ڈیفالٹ reconnect نہیں ہے۔
ویب ساکٹ پروٹوکول بنیادی آٹو دوبارہ مربوط متعلقہ پیرامیٹرز مقرر کرتا ہے: وقفہ = پیرامیٹر کی قدر interval دوبارہ کوشش کرنے کا وقفہ ہے، ملی سیکنڈ میں، interval=10000 10 سیکنڈ کا دوبارہ کوشش کرنے کا وقفہ ہے، ڈیفالٹ 1 سیکنڈ ہے جب یہ مقرر نہیں ہے، یعنی interval=1000.
ویب ساکٹ پروٹوکول بنیادی آٹو ری کنکشن سے متعلق پیرامیٹرز مقرر کرتا ہے: پے لوڈ = پیرامیٹر ویلیو پےلوڈ سبسکرپشن پیغام ہے جو ویب ساکٹ کو دوبارہ مربوط کرنے پر بھیجنے کی ضرورت ہے ، مثال کے طور پر: پےلوڈ = اوکوکوک۔
جرابوں سے متعلق پیرامیٹرز5 پراکسی: پراکسی = پیرامیٹر ویلیو پراکسی ایس ایس 5 پراکسی سیٹنگ ہے، پیرامیٹر ویلیو فارمیٹ: socks5://name:pwd@192.168.0.1:1080، نام ایس ایس 5 سرور صارف نام ہے، PWD ایس ایس 5 سرور لاگ ان پاس ورڈ ہے، 1080 ایس ایس 5 سروس پورٹ ہے.

کےDial()فنکشن صرف لائیو ٹریڈنگ کے لیے معاون ہے۔ ڈائل فنکشن کا استعمال کرتے ہوئے ڈیٹا بیس سے رابطہ قائم کرتے وقت ، کنکشن سٹرنگ ہر ڈیٹا بیس کے لئے گو زبان ڈرائیور پروجیکٹ کے حوالے سے لکھی جاتی ہے۔

ڈیٹا بیس کی حمایت ڈرائیونگ پروجیکٹس کنکشن سٹرنگ تبصرے
سکلائٹ3 github.com/mattn/go-sqlite3 sqlite3://file: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 websocket نجی انٹرفیس کال مثال:

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 درخواست سے متعلق ترتیبات ، مثال کے طور پر ، مندرجہ ذیل طور پر تشکیل دی جاسکتی ہیں:

{
    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_89", "opera_90", "opera_91" زالینڈو:"zalando_android_mobile", "zalando_ios_mobile" nike_:"nike_ios_mobile", "nike_android_mobile" بادل کش:"cloudscraper" mms_:"mms_ios" mesh_:"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کے جواب کے پیغام کو واپس کر دیا جاتا ہے.
  • ٹائم آؤٹ: ٹائم آؤٹ سیٹنگ، سیٹ 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);
}

OKX عوامی ٹکر API انٹرفیس تک رسائی کا ایک مثال.

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 درخواست سے متعلق ترتیبات ، مثال کے طور پر ، مندرجہ ذیل طور پر تشکیل دی جاسکتی ہیں:

{
    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کے جواب کے پیغام کو واپس کر دیا جاتا ہے.
  • ٹائم آؤٹ: ٹائم آؤٹ سیٹنگ، سیٹ 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فنکشن backtesting کے نظام میں معاونت نہیں ہے.

{@fun/Global/HttpQuery HttpQuery} {@fun/Global/HttpQuery HttpQuery}

انکوڈنگ

یہ فنکشن ڈیٹا کو منتقل کردہ پیرامیٹرز کے مطابق کوڈ کرتا ہے.

کےEncodeفنکشن کوڈنگ اور خفیہ کاری کے بعد ڈیٹا واپس کرتا ہے. سٹرنگ

انکوڈ ((algo، inputFormat، outputFormat، ڈیٹا) انکوڈ کریں ((algo، inputFormat، outputFormat، ڈیٹا، 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, انکوڈ اور ڈیکوڈ ڈور. پیرامیٹرalgoبھی حمایت کرتا ہے: ed25519 الگورتھم۔ مختلف ہیش الگورتھم کے استعمال کی حمایت کرتا ہے ، مثال کے طور پر پیرامیٹرalgoed25519.md5، ed25519.sha512 وغیرہ کے طور پر لکھا جا سکتا ہے. یہ حمایت کرتا ہےed25519.seedحساب کتاب. کچھ سچ سٹرنگ ڈیٹا فارمیٹ کی وضاحت کرنے کے لئے استعمال کیا جاتا ہےdataپیرامیٹر.inputFormatپیرامیٹر مندرجہ ذیل میں سے ایک کے طور پر مقرر کیا جا سکتا ہے:raw, hex, base64, stringraw کا مطلب ہے کہ اعداد و شمار خام اعداد و شمار ہیں، hex کا مطلب ہے کہ اعداد و شمار ہیںhexکوڈت، base64 کا مطلب ہے کہ ڈیٹا ہےbase64انکوڈ کیا جاتا ہے، اور string کا مطلب ہے کہ ڈیٹا ایک سٹرنگ ہے۔ ان پٹ فارمیٹ سچ سٹرنگ آؤٹ پٹ کے ڈیٹا فارمیٹ کی وضاحت کے لئے استعمال کیا جاتا ہے.outputFormatپیرامیٹر مندرجہ ذیل میں سے ایک کے طور پر مقرر کیا جا سکتا ہے:raw, hex, base64, stringraw کا مطلب ہے کہ اعداد و شمار خام اعداد و شمار ہیں، hex کا مطلب ہے کہ اعداد و شمار ہیںhexکوڈت، base64 کا مطلب ہے کہ ڈیٹا ہےbase64انکوڈ کیا جاتا ہے، اور string کا مطلب ہے کہ ڈیٹا ایک سٹرنگ ہے۔ آؤٹ پٹ فارمیٹ سچ سٹرنگ پیرامیٹرdataیہ وہ اعداد و شمار ہیں جن پر کارروائی کی جائے گی۔ اعداد و شمار سچ سٹرنگ ڈیٹا فارمیٹ کی وضاحت کرنے کے لئے استعمال کیا جاتا ہےkeyپیرامیٹر.keyپیرامیٹر مندرجہ ذیل میں سے ایک کے طور پر مقرر کیا جا سکتا ہے:raw, hex, base64, stringraw کا مطلب ہے کہ اعداد و شمار خام اعداد و شمار ہیں، hex کا مطلب ہے کہ اعداد و شمار ہیںhexکوڈت، base64 کا مطلب ہے کہ ڈیٹا ہےbase64انکوڈ کیا جاتا ہے، اور string کا مطلب ہے کہ ڈیٹا ایک سٹرنگ ہے۔ کلیدی فارمیٹ غلط سٹرنگ پیرامیٹر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);
}

اگر آپ کو ملی سیکنڈ کے ٹائم اسٹیمپ حاصل کرنے کی ضرورت ہے، تو آپ مندرجہ ذیل کوڈ استعمال کر سکتے ہیں:

{@ تفریح/گلوبل/یونیکس یونیکس}

یونیکس

دوسری سطح پر موجودہ لمحے کا ٹائم اسٹیمپ حاصل کریں۔

دوسری سطح کا ٹائم اسٹیمپ لوٹاتا ہے۔ نمبر

یونیکس ((()

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()پر چل رہا ہے ایک docker کے لئے تقریبمیک او ایسآپریٹنگ سسٹم واپس آ سکتا ہے:darwin/amd64کیونکہ ایپل کمپیوٹرز میں متعدد ہارڈ ویئر فن تعمیرات ہیں۔darwinکا نام ہےمیک او ایس system.

ایم ڈی 5

پیرامیٹر کے MD5 ہیش کا حساب لگاتا ہےdata.

MD5 ہیش ویلیو۔ سٹرنگ

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} {@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()کال ایونٹ کال بیک کے بعد شروع ہوتی ہے ، یہ پچھلے واقعات کو یاد کرے گی۔ بنیادی نظام ایک قطار کی ساخت کو لپیٹتا ہے جو زیادہ سے زیادہ 500 ایونٹ کال بیک کو کیش کرتا ہے۔ اگرEventLoop()تقریب کو وقت پر نہیں بلایا جاتا ہے تاکہ انہیں پروگرام کے عملدرآمد کے دوران نکال دیا جاسکے ، بعد میں 500 کیشے سے باہر ہونے والی ایونٹ کال بیک ضائع ہوجائیں گی۔EventLoop()تقریب بنیادی نظام WebSocket کی کیشے قطار یا متوازی افعال کی کیشے کو متاثر نہیں کرتا جیسے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یہ فنکشن 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.
  • HTTP پروٹوکول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سرٹیفکیٹ لوڈ کرنے کے لئے پیرامیٹرز.

خدمت کریںURI سچ سٹرنگ کے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
  • یہ فنکشن صرف جاوا اسکرپٹ زبان کی حکمت عملیوں کی حمایت کرتا ہے.
  • سروس تھریڈ عالمی دائرہ کار سے الگ تھلگ ہے ، لہذا یہ بندشوں یا بیرونی متغیرات ، کسٹم افعال وغیرہ کے حوالہ جات کی حمایت نہیں کرتا ہے۔ تاہم ، یہ تمام پلیٹ فارم API افعال کو کال کرسکتا ہے۔
  • کےWebsocketسروس HTTP پروٹوکول کی بنیاد پر لاگو کیا جاتا ہے. آپ کے راستے میں ایک روٹنگ شاخ مقرر کر سکتے ہیں اور کے لئے لاگو کرنے کا کوڈ ڈیزائنWebsocketآپ اس سیکشن میں نمونہ کوڈ کا حوالہ دے سکتے ہیں۔

کال بیک فنکشن پیرامیٹر کی طرف سے منتقلhandlerوصول کرتا ہےctxپیرامیٹر.ctxپیرامیٹر ایک سیاق و سباق کا اعتراض ہے جو مندرجہ ذیل طریقوں کے ساتھ ڈیٹا حاصل کرنے اور لکھنے کے لئے استعمال ہوتا ہے۔

  • ctx.proto (() ایچ ٹی پی / ٹی سی پی پروٹوکول پر لاگو ہوتا ہے ، جب بلایا جاتا ہے تو پروٹوکول کا نام لوٹاتا ہے۔ مثال کے طور پر:HTTP/1.1, tcp.
  • ctx.host() ایچ ٹی پی پروٹوکول پر لاگو ہوتا ہے، جب یہ آئی پی ایڈریس اور بندرگاہ کو بلایا جاتا ہے تو میزبان کی معلومات واپس کرتا ہے.
  • ctx.path (() HTTP پروٹوکول پر لاگو ہوتا ہے، جب بلایا جاتا ہے تو درخواست کا راستہ واپس کرتا ہے.
  • ctx.query (کلید) ایچ ٹی پی پروٹوکول پر لاگو ہوتا ہے ، جب کال کی جاتی ہے تو درخواست میں استفسار میں کلید سے متعلق قیمت واپس کردیتا ہے۔ مثال کے طور پر ، جو درخواست بھیجی جاتی ہے وہ ہے:http://127.0.0.1:8088?num=123، اور پیرامیٹر کی طرف سے منتقل کال بیک پروسیسنگ تقریبhandlerواپسی"123"کبctx.query("num")کہا جاتا ہے.
  • ctx.rawQuery() ایچ ٹی پی پروٹوکول پر لاگو ہوتا ہے ، جب بلایا جاتا ہے تو ، درخواست میں اصل استفسار واپس کرتا ہے (ایچ ٹی پی کی درخواست کا استفسار) ۔
  • 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 (کوڈ) ایچ ٹی پی پروٹوکول پر لاگو ہوتا ہے ، ایچ ٹی پی پیغام کی حیثیت کا کوڈ مقرر کریں۔ عام طور پر ، ایچ ٹی پی کی حیثیت کا کوڈ روٹنگ برانچ کے اختتام پر مقرر کیا جاتا ہے۔ ڈیفالٹ ویلیو 200 ہے۔
  • ctx.remoteAddr() ایچ ٹی پی / ٹی سی پی پروٹوکول پر لاگو ہوتا ہے ، جب کال کیا جاتا ہے تو درخواست میں ریموٹ کلائنٹ ایڈریس اور پورٹ واپس کرتا ہے۔
  • ctx.localAddr() ایچ ٹی پی / ٹی سی پی پروٹوکول پر لاگو ہوتا ہے ، جب کال کی جاتی ہے تو سروس کا مقامی پتہ اور بندرگاہ واپس کرتا ہے۔
  • ctx.upgrade ((ویب ساکٹ) HTTP پروٹوکول کی بنیاد پر ویب ساکٹ پروٹوکول پر لاگو کیا، سوئچنگctxویب ساکٹ پروٹوکول میں سیاق و سباق کا اعتراض؛ اگر سوئچ کامیاب ہو تو ایک بولین ویلیو (سچ) ، اور اگر یہ ناکام ہو تو ایک بولین ویلیو (جھوٹا) لوٹاتا ہے۔
  • ctx.read ((timeout_ms) HTTP پروٹوکول کی بنیاد پر ویب ساکٹ پروٹوکول نفاذ / TCP پروٹوکول پر لاگو، ویب ساکٹ کنکشن اور TCP کنکشن کے اعداد و شمار پڑھتا ہے.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محفوظ کردہ کلید-قدر جوڑی میں کلید کا نام ہے، اور بڑے اور چھوٹے نمبر پر حساس نہیں ہے۔ 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کی حذف کا اشارہ کرنے کے لئے null کے طور پر منظور کیا جاتا ہے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 ((ٹائم اسٹیمپ، ایف ایم ٹی)

ملی سیکنڈ ٹائم اسٹیمپ یاDateاعتراض. ٹائم اسٹیمپ غلط نمبر، مقصد فارمیٹ تار،JavaScriptزبان کا ڈیفالٹ فارمیٹ:yyyy-MM-dd hh:mm:ss; Pythonزبان کا ڈیفالٹ فارمیٹ:%Y-%m-%d %H:%M:%S; C++زبان کا ڈیفالٹ فارمیٹ:%Y-%m-%d %H:%M:%S. ایف ایم ٹی غلط سٹرنگ

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حکمت عملی، آپ کو پتہ ہونا ضروری ہے کہ پیرامیٹرز منظور دوسرے سطح کے ٹائم اسٹیمپ ہیں (جاس کارپٹ اور C ++ حکمت عملی میں ملی سیکنڈ کی سطح کے ٹائم اسٹیمپ، جہاں 1 سیکنڈ 1000 ملی سیکنڈ کے برابر ہے)._D()براہ راست ٹریڈنگ میں پڑھنے کے قابل ٹائم اسٹیمپ کے ساتھ ایک وقت کی تار کو تجزیہ کرنے کے لئے، آپ کو آپریٹنگ سسٹم کے ٹائم زون اور وقت کی ترتیب پر توجہ دینے کی ضرورت ہے جہاں ڈاکر پروگرام واقع ہے._D()فنکشن ایک ٹائم اسٹیمپ کو ڈاکرس سسٹم کے وقت کے لحاظ سے پڑھنے کے قابل ٹائم سٹرنگ میں تجزیہ کرتا ہے۔

{@fun/Global/UnixNano UnixNano}، {@fun/Global/Unix Unix}

_N

ایک فلوٹنگ کامنٹ نمبر فارمیٹ کریں.

درستگی کی ترتیب کے مطابق فارمیٹ شدہ فلوٹنگ کامنٹ نمبر نمبر

_N() _N(نمبر) _N ((نمبر، درستگی)

فلوٹنگ کامن نمبر جس کو فارمیٹ کرنے کی ضرورت ہے۔ نمبر سچ نمبر فارمیٹنگ کے لئے درستگی کی ترتیب، پیرامیٹر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);
}

اگر آپ کو دسویں ہندسہ کے بائیں طرف تمام N ہندسوں کو 0 میں تبدیل کرنے کی ضرورت ہے، تو آپ اسے اس طرح لکھ سکتے ہیں:

پیرامیٹرprecisionایک مثبت عدد، منفی عدد ہو سکتا ہے.

{@fun/Trade/exchange.SetPrecision تبادلہ.SetPrecision}

_C

انٹرفیس غلطی رواداری کے لئے دوبارہ کوشش کریں.

کال بیک فنکشن کی واپسی کی قیمت جب یہ عملدرآمد کیا جاتا ہے. تمام اقسام نظام کی طرف سے حمایت کر رہے ہیں سوائےمنطقی غلط قدراورnull قدر.

_C(pfn) _C ((pfn،...args)

پیرامیٹرpfnایک تقریب حوالہ ہے، جو ایک ہےکال بیک فنکشن. پی ایف این سچ فنکشن پیرامیٹرزکال بیک افعال، ایک سے زیادہ پیرامیٹر ہو سکتا ہےarg. پیرامیٹرز کی قسم اور تعدادargکے پیرامیٹرز پر منحصرکال بیک فنکشن. ارگ غلط تار، نمبر، بول، آبجیکٹ، صف، فنکشن، تمام اقسام نظام کی طرف سے حمایت کر رہے ہیں، جیسے null اقدار

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. نمبر

_Cross ((arr1، arr2)

عناصر قسم کی صفیں ہیںnumber. ارر1 سچ صف عناصر قسم کی صفیں ہیں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 کا مطلب موجودہ قیمت کے برابر ہے. استعمال کے لئے مخصوص ہدایات:تجزیہ اور استعمال کے لئے ہدایات کے بارے میں بلٹ ان تقریب _Cross.

JSON پارس

فنکشن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()فنکشن backtest کے نظام میں حمایت نہیں کی جاتی ہے.

لاگ