Penemu mengkuantifikasi dokumen API

Penulis:Mimpi kecil, Dibuat: 2017-11-27 09:05:08, Diperbarui: 2023-07-12 16:47:31

Setelah menerima data, dan setelah melakukan tindak lanjut untuk memata-matai EventsLoop, mereka melewatkan peristiwa ini. // Kejadian-kejadian ini tidak akan terlewatkan, kecuali jika pada baris pertama kode, EventLoop ((-1) dipanggil dan mekanisme pemantauan EventLoop initialized terlebih dahulu

// Log("GetDepth:", routine_getDepth.wait()) 如果这里提前调用wait函数取出GetDepth函数并发调用的结果,此次GetDepth函数收到请求结果的事件便不会在EventLoop函数返回
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("第1个并发任务完成的为:", _D(ts1), ret1)
Log("第2个并发任务完成的为:", _D(ts2), ret2)
Log("第3个并发任务完成的为:", _D(ts3), ret3)

Log("GetTicker:", routine_getTicker.wait())
Log("GetDepth:", routine_getDepth.wait())
Log("GetTrades:", routine_getTrades.wait())

}


```python
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("第1个并发任务完成的为:", _D(ts1), ret1)
    Log("第2个并发任务完成的为:", _D(ts2), ret2)
    Log("第3个并发任务完成的为:", _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("第1个并发任务完成的为:", _D(ts1), ret1);
    Log("第2个并发任务完成的为:", _D(ts2), ret2);
    Log("第3个并发任务完成的为:", _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);
}

Fungsi internal

_G(K, V)

_G(K, V), Fungsi ini mengimplementasikan fungsi kamus global yang dapat disimpan, yang didukung oleh retesting dan real disk. Setelah retesting selesai, data yang disimpan akan dihapus. Struktur data adalahKVTabel, file lokal yang disimpan secara permanen, database terpisah untuk setiap hard disk, tetap ada setelah restart atau administrator keluar.KAnda harus menulisnya dalam bentuk string, tanpa membedakan ukuran dan ukuran.VAnda bisa melakukannya untuk siapa saja.JSONKonten yang diserifikasi._G()Fungsi yang tidak mengirim parameter._G()Fungsi ini akan kembali ke disk saat ini.ID

function main(){
    // 设置一个全局变量num,值为1
    _G("num", 1)     
    // 更改一个全局变量num,值为字符串ok
    _G("num", "ok")    
    // 删除全局变量num
    _G("num", null)
    // 返回全局变量num的值
    Log(_G("num"))
    // 删除所有全局变量
    _G(null)
    // 返回实盘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);
    // 不支持 auto robotId = _G();
}

Perhatikan: Penggunaan_GData yang disimpan dalam penyimpanan permanen fungsional harus digunakan secara wajar sesuai dengan memori perangkat keras, ruang hard disk, dan tidak boleh disalahgunakan; jika tidak, hal ini dapat menyebabkan kerusakan.Kebocoran memoriSaya tidak tahu apa yang terjadi.

_ D ((Tempstamp, Fmt)

_D(Timestamp, Fmt), mengembalikan string waktu yang sesuai dengan waktu yang ditentukan.TimestampUntuk tipe angka, nilai adalah milidetik.FmtUntuk jenis string,FmtPernyataan yang tidak masuk akal:yyyy-MM-dd hh:mm:ss, kembalikan nilai: tipe string. Mengembalikan string yang sesuai dengan tanda waktu yang ditentukan (millisecond) dan mengembalikan waktu saat ini tanpa mengirimkan parameter apapun; misalnya:_D()Atau_D(1478570053241)Format default adalahyyyy-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);
}

Perhatikan:PythonPenggunaan dalam strategi_D()Saat ini, parameter yang harus diperhatikan adalah parameter waktu tingkat detik.JavaScriptC++Dalam strategi ini, waktu berukuran milisegund adalah 1 detik = 1000 milisegund). Penggunaan saat bermain_D()Fungsi menganalisis sebuah timestamp sebagai string waktu yang dapat dibaca dengan memperhatikan zona waktu dan pengaturan waktu dari sistem operasi di mana program administrator berada._D()Fungsi menganalisis sebuah timestamp sebagai string waktu yang dapat dibaca yang ditentukan berdasarkan waktu pada sistem host.

Misalnya, sebuah timestamp adalah1574993606000Menggunakan kode untuk menganalisis:

function main() {
    Log(_D(1574993606000))
}
def main():
    # 北京时间的服务器上运行:2019-11-29 10:13:26 ,另一台其它地区的服务器上的托管者运行此代码结果则为:2019-11-29 02:13:26
    Log(_D(1574993606))
void main() {
    Log(_D(1574993606000));
}

_N(Nomor, Keakuratan)

_N(Num, Precision), Mengformat angka titik lebur.NumUntuk jenis nilai,PrecisionUntuk integer. {\displaystyle \mathbf {1}}} {\displaystyle {\mathbf {2}}} {\displaystyle {\mathbf {2}}} {\displaystyle {\mathbf {2}}} {\displaystyle {\mathbf {2}}} {\displaystyle {\mathbf {2}}} {\displaystyle {\mathbf {2}}} {\displaystyle {\mathbf {2}}} {\displaystyle {\mathbf {2}}} } {\displaystyle {\mathbf {2}}} }

Misalnya:_N(3.1415, 2)Akan dihapus3.1415Nilai dua digit setelah bilangan kecil, fungsi kembali3.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);
}

Jika Anda ingin mengubah semua digit N di sebelah kiri dari titik desimal menjadi 0, Anda bisa menulisnya seperti ini:

function main(){
    var i = 1300
    Log(i)
    var ii = _N(i, -3)
    // 查看日志得知为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...)Fungsi ini adalah fungsi uji ulang yang digunakan untuk mendapatkan transaksi, mendapatkan pesanan yang belum selesai, dll.

Antarmuka ini akan terus memanggil fungsi yang ditentukan sampai berhasil mengembalikan parameter (((functionMengembalikan nilai kosong ataufalseJika Anda tidak dapat menghubungi kami, kami akan mencoba menghubungi Anda lagi.)_C(exchange.GetTicker)Jika Anda ingin melakukan uji coba ulang secara default, Anda dapat menggunakan interval uji coba ulang 3 detik._CDelay(...)Fungsi untuk mengatur interval uji ulang, misalnya_CDelay(1000)Mengubah_CInterval uji ulang fungsi adalah 1 detik.

Untuk fungsi berikut:

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

Semua bisa diterima._C(...)Fungsi untuk memanggil kesalahan._C(function, args...)Fungsi tidak terbatas pada fungsi yang tercantum di atas yang dapat melakukan kesalahan, parameterfunctionIni adalah referensi fungsi, bukan panggilan fungsi._C(exchange.GetTicker)Tidak_C(exchange.GetTicker())

function main(){
    var ticker = _C(exchange.GetTicker)
    // 调整_C()函数重试时间间隔为2秒
    _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);
}

Untuk fungsi dengan parameter_C(...)Perhatikan apa yang terjadi.

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

Fungsi ini juga dapat digunakan untuk penanganan kesalahan fungsi kustom:

var test = function(a, b){
    var time = new Date().getTime() / 1000
    if(time % b == 3){
        Log("符合条件!", "#FF0000")
        return true
    }
    Log("重试!", "#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("符合条件!", "#FF0000")
        return True
    Log("重试!", "#FF0000")
    return False

def main():
    ret = _C(test, 1, 5)
    Log(ret)
// C++ 不支持这种方式对于自定义函数容错

_Cross ((Arr1, Arr2)

_Cross(Arr1, Arr2)Mengembalikan arrayarr1denganarr2Jumlah siklus silang. Nomor positif adalah siklus naik turun, angka negatif adalah siklus turun turun, dan 0 adalah harga saat ini.

Anda dapat mensimulasikan satu set tes data._Cross(Arr1, Arr2)Fungsi:

// 快线指标
var arr1 = [1,2,3,4,5,6,8,8,9]
// 慢线指标
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

Memvisualisasikan data simulasi untuk observasi

img

Panduan penggunaan:Fungsi built-in_Cross analisis dan panduan penggunaan

JSONParse ((strJson)

JSONParse(strJson), Fungsi ini digunakan untuk menganalisis string JSON. Fungsi ini dapat diselesaikan dengan benar string JSON yang berisi nilai numerik yang lebih besar, yang akan menganalisis nilai numerik yang lebih besar sebagai jenis string. Sistem retargeting tidak mendukung fungsi ini.

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));   // 不支持该函数
    
    auto s2 = "{\"num\":123}";
    Log("json::parse:", json::parse(s2));
    // Log("JSONParse:", JSONParse(s2));   // 不支持该函数
}

Warna yang disesuaikan

Setiap string pesan dapat digunakan.#ff0000Nilai RGB seperti itu pada akhirnya, mewakili pemandangan depan yang ingin ditampilkan.#ff0000112233Dalam format ini, enam angka terakhir mewakili warna latar belakang.

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

Informasi log

Informasi log saat disk berjalan dicatat di database disk, database disk digunakansqlite3Database, file database pada hard disk pada perangkat di mana program administrator berada, file database pada program administratorrobotProgram yang dapat dijalankan) di direktori.130350file database disk pada../logs/storage/130350Di dalam katalog ini..Ini adalahrobotAnda dapat mengklik file yang Anda gunakan untuk mengunduh file yang Anda inginkan.130350.db3Saya tidak tahu. Log di sistem retargeting dapat dilakukan setelah retargeting selesai, dengan mengklik di pojok kanan bawah halaman retargeting.Unduh log] tombol untuk mengunduh. Ketika perlu memindahkan disk ke server lain, administrator dapat memindahkan file database disk (dengan ekstensi yang disebut db3) ke server tujuan migrasi, dengan menetapkan nama file sebagai ID disk yang sesuai di platform. Dengan demikian, semua informasi log sebelumnya tidak akan hilang karena migrasi ke perangkat baru.

Catatan

Log(message), menyimpan sebuah pesan ke daftar log.messageAnda dapat memilih jenis apapun. Jika Anda menambahkan di belakang string@Kemudian pesan akan masuk ke antrian push, dan akan di push ke email, Telegram, WebHook, dll. yang dikonfigurasi dalam pengaturan push akun inventor saat ini.Pusat KontrolHalaman, pojok kanan atasPengaturan akunHalaman ini berisi artikel tentang:Pengaturan PushHalaman yang disesuaikan terikat) ‖

Perhatikan:

  • Push tidak didukung di Debug Tools.
  • "Sistem Retesting" tidak mendukung pushing.
function main() {
    Log("发明者量化你好 !@")
    Sleep(1000 * 5)
    // 字符串内加入#ff0000,打印日志显示为红色,并且推送消息
    Log("你好, #ff0000@")
}
def main():
    Log("发明者量化你好 !@")
    Sleep(1000 * 5)
    Log("你好, #ff0000@")
void main() {
    Log("发明者量化你好 !@");
    Sleep(1000 * 5);
    Log("你好, #ff0000@");
}

WebHookPush: Push:

PenggunaanGolangPerangkat lunak yang ditulis oleh DEMO:

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

PengaturanWebHookhttp://XXX.XX.XXX.XX:9090/data?data=Hello_FMZ

Setelah menjalankan program layanan, menjalankan kebijakan, kebijakan mendorong informasi:

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

Setelah menerima push, program layanan mencetak informasi:

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}

Mencetakbase64Gambar yang dienkode LogFungsi mendukung pencetakanbase64Gambar-gambar yang dikodekan untuk`Ini dimulai dengan:`Di akhir artikel ini, saya akan membahas beberapa hal.

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

LogDukungan cetak langsungPythonPerbedaanmatplotlib.pyplotObyek, asalkan obyek itu berisisavefigCara ini bisa dilakukan secara langsungLogSeperti halnya:

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

Pergantian bahasa otomatis untuk log yang dicetak LogFungsi ini mendukung pengalihan bahasa.LogFungsi output teks, yang akan secara otomatis beralih ke bahasa yang sesuai berdasarkan bahasa yang ditetapkan pada halaman platform, seperti:

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

LogProfit ((Profit)

LogProfit(Profit), mencatat nilai laba rugi, mencetak nilai laba rugi dan menggambar kurva laba rugi berdasarkan nilai laba rugi; nilai parameter:KeuntunganUntuk tipe angka.

Fungsi ini dapat diartikan sebagai&Pada akhirnya, hanya menggambar grafik pendapatan, tidak mencetak log pendapatan, misalnya:LogProfit(10, '&')

LogProfitReset (()

LogProfitReset(), kosongkan semua log pendapatan, Anda dapat menggunakan parameter nilai integer untuk menentukan jumlah yang akan disimpan.

function main() {
    // 在收益图表上打印30个点,然后重置,只保留最后10个点
    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)Informasi ini tidak disimpan ke dalam daftar log, hanya memperbarui informasi status disk saat ini, yang ditampilkan di bilah status di atas area log halaman disk.MsgAnda dapat memilih jenis yang Anda inginkan.

function main() {
    LogStatus('这是一个普通的状态提示')
    LogStatus('这是一个红色字体的状态提示#ff0000')
    LogStatus('这是一个多行的状态信息\n我是第二行')
}
def main():
    LogStatus('这是一个普通的状态提示')
    LogStatus('这是一个红色字体的状态提示#ff0000')
    LogStatus('这是一个多行的状态信息\n我是第二行')
void main() {
    LogStatus("这是一个普通的状态提示");
    LogStatus("这是一个红色字体的状态提示#ff0000");
    LogStatus("这是一个多行的状态信息\n我是第二行");
}

LogStatus(Msg)Dukungan cetakbase64Gambar-gambar yang dikodekan untuk`Ini dimulai dengan:`Di akhir artikel ini, saya akan membahas beberapa hal.LogStatus("`data:image/png;base64,AAAA`")LogStatus(Msg)Dukungan streaming langsungPythonPerbedaanmatplotlib.pyplotObyek, asalkan obyek itu berisisavefigMetode ini bisa masuk.LogStatus(Msg)Fungsi, misalnya:

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

Contoh output data dari status bar:

function main() {
    var table = {type: 'table', title: '持仓信息', cols: ['列1', '列2'], rows: [ ['abc', 'def'], ['ABC', 'support color #ff0000']]}
    // JSON序列化后两边加上`字符,视为一个复杂消息格式(当前支持表格)
    LogStatus('`' + JSON.stringify(table) + '`')                    
    // 表格信息也可以在多行中出现
    LogStatus('第一行消息\n`' + JSON.stringify(table) + '`\n第三行消息')
    // 支持多个表格同时显示,将以TAB显示到一组里
    LogStatus('`' + JSON.stringify([table, table]) + '`')
    
    // 也可以构造一个按钮在表格中,策略用GetCommand接收cmd属性的内容                                
    var table = { 
        type: 'table', 
        title: '持仓操作', 
        cols: ['列1', '列2', 'Action'], 
        rows: [ 
            ['abc', 'def', {'type':'button', 'cmd': 'coverAll', 'name': '平仓'}]
        ]
    }
    LogStatus('`' + JSON.stringify(table) + '`') 
    // 或者构造一单独的按钮
    LogStatus('`' + JSON.stringify({'type':'button', 'cmd': 'coverAll', 'name': '平仓'}) + '`') 
    // 可以自定义按钮风格(bootstrap的按钮属性)
    LogStatus('`' + JSON.stringify({'type':'button', 'class': 'btn btn-xs btn-danger', 'cmd': 'coverAll', 'name': '平仓'}) + '`')
}
import json
def main():
    table = {"type": "table", "title": "持仓信息", "cols": ["列1", "列2"], "rows": [["abc", "def"], ["ABC", "support color #ff0000"]]}
    LogStatus('`' + json.dumps(table) + '`')
    LogStatus('第一行消息\n`' + json.dumps(table) + '`\n第三行消息')
    LogStatus('`' + json.dumps([table, table]) + '`')

    table = {
        "type" : "table", 
        "title" : "持仓操作", 
        "cols" : ["列1", "列2", "Action"], 
        "rows" : [
            ["abc", "def", {"type": "button", "cmd": "coverAll", "name": "平仓"}]
        ] 
    }
    LogStatus('`' + json.dumps(table) + '`')
    LogStatus('`' + json.dumps({"type": "button", "cmd": "coverAll", "name": "平仓"}) + '`')
    LogStatus('`' + json.dumps({"type": "button", "class": "btn btn-xs btn-danger", "cmd": "coverAll", "name": "平仓"}) + '`')
void main() {
    json table = R"({"type": "table", "title": "持仓信息", "cols": ["列1", "列2"], "rows": [["abc", "def"], ["ABC", "support color #ff0000"]]})"_json;
    LogStatus("`" + table.dump() + "`");
    LogStatus("第一行消息\n`" + table.dump() + "`\n第三行消息");
    json arr = R"([])"_json;
    arr.push_back(table);
    arr.push_back(table);
    LogStatus("`" + arr.dump() + "`");

    table = R"({
        "type" : "table", 
        "title" : "持仓操作", 
        "cols" : ["列1", "列2", "Action"], 
        "rows" : [
            ["abc", "def", {"type": "button", "cmd": "coverAll", "name": "平仓"}]
        ] 
    })"_json;
    LogStatus("`" + table.dump() + "`");
    LogStatus("`" + R"({"type": "button", "cmd": "coverAll", "name": "平仓"})"_json.dump() + "`");
    LogStatus("`" + R"({"type": "button", "class": "btn btn-xs btn-danger", "cmd": "coverAll", "name": "平仓"})"_json.dump() + "`");
}

Setel tombol status untuk dinonaktifkan, deskripsi fitur:

img

function main() {
    var table = {
        type: "table",
        title: "状态栏按钮的禁用、描述功能测试",
        cols: ["列1", "列2", "列3"], 
        rows: []
    }
    var button1 = {"type": "button", "name": "按钮1", "cmd": "button1", "description": "这是第一个按钮"}
    var button2 = {"type": "button", "name": "按钮2", "cmd": "button2", "description": "这是第二个按钮,设置为禁用", "disabled": true}
    var button3 = {"type": "button", "name": "按钮3", "cmd": "button3", "description": "这是第三个按钮,设置为启用", "disabled": false}
    table.rows.push([button1, button2, button3])
    LogStatus("`" + JSON.stringify(table) + "`")
}
import json
def main():
    table = {
        "type": "table",
        "title": "状态栏按钮的禁用、描述功能测试",
        "cols": ["列1", "列2", "列3"], 
        "rows": []
    }
    button1 = {"type": "button", "name": "按钮1", "cmd": "button1", "description": "这是第一个按钮"}
    button2 = {"type": "button", "name": "按钮2", "cmd": "button2", "description": "这是第二个按钮,设置为禁用", "disabled": True}
    button3 = {"type": "button", "name": "按钮3", "cmd": "button3", "description": "这是第三个按钮,设置为启用", "disabled": False}
    table["rows"].append([button1, button2, button3])
    LogStatus("`" + json.dumps(table) + "`")
void main() {
    json table = R"({
        "type": "table",
        "title": "状态栏按钮的禁用、描述功能测试",
        "cols": ["列1", "列2", "列3"], 
        "rows": []
    })"_json;
    json button1 = R"({"type": "button", "name": "按钮1", "cmd": "button1", "description": "这是第一个按钮"})"_json;
    json button2 = R"({"type": "button", "name": "按钮2", "cmd": "button2", "description": "这是第二个按钮,设置为禁用", "disabled": true})"_json;
    json button3 = R"({"type": "button", "name": "按钮3", "cmd": "button3", "description": "这是第三个按钮,设置为启用", "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() + "`");
}

Peraturan gaya tombol status:

img

function main() {
    var table = {
        type: "table",
        title: "状态栏按钮样式",
        cols: ["默认", "原始", "成功", "信息", "警告", "危险"], 
        rows: [
            [
                {"type":"button", "class": "btn btn-xs btn-default", "name": "默认"},
                {"type":"button", "class": "btn btn-xs btn-primary", "name": "原始"},
                {"type":"button", "class": "btn btn-xs btn-success", "name": "成功"},
                {"type":"button", "class": "btn btn-xs btn-info", "name": "信息"},
                {"type":"button", "class": "btn btn-xs btn-warning", "name": "告警"},
                {"type":"button", "class": "btn btn-xs btn-danger", "name": "危险"}
            ]
        ]
    }
    LogStatus("`" + JSON.stringify(table) + "`")
}
import json
def main():
    table = {
        "type": "table",
        "title": "状态栏按钮样式",
        "cols": ["默认", "原始", "成功", "信息", "警告", "危险"], 
        "rows": [
            [
                {"type":"button", "class": "btn btn-xs btn-default", "name": "默认"},
                {"type":"button", "class": "btn btn-xs btn-primary", "name": "原始"},
                {"type":"button", "class": "btn btn-xs btn-success", "name": "成功"},
                {"type":"button", "class": "btn btn-xs btn-info", "name": "信息"},
                {"type":"button", "class": "btn btn-xs btn-warning", "name": "告警"},
                {"type":"button", "class": "btn btn-xs btn-danger", "name": "危险"}
            ]
        ]
    }
    LogStatus("`" + json.dumps(table) + "`")
void main() {
    json table = R"({
        "type": "table",
        "title": "状态栏按钮样式",
        "cols": ["默认", "原始", "成功", "信息", "警告", "危险"], 
        "rows": [
            [
                {"type":"button", "class": "btn btn-xs btn-default", "name": "默认"},
                {"type":"button", "class": "btn btn-xs btn-primary", "name": "原始"},
                {"type":"button", "class": "btn btn-xs btn-success", "name": "成功"},
                {"type":"button", "class": "btn btn-xs btn-info", "name": "信息"},
                {"type":"button", "class": "btn btn-xs btn-warning", "name": "告警"},
                {"type":"button", "class": "btn btn-xs btn-danger", "name": "危险"}
            ]
        ]
    })"_json;
    LogStatus("`" + table.dump() + "`");
}

PenggabunganGetCommand()Fungsi, Fungsi interaktif tombol status:

function test1() {
    Log("调用自定义函数")
}

function main() {
    while (true) {
        var table = {
            type: 'table',
            title: '操作',
            cols: ['列1', '列2', 'Action'],
            rows: [
                ['a', '1', {
                    'type': 'button',                       
                    'cmd': "CoverAll",                      
                    'name': '平仓'                           
                }],
                ['b', '1', {
                    'type': 'button',
                    'cmd': 10,                              
                    'name': '发送数值'
                }],
                ['c', '1', {
                    'type': 'button',
                    'cmd': _D(),                          
                    'name': '调用函数'
                }],
                ['d', '1', {
                    'type': 'button',
                    'cmd': 'test1',       
                    'name': '调用自定义函数'
                }]
            ]
        }
        LogStatus(_D(), "\n", '`' + JSON.stringify(table) + '`')

        var str_cmd = GetCommand()
        if (str_cmd) {
            Log("接收到的交互数据 str_cmd:", "类型:", typeof(str_cmd), "值:", str_cmd)
            if(str_cmd == "test1") {
                test1()
            }
        }

        Sleep(500)
    }
}
import json
def test1():
    Log("调用自定义函数")

def main():
    while True:
        table = {
            "type": "table", 
            "title": "操作", 
            "cols": ["列1", "列2", "Action"],
            "rows": [
                ["a", "1", {
                    "type": "button", 
                    "cmd": "CoverAll",
                    "name": "平仓"
                }],
                ["b", "1", {
                    "type": "button",
                    "cmd": 10,
                    "name": "发送数值" 
                }], 
                ["c", "1", {
                    "type": "button",
                    "cmd": _D(),
                    "name": "调用函数" 
                }],
                ["d", "1", {
                    "type": "button",
                    "cmd": "test1",
                    "name": "调用自定义函数" 
                }]
            ]
        }

        LogStatus(_D(), "\n", "`" + json.dumps(table) + "`")
        str_cmd = GetCommand()
        if str_cmd:
            Log("接收到的交互数据 str_cmd", "类型:", type(str_cmd), "值:", str_cmd)
            if str_cmd == "test1":
                test1()
        Sleep(500)
void test1() {
    Log("调用自定义函数");
}

void main() {
    while(true) {
        json table = R"({
            "type": "table", 
            "title": "操作", 
            "cols": ["列1", "列2", "Action"],
            "rows": [
                ["a", "1", {
                    "type": "button", 
                    "cmd": "CoverAll",
                    "name": "平仓"
                }],
                ["b", "1", {
                    "type": "button",
                    "cmd": 10,
                    "name": "发送数值" 
                }], 
                ["c", "1", {
                    "type": "button",
                    "cmd": "",
                    "name": "调用函数" 
                }],
                ["d", "1", {
                    "type": "button",
                    "cmd": "test1",
                    "name": "调用自定义函数" 
                }]
            ]
        })"_json;
        table["rows"][2][2]["cmd"] = _D();
        LogStatus(_D(), "\n", "`" + table.dump() + "`");
        auto str_cmd = GetCommand();
        if(str_cmd != "") {
            Log("接收到的交互数据 str_cmd", "类型:", typeid(str_cmd).name(), "值:", str_cmd);
            if(str_cmd == "test1") {
                test1();
            }
        }
        Sleep(500);
    }
}

Ini juga mendukung input data saat tombol status built-in berinteraksi, dan instruksi interaksi akhirnya dibuat olehGetCommand()Fungsi menangkap. Tambah struktur data pada tombol kontrol pada status barinputContoh, untuk{"type": "button", "cmd": "open", "name": "开仓"}Meningkat"input": {"name": "开仓数量", "type": "number", "defValue": 1}Dengan mengklik tombol, sebuah pop-up dengan kontrol kotak masuk (data yang ditetapkan defValue sebagai default dalam kotak masuk) dapat muncul. Data yang dimasukkan dapat dikirim bersama dengan perintah tombol. Misalnya, saat menjalankan kode uji coba berikut, setelah mengklik tombol "Open Stock", pop-up dengan kotak masuk muncul, dan data yang dimasukkan ke dalam kotak masuk.111Setelah itu, klik "Konfirmasi".GetCommandFungsi ini akan menangkap pesan:open:111

function main() {
    var tbl = {
        type: "table",
        title: "操作",
        cols: ["列1", "列2"],
        rows: [
            ["开仓操作", {"type": "button", "cmd": "open", "name": "开仓", "input": {"name": "开仓数量", "type": "number", "defValue": 1}}],
            ["平仓操作", {"type": "button", "cmd": "coverAll", "name": "全部平仓"}]
        ] 
    }

    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": "操作", 
        "cols": ["列1", "列2"],
        "rows": [
            ["开仓操作", {"type": "button", "cmd": "open", "name": "开仓", "input": {"name": "开仓数量", "type": "number", "defValue": 1}}],
            ["平仓操作", {"type": "button", "cmd": "coverAll", "name": "全部平仓"}]
        ]
    }

    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": "操作", 
        "cols": ["列1", "列2"],
        "rows": [
            ["开仓操作", {"type": "button", "cmd": "open", "name": "开仓", "input": {"name": "开仓数量", "type": "number", "defValue": 1}}],
            ["平仓操作", {"type": "button", "cmd": "coverAll", "name": "全部平仓"}]
        ]
    })"_json;

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

PenggabunganLogStatus(Msg)Sel dalam tabel yang digambar fungsi:

  • Penggabungan secara horizontal

    function main() {
        var table = { 
            type: 'table', 
            title: '持仓操作', 
            cols: ['列1', '列2', 'Action'], 
            rows: [ 
                ['abc', 'def', {'type':'button', 'cmd': 'coverAll', 'name': '平仓'}]
            ]
        } 
        var ticker = exchange.GetTicker()
        // 添加一行数据,第一个和第二个单元格合并,并且输出ticker变量在合并后的单元格内
        table.rows.push([{body : JSON.stringify(ticker), colspan : 2}, "abc"])    
        LogStatus('`' + JSON.stringify(table) + '`')
    }
    
    import json
    def main():
        table = {
            "type" : "table",
            "title" : "持仓操作",
            "cols" : ["列1", "列2", "Action"],
            "rows" : [
                ["abc", "def", {"type": "button", "cmd": "coverAll", "name": "平仓"}]
            ]
        }
        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" : "持仓操作",
            "cols" : ["列1", "列2", "Action"],
            "rows" : [
                ["abc", "def", {"type": "button", "cmd": "coverAll", "name": "平仓"}]
            ]
        })"_json;
    
        auto ticker = exchange.GetTicker();
        json jsonTicker = R"({"Buy": 0, "Sell": 0, "High": 0, "Low": 0, "Volume": 0, "Last": 0, "Time": 0})"_json;
        jsonTicker["Buy"] = ticker.Buy;
        jsonTicker["Sell"] = ticker.Sell;
        jsonTicker["Last"] = ticker.Last;
        jsonTicker["Volume"] = ticker.Volume;
        jsonTicker["Time"] = ticker.Time;
        jsonTicker["High"] = ticker.High;
        jsonTicker["Low"] = ticker.Low;
    
        json arr = R"([{"body": {}, "colspan": 2}, "abc"])"_json;
        arr[0]["body"] = jsonTicker;
        table["rows"].push_back(arr);
        LogStatus("`" + table.dump() + "`");
    }
    

  • Penggabungan vertikal

    function main() {
        var table = { 
            type: 'table', 
            title: '表格演示', 
            cols: ['列A', '列B', '列C'], 
            rows: [ 
                ['A1', 'B1', {'type':'button', 'cmd': 'coverAll', 'name': 'C1'}]
            ]
        } 
    
        var ticker = exchange.GetTicker()
        var name = exchange.GetName()
    
        table.rows.push([{body : "A2 + B2:" + JSON.stringify(ticker), colspan : 2}, "C2"])
        table.rows.push([{body : "A3 + A4 + A5:" + name, rowspan : 3}, "B3", "C3"])
        // A3被上一行第一个单元格合并
        table.rows.push(["B4", "C4"])
        // A2被上一行第一个单元格合并
        table.rows.push(["B5", "C5"])                                            
        table.rows.push(["A6", "B6", "C6"])
        LogStatus('`' + JSON.stringify(table) + '`')
    }
    
    import json
    def main():
        table = {
            "type" : "table", 
            "title" : "表格演示", 
            "cols" : ["列A", "列B", "列C"], 
            "rows" : [
                ["A1", "B1", {"type": "button", "cmd": "coverAll", "name": "C1"}]
            ]
        }
        
        ticker = exchange.GetTicker()
        name = exchange.GetName()
        
        table["rows"].append([{"body": "A2 + B2:" + json.dumps(ticker), "colspan": 2}, "C2"])
        table["rows"].append([{"body": "A3 + A4 + A5:" + name, "rowspan": 3}, "B3", "C3"])
        table["rows"].append(["B4", "C4"])
        table["rows"].append(["B5", "C5"])
        table["rows"].append(["A6", "B6", "C6"])
        LogStatus("`" + json.dumps(table) + "`")
    
    void main() {
        json table = R"({
            "type" : "table", 
            "title" : "表格演示", 
            "cols" : ["列A", "列B", "列C"], 
            "rows" : [
                ["A1", "B1", {"type": "button", "cmd": "coverAll", "name": "C1"}]
            ]
        })"_json;
        // 为了测试,代码简短易读,这里使用构造的数据
        json jsonTicker = R"({"High": 0, "Low": 0, "Buy": 0, "Sell": 0, "Last": 0, "Time": 0, "Volume": 0})"_json;
        auto name = exchange.GetName();
        json arr1 = R"([{"body": "", "colspan": 2}, "C2"])"_json;
        arr1[0]["body"] = "A2 + B2:" + jsonTicker.dump();
        json arr2 = R"([{"body": "", "rowspan": 3}, "B3", "C3"])"_json;
        arr2[0]["body"] = "A3 + A4 + A5:" + name;
        table["rows"].push_back(arr1);
        table["rows"].push_back(arr2);
        table["rows"].push_back(R"(["B4", "C4"])"_json);
        table["rows"].push_back(R"(["B5", "C5"])"_json);
        table["rows"].push_back(R"(["A6", "B6", "C6"])"_json);
        LogStatus("`" + table.dump() + "`");
    }
    

Tabel status menampilkan halaman pembagian:

function main() {
    var table1 = {type: 'table', title: 'table1', cols: ['列1', '列2'], rows: [ ['abc', 'def'], ['ABC', 'support color #ff0000']]}
    var table2 = {type: 'table', title: 'table2', cols: ['列1', '列2'], rows: [ ['abc', 'def'], ['ABC', 'support color #ff0000']]}
    LogStatus('`' + JSON.stringify([table1, table2]) + '`')
}
import json
def main():
    table1 = {"type": "table", "title": "table1", "cols": ["列1", "列2"], "rows": [ ["abc", "def"], ["ABC", "support color #ff0000"]]}
    table2 = {"type": "table", "title": "table2", "cols": ["列1", "列2"], "rows": [ ["abc", "def"], ["ABC", "support color #ff0000"]]}
    LogStatus("`" + json.dumps([table1, table2]) + "`")
void main() {
    json table1 = R"({"type": "table", "title": "table1", "cols": ["列1", "列2"], "rows": [ ["abc", "def"], ["ABC", "support color #ff0000"]]})"_json;
    json table2 = R"({"type": "table", "title": "table2", "cols": ["列1", "列2"], "rows": [ ["abc", "def"], ["ABC", "support color #ff0000"]]})"_json;
    json arr = R"([])"_json;
    arr.push_back(table1);
    arr.push_back(table2);
    LogStatus("`" + arr.dump() + "`");
}

img

Selain dapat memisahkan halaman untuk menampilkan tabel, Anda juga dapat menampilkan beberapa tabel yang disusun dari atas ke bawah.

function main(){
    var tab1 = {
        type : "table",
        title : "表格1",
        cols : ["1", "2"],
        rows : []
    }
    var tab2 = {
        type : "table",
        title : "表格2",
        cols : ["1", "2", "3"],
        rows : []
    }
    var tab3 = {
        type : "table",
        title : "表格3",
        cols : ["A", "B", "C"],
        rows : []
    }

    tab1.rows.push(["jack", "lucy"])
    tab2.rows.push(["A", "B", "C"])
    tab3.rows.push(["A", "B", "C"])

    LogStatus('`' + JSON.stringify(tab1) + '`\n' + 
        '`' + JSON.stringify(tab2) + '`\n' +
        '`' + JSON.stringify(tab3) + '`')
  
    Log("exit")
}
import json
def main():
    tab1 = {
        "type": "table", 
        "title": "表格1", 
        "cols": ["1", "2"], 
        "rows": []
    }
    tab2 = {
        "type": "table", 
        "title": "表格2", 
        "cols": ["1", "2", "3"], 
        "rows": []
    }
    tab3 = {
        "type": "table", 
        "title": "表格3", 
        "cols": ["A", "B", "C"], 
        "rows": []
    }

    tab1["rows"].append(["jack", "lucy"])
    tab2["rows"].append(["A", "B", "C"])
    tab3["rows"].append(["A", "B", "C"])
    LogStatus("`" + json.dumps(tab1) + "`\n" + 
        "`" + json.dumps(tab2) + "`\n" + 
        "`" + json.dumps(tab3) + "`")
void main() {
    json tab1 = R"({
        "type": "table", 
        "title": "表格1", 
        "cols": ["1", "2"], 
        "rows": []
    })"_json;
    json tab2 = R"({
        "type": "table", 
        "title": "表格2", 
        "cols": ["1", "2", "3"], 
        "rows": []
    })"_json;
    json tab3 = R"({
        "type": "table", 
        "title": "表格3", 
        "cols": ["A", "B", "C"], 
        "rows": []
    })"_json;
    tab1["rows"].push_back(R"(["jack", "lucy"])"_json);
    tab2["rows"].push_back(R"(["A", "B", "C"])"_json);
    tab3["rows"].push_back(R"(["A", "B", "C"])"_json);
    LogStatus("`" + tab1.dump() + "`\n" + 
        "`" + tab2.dump() + "`\n" +
        "`" + tab3.dump() + "`");
}

Hasilnya:

Perhatikan: Ketika kebijakan berjalan pada disk, pada halaman disk, jika melihat kembali catatan sejarah, status bar akan masuk ke mode tidur dan berhenti diperbarui. Data status bar hanya akan diperbarui saat log pada halaman pertama. Dukungan untuk output pada status barbase64Gambar yang dienkode, juga mendukung output ke dalam tabel yang ditampilkan pada status barbase64Gambar yang dienkode. Gambar yang dienkode tidak lagi menampilkan kode contoh karena string data gambar yang dienkode biasanya sangat panjang.

EnableLog (()

EnableLog(IsEnable), catatan log yang membuka atau menutup informasi pesanan.isEnableUntuk jenis bulur.IsEnableSetel untukfalseTidak ada yang bisa dilakukan dengan cara ini, karena tidak ada yang bisa dilakukan dengan cara ini.

Grafik ((...)

Chart(...), fungsi gambar grafik yang disesuaikan.

Chart({...}), parameternya adalahJSONSerialHighStocksPerbedaanHighcharts.StockChartParameter. Tambah satu dari parameter asli.__isStockAtribut, jika ditentukan__isStock:false, akan ditampilkan sebagai grafik biasa.

Perhatikan: Jika sudah diatur__isStockAtributnya adalahfalseDia mengatakan, "Saya tidak tahu apa yang akan terjadi.HighchartDi bawah ini gambarnya:

Highcharts图表

Jika sudah diatur__isStockAtributnya adalahtrueDia mengatakan, "Saya tidak tahu apa yang akan terjadi.Stok tinggi(Default)__isStockUntuktrueDi sini kita bisa melihat beberapa contoh:

Highstocks图表

Kembali ke apa yang bisa Anda panggiladd(n, data)nUntukseriesIndeks (misalnya 0),dataUntuk data yang ditulis ke dalam grafik) ke indeks yang ditentukanseriesTambahkan data, hubungireset()Dia mengatakan, "Saya tidak tahu apa yang akan terjadi.resetAnda dapat menggunakan parameter angka untuk menentukan jumlah catatan yang akan disimpan.

Bisa dihubungiadd(n, data, i)iUntuk itu, dataseriesUntuk mengubah indeks yang sesuaiseriesData di bawah ini.

Bisa menjadi negatif, -1 adalah yang terakhir, -2 adalah yang kedua, misalnya ketika menggambar garis, mengubah data pada titik terakhir garis:

chart.add(0, [1574993606000, 13.5], -1)Perubahanseries[0].dataData dari titik pertama adalah bilangan bulat.

Dukungan untuk menampilkan beberapa grafik, hanya dengan memasukkan parameter array untuk konfigurasi, seperti:var chart = Chart([{...}, {...}, {...}])Jadi, contohnya, ada dua grafik.seriesDiagram 2 memilikiseriesDiagram 3 memilikiseriesJadi, bagaimana?addSaat menentukan ID deret 0 dan 1, yang mewakili data dari dua deret di update Chart 1,addSaat menentukan ID deret sebagai 2 menunjukkan yang pertama dari grafik 2.seriesDan jika kita menggunakan data, maka kita akan menentukan bahwa urutan 3 adalah yang pertama dari grafik 3.seriesData tersebut adalah:

HighStockshttp://api.highcharts.com/highstock

Di sini, Anda dapat melihat beberapa pengaturan properti yang terkait:Contoh

Contoh objek konfigurasi grafik:

var cfgA = {
    extension: {
        // 不参于分组,单独显示,默认为分组 'group'
        layout: 'single', 
        // 指定高度,可以设置为字符串,"300px",设置数值300会自动替换为"300px"
        height: 300,      
        // 指定宽度占的单元值,总值为12
        col: 8            
    },
    title: {
        text: '盘口图表'
    },
    xAxis: {
        type: 'datetime'
    },
    series: [{
        name: '买一',
        data: []
    }, {
        name: '卖一',
        data: []
    }]
}

var cfgB = {
    title: {
        text: '差价图'
    },
    xAxis: {
        type: 'datetime'
    },
    series: [{
        name: '差价',
        type: 'column',
        data: []
    }]
}

var cfgC = {
    __isStock: false,
    title: {
        text: '饼图'
    },
    series: [{
        type: 'pie',
        name: 'one',
        // 指定初始数据后不需要用add函数更新,直接更改图表配置就可以更新序列
        data: [                    
            ["A", 25],
            ["B", 25],
            ["C", 25],
            ["D", 25]
        ]                
    }]
}

var cfgD = {
    extension: {
        layout: 'single',
        // 指定宽度占的单元值,总值为12
        col: 8,                    
        height: '300px'
    },
    title: {
        text: '盘口图表'
    },
    xAxis: {
        type: 'datetime'
    },
    series: [{
        name: '买一',
        data: []
    }, {
        name: '卖一',
        data: []
    }]
}

var cfgE = {
    __isStock: false,
    extension: {
        layout: 'single',
        col: 4,
        height: '300px'
    },
    title: {
        text: '饼图2'
    },
    series: [{
        type: 'pie',
        name: 'one',
        data: [
            ["A", 25],
            ["B", 25],
            ["C", 25],
            ["D", 25]
        ]
    }]
}
cfgA = {
    "extension" : {
        "layout" : "single", 
        "height" : 300,
        "col" : 8
    }, 
    "title" : {
        "text" : "盘口图表"
    },
    "xAxis" : {
        "type" : "datetime" 
    }, 
    "series" : [{
        "name" : "买一",
        "data" : []
    }, {
        "name" : "卖一", 
        "data" : []
    }]
}    

cfgB = {
    "title" : {
        "text" : "差价图"
    }, 
    "xAxis" : {
        "type" : "datetime"
    }, 
    "series" : [{
        "name" : "差价", 
        "type" : "column", 
        "data" : []
    }]
}    

cfgC = {
    "__isStock" : False,
    "title" : {
        "text" : "饼图"
    }, 
    "series" : [{
        "type" : "pie", 
        "name" : "one", 
        "data" : [
            ["A", 25],
            ["B", 25],
            ["C", 25],
            ["D", 25]
        ]
    }]
}    

cfgD = {
    "extension" : {
        "layout" : "single",
        "col" : 8,
        "height" : "300px"
    }, 
    "title" : {
        "text" : "盘口图表"
    }, 
    "series" : [{
        "name" : "买一", 
        "data" : []
    }, {
        "name" : "卖一",
        "data" : []
    }]
}    

cfgE = {
    "__isStock" : False, 
    "extension" : {
        "layout" : "single", 
        "col" : 4,
        "height" : "300px"
    }, 
    "title" : {
        "text" : "饼图2"
    },
    "series" : [{
        "type" : "pie",
        "name" : "one", 
        "data" : [
            ["A", 25], 
            ["B", 25], 
            ["C", 25], 
            ["D", 25]
        ]
    }]
}
json cfgA = R"({
    "extension" : {
        "layout" : "single", 
        "height" : 300,
        "col" : 8
    }, 
    "title" : {
        "text" : "盘口图表"
    },
    "xAxis" : {
        "type" : "datetime" 
    }, 
    "series" : [{
        "name" : "买一",
        "data" : []
    }, {
        "name" : "卖一", 
        "data" : []
    }]
})"_json;    

json cfgB = R"({
    "title" : {
        "text" : "差价图"
    }, 
    "xAxis" : {
        "type" : "datetime"
    }, 
    "series" : [{
        "name" : "差价", 
        "type" : "column", 
        "data" : []
    }]
})"_json;    

json cfgC = R"({
    "__isStock" : false,
    "title" : {
        "text" : "饼图"
    }, 
    "series" : [{
        "type" : "pie", 
        "name" : "one", 
        "data" : [
            ["A", 25],
            ["B", 25],
            ["C", 25],
            ["D", 25]
        ]
    }]
})"_json;    

json cfgD = R"({
    "extension" : {
        "layout" : "single",
        "col" : 8,
        "height" : "300px"
    }, 
    "title" : {
        "text" : "盘口图表"
    }, 
    "series" : [{
        "name" : "买一", 
        "data" : []
    }, {
        "name" : "卖一",
        "data" : []
    }]
})"_json;    

json cfgE = R"({
    "__isStock" : false, 
    "extension" : {
        "layout" : "single", 
        "col" : 4,
        "height" : "300px"
    }, 
    "title" : {
        "text" : "饼图2"
    },
    "series" : [{
        "type" : "pie",
        "name" : "one", 
        "data" : [
            ["A", 25], 
            ["B", 25], 
            ["C", 25], 
            ["D", 25]
        ]
    }]
})"_json;
  • cfgA.extension.layoutKarakteristik

    Jika atribut ini ditetapkan dengan nilai "single", grafik tidak akan ditumpuk (tidak akan ditampilkan dengan tag berbelah halaman) dan akan ditampilkan secara terpisah (ditampilkan datar).

  • cfgA.extension.heightKarakteristik

    Atribut ini digunakan untuk mengatur ketinggian grafik, nilai dapat diatur sebagai tipe angka, atau dengan cara "300px".

  • cfgA.extension.colKarakteristik

    Properti ini digunakan untuk mengatur lebar grafik, dengan lebar halaman dibagi menjadi 12 unit, dengan pengaturan 8 berarti grafik memiliki lebar 8 unit.

    Perangkat lunak ini dapat digunakan untuk membuat aplikasi yang lebih mudah diakses oleh pengguna.

    Dalam contoh di atas, objek konfigurasi grafik menunjukkan efek:

  • Data pada objek konfigurasi grafik, mengubah konfigurasi grafik secara langsung, dan kemudian memperbarui grafik untuk mencapai pembaruan data:

    Di sini kita bisa melihat beberapa contoh.JavaScriptParagraf kode bagian dari contohContoh lengkap):

    cfgC.series[0].data[0][1] = Math.random() * 100
    cfgE.series[0].data[0][1] = Math.random() * 100
    // update实际上等于重置了图表的配置
    chart.update([cfgA, cfgB, cfgC, cfgD, cfgE])
    

    DiperbolehkanaddMetode untuk memperbarui data, misalnya menambahkan sebuah item ke pie chart.JavaScriptParagraf kode bagian dari contohContoh lengkap):

    // 为饼图增加一个数据点,add只能更新通过add方式添加的数据点,内置的数据点无法后期更新
    chart.add(3, {
        name: "ZZ",
        y: Math.random() * 100
    })
    
  • Penggunaan tambahanChartContoh fungsi

    Contoh gambar sederhana:

    // 这个chart在JavaScript语言中是对象,在使用Chart函数之前我们需要声明一个配置图表的对象变量chart
    var chart = {                                           
        // 该字段标记图表是否为一般图表,有兴趣的可以改成false运行看看
        __isStock: true,                                    
        // 缩放工具
        tooltip: {xDateFormat: '%Y-%m-%d %H:%M:%S, %A'},    
        // 标题
        title : { text : '差价分析图'},                       
        // 选择范围
        rangeSelector: {                                    
            buttons:  [{type: 'hour',count: 1, text: '1h'}, {typ

Lebih banyak

QQ89520Ada satu masalah, apakah fungsi_C akan mencoba lagi atau hanya sekali saja.

Haiwwhai_C ((function, args...) Apakah ini default 3s? Apakah Anda bisa mengubah default untuk langsung menempatkan _CDelay ((1000) sebelum _C ((function, args...)?

makan siangCluster: Jika Anda membuat 1000 robot secara bersamaan, dan tidak ada stres, Anda dapat membuat beberapa administrator untuk mendistribusikan tugas. Apakah ada contoh kode untuk membangun cluster? Bagaimana membangun beberapa host untuk mendistribusikan tugas

Wangij1Log ((talib.help (('MACD')); hanya dapat digunakan di bawah js, Python tidak memiliki atribut talib.help...

cjz140Apa perbedaan antara fungsi _C ((function, args...) dan fungsi Sleep, yang menurut saya berarti menunggu untuk mencoba lagi?

3263243yBagaimana cara menghapus ErrorFilter setelah SetErrorFilter? tanpa menyaring pesan kesalahan.

QQ47898077Apakah ada cara lain untuk menggunakan perpustakaan pihak ketiga?

QQ47898077Apa yang harus diisi oleh kelas induk jika Anda ingin mewarisi obyek bursa yang mendefinisikan kelas baru?

ethanwuApakah ada alat debugging lokal?

penglihengApa itu exange.IO (status)?

penglihengMengapa fungsi sell berwarna abu-abu, apakah fungsi representasi tidak tersedia lagi?

penglihengMengapa fungsi sell berwarna abu-abu, apakah fungsi representasi tidak tersedia lagi?

penglihengJS tidak bisa bahasa Inggris, haha, jadi saya ingin bertanya apakah Anda mendukung ES6.

penglihengJS tidak bisa bahasa Inggris, haha, jadi saya ingin bertanya apakah Anda mendukung ES6.

Don.Bagaimana cara menulis garis tengah volume?

TurtleJika tidak berhasil, apa yang akan dikembalikan jika Anda membeli di exchange.Buy.1000 dengan harga pasar?

Anak laki-laki NingFonts baru ini bagus.

kuda nilJaringan pengujian Bitmex ((testnet.bitmex.com) juga memiliki antarmuka API, tetapi saat ini pertukaran hanya dapat memilih Bitmex home station, alamat dokumen API adalah https://testnet.bitmex.com/app/apiOverview Bagaimana cara mendukungnya?

Cxjijinvar ret1 = exchanges[0].IO (("api", "future_estimated_price", "symbol=btc_usd"); Log (('ok futures estimated delivery price', ret1); https://dn-filebox.qbox.me/d1ed268c1e75753c5d289447d279aa9d81e41b5f.png Jika Anda menggunakan antarmuka yang berbeda, mengapa Anda menulis laporan kesalahan?

allenfrostlineApakah ada perbedaan antara realTicker dan Ticker? Baru-baru ini ada strategi untuk menulis ulang paket yang muncul pada saat yang sama, tetapi tampaknya tidak ada yang disebutkan dalam API yang pertama.

penglihatanHalo, sebagai seorang pengembang Python, apa yang menurut Anda ditulis dalam dokumen API Anda? Beberapa antarmuka fungsi bidang terlihat aneh, bisakah Anda menulis dokumen seperti githubpage dan readdocs?

allenfrostlineGetAccount: [EAPI:Rate limit exceeded] Mau tanya bagaimana cara mengatasinya? selain itu saya tidak punyaqq atau ada kelompok WeChat seperti itu? terima kasih

zhjx2314Tidak mendukung StochRSI, apakah bisa ditambahkan secepatnya?

yhfggPada saat itu, apakah skrip berada di server Ali Cloud sendiri atau di botvs cluster?

yhfggApa versi python yang Anda gunakan?

FkyslyGetFee harus diartikan sebagai sebuah struktur yang dikembalikan oleh Fee, dengan satu kata yang hilang.

ZkwapBagaimana cara memanggil talib menggunakan js?

yhfggMinta dokumentasi python

Wmjbs123Apakah background kode editor strategi bisa berwarna hitam? mata putih berbintik-bintik, menulis kode di malam hari, mudah dekat.

Don.Bagaimana cara menyetel ringkasan dalam pesan WeChat robot?

Angka-AngkaApakah saya bisa menambahkan bidang harga rata dalam struktur order?

Anak kecil.GetOrders: mendapatkan semua pesanan yang belum selesai, mengembalikan struktur Array Order, dalam perdagangan Bitcoin ETH di Cina, hanya mengembalikan 10 item terbaru.

yhfggFungsi matematika yang dibutuhkan untuk menggunakan probabilitas statistik, di mana?

jiebangApakah nilai yang dikembalikan dari fungsi $.Cross ((x, y) ini berarti apa?

Nama Ibu SayaLogReset ini akan mengosongkan semua log, dan dapat menggunakan parameter angka untuk menentukan jumlah catatan yang akan disimpan. Bagaimana cara menghapus beberapa log terbaru?

edwardgywFungsi CORRE di talib tampaknya tidak dipindahkan atau hilang?

Gunung miskin YangyangTampaknya tidak ada fitur referensi indikator!

KecilBagaimana waktu k-line yang dibaca diterjemahkan menjadi waktu sekarang oh, saya tidak mengerti, terlalu lama satu, diselesaikan, terima kasih

KecilBagaimana cara menulis angka di array, saya menggunakan records.remove (rekords[0]) sepertinya tidak bisa.

ularayuJika Anda ingin menggunakan ATR, Anda harus menggunakan ATR yang ada di jam-jam.

ularayuJika Anda ingin menggunakan ATR, Anda harus menggunakan ATR yang ada di jam-jam.

57278863Belajar bagaimana futures tradisional mendapatkan harga dan pesanan, maaf, akarnya tipis.

KirinIni adalah contoh dari perdagangan futures tradisional!

KecilApakah Anda bisa menulis contoh tentang perdagangan futures tradisional?

KecilBagaimana cara mencetak status kepemilikan, bagaimana cara saya mencetak adalah [object object], bagaimana cara mendapatkan status kepemilikan multi-objek dan kosong, dan juga GetTicker (), bagaimana cara mendapatkan minggu, minggu berikutnya, dan kuartal pada minggu itu.

CxjijinApakah bursa berjangka dapat mendapatkan pasar dengan GetTicker (??), dan apakah pasar yang dikembalikan adalah jenis kontrak (??) minggu ini, minggu berikutnya, dll.?

MenjualApakah ada indikator lain yang bisa ditambahkan untuk StochRSI?

MomoxCancelOrder ((orderId) Menghapus sebuah order berdasarkan nomor order, mengembalikan true atau false, tanya true= sel berhasil dibatalkan, kan?

Momox_G(K, V) Tabel global yang dapat disimpan Apakah metode ini menyimpan variabel global yang dapat digunakan untuk berbagi data antara kebijakan yang berbeda?

fluffy3dKeberhasilan yang luar biasa

Tidak adaAnda dapat mengatur ulang log pendapatan dengan LogProfitReset. Sejarah pada grafik pendapatan sebelumnya tidak ada.

xcyApakah Anda bisa menyalin EA secara langsung?

sjironmanSaya merasa platform ini luar biasa, luar biasa, lebih banyak interaksi dalam kelompok.

KecilBahasa apa itu, apakah ada bahan untuk belajar?

JxhbtcData error selama seminggu, tidak bisa terhubung ke robot, bagaimana cara menyelesaikannya?

DyahhuApakah indeks TA hanya untuk menghitung harga penutupan?

btcrobotHai, dunia.

Mimpi kecilFungsi _C akan mencoba lagi tanpa berpikir sampai hasilnya berhasil.

Mimpi kecilPerpustakaan talib untuk python perlu diinstal. https://www.botvs.com/bbs-topic/669 dapat dilihat di posting ini.

Mimpi kecilSleep adalah program yang tidak melakukan apa-apa, menunggu parameter yang ditetapkan dalam hitungan millisecond, _C adalah fungsi yang kembali memanggil parameter yang dikirimkan.

Mimpi kecilTanpa perlu mewarisi, JS langsung terbungkus pada objek {name: "objek baru", old_exchange : exchange[0],...... }

Mimpi kecilAda editor lokal, plugin sinkronisasi jarak jauh, yang pada dasarnya adalah editor lokal, debugging jarak jauh.

Mimpi kecilAnda bisa datang ke grup QQ, dan bisa mendiskusikannya.

Mimpi kecilDalam dokumentasi API, warna abu-abu berarti bahwa fungsi ini tidak memiliki penjelasan yang terlalu luas, menunjukkan representasi abu-abu dan biru. Ada lebih banyak penjelasan, itu saja.

Mimpi kecilES6 saat ini tidak didukung, ^^

Mimpi kecilAnda bisa masuk ke grup QQ Saya, jelaskan masalahnya, saya akan menjawabnya ^^

Mimpi kecilJika Anda tidak mau membeli, maka Anda harus membayarnya.

TurtleOKCoin, misalnya, jika jumlah yang dibeli melebihi jumlah yang dimiliki, apa yang akan dikembalikan?

Mimpi kecilSaya akan kembalikan nomor pesanan di OK Futures, dan saya akan kembalikan nomor pesanan di OK Futures.

Tidak adaSudah mendukung pertukaran transaksi pada saat berjalan, perlu mengunduh host terbaru. Dukungan Bter/Poloniex Rincian API dokumentasi Fungsi transaksi Tab deskripsi di bawah ((mengosongkan cache browser setelah refresh jika tidak terlihat)

Mimpi kecilQQ saya, saya akan membantu Anda mencari jawabannya.

Rumah Tangga yang BerkarirJika Anda ingin membuat daftar putih, saya akan mengatur IP host.

Mimpi kecilIni adalah tautan bawah tanah yang tidak dibuat. Server tidak merespons. Apakah alamat IP ditetapkan saat permintaan API KEY?

Rumah Tangga yang BerkarirIni sangat memalukan... saya tidak bisa menjalankan strategi yang telah gagal pada era bitcoin, GetAccount tidak dapat mengakses GetAccount: Post http://api.btc38.com/v1/getMyBalance.php: read tcp 192.168.0.227:58596->211.149.148.144:80: wsarecv: A connection attempt failed because the connected party did not properly respond after a period of time, or established connection failed because connected host has failed to respond. 2017-05-23 21:08:24 Era Bitcoin Kesalahan GetAccount: timeout 2017-05-23 21:08:02 Era Bitcoin Kesalahan GetAccount: timeout 2017-05-23 21:07:40 Era Bites Kesalahan GetAccount: timeout 2017-05-23 21:07:20 Membuat halaman berisi "Membuat halaman berisi 'Membuat halaman berisi 'Membuat halaman berisi 'Membuat halaman berisi 'Membuat halaman berisi 'Membuat halaman berisi 'Membuat halaman berisi 'Membuat halaman berisi 'Membuat halaman berisi 'Membuat halaman berisi 'Membuat halaman berisi 'Membuat halaman berisi 'Membuat halaman berisi 'Membuat halaman berisi ' Apakah itu masalah daftar putih IP???

Mimpi kecilServer bursa tidak merespon, protokol TCP tidak dibangun, tiga kali berjabat tangan tidak dilakukan.

Rumah Tangga yang BerkarirA connection attempt failed because the connected party did not properly respond after a period of time, atau "Percobaan koneksi gagal karena pihak yang terhubung tidak merespons dengan benar setelah periode waktu".

Mimpi kecilHalo! Ini adalah fungsi exchange.IO (api, ApiName, Args) yang tidak didukung, lihat https://www.botvs.com/bbs-topic/812

Rumah Tangga yang BerkarirPercobaan koneksi gagal karena pihak yang terhubung tidak merespon dengan benar setelah periode waktu,

Rumah Tangga yang BerkarirApakah Era Bitcoin Tidak Mendukung?

Mimpi kecilhttps://dn-filebox.qbox.me/a709b30c6cc0a3565234b9e0c99b073f7ba8b454.png Saya tidak tahu apa yang harus dilakukan.

Anak laki-laki NingSebagai contoh, saya ingin melakukan perdagangan mata uang penuh dengan poloniex, tetapi hanya beberapa mata uang yang didukung oleh BOTvs, dan exchange.IO tampaknya tidak mendukung Pnet.

Mimpi kecilAnda dapat memanggilnya sebagai exchange.IO.

Anak laki-laki NingBagaimana dengan API yang membutuhkan verifikasi akun?

Mimpi kecilJika API yang tidak memerlukan validasi akun dapat digunakan dengan httpQuery (lihat dokumentasi BotVS untuk lebih lanjut), API transaksi sebenarnya membutuhkan akses.

Mimpi kecilAnda dapat menggunakan HttpQuery untuk mengirim parameter API: https://www.okcoin.com/api/v1/future_estimated_price.do?symbol=btc_usd. Untuk API pertukaran yang tidak memerlukan verifikasi akun, langsung gunakan fungsi HttpQuery di platform, yang terkait dengan akun menggunakan IO API (IO tidak mendukung API pasar yang tidak memerlukan verifikasi ini). Posting: https://www.botvs.com/bbs-topic/850

penglihatanTerima kasih banyak, semoga ada dokumentasi API yang bagus.

Mimpi kecilSaya ingin tahu di mana saya melihat API realTicker?

Mimpi kecilhttps://dn-filebox.qbox.me/fe1a6f5563ed43a5357f858ecf8a50239619228e.png Dokumen API adalah bahasa JavaScript. Deskripsi, versi python. Deskripsi di bagian atas halaman Komunitas Komunitas.

Tidak adaHalo, terima kasih atas saran, dokumen API sedang dibangun ulang.

Mimpi kecilHello~ yang menunjukkan bahwa frekuensi akses telah melampaui batas. https://dn-filebox.qbox.me/a09498920d04cac62624b7438a058d2098d8fb00.png Apakah Anda menggunakan fungsi Sleep ((1000) dalam kebijakan?, 1000 ini adalah untuk membuat program berhenti sejenak per putaran, dapat diatur sendiri, tujuannya adalah untuk mengontrol program Akses frekuensi API, karena beberapa bursa menetapkan batas akses maksimum, waktu tertentu melebihi jumlah kunjungan tertentu akan menolak akses, memblokir alamat IP.

Mimpi kecilhttps://dn-filebox.qbox.me/c29ab7fc279e1b758355f137907cf52dc8257df6.png Saya sendiri menulis bahwa indikator STOCHRSI yang telah di bandingkan dengan OK, sepakat bahwa kecepatan agak lambat dan harus dioptimalkan, sementara tersedia.

Tidak adaAnda dapat memilih untuk meng-retest di server yang disediakan oleh botvs atau di server host Anda sendiri, versi adalah 2.7.5

Mimpi kecil"Mengharukan" adalah ungkapan yang sering diucapkan.

Mimpi kecilSekarang Anda dapat mengkonfigurasi gaya latar belakang Anda sendiri.

Mimpi kecilDokumen python sedang ditulis.

Mimpi kecilTalib Library mendukung ini.

hzzgood48 https://www.botvs.com/bbs-topic/276

Mimpi kecilTampaknya ada contoh di Strategy Square, https://www.botvs.com/strategy/15098

Tidak adaAkses properti AvergPrice untuk Order, yang didukung oleh pertukaran, dan yang tidak didukung oleh pertukaran akan selalu memiliki properti 0.

yhfggBagaimana sumber-sumber informasi pihak ketiga mengutip?

Tidak adaJika mathjs tidak dapat memuaskan kebutuhannya, maka hanya perlu mencari kebijakan copy-import dari library pihak ketiga. Untuk kecepatan kompilasi, sistem hanya memiliki sejumlah kecil library internal.

Mimpi kecilTidak sopan, ada masalah di grup Anda bisa M saya - saya pada dasarnya online.

jiebangTerima kasih.

Mimpi kecilAnda bisa melihat di kolom komentar, analisis kode dari perpustakaan perdagangan mata uang digital, dan di dalamnya ada komentar tentang fungsi $.Cross.

Tidak adaTidak dapat menghapus yang terbaru, hanya menyimpan beberapa yang terbaru... menghapus semua yang lama sebelum itu.

KirinUntuk mendapatkan setiap posisi dengan posisi [i], posisi adalah suatu array.

Anak laki-laki Ningexchange.GetRecords ((PERIOD_D1));

KirinFutur tradisional saya selalu berteriak "GetAccount: not login", "Password tidak salah, tidak bisa login", "GetAccount: not login", "GetAccount: not login", "Password tidak salah, tidak bisa login", "GetAccount: not login", "GetAccount: not login", "Password tidak salah, tidak bisa login", "GetAccount: tidak login", "GetAccount: not login", "Password tidak salah, tidak bisa login", "GetAccount: tidak login", "GetAccount: tidak login", "Password tidak salah, tidak bisa masuk", "GetAccount: tidak masuk", "GetAccount: tidak masuk", "GetAccount: tidak masuk", "GetAccount: tidak masuk", "GetAccount: tidak masuk", "Gain: tidak masuk"

Tidak adaJika Anda memilih untuk mengklik SetContractType, maka Anda akan mendapatkan SetContractType.

Tidak adaSeperti yang kita lihat, true adalah nilai yang dikembalikan dari tindakan membatalkan order yang dikembalikan oleh bursa, tetapi pembatalan sebenarnya tidak dibatalkan, tergantung pada bagaimana hal itu ditangani di dalam bursa.

Momox3q

Tidak ada(Tidak demikian) sampai suatu waktu (yang telah dipisahkan).

xuanxuanTentu saja tidak, itu eksklusif untuk MT4.

Tidak adaJavascript tersedia di mana-mana di internet.

MenjualApakah masalah Anda sudah diselesaikan?

Tidak adaSebagian besar dari data yang masuk bisa langsung menjadi rekaman atau sebuah array harga murni.