oparameter is set toচিহ্নorsignTx, thekey``` প্যারামিটার প্রয়োজন।

function main(){
    Log(Encode("md5", "raw", "hex", "hello"))
    Log(Encode("sha512", "raw", "base64", "hello"))
    Log(Encode("keccak256", "raw", "hex", "unwrapWETH9(uint256,address)"))

    Log(Encode("raw", "string", "hex", "example"))          // 6578616d706c65
    Log(Encode("raw", "hex", "string", "6578616d706c65"))   // example
}
def main():
    Log(Encode("md5", "raw", "hex", "hello", "", ""))
    Log(Encode("sha512", "raw", "base64", "hello", "", ""))
    Log(Encode("keccak256", "raw", "hex", "unwrapWETH9(uint256,address)", "", ""))

    Log(Encode("raw", "string", "hex", "example", "", ""))
    Log(Encode("raw", "hex", "string", "6578616d706c65", "", ""))
void main(){
    Log(Encode("md5", "raw", "hex", "hello"));
    Log(Encode("sha512", "raw", "base64", "hello"));
    Log(Encode("keccak256", "raw", "hex", "unwrapWETH9(uint256,address)"));
    
    Log(Encode("raw", "string", "hex", "example"));          // 6578616d706c65
    Log(Encode("raw", "hex", "string", "6578616d706c65"));   // example
}

প্যারামিটারalgoএছাড়াও স্ট্রিং এর এনকোডিং এবং ডিকোডিং সমর্থন করে, যেমনtext.encoder.utf8, text.decoder.utf8, text.encoder.gbkএবংtext.decoder.gbk.

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);
}

ইউনিক্স ন্যানো ((()

UnixNano()ন্যানোসেকেন্ড স্তরের টাইমস্ট্যাম্প প্রদান করে; যদি আপনি মিলিসেকেন্ড স্তরের টাইমস্ট্যাম্প পেতে চান, তাহলে আপনি নিম্নলিখিত কোডটি ব্যবহার করতে পারেনঃ

function main() {
    var time = UnixNano() / 1000000
    Log(_N(time, 0))
}
def main():
    time = UnixNano()
    Log(time)
void main() {
    auto time = UnixNano();
    Log(time);
}

ইউনিক্স ((()

Unix()সেকেন্ডে টাইমস্ট্যাম্প ফেরত দেয়।

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

GetOS ((()

GetOS()ডকার অবস্থিত সিস্টেমের তথ্য প্রদান করে।

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

ডকার দ্বারা চালিত লগ আউটপুটMac OSঅ্যাপল কম্পিউটার:

GetOS:darwin/amd64

darwinএর নামMac OS system.

MD5 ((String)

MD5(String); প্যারামিটার মানঃ স্ট্রিং টাইপ।

function main() {
    Log("MD5", MD5("hello world"))
}
def main():
    Log("MD5", MD5("hello world"))
void main() {
    Log("MD5", MD5("hello world"));
}

লগ আউটপুটঃ

MD5 5eb63bbbe01eeed093cb22bb8f5acdc3

DBExec ((...)

DBExec(), এর প্যারামিটার মান স্ট্রিং, সংখ্যা বা বুলিয়ান, শূন্য এবং অন্যান্য ধরণের হতে পারে; রিটার্ন মানঃ SQLite ভাষায় এক্সিকিউশন ফলাফল সহ বস্তু।DBExec(), ডাটাবেসের ইন্টারফেস ফাংশন, পাস পরামিতি মাধ্যমে, বট এর ডাটাবেস চালাতে পারেন (SQLite ডাটাবেস). এটা যোগ, মুছে ফেলা, অনুসন্ধান এবং বট ডাটাবেস পরিবর্তন অপারেশন উপলব্ধি, সমর্থনSQLiteবট ডাটাবেসের সিস্টেমটি টেবিলগুলি সংরক্ষণ করে যার মধ্যে রয়েছেঃkvdb, cfg, log, profitএবংchart; উপরে উল্লিখিত কোনো টেবিল অপারেট করবেন না।DBExec()শুধুমাত্র আসল বটকে সমর্থন করে।

  • মেমরি ডাটাবেস সমর্থন করে ফাংশন প্যারামিটার জন্য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 the 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 the 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 the data
        Log(DBExec(":SELECT * FROM TEST_TABLE;"));
    }
    
  • একটি টেবিল তৈরি করুন

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 the data
    Log(DBExec("SELECT * FROM TEST_TABLE;"))
    
    // Modify the data
    Log(DBExec("UPDATE TEST_TABLE SET HIGH=? WHERE TS=?", 110, 1518970320000))    
    
    // Delete the 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 the data
    Log(DBExec("SELECT * FROM TEST_TABLE;"))
    
    # Modify the data
    Log(DBExec("UPDATE TEST_TABLE SET HIGH=? WHERE TS=?", 110, 1518970320000))
    
    # Delete the 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 the data
    Log(DBExec("SELECT * FROM TEST_TABLE;"));
    
    // Modify the data
    Log(DBExec("UPDATE TEST_TABLE SET HIGH=? WHERE TS=?", 110, 1518970320000));
    
    // Delete the data
    Log(DBExec("DELETE FROM TEST_TABLE WHERE HIGH=?", 110));
}

UUID (()

UUID(), একটি 32-বিট অনন্য 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);
}

ইভেন্টলুপ (টাইমআউট)

EventLoop(timeout), কোন আছে পরে ফিরে আসেwebsocketপাঠযোগ্য অথবাexchange.Go, HttpQuery_Goএবং অন্যান্য সমান্তরাল কাজ সম্পন্ন হয়.timeout0 এ সেট করা হয়, ফেরত দেওয়ার আগে একটি ইভেন্টের জন্য অপেক্ষা করুন। যদি এটি 0 এর চেয়ে বড় হয়, তাহলে ইভেন্টের অপেক্ষা টাইমআউট সেট করুন। যদি এটি 0 এর চেয়ে কম হয়, তবে অবিলম্বে সর্বশেষ ইভেন্টটি ফেরত দিন। যদি ফেরত দেওয়া বস্তুটি না হয়null,Eventরিটার্ন কন্টেন্টের মধ্যে থাকা ট্রিগার ইভেন্ট টাইপ। এই ফাংশনটি শুধুমাত্র বাস্তব বট ট্রেডিংয়ের জন্য উপলব্ধ।

প্রথম কলEventLoopকোড ইভেন্ট শোনার প্রক্রিয়া শুরু হবে.EventLoopইভেন্ট কলব্যাকের পরে শুরু করা হলে, পূর্ববর্তী ইভেন্টটি মিস করা হবে। অন্তর্নিহিত সিস্টেমের দ্বারা ক্যাপসুল করা সারি কাঠামো 500 ইভেন্ট কলব্যাক পর্যন্ত ক্যাশে করবে। যদিEventLoopপ্রোগ্রাম এক্সিকিউশনের সময় অপসারণের জন্য সময়মত কল করা হয় না, 500 ক্যাশের বাইরে পরবর্তী ইভেন্ট কলব্যাকগুলি হারিয়ে যাবে।EventLoopফাংশন ক্যাশে সারি প্রভাবিত করবে নাwebsocketমূলত সিস্টেম, অথবা ক্যাশেexchange.Goএবং অন্যান্য সমান্তরাল ফাংশন. এই ক্যাশে জন্য, আপনি এখনও তথ্য পুনরুদ্ধার করার জন্য তাদের নিজস্ব পদ্ধতি ব্যবহার করতে হবে. তথ্য যে আগে বের করা হয়েছে জন্যEventLoopফাংশন রিটার্ন, কোন রিটার্ন ইভেন্ট উৎপন্ন হবে নাEventLoop function.

এই প্রকল্পের প্রধান উদ্দেশ্যEventLoopফাংশন কৌশল স্তর অবহিত করা হয় যে অন্তর্নিহিত সিস্টেম নতুন নেটওয়ার্ক ডেটা পেয়েছে। ঘটনা সঙ্গে পুরো কৌশল ড্রাইভ। যখনEventLoopফাংশন একটি ইভেন্ট ফেরত, আপনি শুধুমাত্র সব তথ্য উত্স অতিক্রম করতে হবে. উদাহরণস্বরূপ, দ্বারা তৈরি বস্তুরwebsocketসংযোগ এবং বস্তুর দ্বারা তৈরিexchange.Goআপনি একটি ওপেন সোর্স ক্লাস লাইব্রেরি ডিজাইন উল্লেখ করতে পারেনঃক্লাস লাইব্রেরির লিঙ্ক.

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, the subsequent EventLoop function will miss the previous events, because after waiting for 2 seconds, the concurrent function has received the data, and the EventLoop monitoring mechanism will start later, and these events will be missed
     // Unless you start calling EventLoop(-1) on the first line of code, first initialize the listening mechanism of EventLoop, you will not miss these events

     // Log("GetDepth:", routine_getDepth.wait()) If the wait function is called in advance to get the result of the concurrent call of the GetDepth function, the event that the GetDepth function receives the request result 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);
}

অন্তর্নির্মিত ফাংশন

_G(K, V)

_G(K, V), একটি বিশ্বব্যাপী অভিধানের ফাংশন যা সংরক্ষণ করা যেতে পারে, ব্যাকটেস্ট এবং বট উভয় সমর্থন করে। ব্যাকটেস্টের পরে, সংরক্ষিত তথ্য মুছে ফেলা হবে। ডাটা স্ট্রাকচার হলKVটেবিল, একটি স্থানীয় ফাইল স্থায়ীভাবে সংরক্ষণ করা হয়. প্রতিটি বট একটি পৃথক ডাটাবেস আছে. এটি সবসময় পুনরায় আরম্ভ করার পরে বা যখন ডকার প্রস্থান বিদ্যমান থাকবে.Kএকটি স্ট্রিং হতে হবে, যা বড় হাতের সংবেদনশীল নয়।Vযে কোন হতে পারেJSONযখন ফাংশন_G()কল করা হয় এবং বট অপারেশন কোন পরামিতি পাস করা হয়, ফাংশন_G()রিটার্ন করেIDবর্তমান বট এর.

function main(){
    // Set a global variable num with a value of 1
    _G("num", 1)     
    // Change a global variable num with the value "ok"
    _G("num", "ok")    
    // Delete global variable num
    _G("num", null)
    // Return the value of the global variable num
    Log(_G("num"))
    // Delete all global variables
    _G(null)
    // Return bot 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);
    // does not support auto robotId = _G();
}

নোটঃ ব্যবহারের সময়_Gতথ্য সংরক্ষণের জন্য, এটি হার্ডওয়্যার ডিভাইসের মেমরি এবং হার্ড ডিস্ক স্পেস অনুযায়ী যুক্তিসঙ্গতভাবে ব্যবহার করা উচিত, এবং এটি অপব্যবহার করা উচিত নয়। অন্যথায় এটি একটিমেমরি ওভারফ্লো problem.

_D ((টাইমস্ট্যাম্প, Fmt)

_D(Timestamp, Fmt), নির্দিষ্ট টাইমস্ট্যাম্পের সংশ্লিষ্ট সময় স্ট্রিং প্রদান করে। প্যারামিটার মানঃTimestampএকটি সংখ্যাগত টাইপ, মিলিসেকেন্ডে।Fmtএকটি স্ট্রিং টাইপ;Fmtডিফল্টরূপেঃyyyy-MM-dd hh:mm:ss; রিটার্ন ভ্যালুঃ স্ট্রিং টাইপ। এটি নির্দিষ্ট টাইমস্ট্যাম্প ((ms) স্ট্রিং ফেরত দেয় এবং কোনও পরামিতি পাস না করে বর্তমান সময় ফেরত দেয়; উদাহরণস্বরূপঃ_D()অথবা_D(1478570053241), যার ডিফল্ট বিন্যাস হলyyyy-MM-dd hh:mm:ss.

function main(){
    var time = _D()
    Log(time)
}
def main():
    strTime = _D()
    Log(strTime)
void main() {
    auto strTime = _D();
    Log(strTime);
}

নোটঃ ব্যবহারের সময়_D()মধ্যেPythonকৌশল, আমরা মনোযোগ দিতে হবে যে প্যারামিটার পাস হয় টাইমস্ট্যাম্পস সেকেন্ডে (মিলিসেকেন্ড স্তরের টাইমস্ট্যাম্পসJavaScriptএবংC ++কৌশল, এবং 1 সেকেন্ড = 1000 মিলিসেকেন্ড) । বট এ, ফাংশন ব্যবহার করার সময়_D()একটি পাঠযোগ্য টাইমস্ট্যাম্প সঙ্গে একটি সময় স্ট্রিং বিশ্লেষণ করার জন্য, আপনি ডকার প্রোগ্রাম অপারেটিং সিস্টেমের সময় অঞ্চল মনোযোগ দিতে হবে। ফাংশন_D()ডকার সিস্টেমের সময় ভিত্তিক একটি পাঠযোগ্য সময় স্ট্রিং হিসাবে একটি টাইমস্ট্যাম্প বিশ্লেষণ করে।

উদাহরণস্বরূপ, একটি টাইমস্ট্যাম্প বিশ্লেষণ1574993606000কোড সহঃ

function main() {
    Log(_D(1574993606000))
}
def main():
    # Beijing time server runs: 2019-11-29 10:13:26, and the docker on another server in another region runs this code will get the results: 2019-11-29 02:13:26
    Log(_D(1574993606))
void main() {
    Log(_D(1574993606000));
}

_N ((Num, সঠিকতা)

_N(Num, Precision), একটি ফরম্যাট করা ফ্লোটিং কমপ্লেক্স নম্বর। প্যারামিটার মানঃNumসংখ্যাসূচক হয়;Precisionপূর্ণসংখ্যা টাইপ হয়। রিটার্ন মানঃ সংখ্যাসূচক টাইপ।

উদাহরণস্বরূপঃ_N(3.1415, 2)এর দুই দশমিকের পরে মান মুছে ফেলবে3.1415এবং ফিরে3.14.

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 অঙ্ক 0 এ পরিবর্তন করতে চান, আপনি লিখতে পারেনঃ

function main(){
    var i = 1300
    Log(i)
    var ii = _N(i, -3)
    // Checking the log shows 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);
}

_C(...)

_C(function, args…)এটি একটি পুনরায় চেষ্টা ফাংশন, যা বাজারের তথ্য প্রাপ্তি এবং অসম্পূর্ণ অর্ডার অর্জন ইত্যাদি সম্পর্কে ইন্টারফেসের ত্রুটি সহনশীলতার জন্য ব্যবহৃত হয়।

ইন্টারফেসটি নির্দিষ্ট ফাংশনকে ক্রমাগত কল করবে যতক্ষণ না এটি সফলভাবে ফিরে আসে (প্যারামিটারfunctionউল্লেখিত ফাংশন কল করার সময় null মান ফেরত দেয় অথবাfalseউদাহরণস্বরূপ,_ C(exchange. GetTicker), ডিফল্ট পুনরায় চেষ্টা ব্যবধান 3 সেকেন্ড, যা ফাংশন কল করতে পারেন_CDelay (...)পুনরায় চেষ্টা করার সময়সীমা সেট করার জন্য, যেমনঃ_CDelay (1000)অর্থ পরিবর্তন ফাংশন_C১ সেকেন্ডের মধ্যে আবার চেষ্টা করুন।

নিম্নলিখিত ফাংশনগুলির জন্যঃ

  • exchange.GetTicker()
  • exchange.GetDepth()
  • exchange.GetTrades()
  • exchange.GetRecords()
  • exchange.GetAccount()
  • exchange.GetOrders()
  • exchange.GetOrder()
  • exchange.GetPosition()

তারা সব ফাংশন দ্বারা ত্রুটি সহনশীলতা করতে বলা যেতে পারে_C(...). ফাংশন_C(function, args...)উপরে তালিকাভুক্ত ফাংশনগুলির ত্রুটি সহনশীলতা সীমাবদ্ধ নয়।functionউদ্ধৃত করা হয় না বলা হয়, এবং মনোযোগ দিতে যে এটি_C(exchange.GetTicker), না_C(exchange.GetTicker()).

function main(){
    var ticker = _C(exchange.GetTicker)
    // Adjust _C() function's 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);
}

প্যারামিটার সহ ফাংশনগুলির জন্য, যখন ব্যবহার করা হয়_C(...)ত্রুটি সহনশীলতা করতেঃ

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("Meet the criteria! ", "#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("Meet the criteria!", "#FF0000")
        return True
    Log("Retry!", "#FF0000")
    return False

def main():
    ret = _C(test, 1, 5)
    Log(ret)
// C++ does not support this method for fault tolerance of custom functions.

_ক্রস ((Arr1, Arr2)

_Cross(Arr1, Arr2)অ্যারের ক্রসিং সময়ের সংখ্যা প্রদান করেarr1এবংarr2. একটি ধনাত্মক সংখ্যা হল উত্থানের সময়কাল, এবং একটি নেতিবাচক সংখ্যা হ'ল হ্রাসের সময়কাল, এবং 0 বর্তমান মূল্যের সমান। প্যারামিটার মানঃ সংখ্যা টাইপের অ্যারে।

আপনি ফাংশন পরীক্ষা করার জন্য ডেটা সেট সিমুলেট করতে পারেন_Cross(Arr1, 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));
}

img

পর্যবেক্ষণের জন্য সিমুলেটেড ডেটা দৃশ্যমান করুন

img

নির্দিষ্ট নির্দেশাবলীঃঅন্তর্নির্মিত ফাংশন _ক্রস বিশ্লেষণ এবং নির্দেশাবলী

JSONParse ((strJson)

JSONParse(strJson), ফাংশনটি JSON স্ট্রিংগুলি বিশ্লেষণ করতে ব্যবহৃত হয়। বড় সংখ্যাযুক্ত JSON স্ট্রিংগুলি সঠিকভাবে বিশ্লেষণ করা যেতে পারে এবং বড় সংখ্যাগুলি স্ট্রিং ধরণের মধ্যে বিশ্লেষণ করা হবে। ব্যাকটেস্টিং সিস্টেম এই ফাংশনটি সমর্থন করে না।

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
}

কাস্টম রঙ

প্রতিটি বার্তা স্ট্রিং একটি RGB মান দিয়ে শেষ হতে পারে যেমনঃ#ff0000, যা প্রদর্শিত হতে হবে অগ্রভূমি রঙ প্রতিনিধিত্ব করে। যদি এটি একটি বিন্যাসে যেমন#ff0000112233, শেষ ছয়টি পটভূমির রঙকে প্রতিনিধিত্ব করে।

function main() {
    Log("Red", "#FF0000")
}
def main():
    Log("Red", "#FF0000")
void main() {
    Log("Red", "#FF0000");
}

লগ তথ্য

যখন বট চলছে, লগ তথ্য বট এর ডাটাবেসে রেকর্ড করা হয়, যাsqlite3ডাটাবেজ ফাইলগুলি ডকার প্রোগ্রামের সাথে ডিভাইসে অবস্থিত, এবং ফাইলগুলির সঠিক অবস্থান ডকার প্রোগ্রামের অভিধানে রয়েছে (robotউদাহরণস্বরূপঃ আইডি সহ বট ডাটাবেস ফাইল130350ডিরেক্টরিতে আছে../logs/storage/130350 (..হয় অভিধান যেখানে ডকার এরrobotঅবস্থিত হয়), এবং ডাটাবেস ফাইলের নাম130350.db3.

ব্যাকটেস্ট সিস্টেমের লগগুলি ক্লিক করে ডাউনলোড করা যেতে পারে [ডাউনলোড লগব্যাকটেস্ট শেষ হওয়ার পর ব্যাকটেস্ট পৃষ্ঠার নীচের ডান কোণে] বোতাম। যখন আপনাকে বটটিকে অন্য সার্ভারের ডকারের কাছে স্থানান্তর করতে হবে, তখন আপনি বটের ডাটাবেস ফাইলগুলি (এক্সটেনশন db3 সহ ডাটাবেস ফাইলগুলি) স্থানান্তর লক্ষ্য সার্ভারে স্থানান্তর করতে পারেন এবং প্ল্যাটফর্মের সংশ্লিষ্ট বট আইডিতে ফাইলের নাম সেট করতে পারেন। এইভাবে, পূর্ববর্তী বটের সমস্ত লগ তথ্য নতুন ডিভাইসে মাইগ্রেশনের কারণে হারিয়ে যাবে না।

লোগো ((...)

Log(message)মানে লগ লিস্টে একটি বার্তা সংরক্ষণ করা। প্যারামিটার মানঃmessageযেকোনো ধরনের হতে পারে। আপনি যদি অক্ষর যোগ করেন@স্ট্রিংয়ের পরে, বার্তাটি পুশ সারিতে প্রবেশ করবে এবং এফএমজেড কোয়ান্ট ট্রেডিং প্ল্যাটফর্মের বর্তমান ওয়েচ্যাট অ্যাকাউন্টে চাপ দেওয়া হবে, এবং ইমেল, টেলিগ্রাম এবং ওয়েবহুক পুশ সেটিংসে চাপ দেওয়া হবে (পৃষ্ঠাগুলি খুলুনড্যাশবোর্ড, অ্যাকাউন্টএবংপ্রেস সেটিংসজামিনের আদেশের মাধ্যমে) ।

নোটঃ

  • ডিবাগ টুল এ push সমর্থিত নয়।
  • ব্যাকটেস্ট সিস্টেমে push সমর্থিত নয়।
function main() {
    Log("Hello FMZ Quant!@")
    Sleep(1000 * 5)
    // Add the string to #ff0000, print the log in red, and push the message
    Log("Hello, #ff0000@")
}
def main():
    Log("Hello FMZ Quant!@")
    Sleep(1000 * 5)
    Log("Hello, #ff0000@")
void main() {
    Log("Hello FMZ Quant!@");
    Sleep(1000 * 5);
    Log("Hello, #ff0000@");
}

ওয়েবহুকধাক্কাঃ

সার্ভিস প্রোগ্রাম DEMO ব্যবহার করুনGolang:

package main
import (
    "fmt"
    "net/http"
)

func Handle (w http.ResponseWriter, r *http.Request) {
    defer func() {
        fmt.Println("req:", *r)
    }()
}

func main () {
    fmt.Println("listen http://localhost:9090")
    http.HandleFunc("/data", Handle)
    http.ListenAndServe(":9090", nil)
}

সেটWebHook: http://XXX.XX.XXX.XX:9090/data?data=Hello_FMZ

সার্ভিস প্রোগ্রাম চালানোর পরে, কৌশলটি চালান এবং তথ্যটি চাপুনঃ

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

ধাক্কা তথ্য পান, এবং সার্ভিস প্রোগ্রাম তথ্য মুদ্রণঃ

listen http://localhost:9090
req: {GET /data?data=Hello_FMZ HTTP/1.1 1 1 map[User-Agent:[Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/xx.x.xxxx.xxx Safari/537.36] Accept-Encoding:[gzip]] {} <nil> 0 [] false 1XX.XX.X.XX:9090 map[] map[] <nil> map[] XXX.XX.XXX.XX:4xxx2 /data?data=Hello_FMZ <nil> <nil> <nil> 0xc420056300}

মুদ্রণ করুনbase64কোডেড চিত্রফাংশনLogকোডেড চিত্র মুদ্রণ সমর্থন করেbase64, দিয়ে শুরু হয়`, এবং দিয়ে শেষ`উদাহরণস্বরূপঃ

function main() {
    Log("`data:image/png;base64,AAAA`")
}
def main():
    Log("`data:image/png;base64,AAAA`")
void main() {
    Log("`data:image/png;base64,AAAA`");
}

Logমুদ্রণ সমর্থন করেmatplotlib.pyplotবস্তুরPythonসরাসরি, অর্থাৎ, যতক্ষণ পর্যন্ত বস্তুর মধ্যে থাকেsavefigপদ্ধতি, আপনি ব্যবহার করতে পারেনLogসরাসরি মুদ্রণ করার জন্য, উদাহরণস্বরূপঃ

import matplotlib.pyplot as plt 
def main(): 
    plt.plot([3,6,2,4,7,1]) 
    Log(plt)

মুদ্রিত লগগুলির স্বয়ংক্রিয় ভাষা পরিবর্তনফাংশনLogভাষা স্যুইচিং সমর্থন করে; যখন ফাংশনটি পাঠ্য আউটপুট করে, এটি প্ল্যাটফর্ম পৃষ্ঠায় ভাষা সেটিং অনুযায়ী স্বয়ংক্রিয়ভাবে সংশ্লিষ্ট ভাষায় স্যুইচ করবে। উদাহরণস্বরূপঃ

function main() {
    Log("[trans]Chinese|abc[/trans]")
}
def main():
    Log("[trans]Chinese|abc[/trans]")
void main() {
    Log("[trans]Chinese|abc[/trans]");
}

লোগপ্রফিট (LogProfit)

LogProfit(Profit)মুনাফা মান রেকর্ড, মুনাফা মান মুদ্রণ, এবং মুনাফা মান অনুযায়ী একটি মুনাফা বক্ররেখা আঁকা। পরামিতি মানঃমুনাফাসংখ্যাসূচক টাইপ।

যদি ফাংশনটি অক্ষরের সাথে শেষ হয়&, এটা শুধুমাত্র মুনাফা চার্ট অঙ্কন উপলব্ধি করতে পারেন, এবং মুনাফা লগ মুদ্রণ না, যেমনঃLogProfit(10, '&').

LogProfitReset (()

LogProfitReset()সমস্ত লাভ লগ মুছে ফেলা হয়; আপনি সংরক্ষিত আইটেম সংখ্যা নির্দিষ্ট করার জন্য একটি পূর্ণসংখ্যা মান পরামিতি নিতে পারেন।

function main() {
    // Print 30 points on the income chart, then reset, and only retain the last 10 points 
    for(var i = 0; i < 30; i++) {
        LogProfit(i)
        Sleep(500)
    }
    LogProfitReset(10)
}
def main():
    for i in range(30):
        LogProfit(i)
        Sleep(500)
    LogProfitReset(10)
void main() {
    for(int i = 0; i < 30; i++) {
        LogProfit(i);
        Sleep(500);
    }
    LogProfitReset(10);
}

LogStatus ((Msg)

LogStatus(Msg), তথ্য লগ তালিকায় সংরক্ষণ করা হয় না, শুধুমাত্র বট বর্তমান অবস্থা তথ্য আপডেট করা হয়; এটি লগ উপরে প্রদর্শিত হয় এবং অবস্থা আপডেট করার জন্য একাধিক বার কল করা যেতে পারে। প্যারামিটার মানঃMsgযেকোনো ধরনের হতে পারে।

function main() {
    LogStatus('This is a normal status prompt')
    LogStatus('This is a status prompt in red font # ff0000')
    LogStatus('This is a multi-line status message \n I am the second line')
}
def main():
    LogStatus('This is a normal status prompt')
    LogStatus('This is a status prompt in red font # ff0000')
    LogStatus('This is a multi-line status message \nI am the second line')
void main() {
    LogStatus("This is a normal status prompt");
    LogStatus("This is a status prompt in red font # ff0000");
    LogStatus("This is a multi-line status message \nI am the second line");
}

LogStatus(Msg)মুদ্রণ সমর্থন করেbase64কোডেড ছবি, দিয়ে শুরু`এবং শেষ হয়`যেমনঃLogStatus("`data:image/png;base64,AAAA`"). LogStatus(Msg)সরাসরি আমদানি সমর্থন করেPythonএরmatplotlib.pyplotবস্তু, যতক্ষণ অবজেক্টের মধ্যে রয়েছেsavefigপদ্ধতি, আপনি ফাংশন পাস করতে পারেনLogStatus(Msg)যেমনঃ

import matplotlib.pyplot as plt 
def main():
    plt.plot([3,6,2,4,7,1])
    LogStatus(plt) 

স্ট্যাটাস বারে ডেটা আউটপুট উদাহরণঃ

function main() {
    var table = {type: 'table', title: 'Position Information', cols: ['Column1', 'Column2'], rows: [ ['abc', 'def'], ['ABC', 'support color #ff0000']]}
    // After the JSON order is serialized, add the character "`" on both sides, which is regarded as a complex message format (currently supporting tables)
    LogStatus('`' + JSON.stringify(table) + '`')                    
    // Table information can also appear in multiple lines
    LogStatus('First line message\n`' + JSON.stringify(table) + '`\nThird line message')
    // That supports multiple tables displayed at the same time, and that will be displayed in a group with TAB
    LogStatus('`' + JSON.stringify([table, table]) + '`')
    
    // You can also construct a button in the table, and the strategy uses "GetCommand" to receive the content of the cmd attribute                                
    var table = { 
        type: 'table', 
        title: 'Position operation', 
        cols: ['Column1', 'Column2', 'Action'], 
        rows: [ 
            ['abc', 'def', {'type':'button', 'cmd': 'coverAll', 'name': 'close position'}]
        ]
    }
    LogStatus('`' + JSON.stringify(table) + '`') 
    // Or create a separate button 
    LogStatus('`' + JSON.stringify({'type':'button', 'cmd': 'coverAll', 'name': 'close position'}) + '`') 
    // You can customize the button style (button attribute of bootstrap)
    LogStatus('`' + JSON.stringify({'type':'button', 'class': 'btn btn-xs btn-danger', 'cmd': 'coverAll', 'name': 'close position'}) + '`')
}
import json
def main():
    table = {"type": "table", "title": "Position Information", "cols": ["Column1", "Column2"], "rows": [["abc", "def"], ["ABC", "support color #ff0000"]]}
    LogStatus('`' + json.dumps(table) + '`')
    LogStatus('First line message\n`' + json.dumps(table) + '`\nThird line message')
    LogStatus('`' + json.dumps([table, table]) + '`')

    table = {
        "type" : "table", 
        "title" : "Position operation", 
        "cols" : ["Column1", "Column2", "Action"], 
        "rows" : [
            ["abc", "def", {"type": "button", "cmd": "coverAll", "name": "close position"}]
        ] 
    }
    LogStatus('`' + json.dumps(table) + '`')
    LogStatus('`' + json.dumps({"type": "button", "cmd": "coverAll", "name": "close position"}) + '`')
    LogStatus('`' + json.dumps({"type": "button", "class": "btn btn-xs btn-danger", "cmd": "coverAll", "name": "close position"}) + '`')
void main() {
    json table = R"({"type": "table", "title": "Position Information", "cols": ["Column1", "Column2"], "rows": [["abc", "def"], ["ABC", "support color #ff0000"]]})"_json;
    LogStatus("`" + table.dump() + "`");
    LogStatus("First line message\n`" + table.dump() + "`\nThird line message");
    json arr = R"([])"_json;
    arr.push_back(table);
    arr.push_back(table);
    LogStatus("`" + arr.dump() + "`");

    table = R"({
        "type" : "table", 
        "title" : "Position operation", 
        "cols" : ["Column1", "Column2", "Action"], 
        "rows" : [
            ["abc", "def", {"type": "button", "cmd": "coverAll", "name": "close position"}]
        ] 
    })"_json;
    LogStatus("`" + table.dump() + "`");
    LogStatus("`" + R"({"type": "button", "cmd": "coverAll", "name": "close position"})"_json.dump() + "`");
    LogStatus("`" + R"({"type": "button", "class": "btn btn-xs btn-danger", "cmd": "coverAll", "name": "close position"})"_json.dump() + "`");
}

স্ট্যাটাস বার বোতামের অক্ষম এবং বর্ণনা ফাংশন সেট করুনঃ

img

function main() {
    var table = {
        type: "table",
        title: "Test the disable and description functions of status bar buttons",
        cols: ["Column1", "Column2", "Column3"], 
        rows: []
    }
    var button1 = {"type": "button", "name": "button1", "cmd": "button1", "description": "This is the first button"}
    var button2 = {"type": "button", "name": "button2", "cmd": "button2", "description": "This is the second button, set to disabled", "disabled": true}
    var button3 = {"type": "button", "name": "button3", "cmd": "button3", "description": "This is the third button, set to enabled", "disabled": false}
    table.rows.push([button1, button2, button3])
    LogStatus("`" + JSON.stringify(table) + "`")
}
import json
def main():
    table = {
        "type": "table",
        "title": "Test the disable and description functions of status bar buttons",
        "cols": ["Column1", "Column2", "Column3"], 
        "rows": []
    }
    button1 = {"type": "button", "name": "button1", "cmd": "button1", "description": "This is the first button"}
    button2 = {"type": "button", "name": "button2", "cmd": "button2", "description": "This is the second button, set to disabled", "disabled": True}
    button3 = {"type": "button", "name": "button3", "cmd": "button3", "description": "This is the third button, set to enabled", "disabled": False}
    table["rows"].append([button1, button2, button3])
    LogStatus("`" + json.dumps(table) + "`")
void main() {
    json table = R"({
        "type": "table",
        "title": "Test the disable and description functions of status bar buttons",
        "cols": ["Column1", "Column2", "Column3"], 
        "rows": []
    })"_json;
    json button1 = R"({"type": "button", "name": "button1", "cmd": "button1", "description": "This is the first button"})"_json;
    json button2 = R"({"type": "button", "name": "button2", "cmd": "button2", "description": "This is the second button, set to disabled", "disabled": true})"_json;
    json button3 = R"({"type": "button", "name": "button3", "cmd": "button3", "description": "This is the third button, set to enabled", "disabled": false})"_json;
    json arr = R"([])"_json;
    arr.push_back(button1);
    arr.push_back(button2);
    arr.push_back(button3);
    table["rows"].push_back(arr);
    LogStatus("`" + table.dump() + "`");
}

স্ট্যাটাস বার বোতামের স্টাইল সেট করুনঃ

img

function main() {
    var table = {
        type: "table",
        title: "status bar button style",
        cols: ["default", "raw", "success", "information", "warning", "danger"], 
        rows: [
            [
                {"type":"button", "class": "btn btn-xs btn-default", "name": "default"},
                {"type":"button", "class": "btn btn-xs btn-primary", "name": "raw"},
                {"type":"button", "class": "btn btn-xs btn-success", "name": "success"},
                {"type":"button", "class": "btn btn-xs btn-info", "name": "information"},
                {"type":"button", "class": "btn btn-xs btn-warning", "name": "warning"},
                {"type":"button", "class": "btn btn-xs btn-danger", "name": "danger"}
            ]
        ]
    }
    LogStatus("`" + JSON.stringify(table) + "`")
}
import json
def main():
    table = {
        "type": "table",
        "title": "status bar button style",
        "cols": ["default", "raw", "success", "information", "warning", "danger"], 
        "rows": [
            [
                {"type":"button", "class": "btn btn-xs btn-default", "name": "default"},
                {"type":"button", "class": "btn btn-xs btn-primary", "name": "raw"},
                {"type":"button", "class": "btn btn-xs btn-success", "name": "success"},
                {"type":"button", "class": "btn btn-xs btn-info", "name": "information"},
                {"type":"button", "class": "btn btn-xs btn-warning", "name": "warning"},
                {"type":"button", "class": "btn btn-xs btn-danger", "name": "danger"}
            ]
        ]
    }
    LogStatus("`" + json.dumps(table) + "`")
void main() {
    json table = R"({
        "type": "table",
        "title": "status bar button style",
        "cols": ["default", "raw", "success", "information", "warning", "danger"], 
        "rows": [
            [
                {"type":"button", "class": "btn btn-xs btn-default", "name": "default"},
                {"type":"button", "class": "btn btn-xs btn-primary", "name": "raw"},
                {"type":"button", "class": "btn btn-xs btn-success", "name": "success"},
                {"type":"button", "class": "btn btn-xs btn-info", "name": "information"},
                {"type":"button", "class": "btn btn-xs btn-warning", "name": "warning"},
                {"type":"button", "class": "btn btn-xs btn-danger", "name": "danger"}
            ]
        ]
    })"_json;
    LogStatus("`" + table.dump() + "`");
}

ফাংশন একত্রিত করুনGetCommand()স্ট্যাটাস বার বোতামের ইন্টারেক্টিভ ফাংশন তৈরি করতেঃ

function test1() {
    Log("Call a custom function")
}

function main() {
    while (true) {
        var table = {
            type: 'table',
            title: 'operation',
            cols: ['Column1', 'Column2', 'Action'],
            rows: [
                ['a', '1', {
                    'type': 'button',                       
                    'cmd': "CoverAll",                      
                    'name': 'close position'                           
                }],
                ['b', '1', {
                    'type': 'button',
                    'cmd': 10,                              
                    'name': 'Send value'
                }],
                ['c', '1', {
                    'type': 'button',
                    'cmd': _D(),                          
                    'name': 'Call a function'
                }],
                ['d', '1', {
                    'type': 'button',
                    'cmd': 'test1',       
                    'name': 'Call a custom function'
                }]
            ]
        }
        LogStatus(_D(), "\n", '`' + JSON.stringify(table) + '`')

        var str_cmd = GetCommand()
        if (str_cmd) {
            Log("Received interactive data str_cmd:", "Types of:", typeof(str_cmd), "Value:", str_cmd)
            if(str_cmd == "test1") {
                test1()
            }
        }

        Sleep(500)
    }
}
import json
def test1():
    Log("Call a custom function")

def main():
    while True:
        table = {
            "type": "table", 
            "title": "Operation", 
            "cols": ["Column1", "Column2", "Action"],
            "rows": [
                ["a", "1", {
                    "type": "button", 
                    "cmd": "CoverAll",
                    "name": "close position"
                }],
                ["b", "1", {
                    "type": "button",
                    "cmd": 10,
                    "name": "Send value" 
                }], 
                ["c", "1", {
                    "type": "button",
                    "cmd": _D(),
                    "name": "Call a function" 
                }],
                ["d", "1", {
                    "type": "button",
                    "cmd": "test1",
                    "name": "Call a custom function" 
                }]
            ]
        }

        LogStatus(_D(), "\n", "`" + json.dumps(table) + "`")
        str_cmd = GetCommand()
        if str_cmd:
            Log("Received interactive data str_cmd", "Types:", type(str_cmd), "Value:", str_cmd)
            if str_cmd == "test1":
                test1()
        Sleep(500)
void test1() {
    Log("Call a custom function");
}

void main() {
    while(true) {
        json table = R"({
            "type": "table", 
            "title": "Operation", 
            "cols": ["Column1", "Column2", "Action"],
            "rows": [
                ["a", "1", {
                    "type": "button", 
                    "cmd": "CoverAll",
                    "name": "close position"
                }],
                ["b", "1", {
                    "type": "button",
                    "cmd": 10,
                    "name": "Send value" 
                }], 
                ["c", "1", {
                    "type": "button",
                    "cmd": "",
                    "name": "Call a function" 
                }],
                ["d", "1", {
                    "type": "button",
                    "cmd": "test1",
                    "name": "Call a custom function" 
                }]
            ]
        })"_json;
        table["rows"][2][2]["cmd"] = _D();
        LogStatus(_D(), "\n", "`" + table.dump() + "`");
        auto str_cmd = GetCommand();
        if(str_cmd != "") {
            Log("Received interactive data str_cmd", "Type:", typeid(str_cmd).name(), "Value:", str_cmd);
            if(str_cmd == "test1") {
                test1();
            }
        }
        Sleep(500);
    }
}

ইন্টারঅ্যাকশনের জন্য একটি স্ট্যাটাস বার বোতাম তৈরি করার সময়, ইনপুট ডেটাও সমর্থিত হয়, এবং ইন্টারঅ্যাক্টিভ কমান্ডটি শেষ পর্যন্ত ক্যাপচার করা হয়GetCommand()ফাংশন। একটি যোগ করার জন্যinputস্ট্যাটাস বারে একটি বোতাম কন্ট্রোলের ডাটা স্ট্রাকচারে আইটেম, উদাহরণস্বরূপ, যোগ করুন"input": {"name": "Number of opening orders", "type": "number", "defValue": 1}থেকে{"type": "button", "cmd": "open", "name": "open position"}, আপনি বোতামটি ক্লিক করলে ইনপুট বক্স কন্ট্রোল সহ একটি ডায়ালগ বক্স পপ আপ করতে পারেন (ইনপুট বক্সের ডিফল্ট মান হল 1, যা defValue ডেটা দ্বারা সেট করা হয়), এবং আপনি বোতাম কমান্ড দিয়ে পাঠানোর জন্য ডেটা প্রবেশ করতে পারেন। উদাহরণস্বরূপ, নিম্নলিখিত পরীক্ষার কোডটি চালানোর সময়, Open position বোতামটি ক্লিক করার পরে, একটি ইনপুট বক্স সহ একটি ডায়ালগ বক্স পপ আপ হয়।111ইনপুট বাক্সে এবং ক্লিক করুন OK,GetCommandফাংশন বার্তাটি ক্যাপচার করবেঃopen:111.

function main() {
    var tbl = {
        type: "table",
        title: "operation",
        cols: ["column 1", "column2"],
        rows: [
            ["Open position operation", {"type": "button", "cmd": "open", "name": "open position", "input": {"name": "number of opening positions", "type": "number", "defValue": 1}}],
            ["Close position operation", {"type": "button", "cmd": "coverAll", "name": "close all positions"}]
        ] 
    }

    LogStatus(_D(), "\n", "`" + JSON.stringify(tbl) + "`")
    while (true) {
        var cmd = GetCommand()
        if (cmd) {
            Log("cmd:", cmd)
        }
        Sleep(1000)
    }
}
import json

def main():
    tbl = {
        "type": "table", 
        "title": "operation", 
        "cols": ["column 1", "column 2"],
        "rows": [
            ["Open position operation", {"type": "button", "cmd": "open", "name": "open position", "input": {"name": "number of opening positions", "type": "number", "defValue": 1}}],
            ["Close position operation", {"type": "button", "cmd": "coverAll", "name": "close all positions"}]
        ]
    }

    LogStatus(_D(), "\n", "`" + json.dumps(tbl) + "`")
    while True:
        cmd = GetCommand()
        if cmd:
            Log("cmd:", cmd)
        Sleep(1000)
void main() {
    json tbl = R"({
        "type": "table", 
        "title": "operation", 
        "cols": ["column 1", "column 2"],
        "rows": [
            ["Open position operation", {"type": "button", "cmd": "open", "name": "open position", "input": {"name": "number of opening positions", "type": "number", "defValue": 1}}],
            ["Close position operation", {"type": "button", "cmd": "coverAll", "name": "close all positions"}]
        ]
    })"_json;

    LogStatus(_D(), "\n", "`" + tbl.dump() + "`");
    while(true) {
        auto cmd = GetCommand();
        if(cmd != "") {
            Log("cmd:", cmd);
        }
        Sleep(1000);
    }
}

টেবিলের কোষগুলি একত্রিত করুনLogStatus(Msg)ফাংশনঃ

  • অনুভূমিক একত্রীকরণ

    function main() {
        var table = { 
            type: 'table', 
            title: 'position operation', 
            cols: ['Column1', 'Column2', 'Action'], 
            rows: [ 
                ['abc', 'def', {'type':'button', 'cmd': 'coverAll', 'name': 'close position'}]
            ]
        } 
        var ticker = exchange.GetTicker()
        // Add a row of data, merge the first and second cells, and output the ticker variable in the merged cell
        table.rows.push([{body : JSON.stringify(ticker), colspan : 2}, "abc"])    
        LogStatus('`' + JSON.stringify(table) + '`')
    }
    
    import json
    def main():
        table = {
            "type" : "table",
            "title" : "position operation",
            "cols" : ["Column1", "Column2", "Action"],
            "rows" : [
                ["abc", "def", {"type": "button", "cmd": "coverAll", "name": "close position"}]
            ]
        }
        ticker = exchange.GetTicker()
        table["rows"].append([{"body": json.dumps(ticker), "colspan": 2}, "abc"])
        LogStatus("`" + json.dumps(table) + "`")
    
    void main() {
        json table = R"({
            "type" : "table",
            "title" : "position operation",
            "cols" : ["Column1", "Column2", "Action"],
            "rows" : [