void main() {
Mail("smtp.163.com", "asdf@163.com", "password", "111@163.com", "title", "body");
}
Mail
फ़ंक्शन का असिंक्रोनस संस्करणMail_Go
फ़ंक्शनः
उपयोग औरexchange.Go
फ़ंक्शन समान है.
function main() {
var r1 = Mail_Go("smtp.163.com", "asdf@163.com", "password", "111@163.com", "title", "body")
var r2 = Mail_Go("smtp.163.com", "asdf@163.com", "password", "111@163.com", "title", "body")
var ret1 = r1.wait()
var ret2 = r2.wait()
Log("ret1:", ret1)
Log("ret2:", ret2)
}
# 不支持
// 不支持
ध्यान देंः
अली क्लाउड सर्वर कुछ पोर्टों को बंद कर सकता है, जिसके कारण ईमेल नहीं भेजा जा सकता है। यदि पोर्ट बदलने की आवश्यकता है, तो पोर्ट नाम सीधे पहले पैरामीटर में जोड़ा जा सकता है, उदाहरण के लिएःsmtp.qq.com:587
, यह पोर्ट परीक्षण उपलब्ध है.
अगर कोई गलती होती है तोःunencryped connection
इसे बदलना होगा।Mail
फ़ंक्शन काsmtpServer
पैरामीटर का प्रारूप हैःssl://xxx.com:xxx
उदाहरण के लिए, क्यूक्यू मेलिंगSMTP
इस तरह सेःssl://smtp.qq.com:465
याsmtp://xxx.com:xxx
。
SetErrorFilter(RegEx)
, फ़िल्टर त्रुटि लॉग↑ पैरामीटर मानः स्ट्रिंग प्रकार↑
इस नियमित अभिव्यक्ति से मेल खाने वाले त्रुटि लॉग को लॉग सिस्टम में अपलोड नहीं किया जाएगा, और कई बार कई फ़िल्टर शर्तों को सेट करने के लिए कहा जा सकता है ((फ़िल्टर किए गए लॉग को होस्ट निर्देशिका के तहत वास्तविक डिस्क आईडी के अनुरूप डेटाबेस फ़ाइलों में नहीं लिखा जाता है, जिससे डेटाबेस फ़ाइलों के संचलन के कारण लगातार त्रुटियों को रोका जा सकता है)) ।
function main() {
SetErrorFilter("502:|503:|tcp|character|unexpected|network|timeout|WSARecv|Connect|GetAddr|no such|reset|http|received|EOF|reused")
}
def main():
SetErrorFilter("502:|503:|tcp|character|unexpected|network|timeout|WSARecv|Connect|GetAddr|no such|reset|http|received|EOF|reused")
void main() {
SetErrorFilter("502:|503:|tcp|character|unexpected|network|timeout|WSARecv|Connect|GetAddr|no such|reset|http|received|EOF|reused");
}
एक इंटरफेस त्रुटि संदेश को फ़िल्टर करेंः
function main() {
// 随便查询一个不存在的订单,id为123,故意让接口报错
var order = exchange.GetOrder("123")
Log(order)
// 过滤http502错误、GetOrder接口错误,设置错误过滤之后,第二次调用GetOrder不再报错
SetErrorFilter("502:|GetOrder")
order = exchange.GetOrder("123")
Log(order)
}
def main():
order = exchange.GetOrder("123")
Log(order)
SetErrorFilter("502:|GetOrder")
order = exchange.GetOrder("123")
Log(order)
void main() {
TId orderId;
Order order = exchange.GetOrder(orderId);
Log(order);
SetErrorFilter("502:|GetOrder");
order = exchange.GetOrder(orderId);
Log(order);
}
GetPid()
, वास्तविक डिस्क प्रक्रिया आईडी लौटता है.
function main(){
var id = GetPid()
Log(id)
}
def main():
id = GetPid()
Log(id)
void main() {
auto id = GetPid();
Log(id);
}
GetLastError()
, नवीनतम त्रुटि जानकारी प्राप्त करता है. आमतौर पर इसका उपयोग नहीं किया जाता है क्योंकि प्रोग्राम स्वचालित रूप से लॉग सिस्टम में त्रुटि जानकारी अपलोड करता है.GetLastError()
फ़ंक्शन बाद में इस त्रुटि कैश को साफ़ करता है, और फिर से कॉल करने पर पिछली बार दर्ज की गई त्रुटि की जानकारी वापस नहीं करता है।
function main(){
// 因为不存在编号为123的订单,所以会出错
exchange.GetOrder("123")
var error = GetLastError()
Log(error)
}
def main():
exchange.GetOrder("123")
error = GetLastError()
Log(error)
void main() {
// 订单ID类型:TId,所以不能传入字符串,我们下一个不符合交易所规范的订单来触发
exchange.GetOrder(exchange.Buy(1, 1));
auto error = GetLastError();
Log(error);
}
GetCommand()
, इंटरएक्टिव कमांड स्ट्रिंग ((utf-8) प्राप्त करें。 नीति इंटरएक्टिव इंटरफ़ेस से भेजे गए कमांड प्राप्त करें और कैश खाली करें, कोई कमांड नहीं है तो रिक्त स्ट्रिंग लौटाएं。 लौटाए गए कमांड का प्रारूप按钮名称:参数
यदि इंटरैक्टिव कंट्रोल में कोई पैरामीटर नहीं है (जैसे कि इनपुट बॉक्स के बिना बटन कंट्रोल) तो कमांड बटन का नाम है।
function main(){
while(true) {
var cmd = GetCommand()
if (cmd) {
Log(cmd)
}
Sleep(1000)
}
}
def main():
while True:
cmd = GetCommand()
if cmd:
Log(cmd)
Sleep(1000)
void main() {
while(true) {
auto cmd = GetCommand();
if(cmd != "") {
Log(cmd);
}
Sleep(1000);
}
}
एक अंतर्निहित प्रणाली में एक कतार संरचना होती है जो इंटरैक्शन कमांड को रिकॉर्ड करती है, जबGetCommand()
जब फ़ंक्शन को बुलाया जाता है, तो यह कतार में सबसे पहले आने वाले इंटरैक्टिव कमांड को निकालता है (यदि कोई इंटरैक्टिव कमांड नहीं है तो रिक्त स्ट्रिंग लौटाता है) ।
इंटरैक्टिव कंट्रोल के उपयोग के उदाहरण, नीति संपादक इंटरफ़ेस इंटरैक्टिव कंट्रोल सेट करता है।
इस रणनीति में इंटरैक्टिव कोड डिजाइन करना शामिल हैः
function main() {
while (true) {
LogStatus(_D())
var cmd = GetCommand()
if (cmd) {
Log("cmd:", cmd)
var arr = cmd.split(":")
if (arr[0] == "buy") {
Log("买入,该控件不带数量")
} else if (arr[0] == "sell") {
Log("卖出,该控件带数量:", arr[1])
} else {
Log("其它控件触发:", arr)
}
}
Sleep(1000)
}
}
def main():
while True:
LogStatus(_D())
cmd = GetCommand()
if cmd:
Log("cmd:", cmd)
arr = cmd.split(":")
if arr[0] == "buy":
Log("买入,该控件不带数量")
elif arr[0] == "sell":
Log("卖出,该控件带数量:", arr[1])
else:
Log("其它控件触发:", arr)
Sleep(1000)
#include <iostream>
#include <sstream>
#include <string>
#include <vector>
using namespace std;
void split(const string& s,vector<string>& sv,const char flag = ' ') {
sv.clear();
istringstream iss(s);
string temp;
while (getline(iss, temp, flag)) {
sv.push_back(temp);
}
return;
}
void main() {
while(true) {
LogStatus(_D());
auto cmd = GetCommand();
if (cmd != "") {
vector<string> arr;
split(cmd, arr, ':');
if(arr[0] == "buy") {
Log("买入,该控件不带数量");
} else if (arr[0] == "sell") {
Log("卖出,该控件带数量:", arr[1]);
} else {
Log("其它控件触发:", arr);
}
}
Sleep(1000);
}
}
GetMeta()
फ़ंक्शन वापस करता है कि नीति पंजीकरण कोड उत्पन्न करने के लिए लिखा गया थाMeta
इस फ़ंक्शन का मान स्ट्रिंग प्रकार के रूप में लौटाता है.
आवेदन परिदृश्य, जैसे कि रणनीति में विभिन्न किरायेदारों के लिए धनराशि प्रतिबंध करना आवश्यक है।
ध्यान देंः पंजीकरण कोड उत्पन्न करते समयMeta
इस फ़ंक्शन का उपयोग केवल वर्चुअल डिस्क के लिए किया जाता है और नवीनतम होस्ट का उपयोग करना आवश्यक है। यदि नीति पंजीकरण कोड उत्पन्न करते समय मेटाडेटा सेट नहीं किया गया हैGetMeta()
शून्य लौटाता है.
दृश्य प्रदर्शन का उपयोग करने के लिए जानकारी
function main() {
// 策略允许的计价币最大资产数值
var maxBaseCurrency = null
// 获取创建注册码时的元数据
var level = GetMeta()
// 检测Meta对应的条件
if (level == "level1") {
// -1为不限制
maxBaseCurrency = -1
} else if (level == "level2") {
maxBaseCurrency = 10
} else if (level == "level3") {
maxBaseCurrency = 1
} else {
maxBaseCurrency = 0.5
}
while(1) {
Sleep(1000)
var ticker = exchange.GetTicker()
// 检测资产数值
var acc = exchange.GetAccount()
if (maxBaseCurrency != -1 && maxBaseCurrency < acc.Stocks + acc.FrozenStocks) {
// 停止执行策略交易逻辑
LogStatus(_D(), "level:", level, "持仓超过注册码的使用限定,不再执行策略交易逻辑!")
continue
}
// 其它交易逻辑
// 正常输出状态栏信息
LogStatus(_D(), "level:", level, "策略正常运行!ticker数据:\n", ticker)
}
}
def main():
maxBaseCurrency = null
level = GetMeta()
if level == "level1":
maxBaseCurrency = -1
elif level == "level2":
maxBaseCurrency = 10
elif level == "level3":
maxBaseCurrency = 1
else:
maxBaseCurrency = 0.5
while True:
Sleep(1000)
ticker = exchange.GetTicker()
acc = exchange.GetAccount()
if maxBaseCurrency != -1 and maxBaseCurrency < acc["Stocks"] + acc["FrozenStocks"]:
LogStatus(_D(), "level:", level, "持仓超过注册码的使用限定,不再执行策略交易逻辑!")
continue
# 其它交易逻辑
# 正常输出状态栏信息
LogStatus(_D(), "level:", level, "策略正常运行!ticker数据:\n", ticker)
void main() {
auto maxBaseCurrency = 0.0;
auto level = GetMeta();
if (level == "level1") {
maxBaseCurrency = -1;
} else if (level == "level2") {
maxBaseCurrency = 10;
} else if (level == "level3") {
maxBaseCurrency = 1;
} else {
maxBaseCurrency = 0.5;
}
while(1) {
Sleep(1000);
auto ticker = exchange.GetTicker();
auto acc = exchange.GetAccount();
if (maxBaseCurrency != -1 && maxBaseCurrency < acc.Stocks + acc.FrozenStocks) {
// 停止执行策略交易逻辑
LogStatus(_D(), "level:", level, "持仓超过注册码的使用限定,不再执行策略交易逻辑!");
continue;
}
// 其它交易逻辑
// 正常输出状态栏信息
LogStatus(_D(), "level:", level, "策略正常运行!ticker数据:\n", ticker);
}
}
Dial(Address, Timeout)
, आदिमSocket
पहुंच, समर्थनtcp
,udp
,tls
,unix
प्रोटोकॉल. पैरामीटर मानःAddress
स्ट्रिंग प्रकार के लिए,TimeOut
संख्यात्मक प्रकार के लिए, संख्यात्मक इकाई सेकंड है, अगर ओवरटाइमDial(...)
फ़ंक्शन एक रिक्त मान देता है.
Address
पैरामीटर के बारे में अधिक जानकारीः
– | पैरामीटर विवरण |
---|---|
सेटिंग्सDial फ़ंक्शन पैरामीटर |
सामान्य पते परःwss://ws.okx.com:8443/ws/v5/public बाद में| यदि कोई संख्यात्मक स्ट्रिंग है| अक्षरों को|| अलग करने के लिए प्रयोग किया जाता है.& वर्णों का संयोजन. उदाहरण के लिए ss5 एजेंट और संपीड़न पैरामीटर एक साथ सेट करेंःDial("wss://ws.okx.com:8443/ws/v5/public|proxy=socks5://xxx:9999&compress=gzip_raw&mode=recv") 。 |
जब ws प्रोटोकॉल का उपयोग किया जाता है, तो डेटा संपीड़न से संबंधित पैरामीटर हैंःcompress=参数值 |
compress संपीड़न मोड, संपीड़न पैरामीटर, वैकल्पिकgzip_raw 、gzip उदाहरण के लिए, यदि gzip विधि गैर-मानक gzip है, तो विस्तार विधि का उपयोग किया जा सकता हैःgzip_raw यह एक अलग संकेत है.| बाद में सेटिंग्स जोड़ेंcompress=gzip_raw , के साथ& चिह्न और अगले मोड पैरामीटर को अलग करना। |
जब ws प्रोटोकॉल का उपयोग किया जाता है, तो डेटा संपीड़न से संबंधित पैरामीटर हैंःmode=参数值 |
मोड के लिए मोड, वैकल्पिकdual ,send ,recv तीन प्रकार के।dual दो-तरफा, संपीड़न डेटा भेजने और संपीड़न डेटा प्राप्त करने के लिए।send संपीड़ित डेटा भेजने के लिए।recv संपीड़न डेटा प्राप्त करने के लिए, स्थानीय रूप से विघटित करें। |
socks5 एजेंट को सेट करने के लिए संबंधित पैरामीटरःproxy=参数值 |
proxy को ss5 एजेंट के लिए सेट किया गया है, पैरामीटर मान प्रारूपःsocks5://name:pwd@192.168.0.1:1080 .name, ss5 सर्वर के लिए उपयोगकर्ता नाम, pwd, ss5 सर्वर के लिए लॉगिन पासवर्ड, और 1080, ss5 सेवा के लिए पोर्ट है। |
जब ws प्रोटोकॉल के साथ उपयोग किया जाता है, तो नीचे दिए गए ऑटो रिले के लिए संबंधित पैरामीटर सेट करेंःreconnect=参数值 |
reconnect को पुनः कनेक्ट करने के लिए सेट करें या नहीं,reconnect=true पुनः कनेक्टिविटी सक्षम करने के लिए. |
जब ws प्रोटोकॉल के साथ उपयोग किया जाता है, तो नीचे दिए गए ऑटो रिले के लिए संबंधित पैरामीटर सेट करेंःinterval=参数值 |
interval पुनः परीक्षण समय के अंतराल के लिए, मिलीसेकंड में,interval=10000 10 सेकंड के अंतराल पर पुनः प्रयास करने के लिए, डिफ़ॉल्ट 1 सेकंड सेट न करें, यानीinterval=1000 。 |
जब ws प्रोटोकॉल के साथ उपयोग किया जाता है, तो नीचे दिए गए ऑटो रिले के लिए संबंधित पैरामीटर सेट करेंःpayload=参数值 |
payload के लिए ws पुनः कनेक्ट होने पर भेजे जाने वाले सदस्यता संदेश, जैसेःpayload=okok 。 |
function main(){
// Dial支持tcp://,udp://,tls://,unix://协议,可加一个参数指定超时的秒数
var client = Dial("tls://www.baidu.com:443")
if (client) {
// write可再跟一个数字参数指定超时,write返回成功发送的字节数
client.write("GET / HTTP/1.1\nConnection: Closed\n\n")
while (true) {
// read可再跟一个数字参数指定超时,单位:毫秒。返回null指出错或者超时或者socket已经关闭
var buf = client.read()
if (!buf) {
break
}
Log(buf)
}
client.close()
}
}
def main():
client = Dial("tls://www.baidu.com:443")
if client:
client.write("GET / HTTP/1.1\nConnection: Closed\n\n")
while True:
buf = client.read()
if not buf:
break
Log(buf)
client.close()
void main() {
auto client = Dial("tls://www.baidu.com:443");
if(client.Valid) {
client.write("GET / HTTP/1.1\nConnection: Closed\n\n");
while(true) {
auto buf = client.read();
if(buf == "") {
break;
}
Log(buf);
}
client.close();
}
}
read
फ़ंक्शन निम्नलिखित पैरामीटर का समर्थन करता हैः
ws.read()
。ws.read(2000)
निर्दिष्ट ओवरटाइम समय दो सेकंड ((2000 मिलीसेकंड) है।websocket
प्रभावशालीः
प्रवेश पैरामीटर-1
फ़ंक्शन का अर्थ है कि फ़ंक्शन तुरंत वापस आता है, चाहे कोई संदेश हो या नहीं, जैसेःws.read(-1)
‖
प्रवेश पैरामीटर-2
इसका मतलब है कि फ़ंक्शन तुरंत कोई संदेश नहीं लौटाता है, लेकिन केवल नवीनतम संदेश लौटाता है, और बफ़र क्षेत्र में संदेशों को छोड़ दिया जाता है; उदाहरण के लिए।ws.read(-2)
。read()
फ़ंक्शन बफ़र का वर्णनः
ws प्रोटोकॉल द्वारा पुश किए गए डेटा, यदि नीति मेंread()
फ़ंक्शन कॉल के बीच समय का अंतर बहुत लंबा हो सकता है, जिससे डेटा जमा हो सकता है. यह डेटा एक बफ़र क्षेत्र में संग्रहीत किया जाता है, जिसमें बफ़र क्षेत्र की डेटा संरचना एक कतार के रूप में होती है, जिसमें अधिकतम 2000 होते हैं. 2000 से अधिक के बाद, नवीनतम डेटा बफ़र क्षेत्र में प्रवेश करता है, सबसे पुराना डेटा हटा दिया जाता है.
दृश्यread फ़ंक्शन पैरामीटर |
कोई पैरामीटर नहीं | पैरामीटरः -1 | पैरामीटरः -2 | पैरामीटरः 2000, यूनिट मिलीसेकंड है |
---|---|---|---|---|
बफ़र क्षेत्र में डेटा है | सबसे पुराने डेटा को तुरंत लौटाएं | सबसे पुराने डेटा को तुरंत लौटाएं | तुरंत नवीनतम डेटा प्राप्त करें | सबसे पुराने डेटा को तुरंत लौटाएं |
बफ़र क्षेत्र का कोई डेटा नहीं | जब तक डेटा उपलब्ध न हो तब तक ब्लॉक करें | तुरंत रिक्त लौटाता है | तुरंत रिक्त लौटाता है | 2000 मिलीसेकंड प्रतीक्षा करें, कोई डेटा रिक्त लौटाता है, कुछ डेटा लौटाता है |
जब ws कनेक्शन टूट जाता है या नीचे फिर से जुड़ा होता है | read (()) फ़ंक्शन रिक्त स्ट्रिंग लौटाता है, यानीः",write (()) फ़ंक्शन 0 लौटाता है, इस स्थिति का पता लगाता है. आप close (() फ़ंक्शन का उपयोग करके कनेक्शन बंद कर सकते हैं, यदि स्वचालित रूप से पुनः कनेक्ट करना सेट किया गया है तो बंद करने की आवश्यकता नहीं है, सिस्टम आधार स्वचालित रूप से फिर से कनेक्ट होगा। |
wss (WebSocket) प्रोटोकॉल का समर्थन करें Binance के वेबसॉकेट बाजार इंटरफ़ेस पर जाएँः
function main() {
LogStatus("正在连接...")
// 访问币安的websocket接口
var client = Dial("wss://stream.binance.com:9443/ws/!ticker@arr")
if (!client) {
Log("连接失败, 程序退出")
return
}
while (true) {
// read只返回调用read之后获取的数据
var buf = client.read()
if (!buf) {
break
}
var table = {
type: 'table',
title: '行情图表',
cols: ['币种', '最高', '最低', '买一', '卖一', '最后成交价', '成交量', '更新时间'],
rows: []
}
var obj = JSON.parse(buf)
_.each(obj, function(ticker) {
table.rows.push([ticker.s, ticker.h, ticker.l, ticker.b, ticker.a, ticker.c, ticker.q, _D(ticker.E)])
})
LogStatus('`' + JSON.stringify(table) + '`')
}
client.close()
}
import json
def main():
LogStatus("正在连接...")
client = Dial("wss://stream.binance.com:9443/ws/!ticker@arr")
if not client:
Log("连接失败, 程序退出")
return
while True:
buf = client.read()
if not buf:
break
table = {
"type" : "table",
"title" : "行情图表",
"cols" : ["币种", "最高", "最低", "买一", "卖一", "最后成交价", "成交量", "更新时间"],
"rows" : []
}
obj = json.loads(buf)
for i in range(len(obj)):
table["rows"].append([obj[i]["s"], obj[i]["h"], obj[i]["l"], obj[i]["b"], obj[i]["a"], obj[i]["c"], obj[i]["q"], _D(int(obj[i]["E"]))])
LogStatus('`' + json.dumps(table) + '`')
client.close()
void main() {
LogStatus("正在连接...");
auto client = Dial("wss://stream.binance.com:9443/ws/!ticker@arr");
if(!client.Valid) {
Log("连接失败, 程序退出");
return;
}
while(true) {
auto buf = client.read();
if(buf == "") {
break;
}
json table = R"({
"type" : "table",
"title" : "行情图表",
"cols" : ["币种", "最高", "最低", "买一", "卖一", "最后成交价", "成交量", "更新时间"],
"rows" : []
})"_json;
json obj = json::parse(buf);
for(auto& ele : obj.items()) {
table["rows"].push_back({ele.value()["s"], ele.value()["h"], ele.value()["l"], ele.value()["b"], ele.value()["a"], ele.value()["c"],
ele.value()["q"], _D(ele.value()["E"])});
}
LogStatus("`" + table.dump() + "`");
}
client.close();
}
OKX के वेबसॉकेट बाज़ार इंटरफ़ेस पर जाएँः
var ws = null
function main(){
var param = {
"op": "subscribe",
"args": [{
"channel": "tickers",
"instId": "BTC-USDT"
}]
}
// 在调用Dial函数时,指定reconnect=true即设置为重连模式,指定payload即为重连时发送的消息。在websocket连接断开后,会自动重连,自动发送消息
ws = Dial("wss://ws.okx.com:8443/ws/v5/public|compress=gzip_raw&mode=recv&reconnect=true&payload="+ JSON.stringify(param))
if(ws){
var pingCyc = 1000 * 20
var lastPingTime = new Date().getTime()
while(true){
var nowTime = new Date().getTime()
var ret = ws.read()
Log("ret:", ret)
if(nowTime - lastPingTime > pingCyc){
var retPing = ws.write("ping")
lastPingTime = nowTime
Log("发送 :ping", "#FF0000")
}
LogStatus("当前时间:", _D())
Sleep(1000)
}
}
}
function onexit() {
ws.close()
Log("退出")
}
import json
import time
ws = None
def main():
global ws
param = {
"op": "subscribe",
"args": [{
"channel": "tickers",
"instId": "BTC-USDT"
}]
}
ws = Dial("wss://ws.okx.com:8443/ws/v5/public|compress=gzip_raw&mode=recv&reconnect=true&payload=" + json.dumps(param))
if ws:
pingCyc = 1000 * 20
lastPingTime = time.time() * 1000
while True:
nowTime = time.time() * 1000
ret = ws.read()
Log("ret:", ret)
if nowTime - lastPingTime > pingCyc:
retPing = ws.write("ping")
lastPingTime = nowTime
Log("发送:ping", "#FF0000")
LogStatus("当前时间:", _D())
Sleep(1000)
def onexit():
ws.close()
Log("退出")
auto objWS = Dial("wss://ws.okx.com:8443/ws/v5/public|compress=gzip_raw&mode=recv&reconnect=true");
void main() {
json param = R"({
"op": "subscribe",
"args": [{
"channel": "tickers",
"instId": "BTC-USDT"
}]
})"_json;
objWS.write(param.dump());
if(objWS.Valid) {
uint64_t pingCyc = 1000 * 20;
uint64_t lastPingTime = Unix() * 1000;
while(true) {
uint64_t nowTime = Unix() * 1000;
auto ret = objWS.read();
Log("ret:", ret);
if(nowTime - lastPingTime > pingCyc) {
auto retPing = objWS.write("ping");
lastPingTime = nowTime;
Log("发送:ping", "#FF0000");
}
LogStatus("当前时间:", _D());
Sleep(1000);
}
}
}
void onexit() {
objWS.close();
Log("退出");
}
टोकन का उपयोग करने के लिए वेबसॉकेट बाज़ार इंटरफ़ेसः
var ws = null
function main(){
var param = {"sub": "market.btcusdt.detail", "id": "id1"}
ws = Dial("wss://api.huobi.pro/ws|compress=gzip&mode=recv&reconnect=true&payload="+ JSON.stringify(param))
if(ws){
while(1){
var ret = ws.read()
Log("ret:", ret)
// 响应心跳包操作
try {
var jsonRet = JSON.parse(ret)
if(typeof(jsonRet.ping) == "number") {
var strPong = JSON.stringify({"pong" : jsonRet.ping})
ws.write(strPong)
Log("响应ping,发送pong:", strPong, "#FF0000")
}
} catch(e) {
Log("e.name:", e.name, "e.stack:", e.stack, "e.message:", e.message)
}
LogStatus("当前时间:", _D())
Sleep(1000)
}
}
}
function onexit() {
ws.close()
Log("执行ws.close()函数")
}
import json
ws = None
def main():
global ws
param = {"sub" : "market.btcusdt.detail", "id" : "id1"}
ws = Dial("wss://api.huobi.pro/ws|compress=gzip&mode=recv&reconnect=true&payload=" + json.dumps(param))
if ws:
while True:
ret = ws.read()
Log("ret:", ret)
# 响应心跳包操作
try:
jsonRet = json.loads(ret)
if "ping" in jsonRet and type(jsonRet["ping"]) == int:
strPong = json.dumps({"pong" : jsonRet["ping"]})
ws.write(strPong)
Log("响应ping,发送pong:", strPong, "#FF0000")
except Exception as e:
Log("e:", e)
LogStatus("当前时间:", _D())
Sleep(1000)
def onexit():
ws.close()
Log("执行ws.close()函数")
using namespace std;
void main() {
json param = R"({"sub" : "market.btcusdt.detail", "id" : "id1"})"_json;
auto ws = Dial("wss://api.huobi.pro/ws|compress=gzip&mode=recv&reconnect=true&payload=" + param.dump());
if(ws.Valid) {
while(true) {
auto ret = ws.read();
Log("ret:", ret);
// 响应心跳包操作
try
{
auto jsonRet = json::parse(ret);
if(jsonRet["ping"].is_number()) {
json pong = R"({"pong" : 0})"_json;
pong["pong"] = jsonRet["ping"];
auto strPong = pong.dump();
ws.write(strPong);
Log("响应ping,发送pong:", strPong, "#FF0000");
}
} catch(exception &e)
{
Log("e:", e.what());
}
LogStatus("当前时间:", _D());
Sleep(1000);
}
}
}
void onexit() {
// ws.close();
Log("执行ws.close()函数");
}
OKX के लिए वेबसॉकेट सत्यापन इंटरफ़ेस का उपयोग करेंः
function getLogin(pAccessKey, pSecretKey, pPassphrase) {
// 签名函数,用于登录
var ts = (new Date().getTime() / 1000).toString()
var login = {
"op": "login",
"args":[{
"apiKey" : pAccessKey,
"passphrase" : pPassphrase,
"timestamp" : ts,
"sign" : exchange.HMAC("sha256", "base64", ts + "GET" + "/users/self/verify", pSecretKey)
}]
}
return login
}
var client_private = null
function main() {
// 因为read函数使用了超时设置,过滤超时的报错,否则会有冗余错误输出
SetErrorFilter("timeout")
// 持仓频道订阅信息
var posSubscribe = {
"op": "subscribe",
"args": [{
"channel": "positions",
"instType": "ANY"
}]
}
var accessKey = "xxx"
var secretKey = "xxx"
var passphrase = "xxx"
client_private = Dial("wss://ws.okx.com:8443/ws/v5/private")
client_private.write(JSON.stringify(getLogin(accessKey, secretKey, passphrase)))
Sleep(3000) // 登录时,不能立即订阅私有频道,需要等待服务器反应
client_private.write(JSON.stringify(posSubscribe))
if (client_private) {
var lastPingTS = new Date().getTime()
while (true) {
var buf = client_private.read(-1)
if (buf) {
Log(buf)
}
// 检测断开,重连
if (buf == "" && client_private.write(JSON.stringify(posSubscribe)) == 0) {
Log("检测到断开,关闭连接,重连")
client_private.close()
client_private = Dial("wss://ws.okx.com:8443/ws/v5/private")
client_private.write(JSON.stringify(getLogin(accessKey, secretKey, passphrase)))
Sleep(3000)
client_private.write(JSON.stringify(posSubscribe))
}
// 发送心跳包
var nowPingTS = new Date().getTime()
if (nowPingTS - lastPingTS > 10 * 1000) {
client_private.write("ping")
lastPingTS = nowPingTS
}
}
}
}
function onexit() {
var ret = client_private.close()
Log("关闭连接!", ret)
}
import json
import time
def getLogin(pAccessKey, pSecretKey, pPassphrase):
ts = str(time.time())
login = {
"op": "login",
"args":[{
"apiKey" : pAccessKey,
"passphrase" : pPassphrase,
"timestamp" : ts,
"sign" : exchange.HMAC("sha256", "base64", ts + "GET" + "/users/self/verify", pSecretKey)
}]
}
return login
client_private = None
def main():
global client_private
SetErrorFilter("timeout")
posSubscribe = {
"op": "subscribe",
"args": [{
"channel": "positions",
"instType": "ANY"
}]
}
accessKey = "xxx"
secretKey = "xxx"
passphrase = "xxx"
client_private = Dial("wss://ws.okx.com:8443/ws/v5/private")
client_private.write(json.dumps(getLogin(accessKey, secretKey, passphrase)))
Sleep(3000)
client_private.write(json.dumps(posSubscribe))
if client_private:
lastPingTS = time.time() * 1000
while True:
buf = client_private.read(-1)
if buf:
Log(buf)
if buf == "" and client_private.write(json.dumps(posSubscribe)) == 0:
Log("检测到断开,关闭连接,重连")
ret = client_private.close()
client_private = Dial("wss://ws.okx.com:8443/ws/v5/private")
client_private.write(json.dumps(getLogin(accessKey, secretKey, passphrase)))
Sleep(3000)
client_private.write(json.dumps(posSubscribe))
nowPingTS = time.time() * 1000
if nowPingTS - lastPingTS > 10 * 1000:
client_private.write("ping")
lastPingTS = nowPingTS
def onexit():
ret = client_private.close()
Log("关闭连接!", ret)
auto client_private = Dial("wss://ws.okx.com:8443/ws/v5/private");
json getLogin(string pAccessKey, string pSecretKey, string pPassphrase) {
auto ts = std::to_string(Unix());
json login = R"({
"op": "login",
"args": [{
"apiKey": "",
"passphrase": "",
"timestamp": "",
"sign": ""
}]
})"_json;
login["args"][0]["apiKey"] = pAccessKey;
login["args"][0]["passphrase"] = pPassphrase;
login["args"][0]["timestamp"] = ts;
login["args"][0]["sign"] = exchange.HMAC("sha256", "base64", ts + "GET" + "/users/self/verify", pSecretKey);
return login;
}
void main() {
SetErrorFilter("timeout");
json posSubscribe = R"({
"op": "subscribe",
"args": [{
"channel": "positions",
"instType": "ANY"
}]
})"_json;
auto accessKey = "xxx";
auto secretKey = "xxx";
auto passphrase = "xxx";
client_private.write(getLogin(accessKey, secretKey, passphrase).dump());
Sleep(3000);
client_private.write(posSubscribe.dump());
if (client_private.Valid) {
uint64_t lastPingTS = Unix() * 1000;
while (true) {
auto buf = client_private.read(-1);
if (buf != "") {
Log(buf);
}
if (buf == "") {
if (client_private.write(posSubscribe.dump()) == 0) {
Log("检测到断开,关闭连接,重连");
client_private.close();
client_private = Dial("wss://ws.okx.com:8443/ws/v5/private");
client_private.write(getLogin(accessKey, secretKey, passphrase).dump());
Sleep(3000);
client_private.write(posSubscribe.dump());
}
}
uint64_t nowPingTS = Unix() * 1000;
if (nowPingTS - lastPingTS > 10 * 1000) {
client_private.write("ping");
lastPingTS = nowPingTS;
}
}
}
}
void onexit() {
client_private.close();
Log("退出");
}
HttpQuery(Url, PostData, Cookies, Headers, IsReturnHeader)
, नेटवर्क यूआरएल का उपयोग करना. पैरामीटर मानः सभी स्ट्रिंग प्रकार के लिए.
ध्यान देंः
HttpQuery(...)
फ़ंक्शन केवल समर्थन करता हैJavaScript
भाषाएँ ।Python
भाषा का उपयोग कर सकते हैंurllib
एक बार जब आप एक वेबसाइट खोलने के बारे में सोच रहे हैं, तो आप एक वेबसाइट खोलने के बारे में सोच रहे हैं।HttpQuery(...)
यह मुख्य रूप से उन इंटरफेस को एक्सेस करने के लिए उपयोग किया जाता है जिन्हें एक्सचेंज के लिए हस्ताक्षर की आवश्यकता नहीं होती है, जैसे कि सार्वजनिक इंटरफेस जैसे कि बाजार सूचना।
ओकेएक्स तक पहुँचने के लिए बिना हस्ताक्षर के एपीआई इंटरफ़ेस का उदाहरण, जो कि मान लौटाता हैJSON
एक स्ट्रिंग,JavaScript
भाषा की रणनीतियों में इस्तेमाल किया जा सकता हैJSON.parse()
फ़ंक्शन हल करना।
function main(){
// 一个GET访问不带参数的例子
var info = JSON.parse(HttpQuery("https://www.okx.com/api/v5/public/time"))
Log(info)
// 一个GET访问带参数的例子
var ticker = JSON.parse(HttpQuery("https://www.okx.com/api/v5/market/books?instId=BTC-USDT"))
Log(ticker)
}
import json
import urllib.request
def main():
# HttpQuery不支持Python,可以使用urllib/urllib2库代替
info = json.loads(urllib.request.urlopen("https://www.okx.com/api/v5/public/time").read().decode('utf-8'))
Log(info)
ticker = json.loads(urllib.request.urlopen("https://www.okx.com/api/v5/market/books?instId=BTC-USDT").read().decode('utf-8'))
Log(ticker)
void main() {
auto info = json::parse(HttpQuery("https://www.okx.com/api/v5/public/time"));
Log(info);
auto ticker = json::parse(HttpQuery("https://www.okx.com/api/v5/market/books?instId=BTC-USDT"));
Log(ticker);
}
एक URL के लिए वापस सामग्री प्राप्त करें, अगर दूसरा पैरामीटरPostData
स्ट्रिंग के लिएa=1&b=2&c=abc
यह एक बहुत अच्छा तरीका है।POST
कैसे प्रस्तुत करें. अन्य उदाहरणPUT
यह एक बहुत ही अच्छा सवाल है।PostData
पैरामीटर है{method:'PUT', data:'a=1&b=2&c=abc'}
。
PostData
यह भी हो सकता हैJSON
स्ट्रिंग ।
Cookies
यह पैरामीटर इस प्रकार हैःa=10; b=20
, प्रत्येक पैरामीटर को अंकित किया जाता है;
यह एक बहुत ही दिलचस्प लेख है।Headers
यह पैरामीटर इस प्रकार हैःUser-Agent: Mobile\nContent-Type: text/html
प्रत्येक पैरामीटर के लिए प्रतिस्थापन चिह्न\n
यह एक बहुत ही दिलचस्प लेख है।
दूसरा पैरामीटरPostData
आप अपने लिए कुछ अनुकूलित तरीके बना सकते हैं जैसेःHttpQuery("http://www.abc.com", {method:'PUT', data:'a=1&b=2&c=abc'})
कृपया ध्यान देंः यदि आवश्यक हो तोHttpQuery
फ़ंक्शन को ओवरटाइम सेट करें,{method:'PUT', data:'a=1&b=2&c=abc'}
शामिल होंtimeout
विशेषताएं (डिफ़ॉल्ट 60 सेकंड) ।
एक सेकंड की देरी सेट करेंःHttpQuery("http://www.abc.com", {method:'PUT', data:'a=1&b=2&c=abc', timeout:1000})
वितरित करनाCookie
स्ट्रिंग को तीसरे पैरामीटर की आवश्यकता होती है, लेकिन नहींPOST
दूसरा पैरामीटर खाली रखें. अनुकरण परीक्षण के दौरान, फ़ंक्शन एक स्थिर स्ट्रिंग लौटाता है क्योंकि अनुकरण URL तक नहीं पहुंच सकता है।Dummy Data
इस इंटरफ़ेस का उपयोग पाठ संदेश भेजने या अन्य एपीआई इंटरफेस के साथ बातचीत करने के लिए किया जा सकता है।
GET
विधि कॉल उदाहरणःHttpQuery("http://www.baidu.com")
。
POST
विधि कॉल उदाहरणःHttpQuery("http://www.163.com", "a=1&b=2&c=abc")
。
लौटेंHeader
उदाहरण के लिएः
HttpQuery("http://www.baidu.com", null, "a=10; b=20", "User-Agent: Mobile\nContent-Type: text/html", true) // will return {Header: HTTP Header, Body: HTML}
HttpQuery
फ़ंक्शन का उपयोग करके एजेंट सेटिंग्सः
function main() {
// 本次设置代理并发送http请求,无用户名,无密码,此次http请求会通过代理发送
HttpQuery("socks5://127.0.0.1:8889/http://www.baidu.com/")
// 本次设置代理并发送http请求,输入用户名和密码,仅HttpQuery当前调用生效,之后再次调用HttpQuery("http://www.baidu.com")这样不会使用代理
HttpQuery("socks5://username:password@127.0.0.1:8889/http://www.baidu.com/")
}
# HttpQuery不支持Python,可以使用Python的urllib2库
void main() {
HttpQuery("socks5://127.0.0.1:8889/http://www.baidu.com/");
HttpQuery("socks5://username:password@127.0.0.1:8889/http://www.baidu.com/");
}
HttpQuery
फ़ंक्शन का असिंक्रोनस संस्करणHttpQuery_Go
..
उपयोग औरexchange.Go
फ़ंक्शन समान हैं, जैसे कि असिंक्रोनस एक्सेस एक्सचेंज के सार्वजनिक इंटरफ़ेस से एकत्रित बाजार डेटा प्राप्त करना।
function main() {
// 创建第一个异步线程
var r1 = HttpQuery_Go("https://www.okx.com/api/v5/market/tickers?instType=SPOT")
// 创建第二个异步线程
var r2 = HttpQuery_Go("https://api.huobi.pro/market/tickers")
// 获取第一个异步线程调用的返回值
var tickers1 = r1.wait()
// 获取第二个异步线程调用的返回值
var tickers2 = r2.wait()
// 打印结果
Log("tickers1:", tickers1)
Log("tickers2:", tickers2)
}
# 不支持
// 不支持
पुनर्मूल्यांकन प्रणाली में उपयोगHttpQuery(...)
फ़ंक्शनः
पुनः परीक्षण प्रणाली में इस्तेमाल किया जा सकता हैHttpQuery(...)
अनुरोध भेजें (केवल समर्थन)GET
अनुरोध) डेटा प्राप्त करना; 20 बार अलग-अलग यूआरएल का उपयोग करने के लिए रीट्रीट करने के लिए सीमित; औरHttpQuery(...)
एक्सेस डेटा को कैश करता है, उसी URL को दूसरी बार एक्सेस करने परHttpQuery(...)
फ़ंक्शन कैश डेटा वापस करता है ((अब वास्तविक नेटवर्क अनुरोध नहीं होता है) ⇒
हम एक सर्वर या डिवाइस पर एक सेवा प्रोग्राम चला सकते हैं जो नीति कार्यक्रमों के जवाब में उपयोग किया जाता हैHttpQuery(...)
अनुरोध भेजे गए, परीक्षण के लिए उपयोग किए जाने वाले गो भाषा सेवा कार्यक्रम निम्नलिखित हैंः
package main
import (
"fmt"
"net/http"
"encoding/json"
)
func Handle (w http.ResponseWriter, r *http.Request) {
defer func() {
fmt.Println("req:", *r)
ret := map[string]interface{}{
"schema" : []string{"time","open","high","low","close","vol"},
"data" : []interface{}{
[]int64{1564315200000,9531300,9531300,9497060,9497060,787},
[]int64{1564316100000,9495160,9495160,9474260,9489460,338},
},
}
b, _ := json.Marshal(ret)
w.Write(b)
}()
}
func main () {
fmt.Println("listen http://localhost:9090")
http.HandleFunc("/data", Handle)
http.ListenAndServe(":9090", nil)
}
रणनीति पुनरावलोकन के लिए उपयोग किया जाता हैHttpQuery(...)
फ़ंक्शन भेजने का अनुरोधः
function main() {
// 可以写自己运行服务程序所在设备的IP地址
Log(HttpQuery("http://xxx.xx.x.xxx:9090/data?msg=hello"));
Log(exchange.GetAccount());
}
# HttpQuery不支持Python,可以使用Python的urllib2库
void main() {
// 可以写自己运行服务程序所在设备的IP地址
Log(HttpQuery("http://xxx.xx.x.xxx:9090/data?msg=hello"));
Log(exchange.GetAccount());
}
अनुरोध के उत्तर में डेटा को पुनः कोडित करने का समर्थन करता है, आम कोड का समर्थन करता है।
निर्दिष्ट करेंPostData
पैरामीटरः{method: "GET",charset:"GB18030"}
, जो उत्तर देने वाले डेटा ट्रांसफ़र कोड (GB18030) को लागू कर सकता है।
Encode(algo, inputFormat, outputFormat, data, keyFormat, key string)
यह फ़ंक्शन इनपुट पैरामीटर के आधार पर डेटा को कोड करता है.
पैरामीटरalgo
कोड गणना के लिए उपयोग किए जाने वाले एल्गोरिदम के लिए समर्थित सेटिंग्सः data
इस तरह की जानकारी का उपयोग करने के लिए।inputFormat
/outputFormat
/keyFormat
पैरामीटर समर्थनraw
,hex
,base64
,string
इस तरह के कोडों का उपयोग करना।
अगरkeyFormat
शून्य नहीं है, तो पैरामीटर का उपयोग करेंkey
एन्क्रिप्टेड (HMAC), अन्यथा डिफ़ॉल्टkey
पैरामीटरalgo
सेट करें"sign"
या"signTx"
जब पैरामीटर की आवश्यकता होती हैkey
。
function main(){
Log(Encode("md5", "raw", "hex", "hello"))
Log(Encode("sha512", "raw", "base64", "hello"))
Log(Encode("keccak256", "raw", "hex", "unwrapWETH9(uint256,address)"))
Log(Encode("raw", "string", "hex", "example")) // 6578616d706c65
Log(Encode("raw", "hex", "string", "6578616d706c65")) // example
}
def main():
Log(Encode("md5", "raw", "hex", "hello", "", ""))
Log(Encode("sha512", "raw", "base64", "hello", "", ""))
Log(Encode("keccak256", "raw", "hex", "unwrapWETH9(uint256,address)", "", ""))
Log(Encode("raw", "string", "hex", "example", "", ""))
Log(Encode("raw", "hex", "string", "6578616d706c65", "", ""))
void main(){
Log(Encode("md5", "raw", "hex", "hello"));
Log(Encode("sha512", "raw", "base64", "hello"));
Log(Encode("keccak256", "raw", "hex", "unwrapWETH9(uint256,address)"));
Log(Encode("raw", "string", "hex", "example")); // 6578616d706c65
Log(Encode("raw", "hex", "string", "6578616d706c65")); // example
}
पैरामीटरalgo
यह भी समर्थन करता हैःtext.encoder.utf8
,text.decoder.utf8
,text.encoder.gbk
,text.decoder.gbk
, स्ट्रिंग को एन्कोड करना, अनकोड करना ।
function main(){
var ret1 = Encode("text.encoder.utf8", "raw", "hex", "你好") // e4bda0e5a5bd
Log(ret1)
var ret2 = Encode("text.decoder.utf8", "hex", "string", ret1)
Log(ret2)
var ret3 = Encode("text.encoder.gbk", "raw", "hex", "你好") // c4e3bac3
Log(ret3)
var ret4 = Encode("text.decoder.gbk", "hex", "string", ret3)
Log(ret4)
}
def main():
ret1 = Encode("text.encoder.utf8", "raw", "hex", "你好", "", "") # e4bda0e5a5bd
Log(ret1)
ret2 = Encode("text.decoder.utf8", "hex", "string", ret1, "", "")
Log(ret2)
ret3 = Encode("text.encoder.gbk", "raw", "hex", "你好", "", "") # c4e3bac3
Log(ret3)
ret4 = Encode("text.decoder.gbk", "hex", "string", ret3, "", "")
Log(ret4)
void main(){
auto ret1 = Encode("text.encoder.utf8", "raw", "hex", "你好"); // e4bda0e5a5bd
Log(ret1);
auto ret2 = Encode("text.decoder.utf8", "hex", "string", ret1);
Log(ret2);
auto ret3 = Encode("text.encoder.gbk", "raw", "hex", "你好"); // c4e3bac3
Log(ret3);
auto ret4 = Encode("text.decoder.gbk", "hex", "string", ret3);
Log(ret4);
}
UnixNano()
यदि आपको मिलीसेकंड का समय मिलना है, तो निम्न कोड का उपयोग कर सकते हैंः
function main() {
var time = UnixNano() / 1000000
Log(_N(time, 0))
}
def main():
time = UnixNano()
Log(time)
void main() {
auto time = UnixNano();
Log(time);
}
Unix()
, सेकंड स्तर का समय लौटाता है ।
function main() {
var t = Unix()
Log(t)
}
def main():
t = Unix()
Log(t)
void main() {
auto t = Unix();
Log(t);
}
GetOS()
, होस्ट के सिस्टम पर जानकारी लौटाता है.
function main() {
Log("GetOS:", GetOS())
}
def main():
Log("GetOS:", GetOS())
void main() {
Log("GetOS:", GetOS());
}
एप्पल कंप्यूटर परMac OS
ऑपरेटिंग सिस्टम पर चल रहे होस्ट लॉग आउटपुटः
GetOS: डार्विन/amd64
darwin
यानीMac OS
सिस्टम का नाम।
MD5(String)
, पैरामीटर मानः स्ट्रिंग प्रकार ।
function main() {
Log("MD5", MD5("hello world"))
}
def main():
Log("MD5", MD5("hello world"))
void main() {
Log("MD5", MD5("hello world"));
}
लॉग आउटपुटः
MD5 5eb63bbbe01eeed093cb22bb8f5acdc3
DBExec()
, पैरामीटर मानः स्ट्रिंग, संख्यात्मक मान, बुल मान, रिक्त मान आदि के प्रकार हो सकते हैं. वापसी मानः SQLite कथन निष्पादन के परिणामों को शामिल करने वाले ऑब्जेक्ट।
डेटाबेस इंटरफ़ेस फ़ंक्शनDBExec()
इनपुट पैरामीटर के माध्यम से, एक वास्तविक डिस्क डेटाबेस (SQLite डेटाबेस) का संचालन किया जा सकता है। वास्तविक डिस्क डेटाबेस में डेटा को जोड़ने, हटाने, देखने, बदलने आदि कार्यों को पूरा करने के लिए, समर्थनSQLite
सिंटैक्स. वास्तविक डिस्क डेटाबेस में सिस्टम आरक्षित तालिकाःkvdb
、cfg
、log
、profit
、chart
इन तालिकाओं पर कोई भी ऑपरेशन न करें.DBExec()
फ़ंक्शन केवल वास्तविक डिस्क का समर्थन करता है।
मेमोरी डेटाबेस का समर्थन करें
के लिएDBExec
फ़ंक्शन के पैरामीटर, अगरस्क्वायरयह वाक्य है:
आरंभ में, यह मेमोरी डेटाबेस में संचालित होता है, फ़ाइलों को नहीं लिखता है, और तेज़ होता है। यह उन डेटाबेस कार्यों के लिए उपयुक्त है जिन्हें स्थायी रूप से सहेजने की आवश्यकता नहीं होती है, जैसेः
function main() {
var strSql = [
":CREATE TABLE TEST_TABLE(",
"TS INT PRIMARY KEY NOT NULL,",
"HIGH REAL NOT NULL,",
"OPEN REAL NOT NULL,",
"LOW REAL NOT NULL,",
"CLOSE REAL NOT NULL,",
"VOLUME REAL NOT NULL)"
].join("")
var ret = DBExec(strSql)
Log(ret)
// 增加一条数据
Log(DBExec(":INSERT INTO TEST_TABLE (TS, HIGH, OPEN, LOW, CLOSE, VOLUME) VALUES (1518970320000, 100, 99.1, 90, 100, 12345.6);"))
// 查询数据
Log(DBExec(":SELECT * FROM TEST_TABLE;"))
}
def main():
arr = [
":CREATE TABLE TEST_TABLE(",
"TS INT PRIMARY KEY NOT NULL,",
"HIGH REAL NOT NULL,",
"OPEN REAL NOT NULL,",
"LOW REAL NOT NULL,",
"CLOSE REAL NOT NULL,",
"VOLUME REAL NOT NULL)"
]
strSql = ""
for i in range(len(arr)):
strSql += arr[i]
ret = DBExec(strSql)
Log(ret)
# 增加一条数据
Log(DBExec(":INSERT INTO TEST_TABLE (TS, HIGH, OPEN, LOW, CLOSE, VOLUME) VALUES (1518970320000, 100, 99.1, 90, 100, 12345.6);"))
# 查询数据
Log(DBExec(":SELECT * FROM TEST_TABLE;"))
void main() {
string strSql = ":CREATE TABLE TEST_TABLE(\
TS INT PRIMARY KEY NOT NULL,\
HIGH REAL NOT NULL,\
OPEN REAL NOT NULL,\
LOW REAL NOT NULL,\
CLOSE REAL NOT NULL,\
VOLUME REAL NOT NULL)";
auto ret = DBExec(strSql);
Log(ret);
// 增加一条数据
Log(DBExec(":INSERT INTO TEST_TABLE (TS, HIGH, OPEN, LOW, CLOSE, VOLUME) VALUES (1518970320000, 100, 99.1, 90, 100, 12345.6);"));
// 查询数据
Log(DBExec(":SELECT * FROM TEST_TABLE;"));
}
तालिका बनाना
function main() {
var strSql = [
"CREATE TABLE TEST_TABLE(",
"TS INT PRIMARY KEY NOT NULL,",
"HIGH REAL NOT NULL,",
"OPEN REAL NOT NULL,",
"LOW REAL NOT NULL,",
"CLOSE REAL NOT NULL,",
"VOLUME REAL NOT NULL)"
].join("")
var ret = DBExec(strSql)
Log(ret)
}
def main():
arr = [
"CREATE TABLE TEST_TABLE(",
"TS INT PRIMARY KEY NOT NULL,",
"HIGH REAL NOT NULL,",
"OPEN REAL NOT NULL,",
"LOW REAL NOT NULL,",
"CLOSE REAL NOT NULL,",
"VOLUME REAL NOT NULL)"
]
strSql = ""
for i in range(len(arr)):
strSql += arr[i]
ret = DBExec(strSql)
Log(ret)
void main() {
string strSql = "CREATE TABLE TEST_TABLE(\
TS INT PRIMARY KEY NOT NULL,\
HIGH REAL NOT NULL,\
OPEN REAL NOT NULL,\
LOW REAL NOT NULL,\
CLOSE REAL NOT NULL,\
VOLUME REAL NOT NULL)";
auto ret = DBExec(strSql);
Log(ret);
}
function main() {
var strSql = [
"CREATE TABLE TEST_TABLE(",
"TS INT PRIMARY KEY NOT NULL,",
"HIGH REAL NOT NULL,",
"OPEN REAL NOT NULL,",
"LOW REAL NOT NULL,",
"CLOSE REAL NOT NULL,",
"VOLUME REAL NOT NULL)"
].join("")
Log(DBExec(strSql))
// 增加一条数据
Log(DBExec("INSERT INTO TEST_TABLE (TS, HIGH, OPEN, LOW, CLOSE, VOLUME) VALUES (1518970320000, 100, 99.1, 90, 100, 12345.6);"))
// 查询数据
Log(DBExec("SELECT * FROM TEST_TABLE;"))
// 修改数据
Log(DBExec("UPDATE TEST_TABLE SET HIGH=? WHERE TS=?", 110, 1518970320000))
// 删除数据
Log(DBExec("DELETE FROM TEST_TABLE WHERE HIGH=?", 110))
}
def main():
arr = [
"CREATE TABLE TEST_TABLE(",
"TS INT PRIMARY KEY NOT NULL,",
"HIGH REAL NOT NULL,",
"OPEN REAL NOT NULL,",
"LOW REAL NOT NULL,",
"CLOSE REAL NOT NULL,",
"VOLUME REAL NOT NULL)"
]
strSql = ""
for i in range(len(arr)):
strSql += arr[i]
Log(DBExec(strSql))
# 增加一条数据
Log(DBExec("INSERT INTO TEST_TABLE (TS, HIGH, OPEN, LOW, CLOSE, VOLUME) VALUES (1518970320000, 100, 99.1, 90, 100, 12345.6);"))
# 查询数据
Log(DBExec("SELECT * FROM TEST_TABLE;"))
# 修改数据
Log(DBExec("UPDATE TEST_TABLE SET HIGH=? WHERE TS=?", 110, 1518970320000))
# 删除数据
Log(DBExec("DELETE FROM TEST_TABLE WHERE HIGH=?", 110))
void main() {
string strSql = "CREATE TABLE TEST_TABLE(\
TS INT PRIMARY KEY NOT NULL,\
HIGH REAL NOT NULL,\
OPEN REAL NOT NULL,\
LOW REAL NOT NULL,\
CLOSE REAL NOT NULL,\
VOLUME REAL NOT NULL)";
Log(DBExec(strSql));
// 增加一条数据
Log(DBExec("INSERT INTO TEST_TABLE (TS, HIGH, OPEN, LOW, CLOSE, VOLUME) VALUES (1518970320000, 100, 99.1, 90, 100, 12345.6);"));
// 查询数据
Log(DBExec("SELECT * FROM TEST_TABLE;"));
// 修改数据
Log(DBExec("UPDATE TEST_TABLE SET HIGH=? WHERE TS=?", 110, 1518970320000));
// 删除数据
Log(DBExec("DELETE FROM TEST_TABLE WHERE HIGH=?", 110));
}
UUID()
, एक 32-बिट अद्वितीय UUID लौटाता है, जो केवल वास्तविक डिस्क पर लागू होता है.
function main() {
var uuid1 = UUID()
var uuid2 = UUID()
Log(uuid1, uuid2)
}
def main():
uuid1 = UUID()
uuid2 = UUID()
Log(uuid1, uuid2)
void main() {
auto uuid1 = UUID();
auto uuid2 = UUID();
Log(uuid1, uuid2);
}
EventLoop(timeout)
और किसी भीwebsocket
पढ़ सकते हैं याexchange.Go
、HttpQuery_Go
समवर्ती कार्य पूरा होने के बाद वापस लौटें.timeout
यदि 0 सेट किया गया है तो किसी घटना के होने का इंतजार करें, यदि 0 से अधिक है तो घटना का इंतजार करें, यदि 0 से कम है तो हाल की घटना को तुरंत वापस करें। यदि कोई घटना नहीं है तो वापस करने के लिए बराबर है।null
, सामग्री में शामिल लौटाता हैEvent
घटना के लिए ट्रिगर प्रकार. यह फ़ंक्शन केवल डिस्क पर लागू होता है.
कोड में पहली बार कॉलEventLoop
यदि आप इस घटना के बाद पहली बार शुरू करते हैं, तो आप इस घटना की निगरानी करने के लिए पहले की प्रक्रिया को आरंभ कर सकते हैं।EventLoop
कॉल, जो पिछली घटनाओं को याद करता है; अंतर्निहित प्रणाली में लिपटे कतार संरचनाएं अधिकतम 500 घटनाओं को कैश करती हैं, यदि प्रोग्राम निष्पादन के दौरान समय पर कॉल नहीं किया जाता हैEventLoop
यदि आप इसे हटा देते हैं, तो 500 से अधिक कैश खो दिए जाएंगे।EventLoop
फ़ंक्शन कॉल सिस्टम के मूल को प्रभावित नहीं करता हैwebsocket
और कैश कतारों को प्रभावित नहीं करता हैexchange.Go
उदाहरण के लिए, समवर्ती फ़ंक्शन के कैश के लिए, इन कैशों के लिए अभी भी अपने स्वयं के तरीकों का उपयोग करके डेटा निकालने की आवश्यकता है।EventLoop
फ़ंक्शन वापस आने से पहले, जो डेटा निकाला गया है, वह वापस नहीं आएगा।EventLoop
फ़ंक्शन में रिटर्न इवेंट उत्पन्न करता है.
EventLoop
फ़ंक्शन का मुख्य उपयोग नीति स्तर को सूचित करना है, जब सिस्टम के निचले स्तर को नया नेटवर्क डेटा प्राप्त होता है।EventLoop
जब फ़ंक्शन घटनाओं को लौटाता है, तो उसे सभी डेटा स्रोतों पर जाने की आवश्यकता होती है। उदाहरण के लिएःwebsocket
हम एक दूसरे से जुड़ते हैं।exchange.Go
ऑब्जेक्ट्स जो बनाए गए हैं वे डेटा प्राप्त करने का प्रयास करते हैं।श्रेणी सूची लिंक。
मुख्य फ़ंक्शन मेंmain()
मध्य कॉल के दौरान, मुख्य थ्रेड की घटनाओं की निगरानी करें।JavaScript
भाषा लेखन की रणनीतियों में,__Thread()
फ़ंक्शन द्वारा बनाए गए थ्रेड, फ़ंक्शन के निष्पादन फ़ंक्शन में भी बुलाए जा सकते हैं, वर्तमान थ्रेड की घटनाओं की निगरानी कर सकते हैं।
function main() {
var routine_getTicker = exchange.Go("GetTicker")
var routine_getDepth = exchange.Go("GetDepth")
var routine_getTrades = exchange.Go("GetTrades")
// Sleep(2000),如果这里使用Sleep语句,会导致之后的EventLoop函数错过之前的事件,因为等待了2秒,并发的函数
qq89520एक समस्या है कि क्या C फ़ंक्शन को बार-बार या केवल बार-बार दोहराया जाना चाहिए।
वाह वाह_C ((function, args...) क्या यह डिफ़ॉल्ट 3s है? क्या आप डिफ़ॉल्ट रूप से _CDelay ((1000) को _C ((function, args...) से पहले डाल सकते हैं? क्या आप इसे एक बार सेट कर सकते हैं?
भोजन करनाक्लस्टरः यदि आप एक साथ 1000 रोबोट बनाते हैं, और कोई तनाव नहीं है, तो आप कई प्रबंधक बना सकते हैं जो कार्य को विभाजित करते हैं। एक समूह बनाने के लिए कोड के उदाहरण हैं?
वांगजी1Log ((talib.help (('MACD')); केवल js के साथ उपयोग किया जा सकता है, पायथन में कोई talib.help विशेषता नहीं है...
cjz140_C ((function, args...) और Sleep के बीच क्या अंतर है, मुझे लगता है कि यह सब फिर से प्रयास करने के लिए प्रतीक्षा करने का मतलब है?
3263243ySetErrorFilter के बाद ErrorFilter को कैसे खाली करें?
qq47898077अगर आप तीसरे पक्ष की लाइब्रेरी का उपयोग करना चाहते हैं तो क्या कोई तरीका है?
qq47898077यदि आप एक्सचेंज ऑब्जेक्ट्स को परिभाषित करने वाले नए वर्गों का उत्तराधिकारी बनना चाहते हैं, तो पिता वर्ग को क्या भरना चाहिए?
इथानवुक्या कोई स्थानीय डीबगिंग उपकरण है?
पेंगलिहेंगक्या यह exange.IO (("status") है?
पेंगलिहेंगsell का फ़ंक्शन ग्रे क्यों है, क्या यह फ़ंक्शन का प्रतिनिधित्व करने के लिए अनुपयोगी है?
पेंगलिहेंगsell का फ़ंक्शन ग्रे क्यों है, क्या यह फ़ंक्शन का प्रतिनिधित्व करने के लिए अनुपयोगी है?
पेंगलिहेंगjs भाषा नहीं जानता है, हाहाहा, मैं पूछना चाहता हूँ कि क्या मैं es6 समर्थन करता हूँ?
पेंगलिहेंगjs भाषा नहीं जानता है, हाहाहा, मैं पूछना चाहता हूँ कि क्या मैं es6 समर्थन करता हूँ?
Don.Volume की औसत रेखा को कैसे लिखा जाता है?
ज्यूटर्टलएक्सचेंज.बुक (१०००) पर बाजार मूल्य पर खरीदें यदि यह सफल नहीं होता है तो क्या वापस आएगा?
नींबूयह नया फ़ॉन्ट अच्छा लग रहा है।
हिप्पोक्राफ्टबिटमेक्स का परीक्षण नेटवर्क ((testnet.bitmex.com) भी एपीआई इंटरफेस है, लेकिन वर्तमान में एक्सचेंज केवल बिटमेक्स मुख्य स्टेशन का चयन कर सकते हैं, एपीआई दस्तावेज़ का पता https://testnet.bitmex.com/app/apiOverview है। कृपया समर्थन कैसे करें?
चजीजिनvar ret1 = exchanges[0].IO (("api", "future_estimated_price", "symbol=btc_usd"); लॉग (('ओके फ्यूचर्स अनुमानित डिलिवरी मूल्य', ret1); https://dn-filebox.qbox.me/d1ed268c1e75753c5d289447d279aa9d81e41b5f.png एक बार जब आप किसी अन्य एक्सचेंज के फ़ंक्शन इंटरफेस को कॉल करते हैं, तो आप गलत रिपोर्ट लिखते हैं, क्यों?
एलेनफ्रॉस्टलाइनक्या आप जानना चाहते हैं कि realTicker और टिकर में क्या अंतर है? हाल ही में सूट की रणनीति को फिर से लिखना है, दोनों एक साथ दिखाई देते हैं लेकिन पहले एपीआई में कोई उल्लेख नहीं है।
दर्शनहैलो, एक पायथन डेवलपर के रूप में, क्या लगता है कि आपके एपीआई दस्तावेज़ लिख रहे हैं? कुछ फ़ील्ड फ़ंक्शन इंटरफ़ेस अजीब लग रहे हैं, क्या आप एक दस्तावेज़ लिख सकते हैं जैसे कि githubpage और readdocs?
एलेनफ्रॉस्टलाइनGetAccount: [EAPI:Rate limit exceeded] क्या आप जानना चाहते हैं कि यह कैसे हल होता है? इसके अलावा मेरे पास कोई q नहीं है या कोई वीचेन्ज समूह है? धन्यवाद
zhjx2314StochRSI का समर्थन नहीं करता है, क्या इसे जल्द ही जोड़ा जा सकता है?
यहफगpython नीति वास्तविक डिस्क पर जब स्क्रिप्ट अपने स्वयं के अली क्लाउड सर्वर या botvs क्लस्टर पर है?
यहफगpython का कौन सा संस्करण प्रयोग किया जाता है?
फकीलीGetFee की व्याख्या यह होनी चाहिए कि यह एक Fee स्ट्रक्चर लौटाता है।
झ्वपक्या आप तालिब को कॉल करने के लिए एक js विधि का उपयोग कर सकते हैं?
यहफगपायथन दस्तावेज़ीकरण प्राप्त करें
wmjbs123क्या रणनीति संपादक का कोड पृष्ठभूमि काले रंग का हो सकता है? सफेद आँखों के साथ, रात में कोड लिखना, निकट दृष्टि के लिए आसान है
Don.रोबोट के वीवीसी संदेश में सारांश कैसे सेट करें?
पागलक्या आप ऑर्डर स्ट्रक्चर में एक समान लेनदेन मूल्य क्षेत्र जोड़ सकते हैं?
छोटे बच्चेGetOrders: सभी अधूरे ऑर्डर प्राप्त करें, एक ऑर्डर सरणी संरचना लौटाता है, चीन में बिटकॉइन लेनदेन ETH में, केवल हाल के 10 आइटम लौटाता है, क्या यहां एक फ़ंक्शन है जो सभी अधूरे ऑर्डर वापस करता है?
यहफगएक गणितीय फ़ंक्शन जो कि सांख्यिकीय संभावना सिद्धांत के लिए आवश्यक है, यह कहाँ से आता है?
जिबंग.Cross ((x, y) फ़ंक्शन का क्या अर्थ है?
मेरी मामा ने कहाLogReset सभी लॉग को खाली कर देता है और एक संख्यात्मक पैरामीटर के साथ लॉग रिसेट कर सकता है, जो कि लॉग को सुरक्षित रखने के लिए निर्दिष्ट करता है यह हाल के लॉग्स को कैसे हटाता है?
एडवर्डग्यूतालिब में CORRE फ़ंक्शन ऐसा लगता है जैसे कि इसे नहीं लाया गया है या इसे याद किया गया है?
गरीब पहाड़ियाऐसा लगता है कि कोई सूचक संदर्भ सुविधा नहीं है!
छोटाk लाइन समय पढ़ने के लिए कैसे अनुवाद करता है अब समय ओह, समझ में नहीं आता, बहुत लंबा एक, हल, धन्यवाद
छोटामैं record.remove ((records[0]) का उपयोग कर रहा हूँ, लेकिन यह नहीं कर रहा है
सांपसामान्य रूप से प्राप्त किया जाता है घंटे के लाइन, कैसे दिन के लाइन के लिए एटीआर कॉल करने के लिए?
सांपसामान्य रूप से प्राप्त किया जाता है घंटे के लाइन, कैसे दिन के लाइन के लिए एटीआर कॉल करने के लिए?
57278863सीखें कि पारंपरिक वायदा कैसे प्राप्त करें मूल्य और आदेश, क्षमा करें, जड़ें पतली हैं
किरिनएक पारंपरिक फ्यूचर्स ट्रेडिंग उदाहरण!
छोटाशून्य, क्या आप पारंपरिक वायदा व्यापार के उदाहरण लिख सकते हैं?
छोटाजब एक ही समय में कई रिक्त ऑब्जेक्ट हो, तो कैसे प्रिंट करें, मेरा प्रिंट कैसे करें [object object], कैसे प्राप्त करें, और GetTicker))) कैसे प्राप्त करें, उस सप्ताह, अगले सप्ताह, और तिमाही कैसे प्राप्त करें, उस सप्ताह की कीमत, कोष्ठक में उस सप्ताह, अगले सप्ताह और तिमाही मैं लिखता हूं।
चजीजिनक्या फ्यूचर्स एक्सचेंज GetTicker के साथ ट्रेडों को प्राप्त कर सकते हैं? क्या वे उस प्रकार के अनुबंधों के लिए ट्रेडों को वापस करते हैं ((सप्ताह, अगले सप्ताह...)?
बेचनाStochRSI क्या है, क्या आप जोड़ सकते हैं?
मोमोक्सCancelOrder ((orderId) ऑर्डर नंबर के आधार पर एक ऑर्डर रद्द करें, true या false लौटाएं, true= कक्ष को सफलतापूर्वक रद्द किया गया है, है ना?
मोमोक्स_G(K, V) संग्रहीत वैश्विक शब्दकोश तालिका क्या इस पद्धति द्वारा संग्रहीत वैश्विक चर का उपयोग विभिन्न नीतियों के बीच डेटा साझा करने के लिए किया जा सकता है?
फ्लुफी3डीतेजी से लोकप्रिय
शून्यLogProfitReset का उपयोग करके आय लॉग को रीसेट किया जा सकता है।
क्सिक्या आप सीधे ईए को कॉपी कर सकते हैं?
शिरोनमानमुझे लगता है कि यह मंच बहुत अच्छा है, बहुत अच्छा है, अधिक समूह में बातचीत है।
छोटायह कौन सी भाषा है, क्या इसके लिए कोई अध्ययन सामग्री है?
jxhbtcData error एक हफ्ते से नहीं हो पा रहा है रोबोट को कनेक्ट
घिहुक्या सूचकांक तालिका केवल समापन मूल्य के लिए गणना करती है?
btcrobotहाय, दुनिया
छोटे सपने_C फ़ंक्शन तब तक पुनः प्रयास करता है जब तक कि परिणाम प्राप्त नहीं हो जाता है।
छोटे सपनेpython के लिए talib पुस्तकालय को स्थापित करने की आवश्यकता है.https://www.botvs.com/bbs-topic/669 इस पोस्ट पर जा सकते हैं.
छोटे सपनेस्लीप एक प्रोग्राम है जो कुछ नहीं करता है और प्रतीक्षा करता है। पैरामीटर सेट होने के लिए मिलीसेकंड की संख्या, _C एक बार फिर से कॉल करने के लिए एक पैरामीटर है।
छोटे सपनेबिना विरासत के, JS सीधे ऑब्जेक्ट में लिपटे {name: "नया ऑब्जेक्ट", old_exchange : exchange[0],...... }
छोटे सपनेस्थानीय संपादक रिमोट सिंक प्लगइन, मूल रूप से स्थानीय संपादक रिमोट डिबगिंग है।
छोटे सपनेQQ समूह में आ सकते हैं, और चर्चा करने में आसान हैं।
छोटे सपनेएपीआई दस्तावेजों में ग्रे का मतलब है कि यह फ़ंक्शन बहुत अधिक विस्तारित व्याख्या के बिना दिखाता है, ग्रे का प्रतिनिधित्व करता है, नीले रंग का प्रतिनिधित्व करता है और अधिक व्याख्या है, और यही है।
छोटे सपनेES6 अस्थायी रूप से असमर्थित है, ^^
छोटे सपनेQQ में जा सकते हैं, मुझे समस्या का वर्णन करें, मैं जवाब दूंगा ^^
छोटे सपनेयह एक त्रुटि वापस करता है और आदेश नहीं देता है (वास्तव में, यह खरीदने के लिए पर्याप्त नहीं है!
ज्यूटर्टलउदाहरण के लिए OKCoin, अगर खरीदे गए लोगों की संख्या से अधिक है, तो क्या वापस आ जाएगा?
छोटे सपनेमैं एक ऑर्डर नंबर लौटाता हूं, जो कि एक ऑर्डर नंबर है, जो कि एक ऑर्डर नंबर है, जो कि एक ऑर्डर नंबर है, जो कि एक ऑर्डर नंबर है।
शून्यचल रहे समय पर लेन-देन स्विच करने के लिए समर्थन है, नवीनतम होस्ट डाउनलोड करने की आवश्यकता है। समर्थन Bter/Poloniex विस्तृत एपीआई प्रलेखन लेन-देन फ़ंक्शन टैब नीचे वर्णित ((खाली ब्राउज़र कैश खाली करें यदि यह नहीं दिखता है तो ताज़ा करें)
छोटे सपनेQQ मैं हूँ, मैं आपकी मदद कर सकता हूँ।
पेशेवर पालन-पोषणमैं होस्ट का आईपी सेट करता हूं?
छोटे सपनेयह एक अंतर्निहित लिंक है जो स्थापित नहीं किया गया है सर्वर प्रतिक्रिया नहीं कर रहा है; क्या एपीआई कुंजी का अनुरोध करते समय एक आईपी पता सेट किया गया है?
पेशेवर पालन-पोषणयह शर्म की बात है................................................................................................ 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 पुनः आरंभ करें क्या यह आईपी श्वेतसूची की समस्या है?
छोटे सपनेएक्सचेंज के सर्वर ने कोई प्रतिक्रिया नहीं दी, तीन बार हाथ मिलाने के बाद भी टीसीपी प्रोटोकॉल स्थापित नहीं हुआ।
पेशेवर पालन-पोषण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 यह ठीक है।
नींबूउदाहरण के लिए, मैं एक पूर्ण-मुद्रा लेनदेन करना चाहता हूं, लेकिन BOTvs केवल कुछ ही मुद्राओं का समर्थन करता है, और exchange.IO पी नेटवर्क का समर्थन नहीं करता है।
छोटे सपनेआप exchange.IO को कॉल कर सकते हैं।
नींबूक्या एपीआई के लिए खाता सत्यापन की आवश्यकता है?
छोटे सपनेयदि एपीआई के लिए खाता सत्यापन की आवश्यकता नहीं है, तो httpQuery का उपयोग किया जा सकता है (BotVS प्रलेखन देखें), और वास्तविक लेनदेन एपीआई तक पहुंच की आवश्यकता है।
छोटे सपनेHttpQuery API पैरामीटर का उपयोग करके संदेश भेजेंः https://www.okcoin.com/api/v1/future_estimated_price.do?symbol=btc_usd, यह ठीक है. खाता सत्यापन की आवश्यकता नहीं है कि लेनदेन एपीआई के लिए सीधे मंच पर HttpQuery फ़ंक्शन का उपयोग करें, जो खाते से संबंधित हैं, IO एपीआई का उपयोग करें (IO इन गैर-प्रमाणित लेनदेन एपीआई का समर्थन नहीं करता है) । पोस्टः https://www.botvs.com/bbs-topic/850
दर्शनअच्छा धन्यवाद, और आशा है कि एक अच्छा एपीआई प्रलेखन है।
छोटे सपनेक्या आप जानते हैं कि realTicker एपीआई कहां दिखाई देता है?
छोटे सपनेhttps://dn-filebox.qbox.me/fe1a6f5563ed43a5357f858ecf8a50239619228e.png एपीआई दस्तावेज जावास्क्रिप्ट भाषा में वर्णित है, पायथन संस्करण में वर्णित है, जो कि कंकड़ संचार समुदाय कंकड़ पृष्ठ के शीर्ष पर पोस्ट किए गए हैं.
शून्यनमस्ते, सुझाव के लिए धन्यवाद, एपीआई दस्तावेज़ीकरण वर्तमान में फिर से तैयार किया जा रहा है।
छोटे सपनेआपका स्वागत है - यह दर्शाता है कि उपयोग की आवृत्ति सीमा से अधिक है। https://dn-filebox.qbox.me/a09498920d04cac62624b7438a058d2098d8fb00.png क्या रणनीति में Sleep (1000) फ़ंक्शन का उपयोग किया गया है?, यह 1000 प्रोग्राम को प्रति राउंड एक सेकंड के लिए रोक देता है, जिसे स्वयं सेट किया जा सकता है, जिसका उद्देश्य प्रोग्राम को नियंत्रित करना है एपीआई तक पहुंच की आवृत्ति, क्योंकि कुछ एक्सचेंजों ने अधिकतम पहुंच सीमा सेट की है, एक निश्चित समय से अधिक पहुंच से इनकार कर दिया जाएगा, आईपी पते को अवरुद्ध कर दिया जाएगा।
छोटे सपनेhttps://dn-filebox.qbox.me/c29ab7fc279e1b758355f137907cf52dc8257df6.png मैंने व्यक्तिगत रूप से लिखा है कि स्टोक्सआरएसआई सूचकांक जो पहले से ही OK के साथ तुलना की गई है, सहमत है कि गति थोड़ी धीमी है, अनुकूलित है, और अस्थायी रूप से उपलब्ध है।https://www.botvs.com/bbs-topic/392
शून्यआप अपने सर्वर पर botvs द्वारा प्रदान किए गए या अपने स्वयं के होस्ट के सर्वर पर पुनः परीक्षण का चयन कर सकते हैं, संस्करण 2.7.5 है।
छोटे सपनेअब इसे जोड़ा गया है।
छोटे सपनेअब आप अपनी पृष्ठभूमि शैली को स्वयं कॉन्फ़िगर कर सकते हैं।
छोटे सपनेपायथन दस्तावेज़ लिख रहा है।
छोटे सपनेतालिब की लाइब्रेरी समर्थित है।
hzzgood48 https://www.botvs.com/bbs-topic/276
छोटे सपनेऐसा लगता है कि रणनीति वर्ग में एक उदाहरण है, https://www.botvs.com/strategy/15098
शून्यऑर्डर के औसत मूल्य गुणों को एक्सेस करें, एक्सचेंजों का समर्थन कर सकते हैं, जो एक्सचेंजों का समर्थन नहीं करते हैं वे हमेशा 0 के लिए हैं
यहफगतीसरे पक्ष के स्रोतों का संदर्भ कैसे लें?
शून्ययदि mathjs संतुष्ट नहीं होता है, तो यह केवल तीसरे पक्ष की लाइब्रेरी को कॉपी और आयात करने की नीति का पता लगा सकता है।
छोटे सपनेमैं एक अजनबी हूँ, मुझे समूह में समस्या है, मैं ऑनलाइन हूँ।
जिबंगधन्यवाद.
छोटे सपनेक्या आप एक समूह में हैं? आप नोटरी संस्करण में देख सकते हैं डिजिटल मुद्रा लेनदेन वर्ग कोड विश्लेषण। इसमें $Cross फ़ंक्शन के लिए नोटरी है।
शून्यआप नवीनतम को नहीं हटा सकते, केवल कुछ नवीनतम को बचा सकते हैं... पहले के सभी पुराने को हटा दें।
किरिनस्थिति [i] का उपयोग करके प्रत्येक होल्डिंग प्राप्त करने के लिए, स्थिति एक सरणी है
नींबूexchange.GetRecords ((PERIOD_D1));
किरिनमेरा पारंपरिक वायदा हमेशा GetAccount: not login, "पासवर्ड गलत टाइप नहीं किया गया, लॉग इन नहीं किया गया"
शून्यडिफ़ॉल्ट रूप से सप्ताह है, जिसे प्राप्त करने के लिए सेट कॉन्ट्रैक्ट टाइप की आवश्यकता होती है।
शून्यजैसा कि आप देख सकते हैं, यह सच है, यह एक्सचेंज द्वारा लौटाए गए ऑर्डर को रद्द करने के कार्य का मूल्य है, लेकिन वास्तव में रद्द नहीं किया गया है, यह एक्सचेंज के भीतर कैसे किया जाता है।
मोमोक्स3q
शून्यकुछ समय के लिए नहीं, यह अलग है
सियानशुआनबेशक नहीं, यह MT4 के लिए विशेष है।
शून्यजावास्क्रिप्ट के बारे में जानकारी इंटरनेट पर है।
बेचनाक्या आपकी समस्या हल हो गई है?
शून्यज्यादातर, इनपुट डेटा सीधे रिकॉर्ड या शुद्ध मूल्य के रूप में हो सकता है।