রিসোর্স লোড হচ্ছে... লোডিং...

বিশ্বব্যাপী

সংস্করণ

সিস্টেমের বর্তমান সংস্করণ নম্বর প্রদান করে।

বর্তমান সিস্টেম সংস্করণ নম্বর, যেমনঃ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)একটি কৌশল মধ্যে ফাংশন কৌশল প্রোগ্রাম একটি নির্দিষ্ট সময়ের জন্য অপেক্ষা করতে actually যখন backtesting (backtesting সিস্টেমের সময় সিরিজ এড়িয়ে না), তাই এটি কৌশল backtest খুব ধীরে ধীরে কারণ.

IsVirtual

কৌশলটির চলমান পরিবেশ একটি ব্যাকটেস্টিং সিস্টেম কিনা তা নির্ধারণ করুন।

কৌশল একটি সত্য মান ফেরত, উদাহরণস্বরূপঃ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ইমেইল প্রেরকের সার্ভিস ঠিকানা। smtpServer সত্য স্ট্রিং ইমেইল প্রেরকের ইমেইল ঠিকানা নির্দিষ্ট করতে ব্যবহৃত হয়। smtpUsername সত্য স্ট্রিং দ্য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উদাহরণস্বরূপঃ QQ মেইলsmtp.qq.com:587, যা পরীক্ষার জন্য উপলব্ধ। যদি কোনো ত্রুটি রিপোর্ট করা হয়ঃunencryped connection, আপনি পরিবর্তন করতে হবেsmtpServerএরMailফাংশন। প্যারামিটার বিন্যাস হলঃssl://xxx.com:xxxউদাহরণস্বরূপsslপদ্ধতিSMTPQQ মেইলের জন্যঃssl://smtp.qq.com:465অথবাsmtp://xxx.com:xxx. এটা ব্যাকটেস্টিং সিস্টেমে কাজ করে না।

{@ফান/গ্লোবাল/মেইল_গো মেইল_গো}

মেইল_গো

অ্যাসিনক্রোন সংস্করণMail function.

দ্যMail_Goফাংশন অবিলম্বে একটি সমান্তরাল বস্তু ফেরত, এবং আপনি ব্যবহার করতে পারেনwaitএকটি সফল মেইল ডেলিভারি একটি সত্য মান ফেরত দেয়, উদাহরণস্বরূপ,true, এবং একটি ব্যর্থ ডেলিভারি একটি মিথ্যা মান ফেরত দেয়, উদাহরণস্বরূপ,false. বস্তু

মেইল_গো ((smtp সার্ভার, smtpUsername, smtpPassword, mailTo, শিরোনাম, শরীর)

এটি নির্দিষ্ট করতে ব্যবহৃত হয়SMTPইমেইল প্রেরকের সার্ভিস ঠিকানা। smtpServer সত্য স্ট্রিং এটি ইমেইল প্রেরকের ইমেইল ঠিকানা নির্দিষ্ট করতে ব্যবহৃত হয়। smtpUsername সত্য স্ট্রিং দ্য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.

এটা ব্যাকটেস্টিং সিস্টেমে কাজ করে না।

{@fun/Global/Mail Mail}

সেটErrorFilter

ফিল্টার ত্রুটি লগ।

সেটErrorFilter ((ফিল্টার)

নিয়মিত এক্সপ্রেশন স্ট্রিং। ফিল্টার সত্য স্ট্রিং

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

সর্বশেষ ত্রুটি বার্তা পেয়েছি।

শেষ ত্রুটি বার্তা। স্ট্রিং

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, যা শুধুমাত্র কন্ট্রোল নাম ফেরত দেয়। স্ট্রিং

GetCommand ((()

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, যা একটি ইন্টারেক্টিভ কন্ট্রোল যা একটি বোতাম এবং একটি ইনপুট বক্সের সমন্বয়। ইন্টারঅ্যাকশন কোডটি বিভিন্ন ইন্টারঅ্যাকশন কন্ট্রোলের প্রতিক্রিয়া জানাতে কৌশলটিতে ডিজাইন করা হয়েছেঃ

এটা ব্যাকটেস্টিং সিস্টেমে কাজ করে না।

GetMeta

কৌশল রেজিস্ট্রেশন কোড তৈরি করার সময় মেটা এর মান লিখুন।

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চারটি জনপ্রিয় যোগাযোগ প্রোটোকল সমর্থন করেঃmqtt, nats, amqp, kafka. ডাটাবেসের সাথে সংযোগের জন্য সমর্থনঃsqlite3, mysql, postgres, clickhouse.

দ্যDial()ফাংশনটি যদি এটি টাইম আউট করে তবে শূন্য ফেরত দেয়। একটি সাধারণ কল একটি সংযোগ অবজেক্ট ফেরত দেয় যার তিনটি পদ্ধতি রয়েছেঃread, writeএবংclose.readপদ্ধতিটি ডেটা পড়তে ব্যবহৃত হয়,writeতথ্য পাঠানোর জন্য ব্যবহৃত হয় এবংcloseসংযোগ বন্ধ করতে এই পদ্ধতি ব্যবহার করা হয়। দ্যreadপদ্ধতি নিম্নলিখিত পরামিতি সমর্থন করেঃ

  • যখন কোন প্যারামিটার পাস করা হয় না, এটি একটি বার্তা পাওয়া যায় এবং ফেরত পর্যন্ত ব্লক, যেমনws.read().
  • যখন একটি পরামিতি হিসাবে পাস করা হয়, তখন ইউনিটটি মিলিসেকেন্ড হয়, বার্তার অপেক্ষা টাইমআউট সময় নির্দিষ্ট করে। উদাহরণস্বরূপঃws.read(2000)দুই সেকেন্ডের টাইমআউট (২০০০ মিলিসেকেন্ড) নির্দিষ্ট করে।
  • নিম্নলিখিত দুটি পরামিতি শুধুমাত্র WebSocket এর জন্য বৈধঃ প্যারামিটার পাস করা হচ্ছে-1মানে ফাংশনটি অবিলম্বে বার্তাগুলির উপস্থিতি বা অনুপস্থিতি নির্বিশেষে ফেরত দেয়, উদাহরণস্বরূপঃws.read(-1). প্যারামিটার পাস করা হচ্ছে-2এর মানে হল যে ফাংশনটি অবিলম্বে একটি বার্তা সহ বা ছাড়াই ফিরে আসে, তবে কেবলমাত্র সর্বশেষ বার্তাটি ফিরে আসে এবং বাফারযুক্ত বার্তাটি বাদ দেওয়া হয়। উদাহরণস্বরূপ,ws.read(-2).

read()ফাংশন বাফারের বর্ণনাঃ ওয়েবসকেট প্রোটোকলের দ্বারা প্রেরিত ইনকামিং ডেটা যদি কৌশলটির মধ্যে সময়ের ব্যবধানread()ফাংশন কলগুলি খুব দীর্ঘ। এই ডেটাগুলি বাফারে সংরক্ষণ করা হয়, যার সর্বাধিক 2000 এর সাথে একটি সারি ডেটা কাঠামো রয়েছে। 2000 অতিক্রম করার পরে, সর্বশেষতম ডেটা বাফারে প্রবেশ করে এবং প্রাচীনতম ডেটা মুছে ফেলা হয়।

দৃশ্যকল্প কোন প্যারামিটার নেই প্যারামিটারঃ -1 প্যারামিটার: -২ প্যারামিটারঃ 2000 মিলিসেকেন্ডে
ডেটা ইতিমধ্যে বাফারে রয়েছে অবিলম্বে পুরোনো তথ্য ফেরত দিন অবিলম্বে পুরোনো তথ্য ফেরত দিন অবিলম্বে সর্বশেষ তথ্য ফেরত দিন অবিলম্বে পুরোনো তথ্য ফেরত দিন
বাফারে কোন তথ্য নেই ডাটা ব্লক করা হলে পুনরুদ্ধার করুন অবিলম্বে null ফেরত দিন অবিলম্বে null ফেরত দিন অপেক্ষা করুন 2000 এমএস, যদি কোন তথ্য না থাকে তাহলে null ফেরত দিন, যদি তথ্য থাকে তাহলে null ফেরত দিন
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): এসকিউএল স্ট্র্যাটেজ এক্সিকিউট করার জন্য ব্যবহৃত হয়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 হল কম্প্রেশন পদ্ধতি, কম্প্রেস প্যারামিটার অপশন হল: gzip_raw, gzip, ইত্যাদি. যদি gzip পদ্ধতিটি স্ট্যান্ডার্ড gzip না হয়, আপনি বর্ধিত পদ্ধতি ব্যবহার করতে পারেনঃ gzip_raw
ওয়েবসকেট প্রোটোকলের ডেটা সংকোচনের সাথে সম্পর্কিত পরামিতিঃ mode=parameter value মোড হল কম্প্রেশন মোড, মোড প্যারামিটারটি দ্বৈত হতে পারে, পাঠান, recv. দ্বৈত হল দ্বি-মুখী কম্প্রেশন, সংকুচিত ডেটা প্রেরণ করুন, সংকুচিত ডেটা গ্রহণ করুন। প্রেরণ হল সংকুচিত ডেটা প্রেরণ করুন। recv হল সংকুচিত ডেটা গ্রহণ করুন, স্থানীয় ডিকম্প্রেশন।
ওয়েবসকেট প্রোটোকল অন্তর্নিহিত স্বয়ংক্রিয় পুনরায় সংযোগ সম্পর্কিত পরামিতি সেট করেঃ পুনরায় সংযোগ = পরামিতি মান reconnect হল reconnect সেট করতে হবে কিনা, reconnect=true হল reconnect সক্ষম করতে হবে। এই প্যারামিটারটি সেট না হলে ডিফল্ট কোন reconnect হয় না।
ওয়েবসকেট প্রোটোকল অন্তর্নিহিত স্বয়ংক্রিয় পুনরায় সংযোগ সম্পর্কিত পরামিতি সেট করেঃ interval=parameter value interval হল পুনরায় চেষ্টা করার সময়সীমা, মিলিসেকেন্ডে, interval=10000 হল 10 সেকেন্ডের পুনরায় চেষ্টা করার সময়সীমা, ডিফল্টটি 1 সেকেন্ড যখন এটি সেট করা হয় না, অর্থাৎ interval=1000.
ওয়েবসকেট প্রোটোকল অন্তর্নিহিত স্বয়ংক্রিয় পুনরায় সংযোগ সম্পর্কিত পরামিতি সেট করেঃ payload=parameter value payload হল সাবস্ক্রিপশন বার্তা যা WebSocket পুনরায় সংযুক্ত হলে পাঠানো প্রয়োজন, উদাহরণস্বরূপঃ payload=okokok।
Socks5 proxy এর সাথে সম্পর্কিত পরামিতিঃ proxy=প্যারামিটার মান প্রক্সি হল ss5 প্রক্সি সেটিং, প্যারামিটার মান বিন্যাসঃ socks5://name:pwd@192.168.0.1:1080, নাম হচ্ছে এসএস৫ সার্ভারের ইউজার নেম, পিডব্লিউডি হচ্ছে এসএস৫ সার্ভারের লগইন পাসওয়ার্ড, ১০৮০ হচ্ছে এসএস৫ সার্ভিস পোর্ট।

দ্যDial()এই ফাংশনটি শুধুমাত্র লাইভ ট্রেডিং এর জন্য সমর্থিত। ডায়াল ফাংশন ব্যবহার করে একটি ডাটাবেসের সাথে সংযোগ করার সময়, সংযোগ স্ট্রিং প্রতিটি ডাটাবেসের জন্য go ভাষা ড্রাইভার প্রকল্পের উল্লেখ করে লেখা হয়।

সমর্থিত ডাটাবেস চালিকাশক্তি প্রকল্প সংযোগ স্ট্রিং মন্তব্যসমূহ
স্কিলেট3 github.com/mattn/go-sqlite3 sqlite3://file:test.db?cache=shared&mode=memory দ্যsqlite3://প্রিফিক্স নির্দেশ করে যে sqlite3 ডাটাবেস ব্যবহার করা হচ্ছে, উদাহরণ কলঃDial("sqlite3://test1.db")
মাইএসকিউএল github.com/go-sql-driver/mysql mysql://username:yourpassword@tcp(localhost:3306)/আপনার ডাটাবেজ?
পশুপালন github.com/lib/pq postgres://user=postgres dbname=yourdatabase sslmode=disable password=yourpassword হোস্ট=স্থানীয় হোস্ট পোর্ট=5432
ক্লিকহাউস github.com/ClickHouse/clickhouse-go clickhouse://tcp://host:9000?username=username&password=yourpassword&database=youdatabase ব্যবহারকারীর নাম এবং পাসওয়ার্ড

দয়া করে মনে রাখবেন যে যখনpayloadবিষয়বস্তু সেটaddressপ্যারামিটারে অক্ষর রয়েছে=অথবা অন্যান্য বিশেষ অক্ষর, এটা প্যারসিং প্রভাবিত করতে পারেaddressপ্যারামিটারDialফাংশন, যেমন নিম্নলিখিত উদাহরণ।

ব্যাকপ্যাক এক্সচেঞ্জ ওয়েবসকেট ব্যক্তিগত ইন্টারফেস কল উদাহরণঃ

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

এইচটিটিপি অনুরোধ পাঠান।

অনুরোধের প্রতিক্রিয়া তথ্য ফেরত দেয়। যদি ফেরত মান একটিJSONস্ট্রিং, এটা দ্বারা বিশ্লেষণ করা যেতে পারেJSON.parse()কর্মক্ষমতাJavaScriptভাষা কৌশল, এবংjson::parse()কর্মক্ষমতাC++যদি ডিবাগটি বিকল্প কাঠামোতে সত্য হিসাবে সেট করা থাকে, তবে রিটার্ন মানটি একটি অবজেক্ট (জেএসওএন); যদি ডিবাগটি মিথ্যাতে সেট করা থাকে, তবে রিটার্ন মানটি একটি স্ট্রিং। স্ট্রিং, বস্তু

HttpQuery ((url) HttpQuery ((URL, অপশন)

এইচটিটিপি অনুরোধ ইউআরএল। ইউআরএল সত্য স্ট্রিং এইচটিপি অনুরোধ সম্পর্কিত সেটিংস, উদাহরণস্বরূপ, নিম্নরূপ কাঠামোগত করা যেতে পারেঃ

{
    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_ios_mobile", "nike_android_mobile", মেঘঘঘাট্টা:"cloudscraper", এমএমএস_:"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এইচটিটিপি অনুরোধ সরাসরি পাঠাতে লাইব্রেরি.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, অপশন)

এইচটিটিপি অনুরোধ ইউআরএল। ইউআরএল সত্য স্ট্রিং এইচটিপি অনুরোধ সম্পর্কিত সেটিংস, উদাহরণস্বরূপ, নিম্নরূপ কাঠামোগত করা যেতে পারেঃ

{
    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এইচটিটিপি অনুরোধ সরাসরি পাঠাতে লাইব্রেরি.HttpQuery_Go()মূলত ইন্টারফেস অ্যাক্সেস করতে ব্যবহৃত হয় যা এক্সচেঞ্জে স্বাক্ষরের প্রয়োজন হয় না, যেমন টিকার তথ্যের মতো পাবলিক ইন্টারফেস।HttpQuery_Goফাংশনটি ব্যাকটেস্টিং সিস্টেমে সমর্থিত নয়।

{@fun/Global/HttpQuery HttpQuery}

এনকোডিং

এই ফাংশনটি পাস করা পরামিতি অনুযায়ী ডেটা কোড করে।

দ্যEncodeফাংশন এনকোডিং এবং এনক্রিপশন পরে তথ্য ফেরত দেয়। স্ট্রিং

এনকোড ((algo, inputFormat, outputFormat, data) এনকোড ((algo, ইনপুটফর্ম্যাট, আউটপুটফর্ম্যাট, ডেটা, কীফর্ম্যাট, কী)

প্যারামিটার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, 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 Unix}

ইউনিক্স

দ্বিতীয় স্তরের বর্তমান মুহুর্তের টাইমস্ট্যাম্প পান।

দ্বিতীয় স্তরের টাইমস্ট্যাম্প রিটার্ন করে। সংখ্যা

ইউনিক্স ((()

function main() {
    var t = Unix()
    Log(t)
}
def main():
    t = Unix()
    Log(t)
void main() {
    auto t = Unix();
    Log(t);
}

{@fun/Global/UnixNano ইউনিক্স ন্যানো}

গেটওএস

ডকার অবস্থিত ডিভাইসের সিস্টেম তথ্য পান।

সিস্টেম তথ্য। স্ট্রিং

GetOS ((()

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

উদাহরণস্বরূপ,GetOS()একটি ডকারের জন্য ফাংশনম্যাক ওএসঅপারেটিং সিস্টেম ফিরে আসতে পারেঃdarwin/amd64কারণ অ্যাপলের কম্পিউটারে একাধিক হার্ডওয়্যার আর্কিটেকচার রয়েছে।darwinনাম হলম্যাক ওএস system.

এমডি৫

প্যারামিটারের MD5 হ্যাশ গণনা করেdata.

এমডি৫ হ্যাশ মান। স্ট্রিং

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.

{@ফান/গ্লোবাল/এনকোড এনকোড}

DBExec

ডাটাবেজ ইন্টারফেস ফাংশন।

একটি বস্তু যা একটি কার্য সম্পাদনের ফলাফল ধারণ করেsqlবিবৃতি, উদাহরণস্বরূপঃ


{"columns":["TS","HIGH","OPEN","LOW","CLOSE","VOLUME"],"values":[[1518970320000,100,99.1,90,100,12345.6]]}

বস্তু

DBExec ((sql)

sqlবিবৃতি স্ট্রিং. 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ফাংশন পরামিতি, যদি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)
}
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()লাইভ ট্রেডিং ডাটাবেস (এসকিউএলাইট ডাটাবেস) পরিচালনা করতে পারে প্যারামিটারগুলি পাস করে। লাইভ ট্রেডিং ডাটাবেসে ডেটা যুক্ত, মুছে ফেলা, পরীক্ষা এবং পরিবর্তন করার অপারেশনটি উপলব্ধি করুন,এসকিউএলাইটলাইভ ট্রেডিং ডাটাবেসের সিস্টেম সংরক্ষিত টেবিলঃkvdb, cfg, log, profit, chartএই টেবিলে কাজ করবেন না।লেনদেনএই ধরনের অপারেশনগুলি সমর্থিত নয় এবং সিস্টেমে দ্বন্দ্ব সৃষ্টি করতে পারে এমন অপারেশনগুলি সম্পাদন করার পরামর্শ দেওয়া হয় না।DBExec()এই ফাংশনটি শুধুমাত্র লাইভ ট্রেডিং এর জন্য সমর্থিত।

{@ফান/গ্লোবাল/_জি _জি}

UUID

একটি 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এইচটিটিপি পরিষেবা, টিসিপি পরিষেবা এবং ওয়েবসকেট পরিষেবা (এইচটিটিপি প্রোটোকলের উপর ভিত্তি করে) তৈরি করতে ফাংশন ব্যবহার করা হয়।

একটি স্ট্রিং ফেরত দেয় যা তৈরি পরিষেবার আইপি ঠিকানা এবং পোর্ট রেকর্ড করে। উদাহরণস্বরূপঃ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://127.0.0.1:6666?tls=true&gzip=true; আপনি যোগ করতে পারেনcert_pemএবংcert_key_pemসার্টিফিকেট লোড করার পরামিতি।

serveURI সত্য স্ট্রিং দ্যhandlerপ্যারামিটারটি রাউটিং প্রসেসিং ফাংশন (এইচটিটিপি প্রোটোকল), বার্তা প্রসেসিং ফাংশন (টিসিপি প্রোটোকল) এবং স্ট্রিম প্রসেসিং ফাংশন (ওয়েবসকেট) এ পাস করতে ব্যবহৃত হয়। প্যারামিটার দ্বারা পাস করা কলব্যাক ফাংশনhandlerএকাধিক প্যারামিটার সংজ্ঞায়িত করতে পারেন, প্রথম প্যারামিটারটি হল ctx বস্তু (context object) ।

হ্যান্ডলার সত্য ফাংশন কলব্যাক ফাংশনের প্রকৃত প্যারামিটার প্যারামিটার হিসাবে পাস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এইচটিটিপি প্রোটোকলের উপর ভিত্তি করে পরিষেবাটি বাস্তবায়িত হয়। আপনি পাথে একটি রাউটিং শাখা সেট করতে পারেন এবং এর জন্য বাস্তবায়ন কোড ডিজাইন করতে পারেনWebsocketআপনি এই বিভাগে নমুনা কোডটি দেখতে পারেন।

প্যারামিটার দ্বারা পাস করা কলব্যাক ফাংশনhandlerএকটি পায়ctxপ্যারামিটার।ctxপ্যারামিটার হল একটি কনটেক্সট অবজেক্ট যা নিম্নলিখিত পদ্ধতির সাথে ডেটা পেতে এবং লিখতে ব্যবহৃত হয়ঃ

  • ctx.proto (() Http/TCP প্রোটোকলে প্রয়োগ করা হয়, কল করার সময় প্রোটোকলের নাম ফেরত দেয়। উদাহরণস্বরূপঃHTTP/1.1, tcp.
  • ctx.host() এইচটিটিপি প্রোটোকলে প্রয়োগ করা হলে, এটি আইপি ঠিকানা এবং পোর্ট কল করার সময় হোস্ট তথ্য ফেরত দেয়।
  • ctx.path (() এইচটিটিপি প্রোটোকলে প্রয়োগ করা হয়, যখন কল করা হয় তখন অনুরোধ পথটি ফেরত দেয়।
  • ctx.query ((key) এইচটিটিপি প্রোটোকলে প্রয়োগ করা হয়, যখন অনুরোধ করা হয় তখন অনুরোধে ক্যোয়ারিতে কীটির সাথে সম্পর্কিত মান প্রদান করে। উদাহরণস্বরূপ, পাঠানো অনুরোধটি হলঃhttp://127.0.0.1:8088?num=123, এবং কলব্যাক প্রসেসিং ফাংশন প্যারামিটার দ্বারা পাসhandlerরিটার্ন"123"কখনctx.query("num")বলা হয়।
  • ctx.rawQuery (() এইচটিটিপি প্রোটোকলে প্রয়োগ করা হয়, যখন কল করা হয়, তখন অনুরোধে মূল ক্যোয়ারী (এইচটিটিপি অনুরোধের ক্যোয়ারী) ফিরিয়ে দেয়।
  • ctx.headers ((() এইচটিটিপি প্রোটোকলে প্রয়োগ করা হয়, এবং যখন কল করা হয় তখন অনুরোধে অনুরোধ শিরোনামের তথ্য ফেরত দেয়।
  • ctx.header ((key)) এইচটিটিপি প্রোটোকলে প্রয়োগ করা হয়, এটি কল করার সময় নির্দিষ্ট অনুরোধ শিরোনামে একটি কী মান ফেরত দেয়। উদাহরণস্বরূপ,User-Agentবর্তমান আবেদনের শিরোনামেঃctx.header("User-Agent").
  • ctx.method (() এইচটিটিপি প্রোটোকলে প্রয়োগ করা হয়, কল করার সময় অনুরোধ পদ্ধতি ফেরত দেয়, যেমনGET, POSTইত্যাদি।
  • ctx.body ((() Http প্রোটোকলের POST অনুরোধে প্রয়োগ করা হয়, এবং যখন কল করা হয় তখন অনুরোধের দেহটি ফেরত দেয়।
  • ctx.setHeader ((কী, মান) উত্তর বার্তার অনুরোধ শিরোনাম তথ্য সেট করতে HTTP প্রোটোকলে প্রয়োগ করা হয়।
  • ctx.setStatus ((কোড) এইচটিটিপি প্রোটোকলে প্রয়োগ করা হয়, এইচটিটিপি বার্তার স্থিতি কোড সেট করুন। সাধারণত, এইচটিটিপি স্থিতি কোডটি রাউটিং শাখার শেষে সেট করা হয়। ডিফল্ট মানটি 200।
  • ctx.remoteAddr ((() Http/TCP প্রোটোকলে প্রয়োগ করা হয়, যখন কল করা হয় তখন রিমোট ক্লায়েন্টের ঠিকানা এবং অনুরোধে পোর্ট ফেরত দেয়।
  • ctx.localAddr() এইচটিটিপি/টিসিপি প্রোটোকলে প্রয়োগ করা হয়, যখন কল করা হয় তখন স্থানীয় ঠিকানা এবং পরিষেবাটির পোর্ট ফেরত দেয়।
  • ctx.upgrade ((websocket) 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}

_ জি

ধারাবাহিকভাবে ডেটা সংরক্ষণ করুন, ফাংশনটি একটি বিশ্বব্যাপী অভিধান ফাংশন বাস্তবায়ন করে যা সংরক্ষণ করা যেতে পারে। ডেটা কাঠামো একটি কেভি টেবিল যা স্থায়ীভাবে ডকারের স্থানীয় ডাটাবেস ফাইলটিতে সংরক্ষণ করা হয়।

ক্রমাগত সংরক্ষিত কী-মানের তথ্যk-vকী-ভ্যালু জোড়া। string, number, bool, object, array, null মান

_G() _G(k) _G(k, v)

প্যারামিটারkসংরক্ষিত কী-মান জোড়ায় কীটির নাম, এবং এটি বড় এবং ছোট আকারের সংবেদনশীল নয়। ক মিথ্যা স্ট্রিং, null মান প্যারামিটারvসংরক্ষিত কী-মান জোড়া মধ্যে কী মান, যা যে কোন তথ্য হতে পারেJSONসিরিয়ালাইজড। v মিথ্যা string, number, bool, object, array, null মান

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. এফএমটি মিথ্যা স্ট্রিং

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একটি পূর্ণসংখ্যা, এবং পরামিতিprecisionডিফল্টরূপে ৪। নির্ভুলতা মিথ্যা সংখ্যা

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

ইন্টারফেস ত্রুটি সহনশীলতার জন্য ফাংশন পুনরায় চেষ্টা করুন।

কলব্যাক ফাংশনের রিটার্ন মান যখন এটি কার্যকর করা হয়। সিস্টেম সব ধরনের ব্যতীত সমর্থন করেযৌক্তিক মিথ্যা মানএবংশূন্য মান.

_C(pfn) _C ((pfn,...args)

প্যারামিটারpfnএকটি ফাংশন রেফারেন্স, যা একটিকলব্যাক ফাংশন. পিএফএন সত্য ফাংশন প্যারামিটারকলব্যাক ফাংশন, একের বেশি প্যারামিটার থাকতে পারেarg. প্যারামিটারের ধরন এবং সংখ্যাargপ্যারামিটার উপর নির্ভর করেকলব্যাক ফাংশন. আরজি মিথ্যা string, number, bool, object, array, function, সমস্ত ধরনের সিস্টেম দ্বারা সমর্থিত, যেমন null values

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()১ সেকেন্ডে ফাংশন। নিম্নলিখিত ফাংশনগুলির জন্য ত্রুটি সহনশীলতা করা যেতে পারে, তবে সীমাবদ্ধ নয়ঃ

  • 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 (গুলি)

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()ব্যাকটেস্ট সিস্টেমে এই ফাংশনটি সমর্থিত নয়।

লগ