После того, как мы получили данные, мы начали прослушивать 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)
Эта функция реализует сохранную функцию глобального словаря, поддерживающую ретро- и дисковую проверку. После ретро-проверки сохраненные данные удаляются.
Структура данных: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(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()
При этом необходимо обратить внимание, что параметры передачи - это секундовые временные рамки.JavaScript
、C++
В стратегии используется время на уровне миллисекундов, и 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, 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(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++ 不支持这种方式对于自定义函数容错
_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));
}
Визуализировать данные моделирования для наблюдения
Конкретные инструкции по использованию:Встроенная функция_Cross Анализ и инструкции по использованию
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)
}
НастройкаWebHook
:http://XXX.XX.XXX.XX:9090/data?data=Hello_FMZ
После запуска сервиса выполняется стратегия, стратегия отправляет сообщения:
function main() {
Log("msg", "@")
}
def main():
Log("msg", "@")
void main() {
Log("msg", "@");
}
Получая сообщение о продвижении, сервис-программа распечатывает:
listen http://localhost:9090
req: {GET /data?data=Hello_FMZ HTTP/1.1 1 1 map[User-Agent:[Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/xx.x.xxxx.xxx Safari/537.36] Accept-Encoding:[gzip]] {} <nil> 0 [] false 1XX.XX.X.XX:9090 map[] map[] <nil> map[] XXX.XX.XXX.XX:4xxx2 /data?data=Hello_FMZ <nil> <nil> <nil> 0xc420056300}
Печатьbase64
Изображения после кодирования
Log
Функция поддерживает печатьbase64
Изображения, которые были закодированы,`
Начнем с`
В конце, например:
function main() {
Log("`data:image/png;base64,AAAA`")
}
def main():
Log("`data:image/png;base64,AAAA`")
void main() {
Log("`data:image/png;base64,AAAA`");
}
Log
Поддержка прямого печатиPython
О чем вы?matplotlib.pyplot
Объекты, если они содержатsavefig
Это может быть прямо.Log
Например:
import matplotlib.pyplot as plt
def main():
plt.plot([3,6,2,4,7,1])
Log(plt)
Автоматическое переключение языка в журнале печати
Log
Функция поддерживает переключение языков.Log
Функция выводит текст, который автоматически переключается на соответствующий язык в зависимости от языка на странице платформы, например:
function main() {
Log("[trans]中文|abc[/trans]")
}
def main():
Log("[trans]中文|abc[/trans]")
void main() {
Log("[trans]中文|abc[/trans]");
}
LogProfit(Profit)
, записывая прибыль и убыток, печатая прибыль и убыток и рисуя кривую прибыли на основе прибыли и убытка; параметры:ПрибыльДля типа числа.
Если мы используем символы,&
В конце концов, просто нарисуйте график доходов, а не печатайте журналы доходов, например:LogProfit(10, '&')
。
LogProfitReset()
, снять все журналы доходов, можно использовать целый параметр, чтобы указать количество записей, которые нужно сохранить.
function main() {
// 在收益图表上打印30个点,然后重置,只保留最后10个点
for(var i = 0; i < 30; i++) {
LogProfit(i)
Sleep(500)
}
LogProfitReset(10)
}
def main():
for i in range(30):
LogProfit(i)
Sleep(500)
LogProfitReset(10)
void main() {
for(int i = 0; i < 30; i++) {
LogProfit(i);
Sleep(500);
}
LogProfitReset(10);
}
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() + "`");
}
Настройка кнопки состояния и ее отключение, описание функции:
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() + "`");
}
Настройка стиля кнопки состояния:
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() + "`");
}
В дополнение к разделению страниц, можно отображать несколько таблиц, расположенных в порядке сверху вниз.
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(IsEnable)
, запись в журнале открытия или закрытия информации о заказах.isEnable
Для типа Бура.IsEnable
Установка наfalse
В то время, как многие из них не имеют доступа к электронной почте, они не печатают журналы заказов и не записывают их в реальные базы данных.
Chart(...)
, настраивать графический рисунок.
Chart({...})
Параметры:JSON
СериализированныйВысокие запасыО чем вы?Highcharts.StockChartПараметры. Добавить один параметр к исходному параметру.__isStock
Признаки, если указаны__isStock:false
, показанный как обычный график.
Обратите внимание:
Если установлено__isStock
Признакиfalse
Например, вы можете использовать график:Высокие диаграммыНапример, на карте:
Если установлено__isStock
Признакиtrue
Например, вы можете использовать график:Высокие запасы(по умолчанию)__isStock
Дляtrue
В частности, он пишет:
Возвращение к тому, что можно было бы назвать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
В этом случае мы не будем делать ничего плохого.
HighStocks
:http://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 ((
Профессиональные кормильцыПопытка подключения не удалась, потому что подключенная сторона не ответила должным образом через определенный период времени,
Профессиональные кормильцыНе поддерживает бит-эпоха?
Маленькие мечты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 есть повсюду в Интернете.
ПродажиВы решили свой вопрос?
НульВ большинстве случаев, данные, которые мы передаем, могут быть прямыми записями или чистыми ценами.