Pencipta Kuantiti API Dokumen

Penulis:Mimpi kecil, Dicipta: 2017-11-27 09:05:08, Dikemas kini: 2023-07-12 16:47:31

Apabila data telah diterima, dan susulan mula menggunakan mekanisme pengawasan EventLoop, peristiwa ini terlepas pandang. // Kejadian-kejadian ini tidak akan terlepas kecuali jika panggilan EventLoop ((-1) bermula pada baris pertama kod dan mekanisme pengawasan EventLoop dipromosikan 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 terbina dalam

_G(K, V)

_G(K, V)Fungsi ini mencapai fungsi kamus global yang boleh disimpan, yang disokong oleh kedua-dua retest dan cakera sebenar. Setelah retest selesai, data yang disimpan akan dihapuskan. Struktur data adalahKVJadual, kekal sebagai fail tempatan, setiap cakera berasingan dengan pangkalan data, kekal selepas dimulakan semula atau pengurus keluar.KDi sini, anda perlu menulis sebagai strings, tanpa membedakan saiz kecil dan besar.Vboleh digunakan untuk apa-apaJSONKandungan yang disusun secara berurutan._G()Apabila fungsi dan tidak menghantar sebarang parameter,_G()Fungsi ini akan kembali pada cakera sebenar sekarang.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_GApabila menyimpan data dengan fungsi yang kekal, memori dan ruang cakera keras peranti perkakasan harus digunakan dengan wajar dan tidak boleh disalahgunakan; jika tidak, boleh menyebabkanKebocoran ingatanPerlukah kita cuba?

_D ((Timestamp, Fmt)

_D(Timestamp, Fmt), Mengembalikan senar masa yang sesuai dengan senar masa yang ditentukan.TimestampUntuk jenis nilai, nilai adalah bilangan mili saat.FmtUntuk jenis strings,FmtPerkataan yang tersirat:yyyy-MM-dd hh:mm:ss, Kembali nilai: jenis baris. Mengembalikan senar yang sesuai dengan senar masa yang ditetapkan (mm) tanpa menghantar sebarang parameter untuk mengembalikan masa semasa; contohnya:_D()atau_D(1478570053241)Format lalai ialahyyyy-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()Pada masa yang sama, parameter yang perlu diperhatikan adalah parameter waktu pada tahap saat.JavaScriptC++Dalam strategi ini, satu detik sama dengan 1000 milisekod). Digunakan pada masa sebenar_D()Fungsi yang menguraikan timestamp sebagai rentetan masa yang boleh dibaca memerlukan perhatian kepada zon masa, tetapan masa, dan tetapan masa sistem operasi di mana program hos berada._D()Fungsi menguraikan sebuah senar masa sebagai senar masa yang boleh dibaca yang ditetapkan berdasarkan masa sistem hosts.

Sebagai contoh, satu timestamp adalah1574993606000Mengulas menggunakan kod:

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(Nombor, ketepatan)

_N(Num, Precision), Formatkan nombor titik terapung.NumUntuk jenis nilai,PrecisionUntuk jenis keseluruhan. Mengembalikan nilai: jenis bilangan.

Contohnya:_N(3.1415, 2)akan dihapuskan3.1415Nilai dua digit selepas 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 titik kecil menjadi 0, anda boleh 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 semula, digunakan untuk mendapatkan transaksi, mendapatkan pesanan yang belum selesai, dan lain-lain.

Antara muka akan terus memanggil fungsi tertentu sehingga berjaya mengembalikan ((parameter)functionMengembalikan nilai kosong ataufalsePerkhidmatan telefon bimbit akan dihidupkan semula (contohnya:_C(exchange.GetTicker)Jika anda tidak mahu, anda boleh mengklik "Selesai" untuk menghidupkan semula._CDelay(...)Fungsi untuk menetapkan selang uji semula, contohnya_CDelay(1000)Mengenai perubahan_CFungsi akan diuji semula pada selang 1 saat.

Untuk fungsi berikut:

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

Semua boleh diterima._C(...)Fungsi untuk memanggil kesalahan._C(function, args...)Fungsi tidak terhad kepada fungsi yang disenaraikan di atas, parameterfunctionFungsi merujuk bukan panggilan fungsi. Perhatikan_C(exchange.GetTicker)Bukan_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);
}

Digunakan untuk fungsi yang mempunyai parameter_C(...)Apabila salah:

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

Ia juga boleh digunakan untuk membetulkan kesalahan fungsi tersuai:

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++ 不支持这种方式对于自定义函数容错

_Silang ((Arr1, Arr2)

_Cross(Arr1, Arr2)Kembali kepada Arrayarr1denganarr2Jumlah kitaran persimpangan. Nombor positif untuk kitaran naik, nombor negatif untuk kitaran turun, 0 untuk harga semasa. Nilai parameter: Array jenis nombor.

Ia boleh meniru satu set ujian 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

Menggambarkan data simulasi untuk pengamatan

img

Maklumat penggunaan:Fungsi terbina dalam_Cross analisis dan panduan penggunaan

JSONParse ((strJson)

JSONParse(strJson)Fungsi ini digunakan untuk menguraikan strings JSON. Fungsi ini digunakan untuk menguraikan strings JSON yang mengandungi nilai nombor yang lebih besar.

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 tersuai

Setiap baris mesej boleh digunakan.#ff0000Nilai RGB seperti ini pada akhir, mewakili pemandangan depan yang perlu dipaparkan.#ff0000112233Dalam format ini, enam nombor terakhir mewakili warna latar belakang.

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

Maklumat log

Maklumat log semasa pemacuan diska sebenar disimpan dalam pangkalan data diska sebenar, yang digunakan oleh pangkalan data diska sebenarsqlite3Peranti di mana fail pangkalan data berada, fail pangkalan data pada cakera, fail pangkalan data di mana fail pangkalan data beradarobotPerisian yang boleh dilaksanakan) di dalam direktori. Contohnya:130350file database cakera pada../logs/storage/130350Di dalam katalog ini..Maksudnya,robotdirektori di mana program pentadbir berada), fail pangkalan data dipanggil130350.db3Saya tidak tahu. Log dalam sistem retargeting boleh diklik di sudut kanan bawah halaman retargeting selepas retargeting selesai.Muat turun log] butang untuk memuat turun. Apabila perlu memindahkan cakera pada pelayan lain, pentadbir boleh memindahkan fail pangkalan data pada cakera tersebut (dengan pelanjutan yang dinamakan fail pangkalan data db3) ke pelayan sasaran pemindahan, dan menetapkan nama fail sebagai ID cakera yang sepadan pada platform. Dengan cara ini, semua maklumat log pada cakera sebelumnya tidak akan hilang kerana pemindahan ke peranti baru.

Log ((...)

Log(message), Simpan mesej ke senarai log.messageIa boleh menjadi jenis apa sahaja. Jika anda menambah selepas baris.@Mesej akan dimasukkan ke dalam barisan push, dan akan dihantar ke kotak e-mel, Telegram, WebHook, dan lain-lain yang dikonfigurasikan dalam tetapan push akaun pelabur masa kini.Pusat KawalanHalaman, sudut kanan atasTetapan akaunHalaman:Tetapan PushPeraturan halaman terikat) ].

Perhatikan:

  • Push tidak disokong dalam Debug Tool.
  • "Sistem Pemulihan" tidak menyokong push.
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@");
}

WebHookPenghantaran:

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

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

Selepas menjalankan program perkhidmatan, pelaksanaan strategi, strategi mendorong maklumat:

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

Mengambil dan menghantar, program perkhidmatan mencetak maklumat:

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}

Percetakanbase64Gambar yang telah dikodkan LogFungsi menyokong pencetakanbase64Gambar yang dikodkan untuk digunakan dalam`Bermula dengan:`Perkataan ini juga boleh digunakan untuk mengkritik parti-parti politik.

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

LogSokongan pencetakan langsungPythonPerbezaanmatplotlib.pyplotobjek, selagi objek itu mengandungisavefigIa boleh dilakukan secara langsung.LogMenerbitkan, contohnya:

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

Log cetak menukar bahasa secara automatik LogFungsi ini menyokong pertukaran bahasa.LogFungsi output teks yang akan beralih secara automatik 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 rugi dan rugi, mencetak nilai rugi dan rugi dan melukis kurva pendapatan berdasarkan nilai rugi dan rugi; nilai parameter:KeuntunganUntuk jenis nombor.

Fungsi ini boleh ditulis dengan huruf&Akhirnya, hanya membuat carta pendapatan dan tidak mencetak log pendapatan, contohnya:LogProfit(10, '&')

LogProfitReset (()

LogProfitReset(), kosongkan semua log pendapatan, boleh menggunakan parameter nilai bilangan bulat, tentukan rekod yang 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)Maklumat ini tidak disimpan ke dalam senarai log, hanya mengemas kini maklumat status cakera semasa, yang boleh dipanggil beberapa kali di atas kawasan log halaman cakera sebenar. Nilai parameter:MsgIa boleh digunakan untuk jenis apa sahaja.

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

LogStatus(Msg)Sokongan cetakbase64Gambar yang dikodkan untuk digunakan dalam`Bermula dengan:`Perkataan ini juga boleh digunakan untuk mengkritik parti-parti politik.LogStatus("`data:image/png;base64,AAAA`")LogStatus(Msg)Sokongan streaming langsungPythonPerbezaanmatplotlib.pyplotobjek, selagi objek itu mengandungisavefigCara ini boleh disebarkan.LogStatus(Msg)Fungsi seperti:

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

Contoh output data dalam tetingkap status:

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() + "`");
}

Mengatur butang status untuk dimatikan, menerangkan ciri:

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() + "`");
}

Setelan butang 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() + "`");
}

GabunganGetCommand()Fungsi, membina fungsi interaksi butang 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);
    }
}

Ia juga menyokong input data ketika butang status pembina berinteraksi, arahan interaksi akhirnya digunakan olehGetCommand()Fungsi menangkap. Menambah struktur data untuk kawalan butang dalam tetingkap statusinputPeruntukan, contohnya{"type": "button", "cmd": "open", "name": "开仓"}Peningkatan"input": {"name": "开仓数量", "type": "number", "defValue": 1}, anda boleh membuat butang muncul dengan tetingkap kawalan kotak input apabila diklik (data yang ditetapkan defValue pada kotak input dengan nilai lalai 1, data yang ditetapkan defValue) dan data yang dimasukkan boleh dihantar bersama dengan perintah butang. Sebagai contoh, kod ujian berikut berjalan, tetingkap muncul dengan tetingkap kotak input setelah anda mengklik butang "Membuka".111Kemudian klik "Konfirmasi".GetCommandFungsi ini akan menangkap mesej: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 jadual yang digambar oleh fungsi:

  • Penggabungan berhampiran

    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 menegak

    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() + "`");
    }
    

Jadual status yang dipaparkan di halaman:

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 memaparkan borang yang berbelah halaman, anda juga boleh memaparkan pelbagai borang 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: Apabila dasar ini berjalan pada cakera sebenar, jika anda melihat semula catatan sejarah pada halaman cakera sebenar, tetingkap status akan masuk ke keadaan tidur dan berhenti diperbaharui. Hanya data tetingkap status akan diperbaharui apabila log pada halaman pertama. Sokongan untuk output pada tetingkap statusbase64Gambar yang diekodkan, juga menyokong output ke dalam jadual yang dipaparkan di bar statusbase64Gambar yang telah diekodkan. Gambar yang telah diekodkan tidak lagi menunjukkan kod contoh kerana strings data gambar yang telah diekodkan biasanya sangat panjang.

EnableLog ((()

EnableLog(IsEnable), catatan log yang membuka atau menutup maklumat pesanan. Nilai parameter:isEnableUntuk jenis Bull.IsEnableTetapkan sebagaifalseDalam kes ini, anda tidak perlu mencetak log pesanan anda dan tidak perlu menulisnya ke dalam pangkalan data cakera sebenar.

Jadual ((...)

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

Chart({...}), parameter bolehJSONPeringkatHighStocksPerbezaanHighcharts.StockChartParameter.. tambah satu daripada parameter asal__isStockSifat, jika ditetapkan__isStock:false, akan dipaparkan sebagai grafik biasa.

Perhatikan: Jika ditetapkan__isStockSifatfalseGambar yang digunakan ialah:Carta tinggiDi bawah ini adalah gambar:

Highcharts图表

Jika ditetapkan__isStockSifattrueGambar yang digunakan ialah:Stok tinggi(Penggunaan lalai)__isStockuntuktrue), seperti yang ditunjukkan dalam gambar:

Highstocks图表

Kembali ke apa yang boleh dipanggiladd(n, data)nuntukseriesIndeks (seperti 0),dataUntuk data yang akan ditulis ke dalam grafik) ke indeks yang ditentukanseriesTambah data, panggilreset()Menghapuskan data grafik,resetIa boleh menggunakan parameter nombor untuk menentukan jumlah baris yang disimpan.

Boleh hubungiadd(n, data, i)iUntuk itu, dataseriesPeranti yang digunakan untuk menukar indeksseriesData yang terdapat di bawah ini.

Ia boleh menjadi negatif, -1 menunjukkan yang terakhir, -2 adalah bilangan negatif kedua, contohnya, apabila menggambar garis, data pada titik terakhir baris diubah:

chart.add(0, [1574993606000, 13.5], -1)Perubahanseries[0].dataData pada titik pertama bilangan negatif.

Sokongan untuk memaparkan pelbagai carta, dengan hanya memasukkan parameter matriks semasa persediaan, seperti:var chart = Chart([{...}, {...}, {...}])Contohnya, satu grafik mempunyai dua.seriesGambar 2, ada satu.seriesGambar 3, ada satu.seriesJadi,addApabila menentukan ID siri 0 dan 1 untuk mewakili data dua siri dalam Rajah 1 yang dikemas kini,addApabila menetapkan ID siri sebagai 2 menunjukkan yang pertama dalam grafik 2.seriesData, yang menunjukkan siri 3 merujuk kepada yang pertama dalam Rajah 3.seriesData ini menunjukkan bahawa:

HighStockshttp://api.highcharts.com/highstock

Gambar berbilang menunjukkan beberapa tetapan sifat yang berkaitan: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.layoutSifat

    Jika sifat ini ditetapkan dengan nilai "single", carta tidak akan ditumpuk (tidak akan dipaparkan sebagai tag berpecah halaman) dan akan dipaparkan secara berasingan (paparkan rata).

  • cfgA.extension.heightSifat

    Sifat ini digunakan untuk menetapkan ketinggian carta, nilai boleh ditetapkan sebagai jenis angka, atau dengan cara "300px".

  • cfgA.extension.colSifat

    Aptit ini digunakan untuk menetapkan lebar carta, lebar halaman dibahagikan kepada 12 unit, dengan tetapan 8 bermaksud carta ini mempunyai lebar 8 unit.

    Menggunakan strategi paradigma yang lengkap:

    Objek konfigurasi grafik dalam contoh di atas menunjukkan kesan:

  • Mengubah data pada objek konfigurasi carta secara langsung, dan kemudian mengemas kini carta untuk mengemas kini data:

    Contohnya,JavaScriptParagraf kod sebahagian daripada 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])
    

    DibenarkanaddCara untuk mengemas kini data, seperti menambah item pada pie chart.JavaScriptParagraf kod sebahagian daripada contohContoh Lengkap):

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

    Contoh gambar mudah:

    // 这个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 lanjut

qq89520Terdapat satu masalah, adakah fungsi C akan cuba semula atau hanya sekali sahaja.

Haiwwhai_C ((function, args...) ini adalah 3s secara lalai? Adakah anda boleh menukar secara lalai untuk meletakkan _CDelay ((1000) sebelum _C ((function, args...)?

makan malamKluster: Jika anda mencipta 1000 bot secara serentak, tanpa tekanan, anda boleh mencipta beberapa pengurus untuk menyebarkan tugas. Terdapat contoh kod untuk membina kluster? Bagaimana untuk membina pelbagai hos untuk mengagihkan tugas

wangyj1Log ((talib.help (('MACD')); hanya boleh digunakan di bawah js, Python tidak mempunyai sifat talib.help...

cjz140Apakah perbezaan antara fungsi _C (function, args...) dan fungsi Sleep, yang saya rasa bermaksud menunggu untuk mencuba semula?

3263243yBagaimana untuk mengosongkan ErrorFilter selepas SetErrorFilter? tanpa menapis mesej ralat.

qq47898077Adakah ada cara lain untuk menggunakan perpustakaan pihak ketiga?

qq47898077Apakah yang harus diisi oleh kelas induk jika anda ingin mewarisi kelas baru yang ditakrifkan oleh objek bursa?

ethanwuAdakah terdapat alat debugging tempatan?

penglihengApakah exange.IO (("status") itu?

penglihengAdakah fungsi sell tidak boleh digunakan lagi? by boleh digunakan, bagaimana untuk menjual?

penglihengAdakah fungsi sell tidak boleh digunakan lagi? by boleh digunakan, bagaimana untuk menjual?

penglihengJS tak pandai bahasa Inggeris, haha, nak tanya support ES6 tak?

penglihengJS tak pandai bahasa Inggeris, haha, nak tanya support ES6 tak?

Don.Bagaimana kita menulis garis tengah bagi volume?

ZjuturtleApakah yang akan dikembalikan jika tidak berjaya membeli pada harga pasaran?

Lelaki NingFonts baru ini nampak cantik.

ikan hippopotamusRangkaian ujian Bitmex ((testnet.bitmex.com) juga mempunyai antara muka API, tetapi pada masa ini pertukaran hanya boleh memilih stesen utama Bitmex, alamat dokumen API adalah https://testnet.bitmex.com/app/apiOverview Bagaimana anda boleh menyokongnya?

cxjijinvar ret1 = exchanges[0].IO (("api", "future_estimated_price", "symbol=btc_usd"); Log (('ok niaga hadapan anggaran harga penghantaran', ret1); https://dn-filebox.qbox.me/d1ed268c1e75753c5d289447d279aa9d81e41b5f.png Jika anda menggunakan antara muka lain untuk membuat laporan kesalahan, mengapa?

AllenfrostlineSaya ingin bertanya apa perbezaan antara realTicker dan Ticker? Strategi untuk menulis semula suite baru-baru ini muncul pada masa yang sama tetapi tidak kelihatan ada sebutan dalam API yang pertama.

penglihatanHalo, sebagai pemaju Python, apa yang anda rasa dokumen API anda menulis? beberapa antara muka fungsi bidang kelihatan pelik, bolehkah anda menulis dokumen seperti githubpage dan readdocs?

AllenfrostlineGetAccount: [EAPI: Rate limit exceeded] Nak tanya bagaimana ini boleh diselesaikan?

zhjx2314Tidak menyokong StochRSI, boleh ditambah secepat mungkin

yhfggAdakah skrip di pelayan awan Ali sendiri atau botvs cluster?

yhfggApakah versi python yang anda gunakan?

FkyslyPenerangan GetFee sepatutnya ialah yang mengembalikan struktur Fee, minus satu kata.

zkwapAdakah cara memanggil talib menggunakan js?

yhfggMemeriksa dokumentasi Python

Wmjbs123Adakah latar belakang kod editor strategi boleh menjadi hitam? mata putih yang menusuk, menulis kod pada waktu malam, mudah rabun.

Don.Bagaimana untuk menetapkan ringkasan dalam akhbar WeChat robot?

Bilangan: GilaBolehkah anda menambah satu bidang dengan harga sama dalam struktur pesanan?

Anak kecil.GetOrders: Dapatkan semua pesanan yang belum selesai, kembalikan struktur array Order, dalam perdagangan Bitcoin ETH di China, hanya mengembalikan 10 item yang paling baru, apakah terdapat fungsi yang mengembalikan semua pesanan yang belum selesai di China Bitcoin ETH, yang bermaksud platform lain boleh menggunakan GetOrders untuk mengembalikan semua, hanya hantu ini Cina Bitcoin kembali 10 item,

yhfggFungsi matematik yang diperlukan untuk teori kebarangkalian statistik, di mana ia digunakan?

jiebangApakah maksud nilai pulangan fungsi $.Cross ((x, y)?

Nama ibu sayaLogReset akan mengosongkan semua log, dengan parameter nombor untuk menentukan rekod yang akan disimpan Bagaimana untuk memadamkan beberapa log terkini?

EdwardgywAdakah fungsi CORRE dalam talib seolah-olah tidak dipindahkan atau terlepas?

Gunung miskin Yang YangTidak kelihatan ada ciri rujukan penunjuk!

KecilSaya tidak faham, terlalu lama, selesai, terima kasih

KecilBagaimana untuk menulis nombor dalam array, saya menggunakan records.remove ((records[0]) seolah-olah tidak berfungsi

ularayuJika anda menggunakan ATR, anda boleh menggunakan ATR pada hari-hari.

ularayuJika anda menggunakan ATR, anda boleh menggunakan ATR pada hari-hari.

57278863Belajar bagaimana untuk mendapatkan harga dan pesanan pada niaga hadapan tradisional, maaf, asasnya tipis.

kirinContoh perdagangan niaga hadapan tradisional!

KecilBolehkah anda menulis contoh perdagangan niaga hadapan tradisional?

KecilBagaimana saya boleh mencetak status simpanan, bagaimana saya boleh mencetak status simpanan obyek, bagaimana saya boleh mendapatkan status simpanan simpanan simpanan dan simpanan kosong, dan juga GetTicker (), bagaimana saya boleh mendapatkan harga minggu, minggu berikutnya, dan suku pada minggu itu. Saya menulis minggu, minggu berikutnya, dan suku pada minggu itu.

cxjijinAdakah bursa niaga hadapan boleh menggunakan GetTicker untuk mendapatkan pasaran? Apakah jenis pasaran kontrak yang dikembalikan (minggu, minggu seterusnya...)?

MenjualAdakah anda boleh menambah StochRSI?

momoxCancelOrder ((orderId) untuk membatalkan pesanan berdasarkan nombor pesanan, kembalikan true atau false, tanya true= sel telah berjaya dibatalkan, betul?

momox_G(K, V) boleh disimpan global dictionary Adakah kaedah ini menyimpan global variabel yang boleh digunakan untuk berkongsi data antara dasar yang berbeza?

flufy3dKemasukan

SifarAnda boleh menetapkan semula log pendapatan dengan menggunakan LogProfitReset.

xyBolehkah anda menyalin EA secara langsung?

sjironmanSaya rasa platform ini sangat hebat, lebih banyak interaksi dalam kumpulan.

KecilBahasa apa ini, ada bahan untuk belajar?

jxhbtcData error seminggu tidak boleh disambungkan ke bot.

DyahhuAdakah indeks TA hanya untuk mengira harga penutupan?

btcrobotHai, dunia.

Mimpi kecilFungsi _C akan mencuba semula tanpa berfikir sehingga hasil yang berjaya diperoleh.

Mimpi kecilPerpustakaan talib untuk python memerlukan pemasangan.https://www.botvs.com/bbs-topic/669 boleh lihat catatan ini.

Mimpi kecilSleep ialah program yang tidak melakukan apa-apa, menunggu parameter ditetapkan dalam beberapa mili saat, _C ialah fungsi yang dipanggil semula sekali parameter yang dihantar.

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

Mimpi kecilTerdapat penyunting tempatan, pemalam sinkronisasi jauh, yang pada dasarnya adalah penyunting tempatan, debugging jauh.

Mimpi kecilBoleh datang ke kumpulan QQ,^^ mudah dibincangkan~

Mimpi kecilDalam dokumentasi API, warna kelabu bermaksud fungsi ini tidak mempunyai banyak penjelasan yang terbuka, menunjukkan wakil kelabu, biru mempunyai lebih banyak penjelasan, dan itu sahaja.

Mimpi kecilES6 tidak disokong buat masa ini ^^

Mimpi kecilBoleh ke kumpulan QQ saya, jelaskan soalan saya, saya akan menjawab ^^

Mimpi kecilJika anda membeli barang yang tidak sesuai dengan harga yang anda inginkan, anda akan mendapat satu kesilapan dan anda tidak akan membuat pesanan (yang sebenarnya adalah membeli, tidak cukup wang!)

ZjuturtleSebagai contoh, OKCoin, jika jumlah yang dibeli melebihi jumlah yang dipegang, apa yang akan dikembalikan?

Mimpi kecilSaya akan kembalikan satu nombor pesanan di OK Futures.

SifarSudah menyokong pertukaran transaksi pada masa berjalan, memerlukan muat turun hos terkini. Sokongan Bter/Poloniex Perincian API dokumentasi Fungsi urus niaga gambar di bawah ((bersihkan cache penyemak imbas dan kemas semula jika tidak dapat dilihat)

Mimpi kecilQQ saya, saya akan membantu anda mencari soalan anda.

Ibu bapa profesionalJika anda ingin membuat senarai putih, saya akan menetapkan IP hos?

Mimpi kecilIni adalah pautan bawah tanah yang tidak dibuat pelayan tidak bertindak balas. Adakah anda menetapkan alamat IP semasa meminta API KEY?

Ibu bapa profesionalIni memalukan... Saya ok boleh menjalankan strategi yang telah gagal pada zaman 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 Zaman Bitcoin Kesilapan GetAccount: timeout 2017-05-23 21:08:02 Zaman Bitcoin Kesilapan GetAccount: timeout 2017-05-23 21:07:40 Zaman Bitcoin Kesilapan GetAccount: timeout 2017-05-23 21:07:20 Mulakan semula Adakah masalah senarai putih IP???

Mimpi kecilPelayan pertukaran tidak bertindak balas, protokol TCP tidak ditubuhkan dan tiga kali berjabat tangan tidak dilakukan.

Ibu bapa profesionalA connection attempt failed because the connected party did not properly respond after a period of time. A connection attempt failed because the connected party did not properly respond after a period of time. A connection attempt failed because the connected party did not properly respond after a period of time.

Mimpi kecilHello! Saya bercakap mengenai fungsi exchange.IO (api, ApiName, Args) yang tidak disokong, lihat https://www.botvs.com/bbs-topic/812

Ibu bapa profesionalPercubaan sambungan gagal kerana pihak yang disambungkan tidak bertindak balas dengan betul selepas tempoh masa,

Ibu bapa profesionalAdakah Zaman Bit tidak menyokong?

Mimpi kecilhttps://dn-filebox.qbox.me/a709b30c6cc0a3565234b9e0c99b073f7ba8b454.png Mungkin boleh.

Lelaki NingSebagai contoh, saya ingin melakukan perdagangan semua mata wang untuk poloniex, tetapi hanya beberapa mata wang yang disokong oleh BOTvs, dan exchange.IO nampaknya tidak menyokong Pnet.

Mimpi kecilIa boleh dipanggil sebagai exchange.IO.

Lelaki NingBagaimana pula dengan API yang memerlukan pengesahan akaun?

Mimpi kecilJika API yang tidak memerlukan pengesahan akaun boleh digunakan dengan httpQuery (lihat dokumentasi BotVS), API urus niaga sebenar memerlukan akses.

Mimpi kecilParameter boleh dihantar menggunakan API HttpQuery: https://www.okcoin.com/api/v1/future_estimated_price.do?symbol=btc_usd. Untuk API pertukaran yang tidak memerlukan pelaksanaan pengesahan akaun, gunakan fungsi HttpQuery di platform secara langsung, yang berkaitan dengan akaun hanya menggunakan IO API (IO tidak menyokong API pelaksanaan yang tidak memerlukan pengesahan ini). Posting: https://www.botvs.com/bbs-topic/850

penglihatanTerima kasih, saya berharap anda mempunyai dokumentasi API yang baik.

Mimpi kecilDi mana anda boleh melihat API realTicker?

Mimpi kecilhttps://dn-filebox.qbox.me/fe1a6f5563ed43a5357f858ecf8a50239619228e.png Dokumen API adalah bahasa JavaScript. Disebutkan, versi python dijelaskan di bahagian atas halaman Komuniti Komuniti Perbuatan.

SifarHi, terima kasih atas cadangan, dokumen API sedang dibina semula.

Mimpi kecilSelamat datang ~ menunjukkan bahawa frekuensi akses melebihi had. https://dn-filebox.qbox.me/a09498920d04cac62624b7438a058d2098d8fb00.png Adakah anda menggunakan fungsi Sleep (1000) dalam dasar anda?, 1000 ini adalah untuk menghentikan program selama satu saat setiap pusingan, yang boleh ditetapkan sendiri, tujuan adalah untuk mengawal frekuensi program mengakses API, kerana beberapa bursa menetapkan had akses maksimum, masa tertentu melebihi jumlah lawatan tertentu akan menolak akses, menyekat alamat IP.

Mimpi kecilhttps://dn-filebox.qbox.me/c29ab7fc279e1b758355f137907cf52dc8257df6.png Saya sendiri menulis bahawa STOCHRSI yang telah dibandingkan dengan OK adalah agak perlahan dan perlu dioptimumkan sementara.

SifarAnda boleh memilih untuk mengulang semula pada pelayan yang disediakan oleh botvs atau pelayan hos anda sendiri, versi adalah 2.7.5

Mimpi kecilSaya tidak tahu apa yang akan berlaku.

Mimpi kecilSekarang anda boleh menyesuaikan gaya latar belakang anda sendiri.

Mimpi kecilDokumen python sedang ditulis.

Mimpi kecilTalib Library boleh disokong.

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

Mimpi kecilRupanya terdapat contoh di Strategy Square, https://www.botvs.com/strategy/15098

SifarAkses kepada sifat AvergPrice Order, yang boleh disokong oleh bursa, dan yang tidak disokong oleh bursa akan sentiasa mempunyai sifat 0.

yhfggBagaimana sumber pihak ketiga mengutip?

SifarJika mathjs tidak dapat memuaskan permintaan, maka ia hanya boleh mencari dasar penyalinan salinan dari perpustakaan pihak ketiga. Untuk mempercepatkan penyusunan, sistem hanya membina beberapa perpustakaan.

Mimpi kecilTidak sopan, ada masalah dalam kumpulan boleh M saya - saya pada dasarnya online.

jiebangTerima kasih.

Mimpi kecilAnda boleh lihat nota-nota mengenai perpustakaan kod pertukaran mata wang digital, di mana terdapat nota mengenai fungsi $.Cross.

SifarTidak dapat memadamkan yang terbaru, hanya menyimpan beberapa yang terkini... memadamkan semua yang lama sebelum ini.

kirinUntuk mendapatkan setiap pegangan dengan posisi [i], kedudukan adalah satu aritmatika

Lelaki Ningpertukaran.GetRecords ((PERIOD_D1));

kirinFitur niaga hadapan tradisional saya selalu memberi isyarat: "GetAccount: not login", "Password tidak salah, tidak boleh log masuk", "GetAccount: not login", "Password tidak salah, tidak boleh log masuk".

SifarSetContractType diperlukan untuk mendapatkan SetContractType yang ditentukan.

SifarSeperti yang anda lihat, ini adalah nilai pulangan untuk tindakan membatalkan pesanan yang dikembalikan oleh bursa, tetapi pembatalan sebenarnya tidak dibatalkan, bergantung kepada bagaimana ia diuruskan di dalam bursa.

momox3q

Sifar"Tidaklah demikian, kerana ia adalah tempat yang terpencil.

xuanxuanSudah tentu tidak, itu eksklusif untuk MT4.

SifarJavascript ada di mana-mana di internet.

MenjualAdakah masalah anda diselesaikan?

SifarKebanyakan data yang anda masukkan boleh berupa rekod secara langsung atau merupakan satu set harga murni.