発明者による量化APIドキュメント

作者: リン・ハーン小さな夢, 作成日: 2017-11-27 09:05:08, 更新日: 2023-07-12 16:47:31

事件の情報を受け取った後,EventLoopの監視システムが開始され,これらの事件を見逃しました. // 最初のコード行で EventLoop (−1) を呼び出さない限り,イベントループの監視メカニズムを初期化しない限り,これらのイベントは見逃されません.

// 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() Function Parse は,時間軸を読み取れる時間文字列として,ホストシステムの時間に基づいて設定します.

時間の軸は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 (N) 番号,精度)

_N(Num, Precision)浮点数をフォーマットします. 参数値:Num値の種類は,Precision整数として. 返される値は: 数値型.

例えば_N(3.1415, 2)削除する3.1415微分数から2桁の値が返されます.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...)この関数は,行事取得,未完了注文取得などのインターフェースのエラー容認のために使用される再試行関数である.

このインターフェースは,指定された関数を成功して ((parameter) を返すまで呼び続けます.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

具体例は:内蔵関数_Cross 解析と使用説明

JSONParse (JSONパース)

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任意のタイプであることができます. 文字列の後ろに追加すると,@文字のメッセージはプッシュキューに移動し,現在の発明者のQTプラットフォームアカウントのプッシュ設定で設定されたメール,Telegram,WebHookなどにプッシュされます.コントロールセンターページ,右上角アカウント設定このページは,押す設定ページの設定が固定されている) 』

警告:

  • "デュウミュウツール"ではプッシュがサポートされていません.
  • 推し進めは"回線システム"ではサポートされていません.
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@");
}

ウェブフック推し進め:

使用するGolangサービスプログラムDEMO:

package main
import (
    "fmt"
    "net/http"
)

func Handle (w http.ResponseWriter, r *http.Request) {
    defer func() {
        fmt.Println("req:", *r)
    }()
}

func main () {
    fmt.Println("listen http://localhost:9090")
    http.HandleFunc("/data", Handle)
    http.ListenAndServe(":9090", nil)
}

設定する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(Profit)利益損失を記録し,利益損失を印刷し,利益損失値に基づいて利益曲線を描きます. 参数値:利益数値の種類は,

この関数は文字で表される.&最後に,収益グラフを書き,収益日記を印刷しない. 例えば:LogProfit(10, '&')

ログプロフィットリセット

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

ログステータス (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に設定されたデータ) を搭載した弹窗がポップアップされ,ボタンのコマンドと共に送信されるデータが入力できます.例えば,以下のテストコードを実行すると",Open Store"ボタンをクリックすると,入力ボックスを含む弹窗がポップアップし,入力ボックスに入力されます.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メディアは,

線を描くとき,線の最後の点のデータを修正する.

chart.add(0, [1574993606000, 13.5], -1)変えたseries[0].dataこの数字は,最初の点の数値である.

複数のグラフを表示するサポート,設定時に単に配列パラメータを入力するだけで:var chart = Chart([{...}, {...}, {...}])グラフの1つと2つをseriesグラフ2にはseriesグラフ3には1つありますseriesじゃあadd0と1のシリアルIDを指定すると,更新図1の2つのシリアルのデータを代表します.add図2の第1項を2に指定するときにseriesグラフ3の最初の行を指します. グラフ3の最初の行を指します.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関数で,_C関数で,_C関数で,_C関数で,_C関数で,_C関数で,_C関数で,_C関数で,_C関数で,_C関数で,_C関数で,_C関数で,_C関数で,_C関数で,_C関数で,_C関数で,_C関数で,_C関数で,_C関数で,_C関数で,_C関数で,_C関数で,_C関数で,_C関数で,_C関数で,_C関数で,_C関数で,_C関数で,_C関数で,_C関数で,_C関数で,_C関数で,_C関数で,_C_関数で,_C_関数で,_C_C_関数で,_C_C_関数で,_C_C_関数で,_C_C_C_関数で,_

ハワイ ハワイ_C ((function, args...) のデフォルトは3sですか?デフォルトで_CDelay ((1000) を直接_C ((function, args...) の前に設定することができますか?一度設定できますか?

ランチャイエクラスター:もし1000個のボットを同時に ストレスを感じずに作るとしたら 複数の管理者が作られ 課題を分散できます 複数の管理者を構築して,タスクを分散させる方法.

ワングイ1log ((talib.help (('MACD'));jsでしか使えない.pythonではtalib.help属性がない...

cjz140_C (関数, args...) と Sleep (関数) の違いは?

3263243ySetErrorFilter の後に ErrorFilter を削除するにはどうすればよいですか?

QQ47898077データベースの利用は可能でしょうか?

QQ47898077交換対象に定義された新しいクラスを継承する場合は,父クラスは何を入力すべきですか?

エタヌウローカル・デュッキング・ツールはありますか?

ペンギンこのサイトは,インターネットのインターネット・サービスです.

ペンギンsell の関数が灰色になっているのは,by が使えなくなっていることを表すためでしょうか.

ペンギンsell の関数が灰色になっているのは,by が使えなくなっていることを表すためでしょうか.

ペンギン言語能力が低いので,

ペンギン言語能力が低いので,

Don.平均線を書き換えるには,

ツィートルテ市場価格で買い換える. 買い換える (1000) は,失敗した場合に返されるものは何ですか?

ニン公子この新しいフォントは素敵です.

河馬Bitmexのテストネットワーク ((testnet.bitmex.com) もAPIインターフェイスがありますが,現在,取引所はBitmexのメインステーションのみを選択できます.APIドキュメントの住所はhttps://testnet.bitmex.com/app/apiOverviewです. どうしたら支援できるでしょうか?

エクシジンvar ret1 = exchanges[0].IO (("api", "future_estimated_price", "symbol=btc_usd"); Log (('ok 期貨 預期 配送 価格', ret1); https://dn-filebox.qbox.me/d1ed268c1e75753c5d289447d279aa9d81e41b5f.png 取引所の機能インターフェースを呼び出し,エラーを表示する場合は,なぜですか?

アレン・フロストラインrealTickerとTickerの違いは何ですか? 最近,リベリー策略が書き換えられ,両 API が同時に登場していますが,前者については言及されていないようです.

ビジョンPython の開発者として,API 文書に何が書かれていると思いますか? フィールド関数インターフェースが奇妙に見えるので,githubpageやreaddocsのように文書を書くことができますか?

アレン・フロストラインGetAccount: [EAPI:Rate limit exceeded] どうしたらいいか知りたいです. QQは持っていません.微信グループなどありますか? ありがとうございました.

zhjx2314StochRSI はサポートされていませんが,すぐに追加できますか?

イーフグPython ポリシーのリアルディスクでは,スクリプトは自分の Ali Cloud サーバーか botvs 集群か?

イーフグPythonのどのバージョンを使っていますか?

じっとしてGetFeeの解釈は,がFee構造を返し,単語を省略しているはずである.

スクワップこの例では,JSでタリブを呼び出す方法があります.

イーフグPythonのドキュメントを検索する

Wmjbs123 について策略編集のコードの背景は黒か白か? 刺眼,夜にコードを書く,近視が容易

Don.ロボットの微信の推し込みの概要を設定するにはどうすればいいですか?

数字狂い注文 (Order) 構造に,取引の均等価格のフィールドを追加できますか?

小さいことGetOrders: すべての未完成の注文を取得し,Order配列構造を返します. 中国のビットコイン取引ETHでは,最近10項のみ返します.

イーフグ統計的確率論の数学関数は何処で使えますか?

ジーバンこの関数の返した値は何でしょうか?

祖母が言ったLogReset はすべてのログを空にして,保存する記号を指定する数字参数を持つことができます. ブログの最新記事を削除するにはどうすればいいですか?

エドワード・ギューtalib のCORRE 関数は移植されていないように見えるか?

貧乏山の指標参照機能がないようです!

小さいものk線時間の読み取りは,どのように現在時間に翻訳されます? ああ,わからない,あまりにも長い,解決,ありがとう.

小さいもの列の数字を削除する方法,私は records.remove ((records[0]) と使っています.

スネークイユ通常,K線は時間K線で,日K線のATRはどのように呼び出すか.

スネークイユ通常,K線は時間K線で,日K線のATRはどのように呼び出すか.

57278863伝統的なフューチャーで価格を得たり,下注したりする方法について学びましょう.

キリン伝統的先物取引の例を!

小さいもの伝統的な先物取引の例を書いてください.

小さいもの複数の空单を同時に保持しているとき,保有状態をどのように印刷するか,私の印刷方法は[object object][object object],多单と空单保有状態をどのように取得するか,またGetTickerもあります. その週,次の週,および四半期をどのように取得するか,その週の価格,括弧の当週,次の週,および四半期を私は書いています.

エクシジンフューチャー取引所はGetTickerで取引を入手できますか? そのタイプの契約取引を返します (前週,次週...)

売るストックRSIの指標は?

モモックスCancelOrder ((orderId) 注文番号に基づいて注文をキャンセルし,trueまたはfalseを返します. true=セルが成功してキャンセルされましたか?

モモックス_G(K,V) 保存可能なグローバル辞書表 この方法で保存されるグローバル変数は,異なるポリシー間のデータ共有に使用できますか?

フルフィー3D人気急上昇

ゼロログプロフィットリセットで収益ログをリセットできます.

xcy直接EAをコピーして使えますか?

スイロンマンこのプラットフォームは素晴らしい 素晴らしい グループでの交流が多くなった

小さいものこの言語は,どんな言語で,学習資料があるのでしょうか?

Jxhbtc"データエラー" "週間 ロボットに接続できず 解決方法

ほら価格の計算は,決済価格を計算するだけのものですか?

btcrobot についてこんにちは 世界

小さな夢_C関数は,成功するまで,無意識に再挑戦します.

小さな夢Pythonのタリブライブラリをインストールする必要があります.https://www.botvs.com/bbs-topic/669 この記事を参照してください.

小さな夢スリープは,プログラムが何もしず,パラメータが設定されるのを待つミリ秒数, _Cは,パラメータを1回再呼び出し,転送された関数である.

小さな夢継承せずに,JSが直接オブジェクトに包み込まれます. {name: "新しいオブジェクト", old_exchange : exchange[0],...... }

小さな夢ローカルエディタ リモートシンクロプラグイン,基本的にはローカルエディタ リモートデュッキング.

小さな夢QQグループに来て,^^ 簡単に議論できます~

小さな夢APIのドキュメントでは,この関数が灰色で表示され,青色で表示され,説明が多くないことを意味する.

小さな夢ES6はサポートされていません ^^

小さな夢QQのグループへ行って,質問を説明して,私は答えます ^^

小さな夢メールの返信は"エラー"で,注文はしません. (実際は買おう,お金が足りない!)

ツィートルテOKCoinは,持っていた人民幣よりも多く購入された場合,何が返されますか?

小さな夢OKフューチャーで注文番号を返します.

ゼロすでに実行時に取引ペアを切り替えるサポートがあり,最新のホストをダウンロードする必要があります.サポート Bter/Poloniex 詳細 API 文書 取引関数のバーの説明 (ブラウザキャッシュを空にして,表示できない場合は刷新)

小さな夢QQ,私はあなたの質問を探します.

職業養子家庭ホストのIPを設定します. このIPは,ホストのIPを設定します.

小さな夢サーバーが応答していない.API KEYのリクエスト時にIPアドレスを設定しますか?

職業養子家庭これは恥ずかしいです.... 接続されたパーティが時間内に適切に応答しなかったため,または接続されたホストが応答に失敗したため,接続の試みが失敗した wsarecv: 2017-05-23 21:08:24 ビット時代 間違い GetAccount:タイムアウト 2017-05-23 21:08:02 ビット時代 誤り GetAccount:タイムアウト 2017-05-23 21:07:40 ビット時代 エラー GetAccount:タイムアウト 2017-05-23 21:07:20 再起動 IPのホワイトリストの問題なのか?

小さな夢取引所のサーバーは応答せず,TCPプロトコルは3回握手も確立されていない.

職業養子家庭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がサポートする通貨はわずかです.

小さな夢交換.IO を呼び出すことができます.

ニン公子アカウントの認証が必要なAPIはどうでしょう?

小さな夢アカウント認証を必要としないAPIは httpQuery (BotVSドキュメントを参照してください) を使用できますが,実際の取引APIにはアクセスが必要です.

小さな夢HttpQueryのAPIのパラメータを転送するには,https://www.okcoin.com/api/v1/future_estimated_price.do?symbol=btc_usdを使用できます. 口座の検証を必要としない取引所のAPIは,プラットフォーム上のHttpQuery関数を直接使用し,アカウントに関連した APIは IOAPIを使用します (IOはこれらの認証を必要としない取引のAPIをサポートしません). 投稿: https://www.botvs.com/bbs-topic/850

ビジョン素晴らしいAPIドキュメントを期待しています.

小さな夢リアルティッカーのAPIはどこで見られるの?

小さな夢https://dn-filebox.qbox.me/fe1a6f5563ed43a5357f858ecf8a50239619228e.png APIドキュメントはJavaScript言語で記述され,python版は交流コミュニティのページのトップに記述されている.

ゼロこんにちは,ご提案ありがとうございます. APIのドキュメントが現在再構築中です.

小さな夢"こんにちは"は,アクセス頻度が制限を超えていることを示しています. https://dn-filebox.qbox.me/a09498920d04cac62624b7438a058d2098d8fb00.png 戦略ではSleep ((1000) 機能を使用していますか? この1000は,プログラムがラウンドごとに1秒間停止させ,自律的に設定できます. 目的はプログラムのアクセスAPIの頻度を制御することです.

小さな夢https://dn-filebox.qbox.me/c29ab7fc279e1b758355f137907cf52dc8257df6.png 私の個人的に書いたSTOCHRSIの指標は,OKと比較されているが,速度が少し遅い,最適化が待っています.

ゼロbotvs で提供されるサーバーでの復習または自社のホストのサーバーでの復習を選択できます.バージョンは2.7.5です.

小さな夢投稿者: 藤井 さん

小さな夢背景のスタイルを自分で設定できます.

小さな夢Pythonのドキュメントが書き込まれています.

小さな夢タリブ・ライブラリのサポートも可能です.

ハズグッド48 https://www.botvs.com/bbs-topic/276

小さな夢戦略広場には,https://www.botvs.com/strategy/15098という例があるようです.

ゼロ取引所がサポートするオーダーのAvgPrice属性にアクセスできます. サポートしない取引所は0の属性になります.

イーフグ引用された資料は?

ゼロmathjs が満足できない場合は,第三者ライブラリをコピーインポートするポリシーを検索するだけです. 編成速度のために,システムはごく少数のライブラリしか内蔵していません.

小さな夢グループで問題がある場合,Mをすることができます~私は基本的にオンラインです.

ジーバンありがとうございました

小さな夢暗号通貨取引のデータベースの コード解析の解説を見ることができます. $Cross関数の解説があります.

ゼロ最近の記事は削除できませんが,最新の記事のみを保存できます.

キリンポジション[i] を使って,すべての保持を取得するには,ポジションは数列である.

ニン公子exchange.GetRecords ((PERIOD_D1)) を取得する

キリン私の伝統的なフューチャーとは"GetAccount: not login",パスワードを間違えてない,ログインできない"というものです.

ゼロデフォルトでは SetContractType が求められます.

ゼロこの true は,取引所が返したキャンセル命令の返し値です. しかし,実際にキャンセルした場合は,取引所内部での処理によって異なります.

モモックス3q

ゼロ暫くの間は別れられる.

シュアンシュアンMT4の専用サイトです.

ゼロJavascriptの情報はネット上にあります.

売る問題を解決した?

ゼロ直接レコードまたは純粋な価格の配列になります.