개발자 양적 API 문서

저자:작은 꿈, 2017-11-27 09:05:08에서 생성, 2023-07-12 16:47:31로 업데이트

이미 데이터를 받았고, 후속으로 EventLoop 감청을 시작했을 때 이러한 사건을 놓쳤다. // 첫 번째 코드 라인에서 EventLoop ((-1) 를 호출하기 시작하지 않고 EventLoop의 경청 메커니즘을 먼저 초기화하지 않으면 이러한 이벤트를 놓치지 않습니다.

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

내장 함수

_G(K, V)

_G(K, V)이 함수는 저장 가능한 전 세계 사전 기능을 구현하고, 회색과 실제 디스크 모두 지원합니다. 회색이 끝나면 저장된 데이터가 삭제됩니다. 데이터 구조는KV테이블은 영구적으로 로컬 파일로 유지되며, 디스크마다 개별 데이터베이스를 가지고 있으며, 다시 시작하거나 관리자가 종료한 후에도 계속 존재합니다.K이 문서는 문자열로 작성되어야하며, 크기와 작이를 구분하지 않아야 합니다.V모든 것을 할 수 있습니다JSON서열화 된 내용._G()이 함수들은 어떤 함수도 전달하지 않는 경우_G()이 함수는 현재 디스크의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();
}

주의: 사용_G기능 영구화 저장 데이터의 경우, 하드웨어 장치의 메모리, 하드 디스크 공간을 합리적으로 사용해야 하며, 악용해서는 안 된다. 그렇지 않으면 발생할 수 있다.메모리 누출이 글은

시간표, FMT

_D(Timestamp, Fmt), 지정된 시간 에 대응하는 시간 문자열을 반환합니다.Timestamp숫자의 유형은 밀리 초수입니다.Fmt문자열 유형은Fmt이 글은 이쪽에서 읽었습니다.yyyy-MM-dd hh:mm:ss, 값을 반환합니다: 문자열 타입. 지정된 시간 (毫秒) 에 해당하는 문자열을 반환하고, 어떤 파라미터도 전달하지 않고 현재 시간을 반환합니다. 예를 들어:_D()또는_D(1478570053241)기본적으로는yyyy-MM-dd hh:mm:ss

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

주의:Python전략적으로 사용_D()이 경우, 입력된 매개 변수는 초 수준 시간 입니다.JavaScriptC++전략에서는 밀리초 수준 시간으로, 1초는 1000 밀리초에 해당한다.) 실시간 사용_D()함수는 시간대를 읽을 수 있는 시간 문자열로 분석할 때, 관리자 프로그램이 있는 운영 체제의 시간대, 시간 설정에 주의를 기울여야 한다._D()함수 해독 시간 을 읽기 가능한 시간 문자열로 관리자 시스템의 시간에 따라 설정합니다.

예를 들어, 시간대는1574993606000코드를 사용하여 분석:

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, 정밀)

_N(Num, Precision), 부동 소수점을 포맷합니다.Num이 문서는Precision전체 타입을 위해. 귀환 값: 숫자 타입.

예를 들어_N(3.1415, 2)삭제됩니다3.1415소수점 두 자리 뒤에 있는 값은 함수가 반환합니다3.14

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

소수점 왼쪽에 있는 모든 n개의 숫자를 0으로 바꾸려면 이렇게 쓸 수 있습니다

function main(){
    var i = 1300
    Log(i)
    var ii = _N(i, -3)
    // 查看日志得知为1000
    Log(ii)
}
def main():
    i = 1300
    Log(i)
    ii = _N(i, -3)
    Log(ii)
void main() {
    auto i = 1300;
    Log(i);
    auto ii = _N(i, -3);
    Log(ii);
}

_C(...)

_C(function, args...)이 함수는 재시험 함수로서, 시장, 완료되지 않은 주문 등을 획득하는 인터페이스의 오류 허용을 위해 사용됩니다.

이 인터페이스는 정해진 함수를 성공적으로 반환할 때까지 계속 호출합니다.function참조 함수 호출 때 빈값을 반환하거나false예를 들어, 전화가 끊어지면 전화가 끊어집니다._C(exchange.GetTicker)기본 반복 간격은 3초로 설정되어 있습니다._CDelay(...)재검토 간격을 설정하는 함수, 예를 들어_CDelay(1000)변화하는 것을 의미합니다_C함수 재시험 간격은 1초입니다.

다음 함수들에 대해:

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

이 모든 것이_C(...)이 함수는 오류를 허용하는 함수를 호출합니다._C(function, args...)함수는 위의 함수들에 국한되지 않습니다.function함수 참조가 아니라 함수 호출입니다._C(exchange.GetTicker)아니죠._C(exchange.GetTicker())

function main(){
    var ticker = _C(exchange.GetTicker)
    // 调整_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);
}

변수 함수들에 대한 사용_C(...)이 글은 이 부분의 일부입니다.

function main(){
    var records = _C(exchange.GetRecords, PERIOD_D1)
    Log(records)
}
def main():
    records = _C(exchange.GetRecords, PERIOD_D1)
    Log(records)
void main() {
    auto records = _C(exchange.GetRecords, PERIOD_D1);
    Log(records);
}

또한 사용자 정의 함수의 오류 처리에도 사용할 수 있습니다.

var test = function(a, b){
    var time = new Date().getTime() / 1000
    if(time % b == 3){
        Log("符合条件!", "#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++ 不支持这种方式对于自定义函数容错

_크로스 ((Arr1, Arr2)

_Cross(Arr1, Arr2)소수 항을 곱하기arr1그리고arr2횡단 주기의 수. 양수는 위를 통과하는 주기를 나타냅니다. 음수는 아래를 통과하는 주기를 나타냅니다. 0은 현재 가격과 같습니다.

데이터 테스트를 모방할 수 있습니다._Cross(Arr1, Arr2)함수:

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

모의 데이터를 시각화하여 관찰합니다

img

사용 설명서:내장 함수_크로스 분석 및 사용 설명

JSONParse ((strJson)

JSONParse(strJson)이 함수는 JSON 문자열을 분석하기 위해 사용됩니다. 더 큰 숫자를 포함하는 JSON 문자열을 올바르게 분석하면 더 큰 숫자를 문자열 유형으로 분석합니다. 회수 시스템은 이 함수를 지원하지 않습니다.

function main() {
    let s1 = '{"num": 8754613216564987646512354656874651651358}'
    Log("JSON.parse:", JSON.parse(s1))    // JSON.parse: {"num":8.754613216564988e+39}
    Log("JSONParse:", JSONParse(s1))      // JSONParse:  {"num":"8754613216564987646512354656874651651358"}
    
    let s2 = '{"num": 123}'
    Log("JSON.parse:", JSON.parse(s2))    // JSON.parse: {"num":123}
    Log("JSONParse:", JSONParse(s2))      // JSONParse:  {"num":123}
}
import json

def main():
    s1 = '{"num": 8754613216564987646512354656874651651358}'
    Log("json.loads:", json.loads(s1))    # json.loads: map[num:8.754613216564987e+39]
    Log("JSONParse:", JSONParse(s1))      # JSONParse:  map[num:8754613216564987646512354656874651651358]
    
    s2 = '{"num": 123}'
    Log("json.loads:", json.loads(s2))    # json.loads: map[num:123]
    Log("JSONParse:", JSONParse(s2))      # JSONParse:  map[num:123]
void main() {
    auto s1 = "{\"num\":8754613216564987646512354656874651651358}";
    Log("json::parse:", json::parse(s1));
    // Log("JSONParse:", JSONParse(s1));   // 不支持该函数
    
    auto s2 = "{\"num\":123}";
    Log("json::parse:", json::parse(s2));
    // Log("JSONParse:", JSONParse(s2));   // 不支持该函数
}

사용자 정의 색상

모든 문자열을 사용할 수 있습니다.#ff0000이러한 RGB 값은 끝으로 표시해야 할 전망을 나타냅니다.#ff0000112233이런 형식으로, 마지막 6자는 배경 색을 나타냅니다.

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

로그 정보

실제 디스크 실행 시 로그 정보는 실제 디스크의 데이터베이스에 기록되며, 실제 디스크의 데이터베이스가 사용된다sqlite3데이터베이스, 디스크의 데이터베이스 파일은 관리자 프로그램에 위치하는 장치, 데이터베이스 파일은 관리자 프로그램에 위치한다.robot실행 가능한 프로그램) 디렉토리. 예를 들어: ID는130350이 파일은../logs/storage/130350이 카탈로그에..그리고robot관리자 프로그램이 있는 디렉토리), 데이터베이스 파일의 이름은130350.db3ᅳ 검색 시스템에서의 로그는 검색이 끝나면 검색 페이지의 오른쪽 하단에서 클릭하면 됩니다.로그 다운로드[다운로드 버튼] 디스크를 다른 서버로 이동해야 할 경우, 디스크의 데이터베이스 파일을 (db3라고 확장된 데이터베이스 파일) 마이그레이션 대상 서버로 이동할 수 있으며, 파일 이름을 플랫폼에 해당하는 디스크 ID로 설정합니다. 이렇게하면 이전 디스크의 모든 로그 정보가 새로운 장치로 마이그레이션으로 손실되지 않습니다.

로그...

Log(message), 게시물을 로그 목록에 저장합니다.message어떤 타입이든 사용하실 수 있습니다. 만약 문자열 뒤에 더하면@문자 메시지는 푸시 큐에 들어가 현재 발명자의 양자 거래 플랫폼 계정 푸시 설정에 설정된 메일, 텔레그램, 웹 등에 푸시됩니다.제어 센터페이지, 오른쪽 상단계정 설정이 페이지에는푸시 설정페이지 설정 묶음) ^

주의:

  • "Debug Tool"에서는 푸시를 지원하지 않습니다.
  • "복사 시스템"에서는 푸시를 지원하지 않습니다.
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@");
}

웹후크:

사용GolangDEMO라는 프로그램으로 작성된 서비스:

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

설정WebHookhttp://XXX.XX.XXX.XX:9090/data?data=Hello_FMZ

서비스 프로그램을 실행한 후, 정책을 실행하고, 정책을 추진합니다.

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

이 사이트는 인터넷에 접속하여 인터넷에 접속하는 모든 사용자들을 대상으로 운영되고 있습니다.

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

인쇄base64코딩된 이미지 Log문자를 지원하는 함수base64이 사진들은`이 글의 시작은`이 글의 끝은 다음과 같습니다.

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

Log직접 인쇄를 지원합니다Python이 모든 것은matplotlib.pyplot객체를 포함하는 경우savefig이 방법은 바로Log예를 들어:

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

인쇄 로그 자동 언어 전환 Log언어 전환을 지원하는 기능Log함수 출력 텍스트는 플랫폼 페이지의 언어 설정에 따라 해당 언어로 자동으로 전환됩니다. 예를 들어:

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

LogProfit ((이익)

LogProfit(Profit)이윤/손실 수치를 기록하고, 이윤/손실 수치를 인쇄하고, 이윤/손실 수치를 기준으로 수익 곡선을 그려라. 파라미터 값:수익숫자의 종류를 가리킨다.

이 함수는&그리고 마지막으로, 수익표만 그려서 수익기록을 인쇄하지 말고, 예를 들어:LogProfit(10, '&')

로그프로프트리셋 (LogProfitReset)

LogProfitReset(), 모든 수익 로그를 비어, 전체 숫자 값의 매개 변수를 가지고 저장된 항목을 지정할 수 있습니다.

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

로그Status ((Msg)

LogStatus(Msg)이 정보는 로그 목록에 저장되지 않고 현재 디스크의 상태 정보를 업데이트합니다. 디스크 페이지의 로그 영역 위에 있는 상태 표시줄에서 업데이트 상태를 여러 번 호출할 수 있습니다.Msg어떤 타입이든 사용할 수 있습니다.

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

LogStatus(Msg)인쇄 지원base64이 사진들은`이 글의 시작은`이 글의 끝은 다음과 같습니다.LogStatus("`data:image/png;base64,AAAA`")LogStatus(Msg)직접 전송 지원Python이 모든 것은matplotlib.pyplot객체를 포함하는 경우savefig이 방법은LogStatus(Msg)예를 들어,

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

상태창에서 데이터를 출력하는 예제:

function main() {
    var table = {type: 'table', title: '持仓信息', 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() + "`");
}

정상 버튼 설정 비활성화, 설명 기능:

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

상태 버튼 스타일 설정:

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

결합GetCommand()함수, 구성 상태 버튼 상호 작용 기능:

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

구성 상태 버튼이 상호 작용할 때도 데이터 입력 지원, 상호 작용 명령어는 최종적으로GetCommand()함수 캡처. 상태 탭에 있는 버튼 컨트롤의 데이터 구조에 추가input예를 들어,{"type": "button", "cmd": "open", "name": "开仓"}증가"input": {"name": "开仓数量", "type": "number", "defValue": 1}, 버튼을 클릭할 때 입력장치 컨트롤이 있는 점포를 (입기장치에서 기본값이 1인 defValue로 설정된 데이터) 팝업할 수 있고, 버튼 명령과 함께 데이터를 입력하여 전송할 수 있다. 예를 들어, 다음 테스트 코드를 실행할 때, "투자" 버튼을 클릭한 후 입력장치가 있는 점포를 팝업하고, 입력장치에 입력한다.111그리고 "확인"을 클릭합니다.GetCommand이 함수는 메시지를 캡처합니다.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);
    }
}

합병LogStatus(Msg)함수가 그려낸 테이블 안의 셀은:

  • 수평 합병

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

  • 수직 합병

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

위와 같은 페이지가 있습니다.

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

페이지를 나눌 수 있을 뿐만 아니라 여러 페이지를 위에서 아래로 배열하여 표시할 수 있습니다.

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

실행 효과:

주의: 이 정책이 실제 디스크에서 실행되는 동안, 실제 디스크 페이지에서 역사 기록을 짚어보면 상태 탭이 휴면 상태로 들어가 업데이트를 중지한다. 로그가 첫 페이지에 있을 때만 상태 탭 데이터가 갱신된다. 상태 에서 출력을 지원합니다.base64코딩된 이미지, 또한 상태 탭에서 표시되는 표에 출력을 지원합니다base64코딩된 이미지. 코딩된 이미지의 문자열 데이터가 일반적으로 길기 때문에 예제 코드가 더 이상 표시되지 않습니다.

EnableLog (()

EnableLog(IsEnable), 주문 정보를 열고 닫는 로그 기록.isEnable의 종류는 입니다.IsEnable설정:false이 경우, 주문기록을 인쇄하지 않고, 실제 데이터베이스에 기록하지 않습니다.

차트 ((...)

Chart(...), 사용자 정의 그래프 그림 그림 函数.

Chart({...})이 경우,JSON배열된하이스토크이 모든 것은Highcharts.StockChart변수. 원래 변수보다 1 더하기__isStock속성, 지정하면__isStock:false이 그래프는 일반 그래프로 표시됩니다.

주의: 설정된 경우__isStock속성false이 그래프는 다음과 같습니다.하이라이트 차트이 사진에서 보시는 것처럼:

Highcharts图表

설정된 경우__isStock속성true이 그래프는 다음과 같습니다.높은 물류(디폴트)__isStock그 이유는true), 그림과 같이:

Highstocks图表

다시 호출할 수 있는add(n, data)n그 이유는series인덱스 (예: 0),data그래프에 입력하는 데이터) 를 지정된 인덱스에series데이터 추가, 호출reset()이 모든 것은 매우 중요한 것입니다.reset기호를 지정할 수 있는 숫자의 매개 변수를 사용할 수 있습니다.

전화할 수 있습니다.add(n, data, i)i이 자료는series이 지표에 있는series이 자료는

음수가 될 수 있고, -1은 마지막이고, -2는 음수 두 번째입니다. 예를 들어 선을 그리는 때, 선의 마지막 점의 데이터를 수정합니다.

chart.add(0, [1574993606000, 13.5], -1)변경series[0].data이 숫자의 제곱의 첫 번째 지점의 데이터는

여러 개의 그래프를 표시할 수 있는 지원.var chart = Chart([{...}, {...}, {...}])예를 들어, 그래프 1과 그래프 2series이 그래프의 두 번째는series그리고 이 그림은series그럼,add0과 1의 일련 ID를 지정할 때 업데이트 그래프 1의 두 개의 일련의 데이터를 나타냅니다.add2로 지정된 시퀀스 ID는 차트 2의 첫 번째를 나타냅니다.series이 그래프의 첫 번째 행을 나타냅니다.series이 자료는

HighStockshttp://api.highcharts.com/highstock

여러 그래프가 관련 속성 설정을 보여줍니다:예제

예를 들어, 그래프 구성 객체:

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.layout속성

    이 속성을 "single"로 설정하면, 그래프는 중첩되지 않습니다 (페이지별로 표시되지 않습니다), 개별적으로 표시됩니다 (평면 표시).

  • cfgA.extension.height속성

    이 속성은 그래프의 높이를 설정하는 데 사용됩니다. 값은 숫자 유형으로 설정되거나 "300px"로 설정될 수 있습니다.

  • cfgA.extension.col속성

    이 속성은 그래프의 폭을 설정하는 데 사용되며, 페이지의 폭은 12개로 나누어져 있으며, 8개로 설정하면 그래프의 폭이 8개이다.

    이 프로젝트의 주요 목표는

    위의 예제에서 그래프 구성 객체가 효과를 보여줍니다:

  • 그래프 구성 개체에 있는 데이터를 직접 변경하여 그래프 설정을 업데이트하면 데이터 업데이트가 가능합니다:

    예를 들어,JavaScript예제 일부 코드 문장완전한 예제):

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

    통과add데이터 업데이트 방법, 예를 들어 피카드에 항목을 추가하는 방법JavaScript예제 일부 코드 문장완전한 예제):

    // 为饼图增加一个数据点,add只能更新通过add方式添加的数据点,内置的数据点无法后期更新
    chart.add(3, {
        name: "ZZ",
        y: Math.random() * 100
    })
    
  • 추가 사용Chart함수의 예

    간단한 그림 예:

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

더 많은

qq89520C 함수에서 한 번만 반복하는 것이 문제입니다

와 와_C ((function, args...) 이 기본값은 3s입니까? 기본값을 변경하여 바로 _CDelay ((1000) 를 C ((function, args...) 이전에 설정할 수 있습니까? 한 번 설정해도 될까요?

하이클러스터: 만약 여러분이 1000개의 로봇을 동시에 만들 수 있다면, 또한 스트레스를 받지 않고도, 여러 개의 관리자를 만들 수 있습니다. 클러스터를 만드는 데 코드 예가 있습니까? 여러 호스트를 구축하여 작업을 분산하는 방법

뱅지1log ((talib.help (('MACD')); js에서만 사용할 수 있으며, 파이썬에서는 talib.help 속성이 없습니다.

cjz140_C (function, args...) 와 Sleep (Sleep) 의 차이점은 무엇일까요?

3263243ySetErrorFilter를 사용하다가 ErrorFilter를 어떻게 비어낼까요?

qq47898077만약 제3자 라이브러리를 이용하고 싶다면 어떻게 해야 할까요?

qq47898077만약 거래소 객체가 새로운 클래스를 정의하는 것을 계승하고자 한다면, 부모 클래스는 무엇을 채워야 하는가?

에탄우이 사이트는 다른 사이트와 비교해 볼 수 있습니다.

그 exange.IO (exange.IO "status") 는?

왜 sell의 함수가 회색으로 표시되는가? by가 사용할 수 있다면 어떻게 팔 수 있습니까?

왜 sell의 함수가 회색으로 표시되는가? by가 사용할 수 있다면 어떻게 팔 수 있습니까?

js는 언어학이 없는데, 哈哈哈.

js는 언어학이 없는데, 哈哈哈.

Don.분량의 중간선을 어떻게 써야 할까요?

쥬트르트시장 가격에 교환을 구매합니다.Buy ((1000) 성공하지 않으면 무엇을 반환합니까?

닌자쿠새로운 글꼴이 멋지네요.

해마Bitmex의 테스트 네트워크 ((testnet.bitmex.com) 에서도 API 인터페이스가 존재하지만 현재 거래소는 Bitmex 본부를 선택할 수 있으며 API 문서 주소는 https://testnet.bitmex.com/app/apiOverview입니다. 어떻게 지원할 수 있을까요?

cxjijinvar ret1 = exchanges[0].IO (("api", "future_estimated_price", "symbol=btc_usd"); 로그 (('ok 선물 예상 거래 가격', ret1); https://dn-filebox.qbox.me/d1ed268c1e75753c5d289447d279aa9d81e41b5f.png 다른 거래소의 기능 인터페이스를 호출하여 오류를 작성하는 이유는 무엇입니까?

알렌프로스트라인realTicker와 Ticker의 차이점은 무엇입니까? 최근에는 리얼티커와 리얼티커 API에서 언급되지 않은 두 가지 전략이 동시에 등장했습니다.

비전안녕하세요. 파이썬 개발자로서, 여러분의 API 문서가 무엇을 쓰고 있다고 생각하십니까? 필드 함수 인터페이스가 약간 이상해 보이지만, githubpage와 readdocs처럼 문서를 쓸 수 있나요?

알렌프로스트라인GetAccount: [EAPI: Rate limit exceeded] 어떻게 해결되는지 궁금합니다?

zhjx2314StochRSI가 지원되지 않습니다.

yhfggPython 정책 리얼 디스크에서 스크립트는 자신의 Ali 클라우드 서버 또는 botvs 클러스터에 있습니까?

yhfgg어떤 버전의 파이썬을 사용하시나요?

아예GetFee의 설명은 가 하나의 Fee 구조 을 반환하고, 하나의 구성자를 빼는 것이라고 생각됩니다.

zkwapjs에서 Talib를 호출하는 방법

yhfggpython 문서를 검색합니다

wmjbs123전략 편집자의 코드 배경은 검은색이 될 수 있습니까? 흰색 톱니, 밤에 코드를 작성하고 근시하기 쉽습니다.

Don.로봇의 WeChat 게시물에서 요약은 어떻게 설정합니까?

미쳤어요주문 (Order) 구조에 거래의 정비값 필드를 추가할 수 있습니까?

작은 것GetOrders: 모든 미완성 주문을 가져오기, Order 배열 구조를 반환하기, 중국 비트코인 거래에서 ETH, 가장 최근의 10 항목만 반환합니다. 여기에 중국 비트코인 ETH의 모든 미완성 주문을 반환하는 함수가 있습니까?

yhfgg통계 확률 이론에 필요한 수학 함수들은 어디서 사용되나요?

이 함수의 값은 $Cross (x, y) 입니다.

제 할머니는이 로그리셋은 모든 로그를 비워버립니다. 어떻게 하면 최근 몇 개의 로그를 삭제할 수 있을까요?

에드워드talib에서 CORRE 함수는 이식되지 않은 것처럼 보이거나 놓쳤습니까?

가난한 산에 있는 이 지표에 대한 참조 기능이 없는 것 같습니다.

작은 것이 k 라인 시간을 읽고 지금 시간으로 번역하는 방법 아, 이해가 안 돼, 너무 길어, 해결, 감사합니다

작은 것소수에서 숫자를 삭제하는 방법을 어떻게 쓸지, 저는 records.remove ((records[0]) 를 사용해서

스네키야우일반적으로는 시간 K선으로, 어떻게 일 K선의 ATR를 호출합니까?

스네키야우일반적으로는 시간 K선으로, 어떻게 일 K선의 ATR를 호출합니까?

57278863전통적인 선물의 가격과 주문을 얻는 방법을 배우십시오. 죄송합니다. 뿌리가 얇습니다.

키린이 자리에서 우리는 이 자리에서 다른 사람들을 만나게 될 것입니다.

작은 것제로, 전통적인 선물 거래의 예를 써줄 수 있나요?

작은 것복수 빈单을 동시에 보유할 때, 보유 상태를 어떻게 인쇄하느냐, 나의 인쇄 방식은 [object object][object object], 복수单과 빈单 보유 상태를 어떻게 얻을 것인가, 그리고 GetTicker ((), 그 주, 다음 주, 그리고 분기 모두 어떻게 얻을 것인가.

cxjijin선물 거래소는 GetTicker (,) 를 사용하여 시장을 얻을 수 있습니까?

팔아치워StochRSI는 어떤 지표를 추가할 수 있을까요?

모박스CancelOrder (orderId) 는 주문 번호에 따라 주문을 취소하고 true 또는 false를 반환합니다. true= 셀이 성공적으로 취소되었습니다.

모박스_G(K, V) 저장할 수 있는 글로벌 사전 목록 이 방법은 저장할 수 있는 글로벌 변수를 사용해서 다른 정책들 사이에서 데이터를 공유할 수 있는가?

플루피3D인기를 끌고

제로로그프로프리트리셋을 사용하여 수익 로그를 다시 설정할 수 있습니다. 이전 수익 차트의 역사는 사라집니다.

xy이 EA를 직접 복사할 수 있을까요?

스라이론맨이 플랫폼이 정말 멋지고, 정말 멋지고, 더 많은 사람들이 함께 소통하는 것 같아요.

작은 것이 언어는 어떤 언어이고, 학습 자료가 있나요?

jxhbtc데이터 오류 일주일 동안 로봇을 연결할 수 없습니다

이 지표는 단지 종결 가격을 계산하기 위한 지표가 아닌가요?

btcrobot안녕, 세상

작은 꿈_C 함수는 성공적으로 결과를 얻을 때까지 다시 시도합니다.

작은 꿈python의 talib 라이브러리는 설치가 필요합니다.https://www.botvs.com/bbs-topic/669 이 게시물을 참조하십시오.

작은 꿈Sleep는 프로그램이 아무 것도 하지 않고, 매개 변수가 설정되는 것을 기다리는 밀리초 수, _C는 매개 변수를 한 번 다시 호출하는 함수이다.

작은 꿈상속을 하지 않고 JS를 직접 객체에 엮어버린다.

작은 꿈로컬 편집기 원격 동기화 플러그인, 기본적으로 로컬 편집기 원격 오디션.

작은 꿈QQ 그룹에 오셔서,^^ 쉽게 토론하실 수 있습니다~

작은 꿈API 문헌에서 회색은 함수가 너무 많은 설명이 없이 회색, 파란색의 대표자가 더 많은 설명이 있고, 그것뿐이라는 것을 의미합니다.

작은 꿈ES6는 현재 지원되지 않습니다 ^^

작은 꿈QQ 그룹에 가서 문제를 설명해줘, 내가 대답해줄게 ^^

작은 꿈이 문서는 바로 오류를 반환하고 주문을 하지 않습니다. (사실 구매하기 위해 돈이 충분하지 않습니다!)

쥬트르트예를 들어, OKCoin, 만약 구매한 금액이 보유한 인민 화폐보다 많다면 어떤 수익을 올릴까요?

작은 꿈그리고 어떤 거래소에서 제가 OK 선물에서 주문 번호를 돌려보낼까요?

제로이미 실행 중인 트랜잭션 전환을 지원하고 있으며 최신 호스트를 다운로드해야 합니다. 지원 Bter/Poloniex 자세한 API 문서 트랜잭션 함수 탭 아래의 설명 (검색자 캐시를 비어 후 갱신하지 않으면 보이지 않습니다)

작은 꿈QQ, 제가 도와드릴게요.

직업적인 가정화이트리스트를 설정해야 합니다. 저는 호스트의 IP를 설정합니다.

작은 꿈이것은 하위 링크입니다. 설치되지 않았습니다. 서버가 응답하지 않았습니다. API KEY를 요청할 때 IP 주소를 설정해야합니까?

직업적인 가정이것은 당황스럽습니다... 제가 실행할 수 있는 전략은 비트 시대부터 고장 났고, GetAccount도 GetAccount에 액세스 할 수 없습니다: 포스트 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 비트 시대 오류 GetAccount: timeout 2017-05-23 21:08:02 비트 시대 오류 GetAccount: timeout 2017-05-23 21:07:40 비트 시대 오류 GetAccount: timeout 2017-05-23 21:07:20 다시 시작 IP 화이트리스트 문제인가요?

작은 꿈거래소의 서버는 응답하지 않았고, TCP 프로토콜은 세 번이나 악수되지 않았습니다.

직업적인 가정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. 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. 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.

작은 꿈안녕하세요! exchange.IO (api, ApiName, Args) 의 함수가 지원되지 않습니다. https://www.botvs.com/bbs-topic/812

직업적인 가정연결 시도가 실패한 이유는 연결된 당사자가 일정 기간 후에 제대로 응답하지 않았기 때문입니다.

직업적인 가정비트 시대가 지지하지 않나요?

작은 꿈https://dn-filebox.qbox.me/a709b30c6cc0a3565234b9e0c99b073f7ba8b454.png 이 글은 이쪽에서 읽었습니다.

닌자쿠예를 들어, 나는 폴로니엑스 (poloniex) 의 모든 통화 거래를 하고 싶지만, BOTvs (BOTvs) 가 지원하는 화폐는 몇 개 밖에 없으며, exchange.IO는 P 네트워크를 지원하지 않는 것 같습니다.

작은 꿈이 경우, 이 화면은 Exchange.IO를 호출할 수 있습니다.

닌자쿠어떤 API가 계정 검증을 필요로 할까요?

작은 꿈계정 검증이 필요하지 않은 API는 httpQuery (BotVS 문서를 참조하십시오) 를 사용할 수 있으며 실제 거래 API는 액세스해야합니다.

작은 꿈HttpQuery API를 사용하여 매개 변수를 전송할 수 있습니다: https://www.okcoin.com/api/v1/future_estimated_price.do?symbol=btc_usd, 이렇게 하면 됩니다. 계정 검증이 필요하지 않은 계정 API의 경우 플랫폼의 HttpQuery 함수를 직접 사용하여 계정과 관련된 경우 IO API를 사용합니다. 포스팅: https://www.botvs.com/bbs-topic/850

비전좋은 감사합니다. 좋은 API 문서를 기대합니다.

작은 꿈이 API를 어디서 보았는지 알려주세요.

작은 꿈https://dn-filebox.qbox.me/fe1a6f5563ed43a5357f858ecf8a50239619228e.png API 문서는 자바스크립트 언어로 설명되어 있으며, 파이썬 버전은 커뮤니케이션 커뮤니티 페이지의 꼭대기에 설명되어 있습니다.

제로안녕하세요, 제안에 감사드립니다. 현재 API 문서는 재구성 중입니다.

작은 꿈안녕하세요~ 접속 빈도가 제한을 넘었다는 표시입니다. https://dn-filebox.qbox.me/a09498920d04cac62624b7438a058d2098d8fb00.png 정책에서 Sleep (1000) 함수를 사용했습니까? 이 1000은 프로그램을 회당 1초 중단시키는 것입니다. 자체적으로 설정할 수 있습니다. 목적은 프로그램을 제어하는 것입니다. API에 액세스하는 빈도, 일부 거래소가 최대 액세스 제한을 설정하기 때문에 특정 방문 횟수를 초과하는 특정 시간이 액세스 거부, IP 주소를 차단합니다.

작은 꿈https://dn-filebox.qbox.me/c29ab7fc279e1b758355f137907cf52dc8257df6.png 제가 개인적으로 쓴 글은 STOCHRSI 지표와 비교해봤는데, 평론에 따르면, 속도가 약간 느리고 최적화되어 있고, 일시적으로 사용할 수 있습니다.

제로botvs가 제공하는 서버에서 다시 테스트를 하거나 자신의 호스트가 있는 서버에서 다시 테스트를 선택할 수 있습니다. 버전은 2.7.5입니다.

작은 꿈이 글은 현재 추가된 글입니다.

작은 꿈이제 배경 스타일을 직접 설정할 수 있습니다.

작은 꿈파이썬 문서가 작성되고 있습니다.

작은 꿈알리바의 문헌을 참고하세요.

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

작은 꿈이 경우, 이 경우, 이 경우, 이 경우, 이 경우, 이 경우.

제로오더의 AVGPrice 속성에 접근하면 거래소가 지원할 수 있고 지원하지 않는 거래소는 0으로 유지됩니다.

yhfgg제3자 자료는 어떻게 인용합니까?

제로mathjs가 만족할 수 없다면, 3자 라이브러리 복제입 정책만 찾아볼 수 있다. 컴파일 속도를 위해, 시스템은 일부 라이브러리만을 내장했다.

작은 꿈"이봐요, 이봐요, 이봐요, 이봐요, 이봐요, 이봐요.

감사합니다.

작은 꿈그룹에서? 당신은 설명서 버전의 디지털 통화 거래 클래스 코드 분석을 볼 수 있습니다. 그 안에 $.Cross 함수의 설명이 있습니다.

제로가장 최근의 항목을 삭제할 수 없고, 최신 몇 개만 유지할 수 있습니다.

키린포지션[i]를 사용하여 모든 포지션을 얻으려면 포지션은 대수입니다.

닌자쿠exchange.GetRecords ((PERIOD_D1));

키린내 전통적인 선물은 항상 "GetAccount: not login", "패드 잘못 입력되지 않았다면 로그인 할 수 없습니다".

제로기본값은 주입니다. 지정된 SetContractType를 얻기 위해서는 먼저 SetContractType가 필요합니다.

제로보시다시피, true는 거래소가 반환하는 취소 명령의 반환 값입니다. 하지만 실제로는 취소되지 않습니다.

모박스3q

제로잠시 동안은 그렇지 않노라

수안물론, MT4의 전용입니다.

제로자바스크립트 자료는 인터넷 상에 있습니다.

팔아치워네 문제가 해결됐나요?

제로대부분의 경우, 입력된 데이터는 직접 기록 또는 순수 가격의 배열이 될 수 있습니다.