Documentación de la API cuantificada por el inventor

El autor:Un sueño pequeño., Creado: 2017-11-27 09:05:08, Actualizado: 2023-07-12 16:47:31

Los datos se han recibido y los seguimientos se han iniciado con el mecanismo de vigilancia EventLoop, por lo que se pierden estos eventos. // No se pierden estos eventos a menos que se inicie la llamada EventLoop ((-1) en la primera línea de código e inicie primero el mecanismo de vigilancia de 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);
}

Funciones integradas

_G(K, V)

_G(K, V)Esta función permite una función de diccionario global que se puede guardar, que es compatible con la revisión y el disco real. Después de la revisión, los datos guardados se eliminan. La estructura de los datos esKVLas tablas, permanentemente guardadas como archivos locales, con una base de datos separada en cada disco físico, persisten después de un reinicio o una salida del administrador.KEn la mayoría de los casos, el texto debe ser escrito como una cadena, sin distinción de tamaño o tamaño.VSe puede usar para cualquier cosa.JSONContenido secuenciado._G()Cuando la función no transmite ningún parámetro, la función se vuelve un parámetro._G()La función devuelve el disco real actual.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();
}

No hay que olvidarlo. Uso_GCuando se almacenan datos de forma funcional permanente, se debe usar la memoria y el espacio en el disco duro de manera razonable y no abusar; de lo contrario, puede causar problemas.Desbordamiento de la memoria¿Qué es lo que está pasando?

_D (tiempo, FMT)

_D(Timestamp, Fmt), devuelve la cadena de tiempo correspondiente a la barra de tiempo especificada.TimestampPara el tipo de valor, el valor es de milisegundos.FmtPara el tipo de strings,Fmt¿Qué es lo que está sucediendo?yyyy-MM-dd hh:mm:ss, devuelve el valor: tipo de cadena. Devuelve el tiempo actual sin pasar ningún parámetro. Por ejemplo:_D()¿Qué es esto?_D(1478570053241)El formato predeterminado es: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);
}

No hay que olvidarlo.PythonUso en la estrategia_D()Cuando el parámetro de entrada es el parámetro de tiempo a nivel de segundo, hay que tener en cuenta que el parámetro de entrada es el parámetro de tiempo a nivel de segundo.JavaScriptC++En la estrategia, el tiempo es de nivel de milisegundo, 1 segundo es igual a 1000 milisegundos). Usado en disco real_D()Cuando una función analiza una barra de tiempo como una cadena de tiempo legible, debe tener en cuenta la zona de tiempo del sistema operativo en el que se encuentra el programa administrador._D()La función analiza un cronómetro como una cadena de tiempo legible que está determinada por el tiempo del sistema administrador.

Por ejemplo, una horquilla1574993606000Para analizar el código:

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úmero, Precisión)

_N(Num, Precision), formatear un número de punto flotante.NumPara el tipo de valor,PrecisionPara el tipo entero. Retorno de valor: Tipo de valor numérico.

Por ejemplo:_N(3.1415, 2)Se borrará3.1415El valor después de dos dígitos del decimal, la función regresa3.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);
}

Si se necesita cambiar todos los números N a la izquierda del decimal a 0, se puede escribir así:

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

¿Qué es esto?

_C(function, args...)Esta función es una función de repetición, que se utiliza para obtener transacciones, obtener pedidos incompletos, etc.

La interfaz continuará llamando a la función especificada hasta que regrese el parámetro (().functionCuando se llama una función a la que se hace referencia, devuelve un valor en blanco ofalseLa mayoría de los usuarios de Twitter han sido llamados por sus padres, pero no por sus padres._C(exchange.GetTicker)Si el usuario no tiene la opción de volver a probar, puede llamar a la página de inicio de sesión._CDelay(...)Función para establecer el intervalo de repetición, por ejemplo_CDelay(1000)El cambio._CEl intervalo de repetición de la función es de 1 segundo.

Para las siguientes funciones:

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

Todos pueden ser aprobados_C(...)La función puede ser llamada para permitir errores._C(function, args...)Las funciones no están limitadas a las funciones erroneas enumeradas anteriormente, los parámetrosfunctionEs una referencia a la función y no una llamada a la función._C(exchange.GetTicker)No es_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);
}

Para funciones con parámetros_C(...)Cuando se comete un error:

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

También se puede usar para el manejo de errores de funciones personalizadas:

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

_Cruce ((Arr1, Arr2)

_Cross(Arr1, Arr2)y regresa el conjuntoarr1¿Qué es esto?arr2El número de ciclos de cruce de la serie. Los números positivos representan los ciclos ascendentes, los números negativos representan los ciclos descendentes, 0 es el mismo que el precio actual.

Se puede simular un conjunto de pruebas de datos._Cross(Arr1, Arr2)Función:

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

Visualizar los datos simulados para hacer observaciones

img

Las instrucciones de uso:Función integrada_Cross análisis y instrucciones de uso

JSONParse ((strJson) es el nombre de la aplicación.

JSONParse(strJson)Esta función se utiliza para analizar las cadenas de JSON. Puede analizar correctamente las cadenas de JSON que contienen valores numéricos más grandes, y analizará los valores numéricos más grandes como el tipo de cadena.

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

Colores personalizados

Cada cadena de mensajes puede usarse.#ff0000Este valor de RGB al final, representa la perspectiva que se desea mostrar.#ff0000112233En este formato, los últimos seis figuras representan el color de fondo.

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

Información del diario

La información del registro se registra en la base de datos del disco físico cuando se ejecuta.sqlite3Base de datos, en el que los archivos de la base de datos están en el dispositivo donde se encuentra el programa administrador, y los archivos de la base de datos en el programa administrador.robotPor ejemplo: ID es el nombre de un programa ejecutable.130350Los archivos de la base de datos de disco real están en../logs/storage/130350En este directorio..Es decir,robotEl archivo de la base de datos se llama130350.db3¿Qué es esto? Los registros en el sistema de revisión pueden ser revisados después de que la revisión haya terminado, haciendo clic en la esquina inferior derecha de la página de revisión.Descargar el diarioEl botón ] para descargar. Cuando se necesita migrar el disco físico a otro servidor, el administrador puede mover el archivo de la base de datos del disco físico (extensión llamada archivo de base de datos db3) al servidor de destino de la migración, configurando el nombre del archivo como el ID de disco físico correspondiente en la plataforma. Así, toda la información de registro del disco físico anterior no se pierde al migrar al nuevo dispositivo.

Registro de las operaciones

Log(message), guardar un mensaje en la lista de registros. El valor del parámetro:messagePuede ser de cualquier tipo. Si se suma después de la cadena@Los mensajes de caracteres entran en la cola de empuje y se empujan a la caja de correo, Telegram, WebHook, etc. configuradas en la configuración de empuje de la cuenta de la plataforma de comercio cuantitativa del inventor actual (en orden de apertura).Centro de controlPágina en la esquina superior derechaConfiguración de la cuentaLa página de Facebook de los activistasConfiguración de empujeLa página está sujeta a la configuración de la página.)

No hay que olvidarlo.

  • En "Debugging Tools" no se admite el empuje.
  • El sistema de retroalimentación no admite el empuje.
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@");
}

- ¿ Qué pasa?En el video:

UsoGolangEl programa de servicio 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)
}

ConfiguraciónWebHookhttp://XXX.XX.XXX.XX:9090/data?data=Hello_FMZ

Después de ejecutar el programa de servicio, ejecuta la política, la política empuja la información:

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

Recibe el envío y el servicio imprime la información:

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}

Impresiónbase64Imagen codificada LogFunción para imprimirbase64Las imágenes son codificadas para ser usadas en el video.`Comienza con:`En el final, por ejemplo:

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

LogApoyo para impresión directaPython¿Qué es esto?matplotlib.pyplotObjeto, siempre y cuando el objeto contienesavefigEl método puede ser directo.LogLos medios de comunicación también pueden imprimir información sobre el tema.

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

El registro de impresión cambia automáticamente de idioma LogLa función es compatible con el intercambio de idiomas.LogLas funciones de texto de salida cambian automáticamente a la lengua correspondiente según el idioma establecido en la página de la plataforma, por ejemplo:

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

LogProfit (Profito)

LogProfit(Profit), registrar el valor de ganancias y pérdidas, imprimir el valor de las ganancias y pérdidas y trazar una curva de ganancias según el valor de las ganancias y pérdidas.ProfitosPara el tipo de valor numérico.

La función se puede expresar en caracteres&Para finalizar, sólo se dibuja un gráfico de ganancias y no se imprime un registro de ganancias, por ejemplo:LogProfit(10, '&')

LogProfitReset (()

LogProfitReset()Si el registro de ganancias está vacío, se puede usar un parámetro de valor integer para especificar el número de entradas reservadas.

function main() {
    // 在收益图表上打印30个点,然后重置,只保留最后10个点
    for(var i = 0; i < 30; i++) {
        LogProfit(i)
        Sleep(500)
    }
    LogProfitReset(10)
}
def main():
    for i in range(30):
        LogProfit(i)
        Sleep(500)
    LogProfitReset(10)
void main() {
    for(int i = 0; i < 30; i++) {
        LogProfit(i);
        Sleep(500);
    }
    LogProfitReset(10);
}

LogStatus (Msg)

LogStatus(Msg)Esta información no se guarda en la lista de registros, solo se actualiza la información de estado del disco real actual, que se muestra en el menú de estado en la parte superior del área de registro de la página del disco real, y se puede llamar varias veces al estado de actualización.MsgPuede ser de cualquier tipo.

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

LogStatus(Msg)Apoyo para la impresiónbase64Las imágenes son codificadas para ser usadas en el video.`Comienza con:`En el final, por ejemplo:LogStatus("`data:image/png;base64,AAAA`")LogStatus(Msg)Apoyo a la transmisión directaPython¿Qué es esto?matplotlib.pyplotObjeto, siempre y cuando el objeto contienesavefigEl método puede ser transmitidoLogStatus(Msg)Funciones, por ejemplo:

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

Ejemplo de la salida de datos en la barra de estado:

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

Desactivar el botón de ajuste del botón de estado. Descripción de funciones:

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

Configuración del estilo del botón de estado:

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

La combinaciónGetCommand()Funciones, configuración de botones de estado y interacción:

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

También se admite la entrada de datos cuando se interactúa con los botones de la barra de estado de la construcción, y las instrucciones de interacción finalmente se usan para generar la información de la barra de estado.GetCommand()Captura de funciones. Aumento en la estructura de datos de los controles de botón en el menú de estadoinputPor ejemplo, para{"type": "button", "cmd": "open", "name": "开仓"}Aumento"input": {"name": "开仓数量", "type": "number", "defValue": 1}Se puede hacer que el botón aparezca una ventana con un control de cuadro de entrada (datos con un valor predeterminado de 1 en el cuadro de entrada, es decir, datos configurados por defValue) que se puede ingresar y enviar junto con la orden del botón. Por ejemplo, cuando se ejecuta el código de prueba siguiente, se aparece una ventana con un control de cuadro de entrada después de hacer clic en el botón "Open Stock" y se ingresa en el cuadro de entrada.111Después haga clic en "Confirm".GetCommandLa función captura el mensaje: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);
    }
}

La fusiónLogStatus(Msg)Las celdas de la tabla dibujada por la función son:

  • Fusión horizontal

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

  • Fusión vertical

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

La tabla de ajustes de estado muestra:

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

Además de la posibilidad de mostrar una tabla dividida en páginas, también se pueden mostrar varias tablas ordenadas de arriba a abajo.

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

Los efectos de ejecución:

No hay que olvidarlo. Cuando la política se ejecuta en el disco real, si se revisa el historial en la página del disco real, la barra de estado se pondrá en estado latente y dejará de actualizarse. Sólo se refrescarán los datos de la barra de estado cuando el registro esté en la primera página. Soporte para la exportación en el tablero de estadobase64Imágenes codificadas que también se pueden exportar a las tablas que aparecen en la barra de estadobase64Imágenes codificadas. Las imágenes codificadas no muestran más el código del ejemplo debido a que sus cadenas de datos son generalmente muy largas.

Habilitar el registro

EnableLog(IsEnable), registro de registro de la información de los pedidos abiertos o cerrados.isEnablePor ejemplo, en el caso de los libros de texto, el tipo de texto es el bol.IsEnableSe puede configurarfalseLos registros de pedidos no se imprimen y no se escriben en una base de datos de disco real.

Gráfico (en inglés)

Chart(...)En el caso de los gráficos, la función de dibujo de gráficos es la siguiente:

Chart({...})El parámetro es:JSONSecuenciadoLas reservas altas¿Qué es esto?Highcharts.StockChartParámetros. Añadir uno más que el parámetro original__isStockPropiedades, si se especifica__isStock:falseEn el caso de los gráficos, los gráficos se muestran como gráficos normales.

No hay que olvidarse de esto. Si está configurado__isStockLas propiedades defalseEl gráfico que se utiliza es:Las tablas de mayor importanciaEn la imagen de abajo:

Highcharts图表

Si está configurado__isStockLas propiedades detrueEl gráfico que se utiliza es:Las poblaciones altas(Por defecto)__isStock¿Por qué?trueEn la foto, se puede ver:

Highstocks图表

Volver a la opción de llamaradd(n, data)n¿Por qué?seriesLos índices (como 0),dataPara escribir datos en el gráfico) a un índice especificadoseriesAñadir datos, hacer llamadasreset()Los datos de los gráficos están en blanco.resetSe puede usar un parámetro numérico para especificar el número de entradas reservadas.

Se puede llamaradd(n, data, i)iPor eso los datos están enseriesEn el índice) para cambiar el correspondienteseriesLos datos que aparecen en el artículo.

Puede ser negativo, -1 es el último, -2 es el segundo decimal, por ejemplo, al dibujar una línea, modificar los datos en el último punto de la línea:

chart.add(0, [1574993606000, 13.5], -1)¿Qué es esto?series[0].dataLos datos del primer punto de la decima de los números.

Apoya la visualización de múltiples gráficos, con sólo introducir los parámetros de la matriz para configurar:var chart = Chart([{...}, {...}, {...}])Por ejemplo, un gráfico tiene dos.seriesEn el gráfico 2, hay una.seriesEn el gráfico 3, hay una.seriesEntonces,addCuando se especifica que el ID de la serie 0 y 1 representa los datos de las dos series de la actualización de la tabla 1,addCuando se especifica el ID de la secuencia como 2, se indica el primero de la tabla 2.seriesLa secuencia 3 se refiere a la primera de la tabla 3.seriesLos datos de las personas que viven en el país.

HighStockshttp://api.highcharts.com/highstock

Los gráficos muestran algunos de los ajustes de las propiedades:Ejemplos

Por ejemplo, los objetos de configuración de gráficos:

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.layoutLas propiedades

    Si esta propiedad está configurada con el valor "single", los gráficos no se superponen (no se muestran como etiquetas separadas), sino que se muestran por separado (se muestran como planos).

  • cfgA.extension.heightLas propiedades

    Esta propiedad se utiliza para establecer la altura de los gráficos, el valor puede ser de tipo numérico o puede ser configurado como "300px".

  • cfgA.extension.colLas propiedades

    Esta propiedad se utiliza para establecer el ancho del gráfico, que se divide en 12 unidades de ancho de página, y se establece en 8 para que el gráfico tenga 8 unidades de ancho.

    La estrategia para ejecutar el modelo completo:

    En el ejemplo anterior, los objetos de configuración gráfica muestran el efecto:

  • Los datos en los objetos de configuración de gráficos se actualizan cuando se modifica directamente la configuración del gráfico y luego se actualiza el gráfico:

    Por ejemplo, en el caso deJavaScriptParámetros de código en el ejemploUn ejemplo completo):

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

    AprobadoaddLos métodos de actualización de datos, por ejemplo, añadir un elemento a un diagrama de galletas.JavaScriptParámetros de código en el ejemploUn ejemplo completo):

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

    Un ejemplo simple de dibujo:

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

Más.

¿Qué es esto?Hay un problema con la función_C. ¿Trabajará siempre o solo una vez?

¡Qué bien!_C ((function, args...) ¿Es este el 3s por defecto? ¿Se puede cambiar por defecto para poner directamente _CDelay ((1000) antes de _C ((function, args...)? ¿Se puede establecer una vez?

- ¿ Qué es eso?Cluster: Si creas 1000 robots simultáneamente y sin estrés, puedes crear varios administradores para distribuir las tareas. ¿Hay ejemplos de código para construir un cluster? ¿Cómo construir varios administradores para distribuir las tareas?

- ¿Qué quieres?Log ((talib.help (('MACD')); sólo se puede usar en js, Python no tiene la propiedad talib.help...

Cjz140¿Cuál es la diferencia entre _C (función, args...) y la función de sueño, que creo que significa esperar para volver a intentarlo?

3263243y¿Cómo borrar ErrorFilter después de SetErrorFilter? sin filtrar el mensaje de error.

¿Qué quiere decir?¿Hay alguna manera de usar una biblioteca de terceros?

¿Qué quiere decir?¿Qué debe rellenar la clase padre si se quiere heredar una nueva clase definida por un objeto de intercambio?

yhanwu¿Hay herramientas de depuración locales?

el pingüino¿Qué pasa con el exange.IO?

el pingüino¿Por qué la función sell está en gris, es que la función de representación ya no está disponible?

el pingüino¿Por qué la función sell está en gris, es que la función de representación ya no está disponible?

el pingüinoNo entiendo el lenguaje de los js.

el pingüinoNo entiendo el lenguaje de los js.

Don.¿Cómo se escribe la línea media del volumen?

la tortuga¿Qué se devuelve si no se consigue?

El hombre de NingEsta nueva tipografía es hermosa.

hipopótamoLa red de pruebas de Bitmex (testnet.bitmex.com) también tiene una interfaz API, pero actualmente las bolsas solo pueden elegir la base de Bitmex, y la dirección del archivo de API es https://testnet.bitmex.com/app/apiOverview. ¿Cómo apoyar?

- ¿Qué quieres decir?var ret1 = exchanges[0].IO (("api", "future_estimated_price", "symbol=btc_usd"); Log (('ok futuros precio de entrega estimado', ret1); https://dn-filebox.qbox.me/d1ed268c1e75753c5d289447d279aa9d81e41b5f.png ¿Por qué llamar a las interfaces de otras bolsas y escribir este error?

todosfrostline¿Cuál es la diferencia entre realTicker y Ticker? Recientemente se ha reescrito la estrategia de los paquetes, y ambos aparecen al mismo tiempo, pero parece que no se menciona en la primera API.

las visionesHola, como desarrollador de Python, ¿qué crees que escribe tu documentación API? Algunas interfaces de función de campo parecen extrañas, ¿puedes escribir un documento como githubpage y readdocs?

todosfrostlineGetAccount: [EAPI: Rate limit exceeded] ¿Quieren saber cómo se resuelve esto?

Zjx2314No soporta StochRSI, ¿se puede añadir pronto?

Yhfgg¿El guión está en su propio servidor en la nube Ali o en el botvs cluster?

Yhfgg¿Qué versión de python usas?

muy bien.La explicación de GetFee debería ser que regrese una estructura de Fee, con una estructura menos.

¿Qué quieres decir?¿Puedo llamar a talib con js?

YhfggBuscar documentación en python

- ¿Qué quieres decir?¿Puede el fondo de código de la estrategia de edición tener un negro? ojos blancos, escribir código en la noche, fácil de miopía.

Don.¿Cómo configurar el resumen en el bot WeChat?

El número de locos¿Se puede añadir un campo de precio de transacción en la estructura de la orden?

El pequeño.GetOrders: Obtener todos los pedidos incompletos, devolver una estructura de orden de la matriz, en el comercio de Bitcoin en China ETH, sólo devuelve los últimos 10 artículos, aquí hay una función que devuelve todos los pedidos incompletos de Bitcoin en China ETH, lo que significa que otras plataformas pueden devolver todo con GetOrders, sólo que este fantasma de China Bitcoin devuelve 10 artículos.

Yhfgg¿Cuál es la función matemática que se necesita para la teoría de probabilidades estadísticas?

- ¿ Qué?¿Qué significa el valor que devuelve la función $.Cross ((x, y)?

Mi abuela dice:El LogReset puede borrar todos los registros con un parámetro numérico para especificar los registros reservados. ¿Cómo se borran los últimos registros?

- ¿Qué quieres?¿La función CORRE en talib parece no haber sido trasladada o se perdió?

El pueblo pobre.¡Parece que no hay una función de referencia de indicadores!

Pequeño¿Cómo se traduce el tiempo de la línea k de lectura en el tiempo actual oh, no entiendo, demasiado largo uno, resuelto, gracias

Pequeño¿Cómo se escribe para eliminar números de las matrices, me parece que no funciona con records.remove ((records[0])

el serpiente¿Cómo llamar ATR a la línea K de día?

el serpiente¿Cómo llamar ATR a la línea K de día?

57278863Aprenda cómo obtener precios y pedidos de futuros tradicionales, lo siento, sus raíces son muy finas.

el mismo¡El ejemplo de los futuros tradicionales!

Pequeño¿Puedes escribir un ejemplo de comercio de futuros tradicionales?

Pequeño¿Cómo imprimir el estado de la posesión de varios ordenes en el mismo tiempo, cómo imprimir mi [object object], cómo obtener el estado de la posesión de varios ordenes y ordenes en el mismo tiempo, y GetTicker ((), cómo obtener la semana, la próxima semana y el trimestre de la semana en el precio, la semana, la próxima semana y el trimestre en paréntesis que escribí.

- ¿Qué quieres decir?¿Pueden los mercados de futuros obtener transacciones con GetTicker (??), y devuelven el tipo de mercado de contrato (?? de la semana, de la semana siguiente...)?

Vender mucho¿Qué indicador del StochRSI se puede añadir?

el momoxCancelOrder ((orderId) para cancelar un pedido basado en el número de la orden, devuelve true o false, pregunta true= la celda fue cancelada con éxito, ¿verdad?

el momox_G(K, V) Se puede guardar una lista de dicionarios globales ¿Puede este método guardar variables globales para compartir datos entre diferentes políticas?

¿Qué quieres decir?La popularidad

No hay nadaLos registros de ganancias se pueden restablecer con LogProfitReset. El historial de los gráficos de ganancias anteriores desaparece.

- ¿ Qué?¿Se puede copiar directamente la EA para usarla?

El hombre de los cielosSiento que esta plataforma es genial, más interacción en el grupo.

Pequeño¿Qué idioma es este? ¿Hay material para aprender?

JxhbtcError de datos Una semana sin conectar el robot, ¿cómo resolverlo?

¿Qué quieres decir?¿Es el índice TA sólo un cálculo del precio de cierre?

¿ Qué pasa?Hola, mundo.

Un sueño pequeño.La función _C intentará repetidamente sin pensarlo hasta que obtenga un resultado exitoso.

Un sueño pequeño.La biblioteca talib de python requiere una instalación. https://www.botvs.com/bbs-topic/669 puede verse en este post.

Un sueño pequeño.Sleep es el número de milisegundos en que el programa no hace nada y espera que el parámetro se establezca, _C es la función que vuelve a llamar el parámetro.

Un sueño pequeño.Sin necesidad de herencia, JS se envuelve directamente en el objeto {name: "nuevo objeto", old_exchange: exchange[0],...... }

Un sueño pequeño.Los editores locales, los complementos de sincronización remota, basicamente, son editores locales, desinstalación remota.

Un sueño pequeño.¿Por qué no vienes al grupo de QQ para hablar?

Un sueño pequeño.En la documentación de la API, gris significa que la función no tiene demasiadas explicaciones de despliegue, se muestra en gris, los representantes de azul tienen más explicaciones, eso es todo.

Un sueño pequeño.ES6 está fuera de soporte.

Un sueño pequeño.¿Puedes ir al grupo de QQ? Yo, describe el problema, yo voy a responder ^^

Un sueño pequeño.En la actualidad, la mayoría de las aplicaciones de Google no están disponibles para los usuarios, pero en la actualidad, la mayoría de las aplicaciones están disponibles para los usuarios de Google.

la tortugaPor ejemplo, OKCoin, si la cantidad comprada es mayor que la cantidad de monedas que se tienen, ¿qué se devuelve?

Un sueño pequeño.En concreto, en qué bolsa de valores voy a devolver un número de orden en OK Futures?

No hay nadaYa se admite el cambio de transacciones en ejecución, se requiere la descarga del último administrador. Se admite Bter/Poloniex Detalles API Documentación Descripción de la función de transacción en la barra de abajo ((Limpiar la caché del navegador y actualizar si no se ve)

Un sueño pequeño.QQ, me voy a ayudar a encontrar la pregunta. 359706687

Familias de criadores profesionales¿Cómo puedo configurar una lista blanca? ¿Cómo configuro la dirección IP del host?

Un sueño pequeño.Este es el enlace subyacente No se ha creado El servidor no responde. ¿Se ha configurado la dirección IP cuando se solicita la API KEY?

Familias de criadores profesionalesEsto es embarazoso. La política que podía ejecutarse cambió a la era de los bites, y GetAccount no puede acceder a GetAccount: Post http://api.btc38.com/v1/getMyBalance.php: read tcp 192.168.0.227:58596->211.149.148.144:80: wsarecv: A connection attempt failed because the connected party did not properly respond after a period of time, or established connection failed because connected host has failed to respond. 2017-05-23 21:08:24 Era de los Bites Error en el registro de GetAccount: timeout 2017-05-23 21:08:02 Era de los Bitcoins Error en el GetAccount: tiempo de espera 2017-05-23 21:07:40 Era bit error GetAccount: tiempo de espera 2017-05-23 21:07:20 Reinicio del proyecto ¿Es el problema de la lista blanca de IP???

Un sueño pequeño.Los servidores de la bolsa no respondieron, el protocolo TCP no se estableció ni se estrechó la mano tres veces.

Familias de criadores profesionalesA connection attempt failed because the connected party did not properly respond after a period of time (Un intento de conexión fracasó porque la parte conectada no respondió adecuadamente después de un período de tiempo)

Un sueño pequeño.Hola! Hablo de la función exchange.IO ((api, ApiName, Args) que no es compatible, por favor vea https://www.botvs.com/bbs-topic/812

Familias de criadores profesionalesUn intento de conexión falló porque la parte conectada no respondió adecuadamente después de un período de tiempo,

Familias de criadores profesionales¿No es compatible con la era de los bitcoins?

Un sueño pequeño.https://dn-filebox.qbox.me/a709b30c6cc0a3565234b9e0c99b073f7ba8b454.png ¿Cómo se puede hacer eso?

El hombre de NingPor ejemplo, quiero hacer un intercambio de todas las monedas de poloniex, pero solo hay unas pocas monedas compatibles con BOTvs, y exchange.IO parece no admitir la red P.

Un sueño pequeño.Se puede llamar exchange.IO.

El hombre de Ning¿Qué pasa con las API que requieren la verificación de cuentas?

Un sueño pequeño.Si la API no requiere la verificación de la cuenta, puede utilizar httpQuery (ver documentación BotVS para más información), la API de transacción real requiere acceso.

Un sueño pequeño.Los parámetros de la API HttpQuery se pueden transmitir a través de: https://www.okcoin.com/api/v1/future_estimated_price.do?symbol=btc_usd. Esto es suficiente. En la página de Facebook del botvs.com se puede leer:

las visionesGracias, espero que haya una excelente documentación de la API.

Un sueño pequeño.¿Dónde se puede ver la API realTicker?

Un sueño pequeño.En la actualidad, la mayoría de los archivos están en manos de personas que no son miembros de la comunidad. La documentación de la API es el lenguaje JavaScript. Descrito en la versión de python. Descrito en la parte superior de la página de la comunidad de chat de chat.

No hay nadaHola, gracias por la sugerencia, la documentación de la API está siendo reconstruida.

Un sueño pequeño.Bienvenido ~ muestra que la frecuencia de acceso está fuera de la limitación. En la actualidad, la mayoría de los archivos de la red social están en manos de personas que no son miembros de la comunidad. ¿Utilizan la función Sleep (?1000) en la política?, Este 1000 es para que el programa se detenga un segundo por ronda, que se puede configurar por sí mismo, el objetivo es controlar la frecuencia de acceso del programa a la API, ya que algunos intercambios establecen un límite máximo de acceso, un cierto tiempo más de un cierto número de visitas se negará el acceso, bloqueando la dirección IP.

Un sueño pequeño.https://dn-filebox.qbox.me/c29ab7fc279e1b758355f137907cf52dc8257df6.png Lo que yo personalmente he escrito sobre los indicadores de STOCHRSI que ya se han comparado con OK, es que la velocidad es un poco lenta y debe ser optimizada, por el momento.

No hay nadaSe puede elegir si se reanudará en el servidor proporcionado por botvs o en el servidor de su propio administrador, la versión es 2.7.5

Un sueño pequeño.Ahora añadido.

Un sueño pequeño.Ahora puedes configurar tu propio estilo de fondo.

Un sueño pequeño.El archivo de python está siendo escrito.

Un sueño pequeño.También puede acceder a la biblioteca talib.

¿Qué quieres decir? https://www.botvs.com/bbs-topic/276

Un sueño pequeño.Parece que hay un ejemplo en Strategy Square, https://www.botvs.com/strategy/15098

No hay nadaEl acceso a las propiedades de Orders de AvgPrice, que los intercambios pueden apoyar, los intercambios que no lo hacen siempre tendrán la propiedad 0.

Yhfgg¿Cómo se cita una fuente de terceros?

No hay nadaSi mathjs no puede hacerlo, solo puede buscar una política de copia e importación de una biblioteca de terceros. Para compiler más rápido, el sistema solo tiene una pequeña cantidad de bibliotecas integradas.

Un sueño pequeño.No soy muy amable, hay problemas en el grupo, ¿puedes decirme que estoy en línea?

- ¿ Qué?Gracias.

Un sueño pequeño.¿En el grupo? Puedes ver el análisis de código de la biblioteca de transacciones de monedas digitales en la versión de comentarios, donde hay comentarios sobre la función $.Cross.

No hay nadaNo se puede borrar lo más reciente, solo se pueden guardar los últimos artículos... se borran todos los viejos.

el mismoPara obtener cada posición con la posición [i], la posición es un conjunto.

El hombre de NingEn el caso de los registros de datos, el número de datos de los registros de datos es el número de datos de los registros.

el mismoMis futuros tradicionales siempre me han dicho: "GetAccount: no login", "No hay error de contraseña, no puedo iniciar sesión".

No hay nadaPor defecto es semana, para obtener el tipo de contrato especificado se necesita SetContractType primero.

No hay nadaComo se ha visto, este true es el valor de retorno de la acción de cancelar la orden que el intercambio devuelve, pero la cancelación real no se cancela, dependiendo de cómo se trate dentro del intercambio.

el momox3q

No hay nada¡No! ¡Está separado!

- ¿ Qué?Por supuesto que no, eso es exclusivo de MT4.

No hay nadaLa información de JavaScript está en todas partes en la red.

Vender mucho¿Está resuelto su problema?

No hay nadaLa mayoría de las veces, los datos que se envían pueden ser directamente registros o un conjunto de precios puros.