Các nhà phát minh định lượng tài liệu API

Tác giả:Giấc mơ nhỏ, Tạo: 2017-11-27 09:05:08, Cập nhật: 2023-07-12 16:47:31

Tuy nhiên, một số người cho rằng các cuộc tấn công trên mạng xã hội đã được thực hiện bởi các tổ chức mạng xã hội khác, trong đó có cả các tổ chức truyền thông và mạng xã hội khác. // Các sự kiện này sẽ không bị bỏ lỡ trừ khi bắt đầu gọi EventLoop ((-1) trong dòng mã đầu tiên và khởi động cơ chế nghe của EventLoop trước

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

Chức năng tích hợp

_G(K, V)

_G(K, V)Chức năng này thực hiện một chức năng từ điển toàn cầu có thể lưu, hỗ trợ cả tra cứu và ổ đĩa thực. Sau khi tra cứu kết thúc, dữ liệu được lưu sẽ được xóa. cấu trúc dữ liệuKVBảng, một tập tin được lưu trữ tại địa phương vĩnh viễn, mỗi ổ đĩa có một cơ sở dữ liệu riêng biệt, tồn tại sau khi khởi động lại hoặc người quản lý rời khỏi.KBạn phải viết bằng một chuỗi, không phân biệt kích thước nhỏ hay lớn.VCó thể dùng cho bất cứ điều gì.JSONNội dung được sắp xếp._G()Khi một hàm không truyền bất kỳ tham số nào,_G()Chức năng trả về ổ đĩa hiện tạiID

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

Lưu ý: Sử dụng_GKhi lưu trữ dữ liệu chức năng lâu dài, nên sử dụng hợp lý bộ nhớ, không gian ổ cứng của thiết bị phần cứng và không được lạm dụng; nếu không có thể gây ra các vấn đề khác.Sự tràn ngập trí nhớCác bạn có thể đọc bài viết này nhé.

_D ((Thức thời gian, Fmt)

_D(Timestamp, Fmt), Trả về một chuỗi thời gian tương ứng với một timestamp được chỉ định.TimestampĐối với loại giá trị, giá trị là số millisecond.FmtBạn có thể sử dụng các loại hình khác nhau.FmtNhìn ngắm:yyyy-MM-dd hh:mm:ss, trả về giá trị: kiểu chuỗi. Trả về một chuỗi tương ứng với một dấu thời gian được chỉ định ((mlseconds) và trả về thời gian hiện tại mà không cần truyền bất kỳ tham số nào; ví dụ:_D()Hoặc_D(1478570053241)Định dạng mặc định làyyyy-MM-dd hh:mm:ss

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

Lưu ý:PythonSử dụng trong chiến lược_D()Trong khi đó, cần lưu ý rằng các tham số được truyền là các bước thời gian ở cấp độ giây.JavaScriptC++Trong chiến lược này, thời gian được tính theo cấp độ millisecond, 1 giây bằng 1000 millisecond). Sử dụng trong đĩa thực_D()Các hàm phân tích một timestamp thành một chuỗi thời gian có thể đọc, cần chú ý đến vùng thời gian, cài đặt thời gian của hệ điều hành mà chương trình quản trị đang ở._D()Chế độ phân tích một chuỗi thời gian là một chuỗi thời gian có thể đọc được dựa trên thời gian của hệ thống quản lý.

Ví dụ, một timestamp là1574993606000Sử dụng mã phân tích:

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(Num, chính xác)

_N(Num, Precision), định dạng một số trôi.NumCác loại giá trịPrecisionĐối với kiểu trọn vẹn. Trả về giá trị: kiểu số.

Ví dụ:_N(3.1415, 2)sẽ bị xóa3.1415Các giá trị sau hai chữ số nhỏ, hàm trả về3.14

function main(){
    var i = 3.1415
    Log(i)
    var ii = _N(i, 2)
    Log(ii)
}
def main():
    i = 3.1415
    Log(i)
    ii = _N(i, 2)
    Log(ii)
void main() {
    auto i = 3.1415;
    Log(i);
    auto ii = _N(i, 2);
    Log(ii);
}

Nếu bạn muốn biến tất cả các vị trí ở bên trái của số số nhỏ thành 0, bạn có thể viết như sau:

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...)Chức năng này là chức năng thử lại, được sử dụng để lấy giao diện, lấy các đơn đặt hàng chưa hoàn thành, v.v.

Giao diện này sẽ liên tục gọi hàm chỉ định cho đến khi thành công trong việc trả về ((parameter)functionTrả về giá trị trống khi gọi hàm được tham chiếu hoặcfalseVí dụ:_C(exchange.GetTicker)Bạn có thể gọi cho các thiết bị này bằng cách sử dụng thiết bị này._CDelay(...)Các hàm để thiết lập khoảng thời gian thử lại, ví dụ:_CDelay(1000)Đề cập đến thay đổi_CPhân đoạn thử lại hàm là 1 giây.

Đối với các hàm sau:

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

Có thể thông qua_C(...)Chức năng gọi cho phép lỗi._C(function, args...)Các hàm không giới hạn trong các hàm được liệt kê ở trên, các tham sốfunctionĐây là một chức năng tham chiếu chứ không phải là một chức năng gọi._C(exchange.GetTicker)Không phải_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);
}

Sử dụng cho các hàm có tham số_C(...)Khi phạm sai:

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

Có thể sử dụng để xử lý lỗi cho các chức năng tùy chỉnh:

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)Trả vềarr1arr2Số lượng các chu kỳ chéo của. Một số tích cực là chu kỳ đi lên, một số âm là chu kỳ đi xuống, 0 là giá hiện tại. Một số lượng số liệu là một số lượng.

Bạn có thể mô phỏng một bộ dữ liệu thử nghiệm._Cross(Arr1, Arr2)Chức năng:

// 快线指标
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

Xem hình ảnh dữ liệu mô phỏng để quan sát

img

Hướng dẫn sử dụng cụ thể:Built-in function_Cross phân tích và hướng dẫn sử dụng

JSONParse ((strJson)

JSONParse(strJson), chức năng này được sử dụng để phân tích các chuỗi JSON. Có thể phân tích chính xác các chuỗi JSON có chứa các giá trị số lớn hơn, sẽ phân tích các giá trị số lớn hơn theo kiểu chuỗi. Hệ thống trả lại không hỗ trợ chức năng này.

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));   // 不支持该函数
}

Màu tùy chỉnh

Bạn có thể sử dụng bất kỳ chuỗi tin nhắn nào.#ff0000Giá trị RGB cuối cùng, đại diện cho cảnh quan cần hiển thị.#ff0000112233Trong hình thức này, sáu chữ cái sau đại diện cho màu nền.

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

Thông tin nhật ký

Thông tin nhật ký trong khi ổ đĩa thực chạy được ghi lại trong cơ sở dữ liệu của ổ đĩa thực, sử dụng cơ sở dữ liệu của ổ đĩa thựcsqlite3Cơ sở dữ liệu, ổ đĩa cơ sở dữ liệu tài liệu trên thiết bị mà chương trình quản lý, tài liệu cơ sở dữ liệu trên chương trình quản lýrobotCác ứng dụng có thể được thực thi) trong thư mục. Ví dụ:130350Các tập tin cơ sở dữ liệu trên ổ đĩa../logs/storage/130350Trong danh mục này..Đó làrobotCác tập tin trong cơ sở dữ liệu được đặt tên là130350.db3‖ Các nhật ký trong hệ thống kiểm tra có thể được kiểm tra sau khi kết thúc, bấm vào góc dưới bên phải của trang kiểm tra.Tải xuống nhật ký[Bấm nút để tải xuống]. Khi cần phải di chuyển ổ đĩa sang máy chủ khác, người quản lý có thể di chuyển tệp cơ sở dữ liệu trên ổ đĩa (còn mở rộng tên là tệp cơ sở dữ liệu db3) đến máy chủ mục tiêu di chuyển, đặt tên tệp thành ID ổ đĩa tương ứng trên nền tảng.

Lịch sử

Log(message), lưu một tin nhắn vào danh sách nhật ký.messageCó thể là bất kỳ loại nào. Nếu bạn thêm vào sau một chuỗi@Các thông điệp sẽ được đẩy vào hàng đợi và được đẩy đến hộp thư, Telegram, WebHook, v.v. được cấu hình trong cài đặt đẩy của tài khoản nền tảng giao dịch định lượng hiện tại của nhà phát minh.Trung tâm điều khiểnTrang, góc trên bên phảiThiết lập tài khoảnTrang web của Facebook:Thiết lập đẩyTrang được thiết lập và gắn kết) ‖

Lưu ý:

  • Các công cụ này không hỗ trợ đẩy.
  • Không hỗ trợ đẩy trong hệ thống kiểm tra lại.
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@");
}

WebHookĐẩy:

Sử dụngGolangDEMO là một chương trình dịch vụ được viết bởi:

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

Thiết lậpWebHookhttp://XXX.XX.XXX.XX:9090/data?data=Hello_FMZ

Sau khi chạy chương trình dịch vụ, thực hiện các chiến lược, các chiến lược đẩy thông tin:

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

Sau khi nhận được tin nhắn, chương trình dịch vụ in tin:

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}

inbase64Hình ảnh sau khi mã hóa LogHỗ trợ inbase64Những hình ảnh được mã hóa để sử dụng`Bắt đầu với`Cuối cùng, ví dụ:

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

LogHỗ trợ in trực tiếpPythoncủamatplotlib.pyplotĐối tượng, miễn là đối tượng bao gồmsavefigCách này có thể trực tiếpLogCác công ty khác cũng có thể sử dụng dịch vụ này.

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

Giao thức tự động chuyển đổi ngôn ngữ LogCác chức năng hỗ trợ chuyển đổi ngôn ngữ.LogChức năng xuất văn bản sẽ tự động chuyển sang ngôn ngữ tương ứng dựa trên ngôn ngữ được đặt trên trang nền tảng, ví dụ:

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

LogProfit ((Lợi nhuận)

LogProfit(Profit), ghi lại giá trị lợi nhuận và lỗ, in giá trị lợi nhuận và lỗ và vẽ đường cong lợi nhuận dựa trên giá trị lợi nhuận và lỗ. Giá trị tham số:Lợi nhuậnĐây là loại giá trị.

Chức năng này được thể hiện bằng các ký tự&Cuối cùng, chỉ vẽ biểu đồ thu nhập mà không in nhật ký thu nhập, ví dụ:LogProfit(10, '&')

LogProfitReset (()

LogProfitReset(), xóa tất cả các nhật ký thu nhập, có thể sử dụng một tham số giá trị số nguyên để chỉ định mục được lưu.

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), thông tin này không được lưu trong danh sách nhật ký, chỉ cập nhật thông tin trạng thái của ổ đĩa hiện tại, được hiển thị trên thanh trạng thái phía trên khu vực nhật ký của trang ổ đĩa, có thể gọi nhiều lần trạng thái cập nhật. Giá trị tham số:MsgCó thể sử dụng bất kỳ kiểu nào.

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

LogStatus(Msg)Hỗ trợ inbase64Những hình ảnh được mã hóa để sử dụng`Bắt đầu với`Cuối cùng, ví dụ:LogStatus("`data:image/png;base64,AAAA`")LogStatus(Msg)Hỗ trợ truyền trực tiếpPythoncủamatplotlib.pyplotĐối tượng, miễn là đối tượng bao gồmsavefigCác phương pháp có thể được truyền vàoLogStatus(Msg)Các hàm, ví dụ:

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

Ví dụ về việc xuất dữ liệu trong thanh trạng thái:

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

Thiết lập nút trạng thái tắt, mô tả chức năng:

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

Các thiết lập phong cách của nút trạng thái:

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

Kết hợpGetCommand()Các chức năng, cấu trúc nút trạng thái và chức năng tương tác:

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

Ngoài ra, hỗ trợ nhập dữ liệu khi các nút trạng thái được cấu trúc để tương tác, lệnh tương tác cuối cùng được thực hiện bởiGetCommand()Chụp hàm. Tăng trong cấu trúc dữ liệu của nút điều khiển trong thanh trạng tháiinputVí dụ như cho{"type": "button", "cmd": "open", "name": "开仓"}Tăng"input": {"name": "开仓数量", "type": "number", "defValue": 1}Một cửa sổ popup với các điều khiển hộp đầu vào (được đặt theo mặc định là 1 trong hộp đầu vào, tức là dữ liệu được đặt theo defValue) có thể được nhập và gửi cùng với lệnh nút. Ví dụ, khi chạy mã thử nghiệm sau đây, một cửa sổ popup với hộp đầu vào xuất hiện sau khi nhấp vào nút "Mở kho" và nhập vào hộp đầu vào.111Sau đó nhấp vào "Chứng minh".GetCommandCác chức năng này sẽ thu thập thông tin: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);
    }
}

Kết hợpLogStatus(Msg)Các ô trong bảng được vẽ bởi hàm:

  • Kết hợp ngang

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

  • Kết hợp theo chiều dọc

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

Bảng trạng thái hiển thị:

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

Ngoài việc có thể hiển thị các biểu mẫu phân trang, bạn có thể hiển thị nhiều biểu mẫu được sắp xếp từ trên xuống dưới.

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

Hành động hiệu quả:

Lưu ý: Trong khi chạy trên ổ đĩa thực, nếu xem lại lịch sử trên trang ổ đĩa thực, thanh trạng thái sẽ đi vào trạng thái ngủ và ngừng cập nhật. Chỉ có dữ liệu thanh trạng thái mới được làm mới khi nhật ký trên trang đầu tiên. Hỗ trợ đầu ra trong trạng tháibase64Hình ảnh được mã hóa, cũng hỗ trợ xuất vào biểu mẫu hiển thị trên thanh trạng tháibase64Hình ảnh đã được mã hóa. Vì các chuỗi dữ liệu của hình ảnh đã được mã hóa thường rất dài, các mã mẫu không còn được hiển thị.

EnableLog (()

EnableLog(IsEnable), ghi lại nhật ký mở hoặc đóng thông tin đặt hàng. Giá trị tham số:isEnableCác loại hình khác nhau của Boolean.IsEnableĐặt thànhfalseTrong khi đó, các công ty khác cũng có thể sử dụng dịch vụ này.

Biểu đồ

Chart(...), tùy chỉnh biểu đồ vẽ biểu đồ.

Chart({...})Các tham số là có thểJSONTiếp tụcHighStockcủaHighcharts.StockChartCác tham số.__isStockTính năng, nếu được chỉ định__isStock:false, sẽ được hiển thị dưới dạng biểu đồ thông thường.

Lưu ý: Nếu thiết lập__isStockthuộc tính làfalseCác biểu đồ được sử dụng là:Biểu đồ caoNhững người tham gia cuộc thi này là những người đã tham gia.

Highcharts图表

Nếu thiết lập__isStockthuộc tính làtrueCác biểu đồ được sử dụng là:Cổ cao(bên mặc định)__isStockĐểtrueNhững người bị ảnh hưởng là những người bị ảnh hưởng.

Highstocks图表

Trở lại các dạng gọi đượcadd(n, data)nĐểseriesChỉ mục (ví dụ như 0),dataĐể ghi dữ liệu vào biểu đồ) đến chỉ mục được chỉ địnhseriesThêm dữ liệu, gọireset()Những người khác cũng có thể làm điều này.resetBạn có thể dùng một số tham số để chỉ số mục được lưu trữ.

Có thể gọiadd(n, data, i)iVì vậy, dữ liệuseriesChỉ mục trong) để thay đổi tương ứngseriesNhững con số trên.

Có thể là âm, -1 là cuối cùng, -2 là số âm thứ hai, ví dụ như khi vẽ đường, thay đổi dữ liệu ở điểm cuối cùng của đường:

chart.add(0, [1574993606000, 13.5], -1), thay đổiseries[0].dataDữ liệu của điểm đầu tiên của số âm của các con số.

Hỗ trợ hiển thị nhiều biểu đồ, chỉ cần nhập các tham số mảng để cấu hình:var chart = Chart([{...}, {...}, {...}])Ví dụ như biểu đồ 1 và 2.seriesTrong biểu đồ 2, có mộtseriesVà hình 3 có một.seriesVậy thì.addKhi chỉ định ID hàng loạt 0 và 1 đại diện cho dữ liệu của hai hàng loạt trong biểu đồ 1 được cập nhật,addKhi chỉ định ID hàng loạt là 2 chỉ đầu tiên của biểu đồ 2.seriesDữ liệu, chỉ định chuỗi 3 là số đầu tiên của biểu đồ 3.seriesNhững con số này là rất lớn.

HighStockshttp://api.highcharts.com/highstock

Các biểu đồ đa dạng cho thấy một số thiết lập thuộc tính liên quan:Ví dụ

Ví dụ như đối tượng cấu hình biểu đồ:

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.layoutTính chất

    Nếu tính năng này được thiết lập với giá trị "single", biểu đồ sẽ không được chồng lên nhau (không được hiển thị theo cách thẻ phân trang) và sẽ được hiển thị một cách riêng biệt (bộ hiển thị phẳng).

  • cfgA.extension.heightTính chất

    Thuộc tính này được sử dụng để thiết lập chiều cao của biểu đồ, giá trị có thể được đặt theo kiểu số hoặc theo cách "300px".

  • cfgA.extension.colTính chất

    Thuộc tính này được sử dụng để thiết lập chiều rộng của biểu đồ, với chiều rộng của trang được chia thành 12 đơn vị, và thiết lập 8 cho phép biểu đồ có chiều rộng 8 đơn vị.

    Một chiến lược mô hình đầy đủ:

    Trong ví dụ trên, các đối tượng cấu hình biểu đồ hiển thị hiệu ứng:

  • Dữ liệu trên các đối tượng cấu hình biểu đồ, thay đổi cấu hình biểu đồ trực tiếp, sau đó cập nhật biểu đồ để cập nhật dữ liệu:

    Ví dụ:JavaScriptCác đoạn mã của mẫuMột ví dụ hoàn chỉnh):

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

    Thỏa thuậnaddCách để cập nhật dữ liệu, ví dụ như thêm một mục vào biểu đồ bánh quy.JavaScriptCác đoạn mã của mẫuMột ví dụ hoàn chỉnh):

    // 为饼图增加一个数据点,add只能更新通过add方式添加的数据点,内置的数据点无法后期更新
    chart.add(3, {
        name: "ZZ",
        y: Math.random() * 100
    })
    
  • Sử dụng phụChartVí dụ về hàm

    Một ví dụ đơn giản:

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

Thêm nữa

qq89520Có một vấn đề là hàm C sẽ luôn thử lại hay chỉ thử lại một lần

Ồ, ôi._C ((function, args...) là mặc định là 3s? Có thể thay đổi mặc định để đặt trực tiếp _CDelay ((1000) trước _C ((function, args...)?

ăn trưaCluster: Nếu bạn tạo ra 1000 robot đồng thời và không có áp lực, bạn có thể tạo ra nhiều người quản lý để phân tán nhiệm vụ Có ví dụ mã để xây dựng các tập hợp? Làm thế nào để xây dựng nhiều quản trị viên để phân tán nhiệm vụ

Wangjy1Log ((talib.help (('MACD')); chỉ được sử dụng trong js, Python không có tài sản talib.help...

cjz140Tôi nghĩ rằng tất cả những thứ này đều có nghĩa là chờ đợi để thử lại

3263243yLàm thế nào để xóa ErrorFilter sau khi SetErrorFilter? Không lọc thông báo lỗi.

qq47898077Có cách nào để sử dụng thư viện của bên thứ ba không?

qq47898077Nếu bạn muốn kế thừa các đối tượng giao dịch định nghĩa lớp mới, lớp cha nên điền vào gì?

ethanwuCó công cụ chỉnh sửa bản địa không?

PenglihengBạn có biết exange.IO (("status")?) không?

PenglihengTại sao hàm sell màu xám, có phải hàm đại diện không còn sử dụng được không?by có sẵn, vậy làm thế nào để bán?

PenglihengTại sao hàm sell màu xám, có phải hàm đại diện không còn sử dụng được không?by có sẵn, vậy làm thế nào để bán?

PenglihengTôi không biết tiếng Anh, haha, tôi muốn hỏi về sự hỗ trợ của es6.

PenglihengTôi không biết tiếng Anh, haha, tôi muốn hỏi về sự hỗ trợ của es6.

Don.Vậy, chúng ta viết đường trung bình của Volume như thế nào?

con rùaNếu không thành công, bạn sẽ được trả gì nếu mua trên exchange.Buy.1000 theo giá thị trường?

Ông NinhPhong cách mới này rất đẹp.

cá mậpMạng lưới thử nghiệm của Bitmex ((testnet.bitmex.com) cũng có giao diện API, nhưng hiện tại sàn giao dịch chỉ có thể chọn trạm chủ của Bitmex, địa chỉ tài liệu API là https://testnet.bitmex.com/app/apiOverview Làm thế nào để hỗ trợ?

cxjijinvar ret1 = exchanges[0].IO (("api", "future_estimated_price", "symbol=btc_usd"); Log (('ok tương lai dự kiến giao dịch giá', ret1); https://dn-filebox.qbox.me/d1ed268c1e75753c5d289447d279aa9d81e41b5f.png Tại sao lại gọi giao diện giao dịch khác và viết thông báo sai?

allenfrostlineBạn có muốn biết sự khác biệt giữa realTicker và Ticker không? gần đây đã viết lại các chiến lược của bộ sưu tập và xuất hiện cùng một lúc nhưng không có sự đề cập nào trong API trước đây.

hình ảnhXin chào, với tư cách là một nhà phát triển Python, bạn nghĩ tài liệu API của bạn viết gì?

allenfrostlineGetAccount: [EAPI: Rate limit exceeded] Bạn muốn hỏi làm thế nào để giải quyết vấn đề này?

zhjx2314Không hỗ trợ StochRSI, có thể thêm sớm không?

yhfggTrong khi đó, bạn có thể sử dụng các ứng dụng khác nhau để tạo ra các ứng dụng khác nhau.

yhfggPhiên bản nào của python?

ừmĐịnh nghĩa của GetFee được cho là trả về một cấu trúc Fee.

zkwapCó cách nào để gọi talib bằng js không?

yhfggTìm tài liệu python

wmjbs123Có thể làm cho nền mã của các biên tập viên chiến lược có màu đen không?

Don.Làm thế nào để thiết lập bản tóm tắt trong WeChat của robot?

Số: điênBạn có thể thêm một trường giao dịch bằng giá trong cấu trúc Order không?

Nhỏ béGetOrders: lấy tất cả các đơn đặt hàng chưa hoàn thành, trả về một cấu trúc Array Order, giao dịch Bitcoin ETH ở Trung Quốc, chỉ trả về 10 mục gần đây nhất.

yhfggCác chức năng toán học cần được sử dụng trong xác suất thống kê ở đâu?

jiebangGiá trị trả về của hàm $.Cross ((x, y) có nghĩa là gì?

Mẹ tôi gọiLogReset sẽ xóa tất cả các nhật ký và có thể có một số tham số để xác định số lượng lưu trữ. Làm thế nào để loại bỏ một vài nhật ký mới nhất?

edwardgywCó phải talib đã bị bỏ qua hoặc không được chuyển nhượng?

Quảng trường Phúc GiangCó vẻ như không có chức năng tham khảo chỉ số!

NhỏTôi không hiểu, quá dài một, giải quyết được, cảm ơn bạn

NhỏCách viết số trong mảng là như thế nào, tôi sử dụng records.remove ((records[0])

SnakeayuTuy nhiên, một số ứng dụng khác cũng được sử dụng, trong đó có ứng dụng ATR.

SnakeayuTuy nhiên, một số ứng dụng khác cũng được sử dụng, trong đó có ứng dụng ATR.

57278863Hãy học cách lấy giá và đặt mua các hợp đồng tương lai truyền thống, xin lỗi, nền tảng rất mỏng.

KirinMột số người cho rằng, "Điều này là một sự thay đổi lớn trong kinh tế".

Nhỏzero, bạn có thể viết một ví dụ về giao dịch tương lai truyền thống không?

NhỏKhi giữ nhiều đơn vị trống cùng một lúc, làm thế nào để in trạng thái giữ, cách in của tôi là [object object], làm thế nào để có được trạng thái giữ nhiều đơn vị và đơn vị trống, và cũng có GetTicker ((), làm thế nào để có được giá trong tuần, tuần sau và quý trong tuần đó, trong vòng eo trong tuần đó, tuần sau và quý tôi đã viết.

cxjijinCác sàn giao dịch tương lai có thể lấy thị trường bằng GetTicker (); trả về thị trường hợp đồng kiểu đó (; tuần trước, tuần sau...)?

Bán lớnBạn có thể nói thêm về StochRSI không?

momoxCancelOrder ((orderId) hủy một đơn đặt hàng dựa trên số đơn đặt hàng, trả về true hoặc false, hãy hỏi true= đơn hàng đã được hủy thành công, phải không?

momox_G(K, V) có thể lưu bảng từ điển toàn cầu Cách lưu biến toàn cầu có thể được sử dụng để chia sẻ dữ liệu giữa các chính sách khác nhau không?

flufy3dSự nổi tiếng

KhôngBạn có thể đặt lại nhật ký thu nhập bằng cách sử dụng LogProfitReset.

xcyCó thể sao chép trực tiếp EA để sử dụng nó không?

sjironmanTôi cảm thấy nền tảng này thật tuyệt vời.

NhỏĐây là ngôn ngữ nào, có tài liệu nào để học không?

jxhbtcData error 1 tuần không kết nối robot

dhyhuChỉ số TA, chỉ tính giá đóng cửa?

btcrobotChào thế giới.

Giấc mơ nhỏChức năng _C sẽ thử lại một lần nữa cho đến khi có kết quả thành công.

Giấc mơ nhỏTalib của python cần cài đặt.https://www.botvs.com/bbs-topic/669 bạn có thể xem bài viết này.

Giấc mơ nhỏSleep là trình không làm gì, chờ đợi các tham số được thiết lập trong số milliseconds, và _C là hàm gọi lại một lần tham số.

Giấc mơ nhỏKhông cần thừa kế, JS trực tiếp được gói trong đối tượng {name: "new object", old_exchange : exchange[0],...... }

Giấc mơ nhỏCó bản địa biên tập viên đồng bộ từ xa plugin, cơ bản là biên tập bản địa điều chỉnh từ xa.

Giấc mơ nhỏBạn có thể tham gia nhóm QQ,^^ dễ dàng thảo luận~

Giấc mơ nhỏTrong tài liệu API, màu xám có nghĩa là hàm này không có giải thích mở rộng quá nhiều, chỉ hiển thị màu xám, đại diện màu xanh có nhiều giải thích hơn, đó là tất cả.

Giấc mơ nhỏES6 không hỗ trợ, ^^

Giấc mơ nhỏBạn có thể đến nhóm QQ, tôi, mô tả vấn đề, tôi sẽ trả lời ^^

Giấc mơ nhỏSau khi trả lại một lỗi, bạn sẽ không đặt hàng (thực sự là mua, không đủ tiền!).

con rùaVí dụ, OKCoin, nếu số tiền mua nhiều hơn số tiền được nắm giữ, nó sẽ trở lại như thế nào?

Giấc mơ nhỏTrong khi đó, một số nhà đầu tư khác cũng cho biết họ sẽ trả lại một số đơn đặt hàng cho các sàn giao dịch này.

KhôngĐã hỗ trợ chuyển đổi giao dịch khi chạy, cần tải xuống trình quản lý mới nhất. Hỗ trợ Bter/Poloniex chi tiết tài liệu API mô tả các chức năng giao dịch bên dưới ((trước khi xóa cache trình duyệt, hãy cập nhật nếu không thấy)

Giấc mơ nhỏTôi sẽ giúp bạn tìm ra câu hỏi.

Gia đình nuôi con nghề nghiệpBạn cần thiết lập danh sách trắng, tôi đặt IP của máy chủ?

Giấc mơ nhỏĐây là liên kết dưới cùng không được thiết lập Máy chủ không phản hồi. Có đặt địa chỉ IP khi yêu cầu API KEY?

Gia đình nuôi con nghề nghiệpPost 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 Thời đại Bitcoin lỗi GetAccount: timeout 2017-05-23 21:08:02 Thời đại Bitcoin lỗi GetAccount: timeout 2017-05-23 21:07:40 Thời đại BitTorrent 2017-05-23 21:07:20 Hoạt động bắt đầu lại Có phải đó là vấn đề danh sách trắng IP???

Giấc mơ nhỏCác máy chủ của sàn giao dịch không phản hồi, giao thức TCP không được thiết lập sau ba lần bắt tay.

Gia đình nuôi con nghề nghiệpA connection attempt failed because the connected party did not properly respond after a period of time (Một nỗ lực kết nối đã thất bại vì bên kết nối đã không phản hồi đúng cách sau một khoảng thời gian)

Giấc mơ nhỏXin chào! Đây là hàm exchange.IO ((api, ApiName, Args) không được hỗ trợ, xem https://www.botvs.com/bbs-topic/812

Gia đình nuôi con nghề nghiệpMột nỗ lực kết nối đã thất bại bởi vì bên kết nối đã không phản hồi đúng cách sau một khoảng thời gian,

Gia đình nuôi con nghề nghiệpThời đại Bitcoin không hỗ trợ

Giấc mơ nhỏhttps://dn-filebox.qbox.me/a709b30c6cc0a3565234b9e0c99b073f7ba8b454.png Có lẽ là được rồi.

Ông NinhVí dụ, tôi muốn giao dịch toàn đồng tiền của poloniex, nhưng chỉ có một vài đồng tiền được hỗ trợ bởi BOTvs, và exchange.IO dường như không hỗ trợ mạng P.

Giấc mơ nhỏBạn có thể gọi exchange.IO.

Ông NinhVậy API cần xác minh tài khoản là gì?

Giấc mơ nhỏNếu API không yêu cầu xác minh tài khoản có thể được sử dụng bằng httpQuery (xem tài liệu BotVS chi tiết hơn), API giao dịch thực tế cần truy cập.

Giấc mơ nhỏCác tham số API có thể được truyền qua HttpQuery: https://www.okcoin.com/api/v1/future_estimated_price.do?symbol=btc_usd. Bài viết: https://www.botvs.com/bbs-topic/850

hình ảnhXin cảm ơn, mong đợi một tài liệu API hoàn hảo.

Giấc mơ nhỏBạn có thể hỏi tôi xem API của realTicker được thấy ở đâu không?

Giấc mơ nhỏhttps://dn-filebox.qbox.me/fe1a6f5563ed43a5357f858ecf8a50239619228e.png Tài liệu API là ngôn ngữ JavaScript. Mô tả, phiên bản python mô tả các bài đăng được đặt ở đầu trang trang của cộng đồng chat chat. Nếu bạn có câu hỏi cụ thể, vui lòng gửi ý kiến.

KhôngXin chào, cảm ơn đã đề xuất, tài liệu API đang được xây dựng lại.

Giấc mơ nhỏXin chào - hiển thị rằng truy cập đã vượt quá giới hạn. https://dn-filebox.qbox.me/a09498920d04cac62624b7438a058d2098d8fb00.png Có sử dụng chức năng Sleep ((1000) trong chính sách không?, 1000 là cho chương trình tạm dừng một giây mỗi vòng, có thể tự đặt, mục đích là để kiểm soát chương trình truy cập API tần suất, vì một số sàn giao dịch đã đặt giới hạn truy cập tối đa, một thời gian nhất định vượt quá một số lần truy cập nhất định sẽ từ chối truy cập, khóa địa chỉ IP.

Giấc mơ nhỏhttps://dn-filebox.qbox.me/c29ab7fc279e1b758355f137907cf52dc8257df6.png Cá nhân tôi đã viết rằng chỉ số STOCHRSI đã được so sánh với OK, đồng ý rằng tốc độ hơi chậm và cần được tối ưu hóa, tạm thời có thể sử dụng.

KhôngBạn có thể tự chọn xem botvs cung cấp máy chủ hay chủ nhà của bạn, phiên bản là 2.7.5

Giấc mơ nhỏCác bạn có thể tham gia vào chương trình này.

Giấc mơ nhỏBây giờ bạn có thể tự cấu hình phong cách nền của mình.

Giấc mơ nhỏCác tài liệu python đang được viết.

Giấc mơ nhỏCó thể sử dụng tài khoản talib hỗ trợ.

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

Giấc mơ nhỏCó một ví dụ ở quảng trường chiến lược: https://www.botvs.com/strategy/15098

KhôngTruy cập vào tính chất AvgPrice của Order, các sàn giao dịch hỗ trợ được, các sàn giao dịch không hỗ trợ sẽ luôn luôn là 0 tính năng này

yhfggLàm thế nào để trích dẫn các tài liệu của bên thứ ba?

KhôngMathjs không thể đáp ứng yêu cầu của mình, nó chỉ có thể tìm kiếm các chính sách sao chép nhập thư viện của bên thứ ba. Để có thể biên dịch nhanh hơn, hệ thống chỉ tích hợp một số ít thư viện.

Giấc mơ nhỏCó một số người nói rằng họ có thể tìm thấy một người bạn trên mạng mà không phải là một người bạn của họ.

jiebangCảm ơn.

Giấc mơ nhỏBạn có thể xem phần giải thích của thư mục phân tích thư viện giao dịch tiền kỹ thuật số, trong đó có phần giải thích về hàm $.Cross.

KhôngKhông thể xóa mới nhất, chỉ giữ lại một vài bài mới nhất... xóa tất cả bài cũ trước đó.

KirinĐể lấy mỗi vị trí với vị trí [i], vị trí là một mảng

Ông Ninhexchange.GetRecords ((PERIOD_D1));

KirinTôi đã từng dùng một giao dịch tương lai truyền thống để báo cáo với GetAccount: not login, password không sai, không đăng nhập.

KhôngTheo mặc định, SetContractType được yêu cầu trước để có được mục SetContractType.

KhôngBạn có thể thấy, đây là giá trị trả về hành động hủy lệnh mà sàn giao dịch trả về, nhưng thực sự hủy không hủy, tùy thuộc vào cách xử lý bên trong sàn giao dịch.

momox3q

KhôngChưa bao giờ, nó bị tách biệt.

xuanxuanTất nhiên là không, đó là MT4 riêng.

KhôngJavascript là một tài liệu phổ biến trên mạng.

Bán lớnVấn đề của bạn đã được giải quyết chưa?

KhôngPhần lớn là, dữ liệu được truyền vào có thể là một bản ghi trực tiếp hoặc một mảng giá thuần túy.