Изобретатели количественно документируют API

Автор:Маленькие мечты, Создано: 2017-11-27 09:05:08, Обновлено: 2023-07-12 16:47:31

После того, как мы получили данные, мы начали прослушивать EventLoop, и мы упустили эти события. // Не пропустите эти события, если не начнете вызывать EventLoop ((−1) в первой строке кода и сначала не внедрите механизм прослушивания EventLoop

// Log("GetDepth:", routine_getDepth.wait()) 如果这里提前调用wait函数取出GetDepth函数并发调用的结果,此次GetDepth函数收到请求结果的事件便不会在EventLoop函数返回
var ts1 = new Date().getTime()
var ret1 = EventLoop(0)

var ts2 = new Date().getTime()
var ret2 = EventLoop(0)

var ts3 = new Date().getTime()
var ret3 = EventLoop(0)

Log("第1个并发任务完成的为:", _D(ts1), ret1)
Log("第2个并发任务完成的为:", _D(ts2), ret2)
Log("第3个并发任务完成的为:", _D(ts3), ret3)

Log("GetTicker:", routine_getTicker.wait())
Log("GetDepth:", routine_getDepth.wait())
Log("GetTrades:", routine_getTrades.wait())

}


```python
import time
def main():
    routine_getTicker = exchange.Go("GetTicker")
    routine_getDepth = exchange.Go("GetDepth")
    routine_getTrades = exchange.Go("GetTrades")
    
    ts1 = time.time()
    ret1 = EventLoop(0)
    
    ts2 = time.time()
    ret2 = EventLoop(0)
    
    ts3 = time.time()
    ret3 = EventLoop(0)
    
    Log("第1个并发任务完成的为:", _D(ts1), ret1)
    Log("第2个并发任务完成的为:", _D(ts2), ret2)
    Log("第3个并发任务完成的为:", _D(ts3), ret3)
    
    Log("GetTicker:", routine_getTicker.wait())
    Log("GetDepth:", routine_getDepth.wait())
    Log("GetTrades:", routine_getTrades.wait())
void main() {
    auto routine_getTicker = exchange.Go("GetTicker");
    auto routine_getDepth = exchange.Go("GetDepth");
    auto routine_getTrades = exchange.Go("GetTrades");
    
    auto ts1 = Unix() * 1000;
    auto ret1 = EventLoop(0);
    
    auto ts2 = Unix() * 1000;
    auto ret2 = EventLoop(0);
    
    auto ts3 = Unix() * 1000;
    auto ret3 = EventLoop(0);
    
    Log("第1个并发任务完成的为:", _D(ts1), ret1);
    Log("第2个并发任务完成的为:", _D(ts2), ret2);
    Log("第3个并发任务完成的为:", _D(ts3), ret3);
    
    Ticker ticker;
    Depth depth;
    Trades trades;
    routine_getTicker.wait(ticker);
    routine_getDepth.wait(depth);
    routine_getTrades.wait(trades);
    
    Log("GetTicker:", ticker);
    Log("GetDepth:", depth);
    Log("GetTrades:", trades);
}

Встроенные функции

_G(K, V)

_G(K, V)Эта функция реализует сохранную функцию глобального словаря, поддерживающую ретро- и дисковую проверку. После ретро-проверки сохраненные данные удаляются. Структура данных:KVТаблицы, постоянно сохраняющие локальные файлы, отдельные базы данных на каждом диске, сохраняющиеся после перезагрузки или выхода администратора.KЕсли вы хотите, чтобы ваш сайт был доступным для всех пользователей, вы должны использовать его как строку, без разделения по размеру и размеру.VЭто может быть сделано для любогоJSONСериализированное содержимое._G()Если вы хотите, чтобы ваша функция была прозрачной, вы можете использовать эту функцию, если вы хотите, чтобы ваша функция была прозрачной._G()Функция возвращает текущий диск.ID

function main(){
    // 设置一个全局变量num,值为1
    _G("num", 1)     
    // 更改一个全局变量num,值为字符串ok
    _G("num", "ok")    
    // 删除全局变量num
    _G("num", null)
    // 返回全局变量num的值
    Log(_G("num"))
    // 删除所有全局变量
    _G(null)
    // 返回实盘ID
    var robotId = _G()
}
def main():
    _G("num", 1)     
    _G("num", "ok")    
    _G("num", None)
    Log(_G("num"))
    _G(None)
    robotId = _G()
void main() {
    _G("num", 1);
    _G("num", "ok");
    _G("num", NULL);
    Log(_G("num"));
    _G(NULL);
    // 不支持 auto robotId = _G();
}

Обратите внимание: Использование_GФункциональное перманентное хранение данных должно быть разумно использовано в соответствии с памятью и жестким дисковым пространством аппаратного устройства и не должно быть злоупотреблено; в противном случае это может привести к повреждению.Переполнение памятиВ этом вопросе.

_D ((Временная марка, FMT)

_D(Timestamp, Fmt), возвращает временную строку, соответствующую заданному времени.TimestampДля типа числа значение миллисекундное число.FmtВ этом случае мы можем использовать:FmtПо умолчаниюyyyy-MM-dd hh:mm:ss, возвращает значение: тип строки. Возвращает строку, соответствующую заданному временному диапазону ((миллисекунд), без передачи каких-либо параметров и возвращает текущее время; например:_D()Или_D(1478570053241)По умолчаниюyyyy-MM-dd hh:mm:ss

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

Обратите внимание:PythonИспользование в стратегии_D()При этом необходимо обратить внимание, что параметры передачи - это секундовые временные рамки.JavaScriptC++В стратегии используется время на уровне миллисекундов, и 1 секунда равна 1000 миллисекундам). Использование в реальном времени_D()Функции, которые анализируют временной пояс как читаемую временную строку, должны обращать внимание на часовой пояс операционной системы, в которой находится администраторская программа._D()Функция анализирует время, которое может быть прочитано в строке времени, которая определена в соответствии с временем хост-системы.

Так, например, время может быть1574993606000Использование кодового анализа:

function main() {
    Log(_D(1574993606000))
}
def main():
    # 北京时间的服务器上运行:2019-11-29 10:13:26 ,另一台其它地区的服务器上的托管者运行此代码结果则为:2019-11-29 02:13:26
    Log(_D(1574993606))
void main() {
    Log(_D(1574993606000));
}

_N ((Num, точность)

_N(Num, Precision), Форматирование плавающего числа.NumДля типа числаPrecisionДля целого типа. Вернутое значение: числовой тип.

Например:_N(3.1415, 2)Удалить3.1415Значение за двумя цифрами от дефекта, которое возвращает функция.3.14

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

Если мы хотим, чтобы все N чисел слева от дробиков были нулевыми, мы можем написать это так:

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

_C(...)

_C(function, args...)Функция, используемая для получения проб, получения незавершенных заказов и т. д., допускает ошибки.

Интерфейс будет продолжать вызывать указанную функцию до успешного возвращения параметров (((functionВозвращает пустое значение при вызове ссылки илиfalseНапример: "Я не могу позвонить, потому что у меня нет телефона"._C(exchange.GetTicker)По умолчанию перепробовать через 3 секунды._CDelay(...)Функции для установки интервалов повторных испытаний, например_CDelay(1000)Это означает изменение._CФункция перепробуется с интервалом в 1 секунду.

Для функций:

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

Все они могут быть приняты._C(...)Функция позволяет вызывать ошибки._C(function, args...)Функции не ограничены ошибочностью функций, перечисленных выше, параметрыfunctionЭто функция ссылки, а не вызов функции, обратите внимание, что_C(exchange.GetTicker)Это не так_C(exchange.GetTicker())

function main(){
    var ticker = _C(exchange.GetTicker)
    // 调整_C()函数重试时间间隔为2秒
    _CDelay(2000)
    var depth = _C(exchange.GetDepth)
    Log(ticker)
    Log(depth)
}
def main():
    ticker = _C(exchange.GetTicker)
    _CDelay(2000)
    depth = _C(exchange.GetDepth)
    Log(ticker)
    Log(depth)
void main() {
    auto ticker = _C(exchange.GetTicker);
    _CDelay(2000);
    auto depth = _C(exchange.GetDepth);
    Log(ticker);
    Log(depth);
}

Использование для функций с параметрами_C(...)Если вы ошибаетесь:

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

Также можно использовать ошибки для устранения ошибок в пользовательских функциях:

var test = function(a, b){
    var time = new Date().getTime() / 1000
    if(time % b == 3){
        Log("符合条件!", "#FF0000")
        return true
    }
    Log("重试!", "#FF0000")
    return false
}

function main(){
    var ret = _C(test, 1, 5)
    Log(ret)
}
import time
def test(a, b):
    ts = time.time()
    if ts % b == 3:
        Log("符合条件!", "#FF0000")
        return True
    Log("重试!", "#FF0000")
    return False

def main():
    ret = _C(test, 1, 5)
    Log(ret)
// C++ 不支持这种方式对于自定义函数容错

_Кросс ((Arr1, Arr2)

_Cross(Arr1, Arr2)Возвращает матрицуArr1иarr2Число пересекающихся циклов. Положительное число - цикл, отрицательное - цикл, 0 - текущая цена. Параметровое значение: числовой тип матрицы.

Можно моделировать набор тестов на данные_Cross(Arr1, Arr2)Функция:

// 快线指标
var arr1 = [1,2,3,4,5,6,8,8,9]
// 慢线指标
var arr2 = [2,3,4,5,6,7,7,7,7]
function main(){
    Log("_Cross(arr1, arr2) : ", _Cross(arr1, arr2))
    Log("_Cross(arr2, arr1) : ", _Cross(arr2, arr1))
}
arr1 = [1,2,3,4,5,6,8,8,9]     
arr2 = [2,3,4,5,6,7,7,7,7]
def main():
    Log("_Cross(arr1, arr2) : ", _Cross(arr1, arr2))
    Log("_Cross(arr2, arr1) : ", _Cross(arr2, arr1))
void main() {
    vector<double> arr1 = {1,2,3,4,5,6,8,8,9};
    vector<double> arr2 = {2,3,4,5,6,7,7,7,7};
    Log("_Cross(arr1, arr2) : ", _Cross(arr1, arr2));
    Log("_Cross(arr2, arr1) : ", _Cross(arr2, arr1));
}

img

Визуализировать данные моделирования для наблюдения

img

Конкретные инструкции по использованию:Встроенная функция_Cross Анализ и инструкции по использованию

JSONParse ((strJson)

JSONParse(strJson)Эта функция используется для анализа JSON-строк. Если JSON-строки, содержащие более крупные числа, могут быть правильно проанализированы, то более крупные числа будут проанализированы в виде строки.

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

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

Оригинальные цвета

Каждая строка сообщения может быть использована.#ff0000Это означает, что RGB-значение, в конце, представляет собой вид, который нужно показать.#ff0000112233В этом формате последние шесть символов представляют цвет фона.

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

Информация о дневнике

При запуске диска информация о журнале записывается в базе данных диска, используя базы данных диска.sqlite3База данных, на дискетах базы данных файлы находятся на устройстве, на котором находится программа хостера, базы данных файлы находятся на компьютере (robotИспользуемые программы) в каталоге.130350Файлы на диске../logs/storage/130350В этом каталоге..То естьrobotДополнительная информация, которую вы можете найти в этом каталоге, приведена в разделе130350.db3Я не знаю. После завершения рецензирования можно нажать на кнопку в правом нижнем углу страницы.Загрузка журналов[Кнопка для загрузки]. При необходимости перемещения диска на другой сервер администратор может переместить файл на диске (с расширением DB3) на мигрируемый сервер и установить имя файла на соответствующий на платформе ID диска. Таким образом, вся информация о журнале предыдущего диска не будет утрачена при переходе на новое устройство.

Журнал...

Log(message), сохранить сообщение в списке журналов.messageЭто может быть любой тип. Если после строки будет добавлено@В этом случае сообщение будет отправлено в очередь, и будет отправлено в почту, 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@");
}

WebHookПродвижение:

Использование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 ((Прибыль)

LogProfit(Profit), записывая прибыль и убыток, печатая прибыль и убыток и рисуя кривую прибыли на основе прибыли и убытка; параметры:ПрибыльДля типа числа.

Если мы используем символы,&В конце концов, просто нарисуйте график доходов, а не печатайте журналы доходов, например:LogProfit(10, '&')

LogProfitReset (()

LogProfitReset(), снять все журналы доходов, можно использовать целый параметр, чтобы указать количество записей, которые нужно сохранить.

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

LogStatus ((Msg)

LogStatus(Msg)Данная информация не сохраняется в списке журналов, но обновляется только информацией о состоянии текущего диска.MsgВы можете использовать любой тип.

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

LogStatus(Msg)Поддержка печатиbase64Изображения, которые были закодированы,`Начнем с`В конце, например:LogStatus("`data:image/png;base64,AAAA`")LogStatus(Msg)Поддержка прямого доступаPythonО чем вы?matplotlib.pyplotОбъекты, если они содержатsavefigИ мы можем использовать это.LogStatus(Msg)Функции, например:

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

Пример вывода данных из строки состояния:

function main() {
    var table = {type: 'table', title: '持仓信息', cols: ['列1', '列2'], rows: [ ['abc', 'def'], ['ABC', 'support color #ff0000']]}
    // JSON序列化后两边加上`字符,视为一个复杂消息格式(当前支持表格)
    LogStatus('`' + JSON.stringify(table) + '`')                    
    // 表格信息也可以在多行中出现
    LogStatus('第一行消息\n`' + JSON.stringify(table) + '`\n第三行消息')
    // 支持多个表格同时显示,将以TAB显示到一组里
    LogStatus('`' + JSON.stringify([table, table]) + '`')
    
    // 也可以构造一个按钮在表格中,策略用GetCommand接收cmd属性的内容                                
    var table = { 
        type: 'table', 
        title: '持仓操作', 
        cols: ['列1', '列2', 'Action'], 
        rows: [ 
            ['abc', 'def', {'type':'button', 'cmd': 'coverAll', 'name': '平仓'}]
        ]
    }
    LogStatus('`' + JSON.stringify(table) + '`') 
    // 或者构造一单独的按钮
    LogStatus('`' + JSON.stringify({'type':'button', 'cmd': 'coverAll', 'name': '平仓'}) + '`') 
    // 可以自定义按钮风格(bootstrap的按钮属性)
    LogStatus('`' + JSON.stringify({'type':'button', 'class': 'btn btn-xs btn-danger', 'cmd': 'coverAll', 'name': '平仓'}) + '`')
}
import json
def main():
    table = {"type": "table", "title": "持仓信息", "cols": ["列1", "列2"], "rows": [["abc", "def"], ["ABC", "support color #ff0000"]]}
    LogStatus('`' + json.dumps(table) + '`')
    LogStatus('第一行消息\n`' + json.dumps(table) + '`\n第三行消息')
    LogStatus('`' + json.dumps([table, table]) + '`')

    table = {
        "type" : "table", 
        "title" : "持仓操作", 
        "cols" : ["列1", "列2", "Action"], 
        "rows" : [
            ["abc", "def", {"type": "button", "cmd": "coverAll", "name": "平仓"}]
        ] 
    }
    LogStatus('`' + json.dumps(table) + '`')
    LogStatus('`' + json.dumps({"type": "button", "cmd": "coverAll", "name": "平仓"}) + '`')
    LogStatus('`' + json.dumps({"type": "button", "class": "btn btn-xs btn-danger", "cmd": "coverAll", "name": "平仓"}) + '`')
void main() {
    json table = R"({"type": "table", "title": "持仓信息", "cols": ["列1", "列2"], "rows": [["abc", "def"], ["ABC", "support color #ff0000"]]})"_json;
    LogStatus("`" + table.dump() + "`");
    LogStatus("第一行消息\n`" + table.dump() + "`\n第三行消息");
    json arr = R"([])"_json;
    arr.push_back(table);
    arr.push_back(table);
    LogStatus("`" + arr.dump() + "`");

    table = R"({
        "type" : "table", 
        "title" : "持仓操作", 
        "cols" : ["列1", "列2", "Action"], 
        "rows" : [
            ["abc", "def", {"type": "button", "cmd": "coverAll", "name": "平仓"}]
        ] 
    })"_json;
    LogStatus("`" + table.dump() + "`");
    LogStatus("`" + R"({"type": "button", "cmd": "coverAll", "name": "平仓"})"_json.dump() + "`");
    LogStatus("`" + R"({"type": "button", "class": "btn btn-xs btn-danger", "cmd": "coverAll", "name": "平仓"})"_json.dump() + "`");
}

Настройка кнопки состояния и ее отключение, описание функции:

img

function main() {
    var table = {
        type: "table",
        title: "状态栏按钮的禁用、描述功能测试",
        cols: ["列1", "列2", "列3"], 
        rows: []
    }
    var button1 = {"type": "button", "name": "按钮1", "cmd": "button1", "description": "这是第一个按钮"}
    var button2 = {"type": "button", "name": "按钮2", "cmd": "button2", "description": "这是第二个按钮,设置为禁用", "disabled": true}
    var button3 = {"type": "button", "name": "按钮3", "cmd": "button3", "description": "这是第三个按钮,设置为启用", "disabled": false}
    table.rows.push([button1, button2, button3])
    LogStatus("`" + JSON.stringify(table) + "`")
}
import json
def main():
    table = {
        "type": "table",
        "title": "状态栏按钮的禁用、描述功能测试",
        "cols": ["列1", "列2", "列3"], 
        "rows": []
    }
    button1 = {"type": "button", "name": "按钮1", "cmd": "button1", "description": "这是第一个按钮"}
    button2 = {"type": "button", "name": "按钮2", "cmd": "button2", "description": "这是第二个按钮,设置为禁用", "disabled": True}
    button3 = {"type": "button", "name": "按钮3", "cmd": "button3", "description": "这是第三个按钮,设置为启用", "disabled": False}
    table["rows"].append([button1, button2, button3])
    LogStatus("`" + json.dumps(table) + "`")
void main() {
    json table = R"({
        "type": "table",
        "title": "状态栏按钮的禁用、描述功能测试",
        "cols": ["列1", "列2", "列3"], 
        "rows": []
    })"_json;
    json button1 = R"({"type": "button", "name": "按钮1", "cmd": "button1", "description": "这是第一个按钮"})"_json;
    json button2 = R"({"type": "button", "name": "按钮2", "cmd": "button2", "description": "这是第二个按钮,设置为禁用", "disabled": true})"_json;
    json button3 = R"({"type": "button", "name": "按钮3", "cmd": "button3", "description": "这是第三个按钮,设置为启用", "disabled": false})"_json;
    json arr = R"([])"_json;
    arr.push_back(button1);
    arr.push_back(button2);
    arr.push_back(button3);
    table["rows"].push_back(arr);
    LogStatus("`" + table.dump() + "`");
}

Настройка стиля кнопки состояния:

img

function main() {
    var table = {
        type: "table",
        title: "状态栏按钮样式",
        cols: ["默认", "原始", "成功", "信息", "警告", "危险"], 
        rows: [
            [
                {"type":"button", "class": "btn btn-xs btn-default", "name": "默认"},
                {"type":"button", "class": "btn btn-xs btn-primary", "name": "原始"},
                {"type":"button", "class": "btn btn-xs btn-success", "name": "成功"},
                {"type":"button", "class": "btn btn-xs btn-info", "name": "信息"},
                {"type":"button", "class": "btn btn-xs btn-warning", "name": "告警"},
                {"type":"button", "class": "btn btn-xs btn-danger", "name": "危险"}
            ]
        ]
    }
    LogStatus("`" + JSON.stringify(table) + "`")
}
import json
def main():
    table = {
        "type": "table",
        "title": "状态栏按钮样式",
        "cols": ["默认", "原始", "成功", "信息", "警告", "危险"], 
        "rows": [
            [
                {"type":"button", "class": "btn btn-xs btn-default", "name": "默认"},
                {"type":"button", "class": "btn btn-xs btn-primary", "name": "原始"},
                {"type":"button", "class": "btn btn-xs btn-success", "name": "成功"},
                {"type":"button", "class": "btn btn-xs btn-info", "name": "信息"},
                {"type":"button", "class": "btn btn-xs btn-warning", "name": "告警"},
                {"type":"button", "class": "btn btn-xs btn-danger", "name": "危险"}
            ]
        ]
    }
    LogStatus("`" + json.dumps(table) + "`")
void main() {
    json table = R"({
        "type": "table",
        "title": "状态栏按钮样式",
        "cols": ["默认", "原始", "成功", "信息", "警告", "危险"], 
        "rows": [
            [
                {"type":"button", "class": "btn btn-xs btn-default", "name": "默认"},
                {"type":"button", "class": "btn btn-xs btn-primary", "name": "原始"},
                {"type":"button", "class": "btn btn-xs btn-success", "name": "成功"},
                {"type":"button", "class": "btn btn-xs btn-info", "name": "信息"},
                {"type":"button", "class": "btn btn-xs btn-warning", "name": "告警"},
                {"type":"button", "class": "btn btn-xs btn-danger", "name": "危险"}
            ]
        ]
    })"_json;
    LogStatus("`" + table.dump() + "`");
}

ОбъединениеGetCommand()Функции, взаимодействие с кнопками конструирования состояния:

function test1() {
    Log("调用自定义函数")
}

function main() {
    while (true) {
        var table = {
            type: 'table',
            title: '操作',
            cols: ['列1', '列2', 'Action'],
            rows: [
                ['a', '1', {
                    'type': 'button',                       
                    'cmd': "CoverAll",                      
                    'name': '平仓'                           
                }],
                ['b', '1', {
                    'type': 'button',
                    'cmd': 10,                              
                    'name': '发送数值'
                }],
                ['c', '1', {
                    'type': 'button',
                    'cmd': _D(),                          
                    'name': '调用函数'
                }],
                ['d', '1', {
                    'type': 'button',
                    'cmd': 'test1',       
                    'name': '调用自定义函数'
                }]
            ]
        }
        LogStatus(_D(), "\n", '`' + JSON.stringify(table) + '`')

        var str_cmd = GetCommand()
        if (str_cmd) {
            Log("接收到的交互数据 str_cmd:", "类型:", typeof(str_cmd), "值:", str_cmd)
            if(str_cmd == "test1") {
                test1()
            }
        }

        Sleep(500)
    }
}
import json
def test1():
    Log("调用自定义函数")

def main():
    while True:
        table = {
            "type": "table", 
            "title": "操作", 
            "cols": ["列1", "列2", "Action"],
            "rows": [
                ["a", "1", {
                    "type": "button", 
                    "cmd": "CoverAll",
                    "name": "平仓"
                }],
                ["b", "1", {
                    "type": "button",
                    "cmd": 10,
                    "name": "发送数值" 
                }], 
                ["c", "1", {
                    "type": "button",
                    "cmd": _D(),
                    "name": "调用函数" 
                }],
                ["d", "1", {
                    "type": "button",
                    "cmd": "test1",
                    "name": "调用自定义函数" 
                }]
            ]
        }

        LogStatus(_D(), "\n", "`" + json.dumps(table) + "`")
        str_cmd = GetCommand()
        if str_cmd:
            Log("接收到的交互数据 str_cmd", "类型:", type(str_cmd), "值:", str_cmd)
            if str_cmd == "test1":
                test1()
        Sleep(500)
void test1() {
    Log("调用自定义函数");
}

void main() {
    while(true) {
        json table = R"({
            "type": "table", 
            "title": "操作", 
            "cols": ["列1", "列2", "Action"],
            "rows": [
                ["a", "1", {
                    "type": "button", 
                    "cmd": "CoverAll",
                    "name": "平仓"
                }],
                ["b", "1", {
                    "type": "button",
                    "cmd": 10,
                    "name": "发送数值" 
                }], 
                ["c", "1", {
                    "type": "button",
                    "cmd": "",
                    "name": "调用函数" 
                }],
                ["d", "1", {
                    "type": "button",
                    "cmd": "test1",
                    "name": "调用自定义函数" 
                }]
            ]
        })"_json;
        table["rows"][2][2]["cmd"] = _D();
        LogStatus(_D(), "\n", "`" + table.dump() + "`");
        auto str_cmd = GetCommand();
        if(str_cmd != "") {
            Log("接收到的交互数据 str_cmd", "类型:", typeid(str_cmd).name(), "值:", str_cmd);
            if(str_cmd == "test1") {
                test1();
            }
        }
        Sleep(500);
    }
}

При взаимодействии с кнопкой конфигурации состояния также поддерживается ввод данных, и инструкция взаимодействия в конечном итоге выполняется с помощьюGetCommand()Функция захвата. Добавление в структуру данных кнопок в панели состоянияinputУкажите, например,{"type": "button", "cmd": "open", "name": "开仓"}Увеличение"input": {"name": "开仓数量", "type": "number", "defValue": 1}Нажатие кнопки может вызвать всплывающее окно с контролем входного окна (с значениями, установленными в окне по умолчанию на 1, т. е. данными, установленными defValue), которое может быть введено и отправлено вместе с командой кнопки. Например, при выполнении следующего тестового кода после нажатия кнопки "Открыть магазин" всплывает всплывающее окно с входным окном, которое вводится в окне ввода.111После этого нажмите "подтвердить".GetCommandФункция будет поймать сообщение:open:111

function main() {
    var tbl = {
        type: "table",
        title: "操作",
        cols: ["列1", "列2"],
        rows: [
            ["开仓操作", {"type": "button", "cmd": "open", "name": "开仓", "input": {"name": "开仓数量", "type": "number", "defValue": 1}}],
            ["平仓操作", {"type": "button", "cmd": "coverAll", "name": "全部平仓"}]
        ] 
    }

    LogStatus(_D(), "\n", "`" + JSON.stringify(tbl) + "`")
    while (true) {
        var cmd = GetCommand()
        if (cmd) {
            Log("cmd:", cmd)
        }
        Sleep(1000)
    }
}
import json

def main():
    tbl = {
        "type": "table", 
        "title": "操作", 
        "cols": ["列1", "列2"],
        "rows": [
            ["开仓操作", {"type": "button", "cmd": "open", "name": "开仓", "input": {"name": "开仓数量", "type": "number", "defValue": 1}}],
            ["平仓操作", {"type": "button", "cmd": "coverAll", "name": "全部平仓"}]
        ]
    }

    LogStatus(_D(), "\n", "`" + json.dumps(tbl) + "`")
    while True:
        cmd = GetCommand()
        if cmd:
            Log("cmd:", cmd)
        Sleep(1000)
void main() {
    json tbl = R"({
        "type": "table", 
        "title": "操作", 
        "cols": ["列1", "列2"],
        "rows": [
            ["开仓操作", {"type": "button", "cmd": "open", "name": "开仓", "input": {"name": "开仓数量", "type": "number", "defValue": 1}}],
            ["平仓操作", {"type": "button", "cmd": "coverAll", "name": "全部平仓"}]
        ]
    })"_json;

    LogStatus(_D(), "\n", "`" + tbl.dump() + "`");
    while(true) {
        auto cmd = GetCommand();
        if(cmd != "") {
            Log("cmd:", cmd);
        }
        Sleep(1000);
    }
}

ОбъединениеLogStatus(Msg)Клетки в таблице, изображенной функцией:

  • Поперечное объединение

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

  • Вертикальное слияние

    function main() {
        var table = { 
            type: 'table', 
            title: '表格演示', 
            cols: ['列A', '列B', '列C'], 
            rows: [ 
                ['A1', 'B1', {'type':'button', 'cmd': 'coverAll', 'name': 'C1'}]
            ]
        } 
    
        var ticker = exchange.GetTicker()
        var name = exchange.GetName()
    
        table.rows.push([{body : "A2 + B2:" + JSON.stringify(ticker), colspan : 2}, "C2"])
        table.rows.push([{body : "A3 + A4 + A5:" + name, rowspan : 3}, "B3", "C3"])
        // A3被上一行第一个单元格合并
        table.rows.push(["B4", "C4"])
        // A2被上一行第一个单元格合并
        table.rows.push(["B5", "C5"])                                            
        table.rows.push(["A6", "B6", "C6"])
        LogStatus('`' + JSON.stringify(table) + '`')
    }
    
    import json
    def main():
        table = {
            "type" : "table", 
            "title" : "表格演示", 
            "cols" : ["列A", "列B", "列C"], 
            "rows" : [
                ["A1", "B1", {"type": "button", "cmd": "coverAll", "name": "C1"}]
            ]
        }
        
        ticker = exchange.GetTicker()
        name = exchange.GetName()
        
        table["rows"].append([{"body": "A2 + B2:" + json.dumps(ticker), "colspan": 2}, "C2"])
        table["rows"].append([{"body": "A3 + A4 + A5:" + name, "rowspan": 3}, "B3", "C3"])
        table["rows"].append(["B4", "C4"])
        table["rows"].append(["B5", "C5"])
        table["rows"].append(["A6", "B6", "C6"])
        LogStatus("`" + json.dumps(table) + "`")
    
    void main() {
        json table = R"({
            "type" : "table", 
            "title" : "表格演示", 
            "cols" : ["列A", "列B", "列C"], 
            "rows" : [
                ["A1", "B1", {"type": "button", "cmd": "coverAll", "name": "C1"}]
            ]
        })"_json;
        // 为了测试,代码简短易读,这里使用构造的数据
        json jsonTicker = R"({"High": 0, "Low": 0, "Buy": 0, "Sell": 0, "Last": 0, "Time": 0, "Volume": 0})"_json;
        auto name = exchange.GetName();
        json arr1 = R"([{"body": "", "colspan": 2}, "C2"])"_json;
        arr1[0]["body"] = "A2 + B2:" + jsonTicker.dump();
        json arr2 = R"([{"body": "", "rowspan": 3}, "B3", "C3"])"_json;
        arr2[0]["body"] = "A3 + A4 + A5:" + name;
        table["rows"].push_back(arr1);
        table["rows"].push_back(arr2);
        table["rows"].push_back(R"(["B4", "C4"])"_json);
        table["rows"].push_back(R"(["B5", "C5"])"_json);
        table["rows"].push_back(R"(["A6", "B6", "C6"])"_json);
        LogStatus("`" + table.dump() + "`");
    }
    

Форма разделения страниц на панели состояния показывает:

function main() {
    var table1 = {type: 'table', title: 'table1', cols: ['列1', '列2'], rows: [ ['abc', 'def'], ['ABC', 'support color #ff0000']]}
    var table2 = {type: 'table', title: 'table2', cols: ['列1', '列2'], rows: [ ['abc', 'def'], ['ABC', 'support color #ff0000']]}
    LogStatus('`' + JSON.stringify([table1, table2]) + '`')
}
import json
def main():
    table1 = {"type": "table", "title": "table1", "cols": ["列1", "列2"], "rows": [ ["abc", "def"], ["ABC", "support color #ff0000"]]}
    table2 = {"type": "table", "title": "table2", "cols": ["列1", "列2"], "rows": [ ["abc", "def"], ["ABC", "support color #ff0000"]]}
    LogStatus("`" + json.dumps([table1, table2]) + "`")
void main() {
    json table1 = R"({"type": "table", "title": "table1", "cols": ["列1", "列2"], "rows": [ ["abc", "def"], ["ABC", "support color #ff0000"]]})"_json;
    json table2 = R"({"type": "table", "title": "table2", "cols": ["列1", "列2"], "rows": [ ["abc", "def"], ["ABC", "support color #ff0000"]]})"_json;
    json arr = R"([])"_json;
    arr.push_back(table1);
    arr.push_back(table2);
    LogStatus("`" + arr.dump() + "`");
}

img

В дополнение к разделению страниц, можно отображать несколько таблиц, расположенных в порядке сверху вниз.

function main(){
    var tab1 = {
        type : "table",
        title : "表格1",
        cols : ["1", "2"],
        rows : []
    }
    var tab2 = {
        type : "table",
        title : "表格2",
        cols : ["1", "2", "3"],
        rows : []
    }
    var tab3 = {
        type : "table",
        title : "表格3",
        cols : ["A", "B", "C"],
        rows : []
    }

    tab1.rows.push(["jack", "lucy"])
    tab2.rows.push(["A", "B", "C"])
    tab3.rows.push(["A", "B", "C"])

    LogStatus('`' + JSON.stringify(tab1) + '`\n' + 
        '`' + JSON.stringify(tab2) + '`\n' +
        '`' + JSON.stringify(tab3) + '`')
  
    Log("exit")
}
import json
def main():
    tab1 = {
        "type": "table", 
        "title": "表格1", 
        "cols": ["1", "2"], 
        "rows": []
    }
    tab2 = {
        "type": "table", 
        "title": "表格2", 
        "cols": ["1", "2", "3"], 
        "rows": []
    }
    tab3 = {
        "type": "table", 
        "title": "表格3", 
        "cols": ["A", "B", "C"], 
        "rows": []
    }

    tab1["rows"].append(["jack", "lucy"])
    tab2["rows"].append(["A", "B", "C"])
    tab3["rows"].append(["A", "B", "C"])
    LogStatus("`" + json.dumps(tab1) + "`\n" + 
        "`" + json.dumps(tab2) + "`\n" + 
        "`" + json.dumps(tab3) + "`")
void main() {
    json tab1 = R"({
        "type": "table", 
        "title": "表格1", 
        "cols": ["1", "2"], 
        "rows": []
    })"_json;
    json tab2 = R"({
        "type": "table", 
        "title": "表格2", 
        "cols": ["1", "2", "3"], 
        "rows": []
    })"_json;
    json tab3 = R"({
        "type": "table", 
        "title": "表格3", 
        "cols": ["A", "B", "C"], 
        "rows": []
    })"_json;
    tab1["rows"].push_back(R"(["jack", "lucy"])"_json);
    tab2["rows"].push_back(R"(["A", "B", "C"])"_json);
    tab3["rows"].push_back(R"(["A", "B", "C"])"_json);
    LogStatus("`" + tab1.dump() + "`\n" + 
        "`" + tab2.dump() + "`\n" +
        "`" + tab3.dump() + "`");
}

Эффекты:

Обратите внимание: При выполнении политики на дискете, если на дисковой странице будет просматриваться история, панель состояния перейдет в режим покоя и перестанет обновляться. Только данные панели состояния обновляются, когда журнал находится на первой странице. Поддержка вывода в статусеbase64Зашифрованные изображения, также поддерживают экспорт в таблицы, отображаемые в строке состоянияbase64Послекодированные изображения. Из-за длинной строки данных послекодированных изображений, примерный код больше не отображается.

EnableLog ((()

EnableLog(IsEnable), запись в журнале открытия или закрытия информации о заказах.isEnableДля типа Бура.IsEnableУстановка наfalseВ то время, как многие из них не имеют доступа к электронной почте, они не печатают журналы заказов и не записывают их в реальные базы данных.

Диаграмма ((...)

Chart(...), настраивать графический рисунок.

Chart({...})Параметры:JSONСериализированныйВысокие запасыО чем вы?Highcharts.StockChartПараметры. Добавить один параметр к исходному параметру.__isStockПризнаки, если указаны__isStock:false, показанный как обычный график.

Обратите внимание: Если установлено__isStockПризнакиfalseНапример, вы можете использовать график:Высокие диаграммыНапример, на карте:

Highcharts图表

Если установлено__isStockПризнакиtrueНапример, вы можете использовать график:Высокие запасы(по умолчанию)__isStockДляtrueВ частности, он пишет:

Highstocks图表

Возвращение к тому, что можно было бы назватьadd(n, data)nДляseriesИндексы (например, 0),dataДля записи данных в график) в указанный индексseriesДобавление данных, вызовыreset()В этом случае вы можете использовать только один из них.resetВы можете использовать цифровой параметр, чтобы указать количество записей, которые должны быть сохранены.

Вы можете позвонитьadd(n, data, i)iДля этого данныеseriesИндекс) для изменения соответствующихseriesВ ней есть данные.

Это может быть отрицательное число, где -1 означает последний, а -2 - второе отрицательное число, например, когда рисуешь линию, изменяя данные на последней точке линии:

chart.add(0, [1574993606000, 13.5], -1)Изменитьseries[0].dataПервая точка числа числа.

Поддержка отображения нескольких графиков, при настройке просто вводите параметры матриц:var chart = Chart([{...}, {...}, {...}])Например, в графике 1 есть два.seriesНа графике 2 есть один.seriesНа рисунке 3 есть одинseriesНу и что?addПри указании последовательности 0 и 1 ID представляет данные двух последовательностей обновленного диаграммы 1.addУказать ID последовательности 2 на первую из таблиц 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

Больше

qq89520Вопрос в том, повторяется ли функция C постоянно или только один раз.

Эй, эй, эй!_C ((function, args...) Это по умолчанию 3s? Можно ли изменить по умолчанию, чтобы поставить _CDelay ((1000) прямо перед _C ((function, args...)?

ЛанчайеКластер: если вы создаете 1000 ботов одновременно и без стресса, вы можете создать несколько администраторов для распределения задач. Есть примеры кода для создания кластеров? Как создать несколько хостеров для распределения задач

Вэнги1Log ((talib.help (('MACD')); используется только в js, а в python нет свойства talib.help...

cjz140Что отличает _C ((function, args...) от функции Sleep, и я думаю, что это означает, что мы должны перепробовать.

3263243yКак очистить ErrorFilter после SetErrorFilter?

- Я не знаю.Есть ли другие способы использовать сторонние библиотеки?

- Я не знаю.Что должен заполнить родительский класс, если вы хотите унаследовать новый класс, определенный объектом биржи?

ЭтанвуЕсть ли настраиваемые инструменты для декомпиляции?

ПэнглихенгА как насчет exange.IO (("status"))?

ПэнглихенгПочему функция sell в сером цвете, это означает, что функция представления не используется?

ПэнглихенгПочему функция sell в сером цвете, это означает, что функция представления не используется?

ПэнглихенгЯ не знаю языка, ха-ха-ха, я хотел бы спросить, поддерживает ли es6

ПэнглихенгЯ не знаю языка, ха-ха-ха, я хотел бы спросить, поддерживает ли es6

Don.Как вы пишете среднюю линию объема?

черепахаЧто будет возвращено, если не удастся купить exchange.Buy ((1000) по рыночной цене?

Нинг-цзыНовый шрифт выглядит потрясающе.

гиппопотамBitmex Test Network ((testnet.bitmex.com) также имеет API-интерфейс, но на данный момент биржа может выбрать только Bitmex Mother Station, адрес API-документации https://testnet.bitmex.com/app/apiOverview Как вы можете помочь?

Чжидзинvar ret1 = exchanges[0].IO (("api", "future_estimated_price", "symbol=btc_usd"); Log (('ok futures estimated delivery price', ret1); https://dn-filebox.qbox.me/d1ed268c1e75753c5d289447d279aa9d81e41b5f.png Почему мы не можем позвонить на интерфейсы других бирж и написать ошибку?

Аллен ФростлайнНедавно была переписана стратегия набора, и оба появились одновременно, но в первом API, похоже, нет упоминания.

виденияПривет, как разработчик Python, что вы думаете, что пишут ваши API-документы?

Аллен ФростлайнGetAccount: [EAPI:Rate limit exceeded] Хотите узнать, как это решить?

zhjx2314Не поддерживает StochRSI, можно ли добавить как можно скорее

ЕфГГГКогда Python в режиме реального времени, сценарий находится на собственном сервере Ali Cloud или на кластере botvs?

ЕфГГГКакую версию python вы используете?

- Очень хорошо.Пояснение GetFee должно было быть таким: "Верните Fee-структуру, а не один слог".

ЗвапКак вы можете вызвать талиб с помощью js?

ЕфГГГПоиск документации Python

Wmjbs123Если вы хотите, чтобы ваш код был чёрным, белыми глазами, написать код ночью, легко близоруко.

Don.Как настроить резюме в вейсбуке бота?

Число: безумныйМожно ли добавить в структуру ордера поле с равной ценой сделки?

МаленькийGetOrders: получает все незавершенные заказы, возвращает структуру Array Order, в китайской биткойн-торговли ETH, возвращает только последние 10 пунктов.

ЕфГГГЕсли мы хотим, чтобы математические функции, которые нужны для статистической теории вероятности, были использованы, где они используются?

ЦзибангЧто означает значение, возвращаемое функцией $.Cross ((x, y)?

Моя мама.Это LogReset, который очищает все журналы и может использовать цифровой параметр, чтобы указать количество записей, которые нужно сохранить. Как это удаляет последние несколько журналов?

Эдвард ГьюКак вы думаете, какая-то функция CORRE в talib не переносится или пропускается?

Бедная гора ЯньньКажется, нет возможности ссылаться на показатели!

МаленькийКак переводить время k-линии, которое читается, в настоящее время, о, я не понимаю, слишком длинный, решен, спасибо

МаленькийКак удалить числа из матриц, я использую record.remove ((records[0])

ЗмейкаюОбычно мы получаем часовую линию K, но как вызвать ATR на дневную линию K?

ЗмейкаюОбычно мы получаем часовую линию K, но как вызвать ATR на дневную линию K?

57278863Узнайте, как традиционные фьючерсы получают цены и заказы, к сожалению, их корни очень тонкие.

КиринВ частности, в Китае существует более 10 тысяч фьючерсных рынков.

МаленькийНу, ну, ну, ну, ну, ну, ну, ну, ну, ну, ну, ну, ну, ну, ну, ну, ну, ну, ну, ну, ну, ну.

МаленькийКак печатать состояние хранения, как я печатаю [object object][object object], как получить состояние хранения множества и пустых блоков, а также GetTicker ((), как получить неделю, следующую неделю и квартал.

ЧжидзинМогут ли фьючерсные биржи использовать GetTicker для получения рынка?

ПродажиКакой StochRSI можно добавить?

МомоксCancelOrder ((orderId) Отменить заказ по номеру заказа, вернуть true или false, попросите true= ячейка была успешно отменена, верно?

Момокс_G(K, V) Сохраняется глобальный словарный список Этот метод сохраняет глобальные переменные, которые могут использоваться для обмена данными между различными политиками.

Флуфи 3DВсплеск популярности

НульВы можете использовать LogProfitReset для перезагрузки журналов доходов.

xyМожно ли непосредственно скопировать EA?

СиронманЯ чувствую, что эта платформа прекрасна, она прекрасна, больше общения в группах.

МаленькийКакой это язык, есть ли какие-либо учебные материалы?

jxhbtcОшибка с данными неделю не подключается к роботу.

ДюхуИндекс TA - это просто расчет цены на закрытие?

btcrobotПривет, мир.

Маленькие мечтыФункция _C будет бездумно повторяться, пока не получит успешный результат.

Маленькие мечтыТалиб библиотека для python требует установки. http://www.botvs.com/bbs-topic/669

Маленькие мечтыSleep - это время, когда программа ничего не делает и ждет, пока параметры не будут установлены.

Маленькие мечтыНе требуя наследования, JS непосредственно завернулся в объект {name: "new object", old_exchange : exchange[0],...... }

Маленькие мечтыУстройства, используемые для создания локальных редакторов, удаленного синхронизации, в основном являются локальными редакторами, удаленными диспетчерами.

Маленькие мечтыЕсли вы не хотите, чтобы кто-то из ваших друзей поделился вашим мнением, приходите в QQ-группу.

Маленькие мечтыВ API-документации серое означает, что эта функция не имеет слишком большого объяснения, показывает серое, синий представитель имеет больше объяснений, и все.

Маленькие мечтыES6 не поддерживается, ^^

Маленькие мечтыЕсли вы хотите, чтобы я рассказал вам об этой проблеме, я отвечу на нее.

Маленькие мечтыЕсли вы не хотите, чтобы ваш товар был куплен, вы можете купить его, если вы не хотите, чтобы он был куплен.

черепахаНапример, OKCoin, что вы получаете, если вы покупаете больше, чем у вас есть?

Маленькие мечтыВ частности, на какой бирже я верну номер заказа на OK Futures?

НульУже поддерживается переключение пары транзакций при запуске, требуется загрузка последнего хостера. Поддержка Bter/Poloniex Подробная API-документация Описание транзакционной функции внизу ((очистить кэш браузера после обновления, если не видно)

Маленькие мечтыQQ, я помогу вам найти вопрос.

Профессиональные кормильцыЕсли вы хотите установить белый список, я настраиваю IP-адрес хоста.

Маленькие мечтыЭто базовая ссылка не создана Сервер не отвечает. При запросе API KEY устанавливается IP-адрес?

Профессиональные кормильцыЭто смущает... Я могу запустить политику, которая не работает в бит-эпоху, и GetAccount не может получить доступ к 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 Битэпоха Ошибка GetAccount: timeout 2017-05-23 21:08:02 Биткойн-эпоха Ошибка GetAccount: timeout 2017-05-23 21:07:40 Бит эпоха Ошибка GetAccount: timeout 2017-05-23 21:07:20 Возобновить Может быть, это вопрос о белом списке IP-адресов?

Маленькие мечтыСерверы биржи не ответили, протокол TCP не был установлен и три раза рукопожатия не были проведены.

Профессиональные кормильцыA connection attempt failed because the connected party did not properly respond after a period of time (попытка подключения потерпела неудачу, потому что подключенная сторона не отреагировала должным образом после определенного периода времени)

Маленькие мечтыПривет! Речь идет об exchange.IO ((api, ApiName, Args) Функция не поддерживается, см. https://www.botvs.com/bbs-topic/812

Профессиональные кормильцыПопытка подключения не удалась, потому что подключенная сторона не ответила должным образом через определенный период времени,

Профессиональные кормильцыНе поддерживает бит-эпоха?

Маленькие мечтыhttps://dn-filebox.qbox.me/a709b30c6cc0a3565234b9e0c99b073f7ba8b454.png Я думаю, что это нормально.

Нинг-цзыНапример, я хочу сделать полную валютную сделку с poloniex, но поддерживает только несколько валют, а exchange.IO, похоже, не поддерживает P-Net.

Маленькие мечтыЭто может быть вызвано exchange.IO.

Нинг-цзыА как насчет API, требующих проверки аккаунта?

Маленькие мечтыЕсли API, не требующие проверки аккаунта, можно использовать с помощью httpQuery (подробнее о документации BotVS), фактический API для транзакций требует доступа.

Маленькие мечтыПараметры API передаются с помощью HttpQuery: https://www.okcoin.com/api/v1/future_estimated_price.do?symbol=btc_usd. Для API бирж, которые не требуют проверки аккаунта, используйте HttpQuery прямо на платформе, а те, которые связаны с аккаунтом, используют IO API. Пост: https://www.botvs.com/bbs-topic/850

виденияСпасибо, надеюсь, что у вас будет прекрасная документация на API.

Маленькие мечтыГде вы видели этот API realTicker?

Маленькие мечтыhttps://dn-filebox.qbox.me/fe1a6f5563ed43a5357f858ecf8a50239619228e.png API-документация является языком JavaScript. Описание, версия python описание в верхней части страницы обмена сообществами в Python.

НульЗдравствуйте, спасибо за совет, сейчас перестраивается документация API.

Маленькие мечтыПривет - показывает, что частота доступа превышает ограничения. https://dn-filebox.qbox.me/a09498920d04cac62624b7438a058d2098d8fb00.png В политике используется функция Sleep ((1000)?, эта 1000 - это позволяет программе приостановить один секунд в каждом раунде, что можно настроить самостоятельно, целью является контроль программы частота доступа к API, поскольку некоторые биржи устанавливают максимальное ограничение доступа, определенное время, превышающее определенное количество посещений, будет отказывать в доступе, блокируя IP-адреса.

Маленькие мечтыhttps://dn-filebox.qbox.me/c29ab7fc279e1b758355f137907cf52dc8257df6.png Я лично пишу, что уже сравнил показатели STOCHRSI с OK, и согласен, что скорость немного медленная, оптимизирована и временно доступна.

НульВы можете выбрать, на сервере botvs или на сервере своего хостера, версия 2.7.5.

Маленькие мечтыВ этом случае, вы должны быть готовы.

Маленькие мечтыТеперь вы можете настроить свой собственный стиль фона.

Маленькие мечтыПитонская документация пишется.

Маленькие мечтыТалибская библиотека поддерживает:

Хззгуд48 https://www.botvs.com/bbs-topic/276

Маленькие мечтыПо-видимому, есть пример на площади стратегии, http://www.botvs.com/strategy/15098

НульДоступ к свойствам AvergPrice для Orders, которые поддерживаются биржами, может, а те, которые не поддерживаются, всегда будут иметь свойство 0.

ЕфГГГКак ссылаться на сторонние источники?

НульДля быстрого компиляции, система встроена только в небольшое количество библиотек.

Маленькие мечтыНеприветливая, проблема в том, что в группе можно "М" мне - я в основном онлайн.

ЦзибангСпасибо.

Маленькие мечтыВы можете посмотреть на комментарий к кодовому анализу библиотеки криптовалютных операций, где есть комментарий к функции $.Cross.

НульНельзя удалять последние, можно сохранить только последние несколько статей... удалить все старые.

КиринЧтобы получить каждую позицию с помощью position[i], position является матрицей.

Нинг-цзыexchange.GetRecords ((PERIOD_D1));

КиринМой традиционный фьючерс всегда был: "GetAccount: not login", "пароль не ошибся, значит не сможешь войти".

НульПо умолчанию это неделя, для получения указанного требуется SetContractType.

НульКак видите, true - это значение, которое будет возвращаться биржевой операцией отмены ордера, но действительно отмены не отменены, зависит от того, как они обрабатываются внутри биржи.

Момокс3q

НульНе может быть, они отделены друг от друга.

СюаньшуаньКонечно, нет, это исключительно для MT4.

НульЯвление Javascript есть повсюду в Интернете.

ПродажиВы решили свой вопрос?

НульВ большинстве случаев, данные, которые мы передаем, могут быть прямыми записями или чистыми ценами.