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:ڈارون/amd64

darwinکا نام ہےMac OS system.

MD5 ((سٹرنگ)

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، اگرمربعبیان کے ساتھ شروع ہوتا ہے:، میموری ڈیٹا بیس میں آپریشن فائلوں کو لکھنے کے بغیر تیز ہو جائے گا ۔ یہ طویل مدتی اسٹوریج کی ضرورت کے بغیر ڈیٹا بیس کے آپریشن کے لئے موزوں ہے ، مثال کے طور پر:

    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کوئی بھی ہو سکتا ہےJSONserializable مواد. جب تقریب_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(نمبر، درستگی)

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

_Cross ((Arr1، Arr2)

_Cross(Arr1, Arr2)صفوں کے کراسنگ ادوار کی تعداد لوٹاتا ہےارر1اور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مثال کے طور پر: ID کے ساتھ بوٹ ڈیٹا بیس فائل130350ڈائرکٹری میں ہے../logs/storage/130350 (..ڈکشنری ہے جہاں ڈوکر کےrobotواقع ہے) ، اور ڈیٹا بیس فائل کا نام ہے130350.db3.

بیک ٹسٹ سسٹم میں نوشتہ جات کو [ڈاؤن لوڈ لاگ] بٹن بیک ٹیسٹ ختم ہونے کے بعد بیک ٹیسٹ کے صفحے کے نیچے دائیں کونے میں. جب آپ کو بوٹ کو کسی دوسرے سرور پر ڈوکر میں منتقل کرنے کی ضرورت ہو تو ، آپ بوٹ کی ڈیٹا بیس فائلوں (توسیع db3 کے ساتھ ڈیٹا بیس فائلیں) کو منتقلی کے ہدف سرور میں منتقل کرسکتے ہیں ، اور فائل کا نام پلیٹ فارم پر متعلقہ بوٹ آئی ڈی پر ترتیب دے سکتے ہیں۔ اس طرح ، پچھلے بوٹ کی تمام لاگ ان معلومات کو نئے آلے میں منتقلی کی وجہ سے ضائع نہیں کیا جائے گا۔

نوشتہ جات

Log(message)کا مطلب ہے لاگ لسٹ میں پیغام محفوظ کرنا۔ پیرامیٹر ویلیو:messageکسی بھی قسم کی ہو سکتی ہے. اگر آپ کو کردار شامل@سٹرنگ کے بعد ، پیغام پش قطار میں داخل ہوگا اور ایف ایم زیڈ کوانٹ ٹریڈنگ پلیٹ فارم کے موجودہ وی چیٹ اکاؤنٹ میں دھکیل دیا جائے گا ، اور ای میل ، ٹیلیگرام اور ویب ہک میں پش کی ترتیبات دھکیل دیا جائے گا (صفحات کھولیںڈیش بورڈ, اکاؤنٹاوردباؤ کی ترتیباتپابندیاں قائم کرنے کے احکامات کے ذریعے) ۔

نوٹ:

  • ڈیبگ ٹول میں پش کی حمایت نہیں کی جاتی ہے۔
  • Backtest سسٹم میں پش کی حمایت نہیں کی جاتی ہے۔
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@");
}

ویب ہکدباؤ:

میں لکھا سروس پروگرام ڈیمو استعمال کریں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(Profit)منافع کی قیمت ریکارڈ کرتا ہے، منافع کی قیمت پرنٹ کرتا ہے، اور منافع کی قیمت کے مطابق منافع کے منحنی خطوط تیار کرتا ہے۔ پیرامیٹر کی قیمت:منافععددی ٹائپ ہے۔

اگر فنکشن حروف کے ساتھ ختم ہوتا ہے&، یہ صرف منافع چارٹ ڈرائنگ کا احساس کر سکتے ہیں، اور منافع لاگ پرنٹنگ نہیں، جیسے:LogProfit(10, '&').

لاگپروفٹ ری سیٹ کریں (()

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

لاگ اسٹیٹس ((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" : [