이미 데이터를 받았고, 후속으로 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++
전략에서는 밀리초 수준 시간_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개의 숫자를 0으로 바꾸려면 이렇게 쓸 수 있습니다
function main(){
var i = 1300
Log(i)
var ii = _N(i, -3)
// 查看日志得知为1000
Log(ii)
}
def main():
i = 1300
Log(i)
ii = _N(i, -3)
Log(ii)
void main() {
auto i = 1300;
Log(i);
auto ii = _N(i, -3);
Log(ii);
}
_C(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));
}
모의 데이터를 시각화하여 관찰합니다
사용 설명서:내장 함수_크로스 분석 및 사용 설명
JSONParse(strJson)
이 함수는 JSON 문자열을 분석하기 위해 사용됩니다. 더 큰 숫자를 포함하는 JSON 문자열을 올바르게 분석하면 더 큰 숫자를 문자열 유형으로 분석합니다. 회수 시스템은 이 함수를 지원하지 않습니다.
function main() {
let s1 = '{"num": 8754613216564987646512354656874651651358}'
Log("JSON.parse:", JSON.parse(s1)) // JSON.parse: {"num":8.754613216564988e+39}
Log("JSONParse:", JSONParse(s1)) // JSONParse: {"num":"8754613216564987646512354656874651651358"}
let s2 = '{"num": 123}'
Log("JSON.parse:", JSON.parse(s2)) // JSON.parse: {"num":123}
Log("JSONParse:", JSONParse(s2)) // JSONParse: {"num":123}
}
import json
def main():
s1 = '{"num": 8754613216564987646512354656874651651358}'
Log("json.loads:", json.loads(s1)) # json.loads: map[num:8.754613216564987e+39]
Log("JSONParse:", JSONParse(s1)) # JSONParse: map[num:8754613216564987646512354656874651651358]
s2 = '{"num": 123}'
Log("json.loads:", json.loads(s2)) # json.loads: map[num:123]
Log("JSONParse:", JSONParse(s2)) # JSONParse: map[num:123]
void main() {
auto s1 = "{\"num\":8754613216564987646512354656874651651358}";
Log("json::parse:", json::parse(s1));
// Log("JSONParse:", JSONParse(s1)); // 不支持该函数
auto s2 = "{\"num\":123}";
Log("json::parse:", json::parse(s2));
// Log("JSONParse:", JSONParse(s2)); // 不支持该函数
}
모든 문자열을 사용할 수 있습니다.#ff0000
이러한 RGB 값은 끝으로 표시해야 할 전망을 나타냅니다.#ff0000112233
이런 형식으로, 마지막 6자는 배경 색을 나타냅니다.
function main() {
Log("红色", "#FF0000")
}
def main():
Log("红色", "#FF0000")
void main() {
Log("红色", "#FF0000");
}
실제 디스크 실행 시 로그 정보는 실제 디스크의 데이터베이스에 기록되며, 실제 디스크의 데이터베이스가 사용된다sqlite3
데이터베이스, 디스크의 데이터베이스 파일은 관리자 프로그램에 위치하는 장치, 데이터베이스 파일은 관리자 프로그램에 위치한다.robot
실행 가능한 프로그램) 디렉토리. 예를 들어: ID는130350
이 파일은../logs/storage/130350
이 카탈로그에..
그리고robot
관리자 프로그램이 있는 디렉토리), 데이터베이스 파일의 이름은130350.db3
ᅳ
검색 시스템에서의 로그는 검색이 끝나면 검색 페이지의 오른쪽 하단에서 클릭하면 됩니다.로그 다운로드[다운로드 버튼]
디스크를 다른 서버로 이동해야 할 경우, 디스크의 데이터베이스 파일을 (db3라고 확장된 데이터베이스 파일) 마이그레이션 대상 서버로 이동할 수 있으며, 파일 이름을 플랫폼에 해당하는 디스크 ID로 설정합니다. 이렇게하면 이전 디스크의 모든 로그 정보가 새로운 장치로 마이그레이션으로 손실되지 않습니다.
Log(message)
, 게시물을 로그 목록에 저장합니다.message
어떤 타입이든 사용하실 수 있습니다.
만약 문자열 뒤에 더하면@
문자 메시지는 푸시 큐에 들어가 현재 발명자의 양자 거래 플랫폼 계정 푸시 설정에 설정된 메일, 텔레그램, 웹
주의:
function main() {
Log("发明者量化你好 !@")
Sleep(1000 * 5)
// 字符串内加入#ff0000,打印日志显示为红色,并且推送消息
Log("你好, #ff0000@")
}
def main():
Log("发明者量化你好 !@")
Sleep(1000 * 5)
Log("你好, #ff0000@")
void main() {
Log("发明者量化你好 !@");
Sleep(1000 * 5);
Log("你好, #ff0000@");
}
웹후크
사용Golang
DEMO라는 프로그램으로 작성된 서비스:
package main
import (
"fmt"
"net/http"
)
func Handle (w http.ResponseWriter, r *http.Request) {
defer func() {
fmt.Println("req:", *r)
}()
}
func main () {
fmt.Println("listen http://localhost:9090")
http.HandleFunc("/data", Handle)
http.ListenAndServe(":9090", nil)
}
설정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변수. 원래 변수보다 1 더하기__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과 그래프 2series
이 그래프의 두 번째는series
그리고 이 그림은series
그럼,add
0과 1의 일련 ID를 지정할 때 업데이트 그래프 1의 두 개의 일련의 데이터를 나타냅니다.add
2로 지정된 시퀀스 ID는 차트 2의 첫 번째를 나타냅니다.series
이 그래프의 첫 번째 행을 나타냅니다.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
qq89520C 함수에서 한 번만 반복하는 것이 문제입니다
와 와_C ((function, args...) 이 기본값은 3s입니까? 기본값을 변경하여 바로 _CDelay ((1000) 를 C ((function, args...) 이전에 설정할 수 있습니까? 한 번 설정해도 될까요?
뱅지1log ((talib.help (('MACD')); js에서만 사용할 수 있으며, 파이썬에서는 talib.help 속성이 없습니다.
cjz140_C (function, args...) 와 Sleep (Sleep) 의 차이점은 무엇일까요?
3263243ySetErrorFilter를 사용하다가 ErrorFilter를 어떻게 비어낼까요?
qq47898077만약 제3자 라이브러리를 이용하고 싶다면 어떻게 해야 할까요?
qq47898077만약 거래소 객체가 새로운 클래스를 정의하는 것을 계승하고자 한다면, 부모 클래스는 무엇을 채워야 하는가?
에탄우이 사이트는 다른 사이트와 비교해 볼 수 있습니다.
Don.분량의 중간선을 어떻게 써야 할까요?
쥬트르트시장 가격에 교환을 구매합니다.Buy ((1000) 성공하지 않으면 무엇을 반환합니까?
닌자쿠새로운 글꼴이 멋지네요.
해마Bitmex의 테스트 네트워크 ((testnet.bitmex.com) 에서도 API 인터페이스가 존재하지만 현재 거래소는 Bitmex 본부를 선택할 수 있으며 API 문서 주소는 https://testnet.bitmex.com/app/apiOverview입니다. 어떻게 지원할 수 있을까요?
cxjijinvar ret1 = exchanges[0].IO (("api", "future_estimated_price", "symbol=btc_usd"); 로그 (('ok 선물 예상 거래 가격', ret1); https://dn-filebox.qbox.me/d1ed268c1e75753c5d289447d279aa9d81e41b5f.png 다른 거래소의 기능 인터페이스를 호출하여 오류를 작성하는 이유는 무엇입니까?
알렌프로스트라인realTicker와 Ticker의 차이점은 무엇입니까? 최근에는 리얼티커와 리얼티커 API에서 언급되지 않은 두 가지 전략이 동시에 등장했습니다.
비전안녕하세요. 파이썬 개발자로서, 여러분의 API 문서가 무엇을 쓰고 있다고 생각하십니까? 필드 함수 인터페이스가 약간 이상해 보이지만, githubpage와 readdocs처럼 문서를 쓸 수 있나요?
알렌프로스트라인GetAccount: [EAPI: Rate limit exceeded] 어떻게 해결되는지 궁금합니다?
zhjx2314StochRSI가 지원되지 않습니다.
yhfggPython 정책 리얼 디스크에서 스크립트는 자신의 Ali 클라우드 서버 또는 botvs 클러스터에 있습니까?
yhfgg어떤 버전의 파이썬을 사용하시나요?
아예GetFee의 설명은
zkwapjs에서 Talib를 호출하는 방법
yhfggpython 문서를 검색합니다
wmjbs123전략 편집자의 코드 배경은 검은색이 될 수 있습니까? 흰색 톱니, 밤에 코드를 작성하고 근시하기 쉽습니다.
Don.로봇의 WeChat 게시물에서 요약은 어떻게 설정합니까?
미쳤어요주문 (Order) 구조에 거래의 정비값 필드를 추가할 수 있습니까?
작은 것GetOrders: 모든 미완성 주문을 가져오기, Order 배열 구조를 반환하기, 중국 비트코인 거래에서 ETH, 가장 최근의 10 항목만 반환합니다. 여기에 중국 비트코인 ETH의 모든 미완성 주문을 반환하는 함수가 있습니까?
yhfgg통계 확률 이론에 필요한 수학 함수들은 어디서 사용되나요?
제 할머니는이 로그리셋은 모든 로그를 비워버립니다. 어떻게 하면 최근 몇 개의 로그를 삭제할 수 있을까요?
에드워드talib에서 CORRE 함수는 이식되지 않은 것처럼 보이거나 놓쳤습니까?
가난한 산에 있는
작은 것이 k 라인 시간을 읽고 지금 시간으로 번역하는 방법 아, 이해가 안 돼, 너무 길어, 해결, 감사합니다
작은 것소수에서 숫자를 삭제하는 방법을 어떻게 쓸지, 저는 records.remove ((records[0]) 를 사용해서
스네키야우일반적으로는 시간 K선으로, 어떻게 일 K선의 ATR를 호출합니까?
스네키야우일반적으로는 시간 K선으로, 어떻게 일 K선의 ATR를 호출합니까?
57278863전통적인 선물의 가격과 주문을 얻는 방법을 배우십시오. 죄송합니다. 뿌리가 얇습니다.
키린이 자리에서 우리는 이 자리에서 다른 사람들을 만나게 될 것입니다.
작은 것제로, 전통적인 선물 거래의 예를 써줄 수 있나요?
작은 것복수 빈单을 동시에 보유할 때, 보유 상태를 어떻게 인쇄하느냐, 나의 인쇄 방식은 [object object][object object], 복수单과 빈单 보유 상태를 어떻게 얻을 것인가, 그리고 GetTicker ((), 그 주, 다음 주, 그리고 분기 모두 어떻게 얻을 것인가.
cxjijin선물 거래소는 GetTicker (,) 를 사용하여 시장을 얻을 수 있습니까?
팔아치워StochRSI는 어떤 지표를 추가할 수 있을까요?
모박스CancelOrder (orderId) 는 주문 번호에 따라 주문을 취소하고 true 또는 false를 반환합니다. true= 셀이 성공적으로 취소되었습니다.
모박스_G(K, V) 저장할 수 있는 글로벌 사전 목록 이 방법은 저장할 수 있는 글로벌 변수를 사용해서 다른 정책들 사이에서 데이터를 공유할 수 있는가?
플루피3D인기를 끌고
제로로그프로프리트리셋을 사용하여 수익 로그를 다시 설정할 수 있습니다. 이전 수익 차트의 역사는 사라집니다.
xy이 EA를 직접 복사할 수 있을까요?
스라이론맨이 플랫폼이 정말 멋지고, 정말 멋지고, 더 많은 사람들이 함께 소통하는 것 같아요.
작은 것이 언어는 어떤 언어이고, 학습 자료가 있나요?
jxhbtc데이터 오류 일주일 동안 로봇을 연결할 수 없습니다
btcrobot안녕, 세상
작은 꿈_C 함수는 성공적으로 결과를 얻을 때까지 다시 시도합니다.
작은 꿈python의 talib 라이브러리는 설치가 필요합니다.https://www.botvs.com/bbs-topic/669 이 게시물을 참조하십시오.
작은 꿈Sleep는 프로그램이 아무 것도 하지 않고, 매개 변수가 설정되는 것을 기다리는 밀리초 수, _C는 매개 변수를 한 번 다시 호출하는 함수이다.
작은 꿈상속을 하지 않고 JS를 직접 객체에 엮어버린다.
작은 꿈로컬 편집기 원격 동기화 플러그인, 기본적으로 로컬 편집기 원격 오디션.
작은 꿈QQ 그룹에 오셔서,^^ 쉽게 토론하실 수 있습니다~
작은 꿈API 문헌에서 회색은 함수가 너무 많은 설명이 없이 회색, 파란색의 대표자가 더 많은 설명이 있고, 그것뿐이라는 것을 의미합니다.
작은 꿈ES6는 현재 지원되지 않습니다 ^^
작은 꿈QQ 그룹에 가서 문제를 설명해줘, 내가 대답해줄게 ^^
작은 꿈이 문서는 바로 오류를 반환하고 주문을 하지 않습니다. (사실 구매하기 위해 돈이 충분하지 않습니다!)
쥬트르트예를 들어, OKCoin, 만약 구매한 금액이 보유한 인민 화폐보다 많다면 어떤 수익을 올릴까요?
작은 꿈그리고 어떤 거래소에서 제가 OK 선물에서 주문 번호를 돌려보낼까요?
제로이미 실행 중인 트랜잭션 전환을 지원하고 있으며 최신 호스트를 다운로드해야 합니다. 지원 Bter/Poloniex 자세한 API 문서 트랜잭션 함수 탭 아래의 설명 (검색자 캐시를 비어 후 갱신하지 않으면 보이지 않습니다)
작은 꿈QQ, 제가 도와드릴게요.
직업적인 가정화이트리스트를 설정해야 합니다. 저는 호스트의 IP를 설정합니다.
작은 꿈이것은 하위 링크입니다. 설치되지 않았습니다. 서버가 응답하지 않았습니다. API KEY를 요청할 때 IP 주소를 설정해야합니까?
직업적인 가정이것은 당황스럽습니다... 제가 실행할 수 있는 전략은 비트 시대부터 고장 났고, GetAccount도 GetAccount에 액세스 할 수 없습니다: 포스트 http://api.btc38.com/v1/getMyBalance.php: read tcp 192.168.0.227:58596->211.149.148.144:80: wsarecv: A connection attempt failed because the connected party did not properly respond after a period of time, or established connection failed because connected host has failed to respond. 2017-05-23 21:08:24 비트 시대 오류 GetAccount: timeout 2017-05-23 21:08:02 비트 시대 오류 GetAccount: timeout 2017-05-23 21:07:40 비트 시대 오류 GetAccount: timeout 2017-05-23 21:07:20 다시 시작 IP 화이트리스트 문제인가요?
작은 꿈거래소의 서버는 응답하지 않았고, TCP 프로토콜은 세 번이나 악수되지 않았습니다.
직업적인 가정A connection attempt failed because the connected party did not properly respond after a period of time. A connection attempt failed because the connected party did not properly respond after a period of time. A connection attempt failed because the connected party did not properly respond after a period of time. A connection attempt failed because the connected party did not properly respond after a period of time. A connection attempt failed because the connected party did not properly respond after a period of time. A connection attempt failed because the connected party did not properly respond after a period of time.
작은 꿈안녕하세요! exchange.IO (
직업적인 가정연결 시도가 실패한 이유는 연결된 당사자가 일정 기간 후에 제대로 응답하지 않았기 때문입니다.
직업적인 가정비트 시대가 지지하지 않나요?
작은 꿈https://dn-filebox.qbox.me/a709b30c6cc0a3565234b9e0c99b073f7ba8b454.png 이 글은 이쪽에서 읽었습니다.
닌자쿠예를 들어, 나는 폴로니엑스 (poloniex) 의 모든 통화 거래를 하고 싶지만, BOTvs (BOTvs) 가 지원하는 화폐는 몇 개 밖에 없으며, exchange.IO는 P 네트워크를 지원하지 않는 것 같습니다.
작은 꿈이 경우, 이 화면은 Exchange.IO를 호출할 수 있습니다.
닌자쿠어떤 API가 계정 검증을 필요로 할까요?
작은 꿈계정 검증이 필요하지 않은 API는 httpQuery (BotVS 문서를 참조하십시오) 를 사용할 수 있으며 실제 거래 API는 액세스해야합니다.
작은 꿈HttpQuery API를 사용하여 매개 변수를 전송할 수 있습니다: https://www.okcoin.com/api/v1/future_estimated_price.do?symbol=btc_usd, 이렇게 하면 됩니다. 계정 검증이 필요하지 않은 계정 API의 경우 플랫폼의 HttpQuery 함수를 직접 사용하여 계정과 관련된 경우 IO API를 사용합니다. 포스팅: https://www.botvs.com/bbs-topic/850
비전좋은 감사합니다. 좋은 API 문서를 기대합니다.
작은 꿈이 API를 어디서 보았는지 알려주세요.
작은 꿈https://dn-filebox.qbox.me/fe1a6f5563ed43a5357f858ecf8a50239619228e.png
API 문서는 자바스크립트 언어로 설명되어 있으며, 파이썬 버전은
제로안녕하세요, 제안에 감사드립니다. 현재 API 문서는 재구성 중입니다.
작은 꿈안녕하세요~ 접속 빈도가 제한을 넘었다는 표시입니다. https://dn-filebox.qbox.me/a09498920d04cac62624b7438a058d2098d8fb00.png 정책에서 Sleep (1000) 함수를 사용했습니까? 이 1000은 프로그램을 회당 1초 중단시키는 것입니다. 자체적으로 설정할 수 있습니다. 목적은 프로그램을 제어하는 것입니다. API에 액세스하는 빈도, 일부 거래소가 최대 액세스 제한을 설정하기 때문에 특정 방문 횟수를 초과하는 특정 시간이 액세스 거부, IP 주소를 차단합니다.
작은 꿈https://dn-filebox.qbox.me/c29ab7fc279e1b758355f137907cf52dc8257df6.png 제가 개인적으로 쓴 글은 STOCHRSI 지표와 비교해봤는데, 평론에 따르면, 속도가 약간 느리고 최적화되어 있고, 일시적으로 사용할 수 있습니다.
제로botvs가 제공하는 서버에서 다시 테스트를 하거나 자신의 호스트가 있는 서버에서 다시 테스트를 선택할 수 있습니다. 버전은 2.7.5입니다.
작은 꿈이 글은 현재 추가된 글입니다.
작은 꿈이제 배경 스타일을 직접 설정할 수 있습니다.
작은 꿈파이썬 문서가 작성되고 있습니다.
작은 꿈알리바의 문헌을 참고하세요.
hzzgood48 https://www.botvs.com/bbs-topic/276
작은 꿈이 경우, 이 경우, 이 경우, 이 경우, 이 경우, 이 경우.
제로오더의 AVGPrice 속성에 접근하면 거래소가 지원할 수 있고 지원하지 않는 거래소는 0으로 유지됩니다.
yhfgg제3자 자료는 어떻게 인용합니까?
제로mathjs가 만족할 수 없다면, 3자 라이브러리 복제입 정책만 찾아볼 수 있다. 컴파일 속도를 위해, 시스템은 일부 라이브러리만을 내장했다.
작은 꿈"이봐요, 이봐요, 이봐요, 이봐요, 이봐요, 이봐요.
작은 꿈그룹에서? 당신은 설명서 버전의 디지털 통화 거래 클래스 코드 분석을 볼 수 있습니다. 그 안에 $.Cross 함수의 설명이 있습니다.
제로가장 최근의 항목을 삭제할 수 없고, 최신 몇 개만 유지할 수 있습니다.
키린포지션[i]를 사용하여 모든 포지션을 얻으려면 포지션은 대수입니다.
닌자쿠exchange.GetRecords ((PERIOD_D1));
키린내 전통적인 선물은 항상 "GetAccount: not login", "패드 잘못 입력되지 않았다면 로그인 할 수 없습니다".
제로기본값은 주입니다. 지정된 SetContractType를 얻기 위해서는 먼저 SetContractType가 필요합니다.
제로보시다시피, true는 거래소가 반환하는 취소 명령의 반환 값입니다. 하지만 실제로는 취소되지 않습니다.
모박스3q
제로잠시 동안은 그렇지 않노라
제로자바스크립트 자료는 인터넷 상에 있습니다.
팔아치워네 문제가 해결됐나요?
제로대부분의 경우, 입력된 데이터는 직접 기록 또는 순수 가격의 배열이 될 수 있습니다.