نظام کا موجودہ ورژن نمبر لوٹاتا ہے۔
موجودہ سسٹم ورژن نمبر، جیسے:3.6
.
سٹرنگ
ورژن
function main() {
Log("version:", Version())
}
def main():
Log("version:", Version())
void main() {
Log("version:", Version());
}
سسٹم ورژن نمبر ڈوکر کے پروگرام کا ورژن نمبر ہے۔
نیند کا فنکشن، جس کی وجہ سے پروگرام ایک عرصے تک رک جاتا ہے۔
نیند ((ملسی سیکنڈ)
کےmillisecond
پیرامیٹر نیند کی مدت اور ملی سیکنڈ کی تعداد مقرر کرنے کے لئے استعمال کیا جاتا ہے.
ملی سیکنڈ
سچ
نمبر
function main() {
Sleep(1000 * 10) // Wait for 10 seconds
Log("Waited for 10 seconds")
}
def main():
Sleep(1000 * 10)
Log("Waited for 10 seconds")
void main() {
Sleep(1000 * 10);
Log("Waited for 10 seconds");
}
مثال کے طور پر،Sleep(1000)
تقریب، پروگرام 1 سیکنڈ کے لئے سوتے گا. یہ 1 ملی سیکنڈ سے کم سوتے وقت کے ساتھ آپریشن کی حمایت، مثال کے طور پر ترتیبSleep(0.1)
یہ کم از کم پیرامیٹر کی حمایت کرتا ہے0.000001
، یعنی نینو سیکنڈ ہائبرنیشن، جہاں 1 نینو سیکنڈ کے برابر ہے1e-6
ملی سیکنڈ.
میں حکمت عملی لکھنے جبPython
زبان،Sleep(millisecond)
کے لئے استعمال کیا جانا چاہئے پولنگ وقفہ، وقت انتظار کے آپریشن.time.sleep(second)
فنکشنPython
ہےtime
لائبریری. اس کا سبب یہ ہے کہtime.sleep(second)
ایک حکمت عملی میں فنکشن حکمت عملی پروگرام کو وقت کی ایک مدت کے لئے انتظار کرتا ہے اصل میں جب بیک ٹیسٹنگ (بیک ٹیسٹنگ سسٹم کی ٹائم سیریز پر کود نہیں) ، لہذا یہ حکمت عملی کو بہت آہستہ آہستہ بیک ٹیسٹ کرنے کا سبب بنتا ہے۔
اس بات کا تعین کریں کہ حکمت عملی کا چلانے کا ماحول بیک ٹسٹنگ سسٹم ہے یا نہیں۔
حکمت عملی ایک حقیقی قدر لوٹاتا ہے، مثال کے طور پر:true
جب بیک ٹسٹنگ سسٹم ماحول میں چلتا ہے۔ حکمت عملی ایک غلط قدر لوٹاتی ہے ، مثال کے طور پر:false
جب ایک زندہ ٹریڈنگ ماحول میں چل رہا ہے.
بول
ورچوئل ہے
function main() {
if (IsVirtual()) {
Log("The current backtest system environment.")
} else {
Log("The current live trading environment.")
}
}
def main():
if IsVirtual():
Log("The current backtest system environment.")
else:
Log("The current live trading environment.")
void main() {
if (IsVirtual()) {
Log("The current backtest system environment.");
} else {
Log("The current live trading environment.");
}
}
اس بات کا تعین کریں کہ آیا موجودہ چلنے والا ماحول بیک ٹسٹنگ سسٹم ہے ، جس کا استعمال بیک ٹسٹنگ اور براہ راست تجارت کے مابین فرق کے ساتھ ہم آہنگ ہونے کے لئے کیا جاتا ہے۔
ایک ای میل بھیجیں.
ایک کامیاب ای میل کی ترسیل ایک حقیقی قدر لوٹاتا ہے، مثال کے طور پر،true
، اور ایک ناکام ترسیل ایک غلط قدر لوٹاتا ہے، مثال کے طور پر،false
.
بول
میل ((smtpسرور، smtpصارف نام، smtpپاس ورڈ، mailTo، عنوان، جسم)
مخصوص کرنے کے لئے استعمالSMTP
ای میل بھیجنے والے کا سروس ایڈریس۔
smtpسرور
سچ
سٹرنگ
ای میل بھیجنے والے کا ای میل ایڈریس بتانے کے لئے استعمال کیا جاتا ہے۔
smtpصارف کا نام
سچ
سٹرنگ
کےSMTP
ای میل بھیجنے والے کے میل باکس کا پاس ورڈ۔
smtp پاس ورڈ
سچ
سٹرنگ
ای میل وصول کنندہ کا ای میل پتہ بتانے کے لئے استعمال کیا جاتا ہے۔
میل ٹو
سچ
سٹرنگ
ای میل کا عنوان۔
عنوان
سچ
سٹرنگ
ای میل جسم.
جسم
سچ
سٹرنگ
function main(){
Mail("smtp.163.com", "asdf@163.com", "password", "111@163.com", "title", "body")
}
def main():
Mail("smtp.163.com", "asdf@163.com", "password", "111@163.com", "title", "body")
void main() {
Mail("smtp.163.com", "asdf@163.com", "password", "111@163.com", "title", "body");
}
کےsmtpPassword
پیرامیٹر کے لئے پاس ورڈ مقرر کرتا ہےSMTP
سروس، میل باکس کا پاس ورڈ نہیں.
سیٹ اپ کرتے وقتsmtpServer
پیرامیٹر، اگر آپ کو بندرگاہ کو تبدیل کرنے کی ضرورت ہے، آپ کو براہ راست پیرامیٹر میں بندرگاہ نمبر شامل کر سکتے ہیںsmtpServer
مثال کے طور پر: کیو کیو میلsmtp.qq.com:587
، جو ٹیسٹنگ کے لیے دستیاب ہے۔
اگر غلطی کی اطلاع دی جائے تو:unencryped connection
، آپ کو ترمیم کرنے کی ضرورت ہےsmtpServer
کےMail
فنکشن۔ پیرامیٹر فارمیٹ ہے:ssl://xxx.com:xxx
، مثال کے طور پر،ssl
طریقہ کارSMTP
کیو کیو میل کے لئے:ssl://smtp.qq.com:465
یاsmtp://xxx.com:xxx
.
یہ بیک ٹیسٹنگ سسٹم میں کام نہیں کرتا.
{@fun/Global/Mail_Go میل_Go}
کے asynchronous ورژنMail
function.
کےMail_Go
تقریب فوری طور پر ایک متوازی اعتراض واپس، اور آپ کو استعمال کر سکتے ہیںwait
میل کی ترسیل کا نتیجہ حاصل کرنے کے لئے اس متوازی اعتراض کا طریقہ۔ ایک کامیاب میل کی ترسیل ایک حقیقی قدر واپس کرتی ہے ، مثال کے طور پر ،true
، اور ایک ناکام ترسیل ایک غلط قدر لوٹاتا ہے، مثال کے طور پر،false
.
چیز
Mail_Go ((smtpسرور، smtpصارف نام، smtpپاس ورڈ، mailTo، عنوان، جسم)
یہ SMTP
ای میل بھیجنے والے کا سروس ایڈریس۔
smtpسرور
سچ
سٹرنگ
یہ ای میل بھیجنے والے کے ای میل ایڈریس کی وضاحت کرنے کے لئے استعمال کیا جاتا ہے.
smtpصارف کا نام
سچ
سٹرنگ
کےSMTP
ای میل بھیجنے والے کے میل باکس کا پاس ورڈ۔
smtp پاس ورڈ
سچ
سٹرنگ
یہ ای میل وصول کنندہ کے ای میل ایڈریس کی وضاحت کرنے کے لئے استعمال کیا جاتا ہے.
میل ٹو
سچ
سٹرنگ
ای میل کا عنوان۔
عنوان
سچ
سٹرنگ
ای میل جسم.
جسم
سچ
سٹرنگ
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)
}
# Not supported.
// Not supported.
یہ بیک ٹیسٹنگ سسٹم میں کام نہیں کرتا.
{@ تفریح/گلوبل/میل میل}
فلٹر غلطی کے نوشتہ جات.
SetErrorFilter ((فلٹرز)
باقاعدہ اظہار تار. فلٹر سچ سٹرنگ
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() {
// A random query for a non-existent order with an id of 123, allowing the interface to report an error deliberately
var order = exchange.GetOrder("123")
Log(order)
// Filter http502 errors, GetOrder interface errors, after setting the error filter, the second call to GetOrder will no longer report errors
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);
}
ایک انٹرفیس غلطی پیغام فلٹر کریں.
اس باقاعدہ اظہار سے ملنے والے غلطی کے نوشتہ جات کو لاگ سسٹم میں اپ لوڈ نہیں کیا جائے گا۔ آپ اسے متعدد بار (وقت کی تعداد پر کوئی حد نہیں) کال کر سکتے ہیں تاکہ متعدد فلٹر کی شرائط طے کی جاسکیں۔ متعدد بار طے شدہ باقاعدہ اظہار جمع ہوجائیں گے اور ایک ہی وقت میں اثر انداز ہوجائیں گے۔ آپ غلطی کے نوشتہ جات کو فلٹر کرنے کے لئے استعمال ہونے والے باقاعدہ اظہار کو ری سیٹ کرنے کے لئے ایک خالی تار طے کرسکتے ہیں۔SetErrorFilter("")
. فلٹر شدہ لاگ اب ڈوکر ڈائرکٹری میں لائیو ٹریڈنگ ID کے مطابق ڈیٹا بیس فائل میں نہیں لکھے جاتے ہیں تاکہ ڈیٹا بیس فائل کو پھولنے سے اکثر غلطی کی اطلاع دینے سے بچایا جاسکے۔
لائیو ٹریڈنگ کے عمل کی شناخت حاصل کریں.
لائیو ٹریڈنگ کے عمل کی شناخت واپس کریں۔ سٹرنگ
GetPid ((()
function main(){
var id = GetPid()
Log(id)
}
def main():
id = GetPid()
Log(id)
void main() {
auto id = GetPid();
Log(id);
}
آخری غلطی کا پیغام حاصل کریں.
آخری غلطی کا پیغام. سٹرنگ
GetLastError()
function main(){
// Because the order number 123 does not exist, so there will be an error.
exchange.GetOrder("123")
var error = GetLastError()
Log(error)
}
def main():
exchange.GetOrder("123")
error = GetLastError()
Log(error)
void main() {
// Order ID type: TId, so you can't pass in a string, we place an order that doesn't meet the exchange specification to trigger
exchange.GetOrder(exchange.Buy(1, 1));
auto error = GetLastError();
Log(error);
}
یہ بیک ٹیسٹنگ سسٹم میں کام نہیں کرتا.
اسٹریٹجی انٹرایکشن کمانڈ حاصل کرتا ہے.
واپسی کمانڈ کی شکل ہےControlName:Data
. ControlName
کنٹرول کا نام ہے، اورData
کنٹرول میں درج کردہ ڈیٹا ہے۔ اگر انٹرایکٹو کنٹرول میں ان پٹ باکس ، ڈراپ ڈاؤن باکس اور دیگر اجزاء نہیں ہیں (مثال کے طور پر ان پٹ باکس کے بغیر بٹن کنٹرول) تو واپس آنے والا کمانڈ فارمیٹ ہےControlName
، جو صرف کنٹرول کا نام واپس کرتا ہے.
سٹرنگ
کمانڈ حاصل کریں
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);
}
}
تعامل کمانڈ کا پتہ لگاتا ہے اور استعمال کرتا ہےLog
جب یہ پتہ چلا جاتا ہے جب انٹرایکشن کمانڈ کو آؤٹ پٹ کرنے کے لئے تقریب.
function main() {
while (true) {
LogStatus(_D())
var cmd = GetCommand()
if (cmd) {
Log("cmd:", cmd)
var arr = cmd.split(":")
if (arr[0] == "buy") {
Log("Buy, the control without number")
} else if (arr[0] == "sell") {
Log("Sell, the control with the number of:", arr[1])
} else {
Log("Other controls trigger:", arr)
}
}
Sleep(1000)
}
}
def main():
while True:
LogStatus(_D())
cmd = GetCommand()
if cmd:
Log("cmd:", cmd)
arr = cmd.split(":")
if arr[0] == "buy":
Log("Buy, the control without number")
elif arr[0] == "sell":
Log("Sell, the control with the number of:", arr[1])
else:
Log("Other controls trigger:", 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("Buy, the control without number");
} else if (arr[0] == "sell") {
Log("Sell, the control with the number of:", arr[1]);
} else {
Log("Other controls trigger:", arr);
}
}
Sleep(1000);
}
}
مثال کے طور پر حکمت عملی انٹرایکٹو کنٹرول ان پٹ باکس کے بغیر ایک کنٹرول شامل کرتا ہے، انٹرایکٹو کنٹرول کا نام ہے:buy
، کنٹرول کی تفصیل کی معلومات یہ ہے:buy
، جو ایک بٹن کنٹرول ہے۔ ان پٹ باکس کے ساتھ ایک کنٹرول شامل کرکے جاری رکھیں۔ انٹرایکٹو کنٹرول کا نام ہے:sell
اور کنٹرول کی تفصیل کا پیغام ہے:sell
، جو ایک انٹرایکٹو کنٹرول ہے جو ایک بٹن اور ان پٹ باکس کا امتزاج ہے۔ انٹرایکشن کوڈ کو مختلف انٹرایکشن کنٹرولز کا جواب دینے کے لئے حکمت عملی میں ڈیزائن کیا گیا ہے۔
یہ بیک ٹیسٹنگ سسٹم میں کام نہیں کرتا.
حکمت عملی رجسٹریشن کوڈ پیدا کرتے وقت میٹا کی قدر لکھا حاصل کریں.
Meta
ڈیٹا.
سٹرنگ
GetMeta()
function main() {
// The maximum asset value of the denominated currency allowed by the strategy.
var maxBaseCurrency = null
// Get the metadata when creating the registration code.
var level = GetMeta()
// Detecting the conditions corresponding to Meta.
if (level == "level1") {
// -1 for unrestricted
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()
// Detect asset values
var acc = exchange.GetAccount()
if (maxBaseCurrency != -1 && maxBaseCurrency < acc.Stocks + acc.FrozenStocks) {
// Stop executing strategy trading logic
LogStatus(_D(), "level:", level, "Positions exceeding the usage limit of the registration code will no longer execute the strategy trading logic!")
continue
}
// Other trading logic
// Normal output of status bar information
LogStatus(_D(), "level:", level, "The strategy is working properly! ticker data: \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, "Positions exceeding the usage limit of the registration code will no longer execute the strategy trading logic!")
continue
# Other trading logic
# Normal output of status bar information
LogStatus(_D(), "level:", level, "The strategy is working properly! ticker data: \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) {
// Stop execution strategy trading logic.
LogStatus(_D(), "level:", level, "Positions exceeding the usage limit of the registration code will no longer execute the strategy trading logic!");
continue;
}
// Other trading logic
// Normal output of status bar information
LogStatus(_D(), "level:", level, "The strategy is working properly! ticker data: \n", ticker);
}
}
مثال کے طور پر درخواست کا منظر نامہ: استعمالMeta
حکمت عملی کے ذریعہ چلائے جانے والے اثاثوں کی مقدار کو محدود کرنا۔
درخواست کے منظر نامے: مختلف حکمت عملی کرایہ داروں کے لئے کیپٹل حدود کرنے کی ضرورت ہے.Meta
رجسٹریشن کوڈ پیدا کرتے وقت مقرر کردہ قدر 190 حروف سے زیادہ نہیں ہوسکتی ہے اورGetMeta()
اگر کوئی میٹا ڈیٹا (Meta
) ایک حکمت عملی رجسٹریشن کوڈ پیدا کرنے کے وقت مقرر کیا جاتا ہے،GetMeta()
فنکشن null لوٹاتا ہے۔ یہ بیک ٹسٹنگ سسٹم میں کام نہیں کرتا ہے۔
ابتدائی کے لئےSocket
رسائی، حمایتtcp
, udp
, tls
, unix
پروٹوکول۔ 4 مقبول مواصلاتی پروٹوکول کی حمایت:mqtt
, nats
, amqp
, kafka
ڈیٹا بیس سے رابطہ قائم کرنے کی حمایت:sqlite3
, mysql
, postgres
, clickhouse
.
کےDial()
اگر یہ ٹائم آؤٹ ہوتا ہے تو فنکشن null لوٹاتا ہے۔ ایک عام کال ایک کنکشن آبجیکٹ لوٹاتا ہے جس میں تین طریقے ہیں:read
, write
اورclose
.read
ڈیٹا کو پڑھنے کے لئے استعمال کیا جاتا ہے،write
ڈیٹا بھیجنے کے لئے استعمال کیا جاتا ہے اورclose
کنکشن بند کرنے کے لئے استعمال کیا جاتا ہے.
کےread
طریقہ مندرجہ ذیل پیرامیٹرز کی حمایت کرتا ہے:
ws.read()
.ws.read(2000)
دو سیکنڈ (2000 ملی سیکنڈ) کا ٹائم آؤٹ بتاتا ہے۔-1
اس کا مطلب یہ ہے کہ فنکشن فوری طور پر پیغام کی موجودگی یا غیر موجودگی سے قطع نظر واپس آتا ہے، مثال کے طور پر:ws.read(-1)
.
پیرامیٹر منتقل کرنا-2
اس کا مطلب یہ ہے کہ فنکشن فوری طور پر پیغام کے ساتھ یا اس کے بغیر واپس آتا ہے ، لیکن صرف تازہ ترین پیغام واپس کیا جاتا ہے ، اور بفر شدہ پیغام کو ضائع کردیا جاتا ہے۔ مثال کے طور پر ،ws.read(-2)
.read()
فنکشن بفر کی تفصیل:
ویب ساکٹ پروٹوکول کی طرف سے دھکا آنے والے اعداد و شمار کی حکمت عملی کے درمیان وقت کے وقفے اگر ڈیٹا جمع ہو سکتا ہےread()
فنکشن کالز بہت لمبی ہوتی ہیں۔ یہ ڈیٹا بفر میں محفوظ ہوتے ہیں ، جس میں زیادہ سے زیادہ 2000 کی قطار کی ڈیٹا ڈھانچہ ہوتی ہے۔ 2000 سے تجاوز کرنے کے بعد ، تازہ ترین ڈیٹا بفر میں داخل ہوتا ہے اور پرانے ڈیٹا کو صاف کردیا جاتا ہے۔
منظرنامہ | کوئی پیرامیٹر نہیں | پیرامیٹر: -1 | پیرامیٹر: -2 | پیرامیٹر: 2000، ملی سیکنڈ میں |
---|---|---|---|---|
ڈیٹا پہلے ہی بفر میں ہے | فوری طور پر سب سے پرانے اعداد و شمار کو واپس کریں | فوری طور پر سب سے پرانے اعداد و شمار کو واپس کریں | فوری طور پر تازہ ترین ڈیٹا واپس کریں | فوری طور پر سب سے پرانے اعداد و شمار کو واپس کریں |
بفر میں کوئی ڈیٹا نہیں | جب ڈیٹا کو بلاک کیا جائے تو واپس کریں | فوری طور پر null لوٹائیں | فوری طور پر null لوٹائیں | انتظار کریں 2000 MS، null واپس اگر کوئی ڈیٹا نہیں ہے، null واپس اگر کوئی ڈیٹا ہے |
WebSocket کنکشن منقطع یا بنیادی کی طرف سے دوبارہ منسلک کیا جاتا ہے | read() فنکشن خالی سٹرنگ لوٹاتا ہے ، یعنی: |
چیز
ڈائل (ایڈریس) ڈائل کریں (ایڈریس، ٹائم آؤٹ)
درخواست کا پتہ۔ ایڈریس سچ سٹرنگ ٹائم آؤٹ سیکنڈ، ٹائم آؤٹ غلط نمبر
function main(){
// Dial supports tcp://,udp://,tls://,unix://protocol, you can add a parameter to specify the number of seconds for the timeout
var client = Dial("tls://www.baidu.com:443")
if (client) {
// write can be followed by a numeric parameter to specify the timeout, write returns the number of bytes successfully sent
client.write("GET / HTTP/1.1\nConnection: Closed\n\n")
while (true) {
// read can be followed by a numeric parameter specifying the timeout in milliseconds. Returning null indicates an error or timeout or that the socket has been closed
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();
}
}
ڈائل فنکشن کال کا مثال:
function main() {
LogStatus("Connecting...")
// Accessing WebSocket interface of Binance
var client = Dial("wss://stream.binance.com:9443/ws/!ticker@arr")
if (!client) {
Log("Connection failed, program exited")
return
}
while (true) {
// read returns only the data retrieved after the read call
var buf = client.read()
if (!buf) {
break
}
var table = {
type: 'table',
title: 'Ticker Chart',
cols: ['Currency', 'Highest', 'Lowest', 'Buy 1', 'Sell 1', 'Last traded price', 'Volume', 'Update time'],
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("Connecting...")
client = Dial("wss://stream.binance.com:9443/ws/!ticker@arr")
if not client:
Log("Connection failed, program exited")
return
while True:
buf = client.read()
if not buf:
break
table = {
"type" : "table",
"title" : "Ticker Chart",
"cols" : ['Currency', 'Highest', 'Lowest', 'Buy 1', 'Sell 1', 'Last traded price', 'Volume', 'Update time'],
"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("Connecting...");
auto client = Dial("wss://stream.binance.com:9443/ws/!ticker@arr");
if(!client.Valid) {
Log("Connection failed, program exited");
return;
}
while(true) {
auto buf = client.read();
if(buf == "") {
break;
}
json table = R"({
"type" : "table",
"title" : "Ticker Chart",
"cols" : ["Currency", "Highest", "Lowest", "Buy 1", "Sell 1", "Last traded price", "Volume", "Update time"],
"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();
}
بائننس کے ویب ساکٹ ٹکر انٹرفیس تک رسائی حاصل کرنے کے لئے:
var ws = null
function main(){
var param = {
"op": "subscribe",
"args": [{
"channel": "tickers",
"instId": "BTC-USDT"
}]
}
// When calling Dial function, specify reconnect=true to set reconnection mode and payload to be the message sent when reconnecting. When the WebSocket connection is disconnected, it will reconnect and send messages automatically.
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("Send : ping", "#FF0000")
}
LogStatus("Current time:", _D())
Sleep(1000)
}
}
}
function onexit() {
ws.close()
Log("exit")
}
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("Send: ping", "#FF0000")
LogStatus("Current time:", _D())
Sleep(1000)
def onexit():
ws.close()
Log("exit")
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("Send: ping", "#FF0000");
}
LogStatus("Current time:", _D());
Sleep(1000);
}
}
}
void onexit() {
objWS.close();
Log("exit");
}
OKX
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)
// Respond to heartbeat packet operations
try {
var jsonRet = JSON.parse(ret)
if(typeof(jsonRet.ping) == "number") {
var strPong = JSON.stringify({"pong" : jsonRet.ping})
ws.write(strPong)
Log("Respond to ping, send pong:", strPong, "#FF0000")
}
} catch(e) {
Log("e.name:", e.name, "e.stack:", e.stack, "e.message:", e.message)
}
LogStatus("Current time:", _D())
Sleep(1000)
}
}
}
function onexit() {
ws.close()
Log("Execute the ws.close() function")
}
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)
# Respond to heartbeat packet operations
try:
jsonRet = json.loads(ret)
if "ping" in jsonRet and type(jsonRet["ping"]) == int:
strPong = json.dumps({"pong" : jsonRet["ping"]})
ws.write(strPong)
Log("Respond to ping, send pong:", strPong, "#FF0000")
except Exception as e:
Log("e:", e)
LogStatus("Current time:", _D())
Sleep(1000)
def onexit():
ws.close()
Log("Execute the ws.close() function")
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);
// Respond to heartbeat packet operations
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("Respond to ping, send pong:", strPong, "#FF0000");
}
} catch(exception &e)
{
Log("e:", e.what());
}
LogStatus("Current time:", _D());
Sleep(1000);
}
}
}
void onexit() {
// ws.close();
Log("Execute the ws.close() function");
}
Huobi
function getLogin(pAccessKey, pSecretKey, pPassphrase) {
// Signature function for login
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) // exchange.HMAC has been deprecated and is temporarily supported. Please use the latest exchange.Encode function instead.
}]
}
return login
}
var client_private = null
function main() {
// Because the read function uses a timeout setting, filtering the timeout reports errors that would otherwise be output with redundant errors
SetErrorFilter("timeout")
// Position channel subscription information
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) // When logging in, you cannot subscribe to private channels immediately, you need to wait for server response
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)
}
// Detect disconnection, reconnect
if (buf == "" && client_private.write(JSON.stringify(posSubscribe)) == 0) {
Log("Disconnection detected, close connection, reconnect")
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))
}
// Send heartbeat packets
var nowPingTS = new Date().getTime()
if (nowPingTS - lastPingTS > 10 * 1000) {
client_private.write("ping")
lastPingTS = nowPingTS
}
}
}
}
function onexit() {
var ret = client_private.close()
Log("Close the connection!", 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("Disconnection detected, close connection, reconnect")
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("Close the connection!", 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("Disconnection detected, close connection, reconnect");
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("exit");
}
OKX
var client = null
function main() {
// client = Dial("sqlite3://:memory:") // Using an in-memory database
client = Dial("sqlite3://test1.db") // Open/connect to the database file in the docker's directory
// record handle
var sqlite3Handle = client.fd()
Log("sqlite3Handle:", sqlite3Handle)
// Querying tables in the database
var ret = client.exec("SELECT name FROM sqlite_master WHERE type='table'")
Log(ret)
}
function onexit() {
Log("Execute client.close()")
client.close()
}
// Not supported
// Not supported
ایک ڈیٹا بیس سے منسلک ہونے پر ڈائل فنکشن کے ذریعہ واپس آنے والے کنکشن آبجیکٹ میں دو طریقہ کار افعال ہیں جو اس کے لئے منفرد ہیں:
exec(sqlString)
: SQL بیانات کو اسی طرح کے انداز میں چلانے کے لئے استعمال کیا جاتا ہےDBExec()
function.fd()
:fd()
فنکشن ایک ہینڈل (مثال کے طور پر، ہینڈل متغیر ہینڈل ہے) واپس آتا ہے جو دوسرے موضوعات کی طرف سے دوبارہ منسلک کرنے کے لئے استعمال کیا جائے گا (یہاں تک کہ اگر ڈائل کی طرف سے پیدا کردہ آبجیکٹ پہلے ہی عملدرآمد کی طرف سے بند کر دیا گیا ہےclose()
کنکشن کو بند کرنے کے لئے تقریب) ہینڈل میں منتقل کر کےDial()
مثال کے طور پر،Dial(handle)
دوبارہ استعمال کنکشن.
مندرجہ ذیل ایک ڈائل تقریب سے منسلک ایک مثال ہےsqlite3
database.تفصیلاتaddress
پیرامیٹر، کی طرف سے الگ|
عام ایڈریس کے بعد علامت: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")
ڈائل فنکشن کے ایڈریس پیرامیٹر کے ذریعہ تعاون یافتہ افعال | پیرامیٹر کی تفصیل |
---|---|
ویب ساکٹ پروٹوکول ڈیٹا کمپریشن سے متعلق پیرامیٹرز: compress=parameter value | کمپریس کمپریشن کا طریقہ ہے، کمپریس پیرامیٹر کے اختیارات ہیں: gzip_raw، gzip، وغیرہ. اگر gzip طریقہ معیاری gzip نہیں ہے، تو آپ توسیعی طریقہ استعمال کر سکتے ہیں: gzip_raw |
ویب ساکٹ پروٹوکول ڈیٹا کمپریشن سے متعلق پیرامیٹرز: mode=parameter value | موڈ کمپریشن موڈ ہے، موڈ پیرامیٹر دوہری ہو سکتا ہے، بھیجیں، recv. دوہری دو طرفہ کمپریشن ہے، کمپریسڈ ڈیٹا بھیجیں، کمپریسڈ ڈیٹا وصول کریں. بھیجنے کے کمپریسڈ ڈیٹا بھیجنے کے لئے ہے. recv کمپریسڈ ڈیٹا وصول کرنے کے لئے ہے، مقامی decompression. |
ویب ساکٹ پروٹوکول بنیادی آٹو دوبارہ مربوط پیرامیٹرز مقرر کرتا ہے: reconnect=parameter value | reconnect reconnect سیٹ کرنا ہے یا نہیں، reconnect=true reconnect کو فعال کرنا ہے۔ جب یہ پیرامیٹر سیٹ نہیں ہوتا ہے تو ڈیفالٹ reconnect نہیں ہے۔ |
ویب ساکٹ پروٹوکول بنیادی آٹو دوبارہ مربوط متعلقہ پیرامیٹرز مقرر کرتا ہے: وقفہ = پیرامیٹر کی قدر | interval دوبارہ کوشش کرنے کا وقفہ ہے، ملی سیکنڈ میں، interval=10000 10 سیکنڈ کا دوبارہ کوشش کرنے کا وقفہ ہے، ڈیفالٹ 1 سیکنڈ ہے جب یہ مقرر نہیں ہے، یعنی interval=1000. |
ویب ساکٹ پروٹوکول بنیادی آٹو ری کنکشن سے متعلق پیرامیٹرز مقرر کرتا ہے: پے لوڈ = پیرامیٹر ویلیو | پےلوڈ سبسکرپشن پیغام ہے جو ویب ساکٹ کو دوبارہ مربوط کرنے پر بھیجنے کی ضرورت ہے ، مثال کے طور پر: پےلوڈ = اوکوکوک۔ |
جرابوں سے متعلق پیرامیٹرز5 پراکسی: پراکسی = پیرامیٹر ویلیو | پراکسی ایس ایس 5 پراکسی سیٹنگ ہے، پیرامیٹر ویلیو فارمیٹ: socks5://name:pwd@192.168.0.1:1080، نام ایس ایس 5 سرور صارف نام ہے، PWD ایس ایس 5 سرور لاگ ان پاس ورڈ ہے، 1080 ایس ایس 5 سروس پورٹ ہے. |
کےDial()
فنکشن صرف لائیو ٹریڈنگ کے لیے معاون ہے۔
ڈائل فنکشن کا استعمال کرتے ہوئے ڈیٹا بیس سے رابطہ قائم کرتے وقت ، کنکشن سٹرنگ ہر ڈیٹا بیس کے لئے گو زبان ڈرائیور پروجیکٹ کے حوالے سے لکھی جاتی ہے۔
ڈیٹا بیس کی حمایت | ڈرائیونگ پروجیکٹس | کنکشن سٹرنگ | تبصرے |
---|---|---|---|
سکلائٹ3 | github.com/mattn/go-sqlite3 | sqlite3://file:test.db؟cache=shared&mode=memory | کےsqlite3:// سابقہ اس بات کی نشاندہی کرتا ہے کہ ایک sqlite3 ڈیٹا بیس استعمال کیا جا رہا ہے، مثال کال:Dial("sqlite3://test1.db") |
mysql | github.com/go-sql-driver/mysql | mysql://username:yourpassword@tcp(localhost:3306) /آپ کا ڈیٹا بیس؟charset=utf8mb4 | – |
پودوں کے بعد | github.com/lib/pq | postgres://user=postgres dbname=yourdatabase sslmode=disable password=yourpassword میزبان=localhost پورٹ=5432 | – |
کلک ہاؤس | github.com/ClickHouse/clickhouse-go | کلک ہاؤس://tcp://host:9000؟username=username&password=yourpassword&database=youdatabase | – |
براہ مہربانی نوٹ کریں کہ جبpayload
مواد میں مقررaddress
پیرامیٹر حروف پر مشتمل ہے=
یا دیگر خصوصی حروف، یہ تجزیہ پر اثر انداز کر سکتے ہیںaddress
پیرامیٹرDial
تقریب، جیسے مندرجہ ذیل مثال.
backPack Exchange websocket نجی انٹرفیس کال مثال:
var client = null
function main() {
// Base64-encoded public key of the key pair, i.e. the access key configured on FMZ
var base64ApiKey = "xxx"
var ts = String(new Date().getTime())
var data = "instruction=subscribe×tamp=" + ts + "&window=5000"
// Since signEd25519 returns a base64 encoding, it contains the character "="
var signature = signEd25519(data)
// The payload may contain the character "=" after being encoded by JSON
payload = {
"method": "SUBSCRIBE",
"params": ["account.orderUpdate"],
"signature": [base64ApiKey, signature, ts, "5000"]
}
client = Dial("wss://ws.backpack.exchange")
client.write(JSON.stringify(payload))
if (!client) {
Log("Connection failed, program exited")
return
}
while (true) {
var buf = client.read()
Log(buf)
}
}
function onexit() {
client.close()
}
function signEd25519(data) {
return exchange.Encode("ed25519.seed", "raw", "base64", data, "base64", "{{secretkey}}")
}
مندرجہ ذیل کال کوڈ میں ٹھیک کام کرتا ہے:
client = Dial("wss://ws.backpack.exchange")
client.write(JSON.stringify(payload))
اگر آپ اسے براہ راست لکھیںpayload
، یہ مناسب طریقے سے کام نہیں کرے گا، مثال کے طور پر:
client = Dial("wss://ws.backpack.exchange|payload=" + JSON.stringify(payload))
فی الحال، صرف جاوا اسکرپٹ کے استعمال کی حمایت کرتا ہےmqtt
, nats
, amqp
، اورkafka
ڈائل فنکشن میں مواصلاتی پروٹوکول۔ چار پروٹوکولوں کے استعمال کو ظاہر کرنے کے لئے جاوا اسکرپٹ زبان کی حکمت عملی کا کوڈ بطور مثال استعمال کیا جاتا ہے۔mqtt
, nats
, amqp
، اورkafka
:
// We need to configure and deploy proxy servers for each protocol first.
// For the sake of demonstration, the subscription (read operation) and publishing (write operation) of the topic test_topic are all performed in the current strategy.
var arrConn = []
var arrName = []
function main() {
LogReset(1)
conn_nats = Dial("nats://admin@127.0.0.1:4222?topic=test_topic")
conn_mqtt = Dial("mqtt://127.0.0.1:1883?topic=test_topic")
conn_amqp = Dial("amqp://q:admin@127.0.0.1:5672/?queue=test_Queue")
conn_kafka = Dial("kafka://localhost:9092/test_topic")
arrConn = [conn_nats, conn_amqp, conn_mqtt, conn_kafka]
arrName = ["nats", "amqp", "mqtt", "kafka"]
while (true) {
for (var i in arrConn) {
var conn = arrConn[i]
var name = arrName[i]
// Write data
conn.write(name + ", time: " + _D() + ", test msg.")
// Read data
var readMsg = conn.read(1000)
Log(name + " readMsg: ", readMsg, "#FF0000")
}
Sleep(1000)
}
}
function onexit() {
for (var i in arrConn) {
arrConn[i].close()
Log("close", arrName[i], "connect")
}
}
تفصیلی دستاویزات کا حوالہ:ایف ایم زیڈ کی تلاش: لائیو ٹریڈنگ کی حکمت عملیوں کے مابین مواصلاتی پروٹوکول کی مشق
ایک HTTP درخواست بھیجیں.
درخواست کے جواب کے اعداد و شمار کو واپس کرتا ہے. اگر واپسی کی قیمت ایک ہےJSON
تار، یہ کی طرف سے تجزیہ کیا جا سکتا ہےJSON.parse()
میں کردارJavaScript
زبان کی حکمت عملی، اورjson::parse()
میں کردارC++
زبان کی حکمت عملی۔ اگر ڈیبگ کو اختیارات کے ڈھانچے میں سچ پر مقرر کیا گیا ہے تو ، واپسی کی قیمت ایک آبجیکٹ (JSON) ہے۔ اگر ڈیبگ کو غلط پر مقرر کیا گیا ہے تو ، واپسی کی قیمت ایک تار ہے۔
تار، اعتراض
HttpQuery ((url) HttpQuery ((url، اختیارات)
ایچ ٹی پی درخواست یو آر ایل. یو آر ایل سچ سٹرنگ HTTP درخواست سے متعلق ترتیبات ، مثال کے طور پر ، مندرجہ ذیل طور پر تشکیل دی جاسکتی ہیں:
{
method: "POST",
body: "a=10&b=20&c=30",
charset: "UTF-8",
cookie: "session_id=12345; lang=en",
profile: "chrome_103",
debug: false,
headers: {"TEST-HTTP-QUERY": "123"},
timeout: 1000
}
tls
انگلی کے نشانات.
حمایت کی ترتیبات میں مندرجہ ذیل اختیارات شامل ہیں:
chrome_:"chrome_103"
, "chrome_104"
, "chrome_105"
, "chrome_106"
, "chrome_107"
, "chrome_108"
, "chrome_109"
, "chrome_110"
, "chrome_111"
, "chrome_112"
, "chrome_117"
سفاری_:"safari_15_6_1"
, "safari_16_0"
, "safari_ipad_15_6"
, "safari_ios_15_5"
, "safari_ios_15_6"
, "safari_ios_16_0"
فائر فاکس:"firefox_102"
, "firefox_104"
, "firefox_105"
, "firefox_106"
, "firefox_108"
, "firefox_110"
, "firefox_117"
اوپیرا_:"opera_89"
, "opera_90"
, "opera_91"
زالینڈو:"zalando_android_mobile"
, "zalando_ios_mobile"
nike_:"nike_ios_mobile"
, "nike_android_mobile"
بادل کش:"cloudscraper"
mms_:"mms_ios"
mesh_:"mesh_ios"
, "mesh_ios_1"
, "mesh_ios_2"
, "mesh_android"
, "mesh_android_1"
, "mesh_android_2"
تصدیق_:"confirmed_ios"
, "confirmed_android"
ٹھیک ہے:"okhttp4_android_7"
, "okhttp4_android_8"
, "okhttp4_android_9"
, "okhttp4_android_10"
, "okhttp4_android_11"
, "okhttp4_android_12"
, "okhttp4_android_13"
,true
،HttpQuery
فنکشن کال مکمل جواب پیغام واپس کرتا ہے.false
، صرف اعداد و شمارBody
کے جواب کے پیغام کو واپس کر دیا جاتا ہے.profile
میدان چھوڑا جا سکتا ہے.اختیارات غلط چیز
function main(){
// An example of GET access without parameters
var info = JSON.parse(HttpQuery("https://www.okx.com/api/v5/public/time"))
Log(info)
// An example of GET access with parameters
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 does not support Python, you can use the urllib/urllib2 library instead
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);
}
OKX عوامی ٹکر API انٹرفیس تک رسائی کا ایک مثال.
function main() {
// Setting proxy and sending an http request for this time, no username, no password, this http request will be sent through the proxy
HttpQuery("socks5://127.0.0.1:8889/http://www.baidu.com/")
// Setting proxy and sending an http request for this time, enter the user name and password, only the current call to HttpQuery takes effect, and then call HttpQuery again ("http://www.baidu.com") so that the proxy will not be used.
HttpQuery("socks5://username:password@127.0.0.1:8889/http://www.baidu.com/")
}
# HttpQuery does not support Python, you can use the urllib/urllib2 library instead
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()
فنکشن صرف حمایت کرتا ہےJavaScript
, C++
زبان،Python
زبان کا استعمال کر سکتے ہیںurllib
براہ راست HTTP درخواستوں کو بھیجنے کے لئے لائبریری.HttpQuery()
بنیادی طور پر تبادلے کے انٹرفیس تک رسائی کے لئے استعمال کیا جاتا ہے جس میں دستخط کی ضرورت نہیں ہے ، جیسے ٹکر کی معلومات جیسے عوامی انٹرفیس۔HttpQuery()
درخواستیں بھیجنے کے لئے بیک ٹسٹنگ سسٹم میں استعمال کیا جا سکتا ہے (صرفGET
اعداد و شمار حاصل کرنے کے لئے درخواستوں کی حمایت کی جاتی ہے۔ بیک ٹیسٹنگ 20 دوروں کے استعمال تک محدود ہےURLs
، اورHttpQuery()
دوروں ڈیٹا کیش کریں گے.URL
دوسری بار تک رسائی حاصل کی جاتی ہے،HttpQuery()
فنکشن کیشڈ ڈیٹا واپس کرتا ہے اور مزید حقیقی نیٹ ورک کی درخواستیں نہیں ہوتی ہیں۔
{@fun/Global/HttpQuery_Go HttpQuery_Go}
ایک HTTP درخواست بھیجتا ہے، ایک غیر متزلزل ورژنHttpQuery
function.
کےHttpQuery_Go()
تقریب فوری طور پر ایک متوازی آبجیکٹ واپس آتا ہے کہ HTTP درخواست کا نتیجہ حاصل کرنے کے لئے استعمال کیا جا سکتا ہے کا استعمال کرتے ہوئےwait
کے طریقہ کارJSON.parse()
تقریب کا استعمال کر سکتے ہیں تجزیہ کرنے کے لئےJSON.parse()
میں کردارJavaScript
زبان کی حکمت عملی.
چیز
HttpQuery_Go ((url) HttpQuery_Go ((url، اختیارات)
ایچ ٹی پی درخواست یو آر ایل. یو آر ایل سچ سٹرنگ HTTP درخواست سے متعلق ترتیبات ، مثال کے طور پر ، مندرجہ ذیل طور پر تشکیل دی جاسکتی ہیں:
{
method: "POST",
body: "a=10&b=20&c=30",
charset: "UTF-8",
cookie: "session_id=12345; lang=en",
// profile: "",
debug: false,
headers: {"TEST-HTTP-QUERY": "123"},
timeout: 1000
}
tls
fingerprints.true
، یہHttpQuery_Go
فنکشن کال مکمل جواب پیغام واپس کرتا ہے.false
، صرف اعداد و شمارBody
کے جواب کے پیغام کو واپس کر دیا جاتا ہے.profile
میدان چھوڑا جا سکتا ہے.اختیارات غلط چیز
function main() {
// Create the first asynchronous thread
var r1 = HttpQuery_Go("https://www.okx.com/api/v5/market/tickers?instType=SPOT")
// Create the second asynchronous thread
var r2 = HttpQuery_Go("https://api.huobi.pro/market/tickers")
// Get the return value of the first asynchronous thread call
var tickers1 = r1.wait()
// Get the return value of the second asynchronous thread call
var tickers2 = r2.wait()
// Print results
Log("tickers1:", tickers1)
Log("tickers2:", tickers2)
}
# Not supported
// Not supported
مجموعی ٹکر ڈیٹا کے لئے تبادلے کے عوامی انٹرفیس تک غیر متزلزل رسائی۔
کےHttpQuery_Go()
فنکشن صرف حمایت کرتا ہےJavaScript
،Python
زبان کے ساتھ استعمال کیا جا سکتا ہےurllib
براہ راست HTTP درخواستوں کو بھیجنے کے لئے لائبریری.HttpQuery_Go()
بنیادی طور پر ان انٹرفیس تک رسائی کے لئے استعمال کیا جاتا ہے جن کے تبادلے پر دستخط کی ضرورت نہیں ہے ، جیسے ٹکر کی معلومات جیسے عوامی انٹرفیس۔HttpQuery_Go
فنکشن backtesting کے نظام میں معاونت نہیں ہے.
{@fun/Global/HttpQuery HttpQuery} {@fun/Global/HttpQuery HttpQuery}
یہ فنکشن ڈیٹا کو منتقل کردہ پیرامیٹرز کے مطابق کوڈ کرتا ہے.
کےEncode
فنکشن کوڈنگ اور خفیہ کاری کے بعد ڈیٹا واپس کرتا ہے.
سٹرنگ
انکوڈ ((algo، inputFormat، outputFormat، ڈیٹا) انکوڈ کریں ((algo، inputFormat، outputFormat، ڈیٹا، keyFormat، key)
پیرامیٹرalgo
کوڈنگ کے حساب میں استعمال ہونے والا الگورتھم ہے۔ سپورٹ کی ترتیب یہ ہے:raw
(کوئی الگورتھم استعمال نہیں کیا جاتا ہے) ، "سائن" ، algo
بھی حمایت کرتا ہے: algo
بھی حمایت کرتا ہے: algo
ed25519.seed
حساب کتاب.
کچھ
سچ
سٹرنگ
ڈیٹا فارمیٹ کی وضاحت کرنے کے لئے استعمال کیا جاتا ہےdata
پیرامیٹر.inputFormat
پیرامیٹر مندرجہ ذیل میں سے ایک کے طور پر مقرر کیا جا سکتا ہے:raw
, hex
, base64
, string
hex
کوڈت، base64
انکوڈ کیا جاتا ہے، اور outputFormat
پیرامیٹر مندرجہ ذیل میں سے ایک کے طور پر مقرر کیا جا سکتا ہے:raw
, hex
, base64
, string
hex
کوڈت، base64
انکوڈ کیا جاتا ہے، اور data
یہ وہ اعداد و شمار ہیں جن پر کارروائی کی جائے گی۔
اعداد و شمار
سچ
سٹرنگ
ڈیٹا فارمیٹ کی وضاحت کرنے کے لئے استعمال کیا جاتا ہےkey
پیرامیٹر.key
پیرامیٹر مندرجہ ذیل میں سے ایک کے طور پر مقرر کیا جا سکتا ہے:raw
, hex
, base64
, string
hex
کوڈت، base64
انکوڈ کیا جاتا ہے، اور key
کے لئے استعمال کیا جاتا خفیہ کلید ہےHMAC
خفیہ کاری. پیرامیٹرkey
جب پیرامیٹر کی ضرورت ہےalgo
پر مقرر کیا گیا ہےsign
یاsignTx
.key
پیرامیٹر کے لئے استعمال نہیں کیا جاتاHMAC
خفیہ کاریalgo
پیرامیٹر
function main() {
Log(Encode("raw", "raw", "hex", "example", "raw", "123")) // 6578616d706c65
Log(Encode("raw", "raw", "hex", "example")) // 6578616d706c65
Log(Encode("sha256", "raw", "hex", "example", "raw", "123")) // 698d54f0494528a759f19c8e87a9f99e75a5881b9267ee3926bcf62c992d84ba
Log(Encode("sha256", "raw", "hex", "example", "", "123")) // 50d858e0985ecc7f60418aaf0cc5ab587f42c2570a884095a9e8ccacd0f6545c
Log(Encode("sha256", "raw", "hex", "example", null, "123")) // 50d858e0985ecc7f60418aaf0cc5ab587f42c2570a884095a9e8ccacd0f6545c
Log(Encode("sha256", "raw", "hex", "example", "string", "123")) // 698d54f0494528a759f19c8e87a9f99e75a5881b9267ee3926bcf62c992d84ba
Log(Encode("raw", "raw", "hex", "123")) // 313233
Log(Encode("raw", "raw", "base64", "123")) // MTIz
Log(Encode("sha256", "raw", "hex", "example", "hex", "313233")) // 698d54f0494528a759f19c8e87a9f99e75a5881b9267ee3926bcf62c992d84ba
Log(Encode("sha256", "raw", "hex", "example", "base64", "MTIz")) // 698d54f0494528a759f19c8e87a9f99e75a5881b9267ee3926bcf62c992d84ba
}
def main():
Log(Encode("raw", "raw", "hex", "example", "raw", "123")) # 6578616d706c65
Log(Encode("raw", "raw", "hex", "example", "", "")) # 6578616d706c65
Log(Encode("sha256", "raw", "hex", "example", "raw", "123")) # 698d54f0494528a759f19c8e87a9f99e75a5881b9267ee3926bcf62c992d84ba
Log(Encode("sha256", "raw", "hex", "example", "", "123")) # 50d858e0985ecc7f60418aaf0cc5ab587f42c2570a884095a9e8ccacd0f6545c
Log(Encode("sha256", "raw", "hex", "example", "string", "123")) # 698d54f0494528a759f19c8e87a9f99e75a5881b9267ee3926bcf62c992d84ba
Log(Encode("raw", "raw", "hex", "123", "", "")) # 313233
Log(Encode("raw", "raw", "base64", "123", "", "")) # MTIz
Log(Encode("sha256", "raw", "hex", "example", "hex", "313233")) # 698d54f0494528a759f19c8e87a9f99e75a5881b9267ee3926bcf62c992d84ba
Log(Encode("sha256", "raw", "hex", "example", "base64", "MTIz")) # 698d54f0494528a759f19c8e87a9f99e75a5881b9267ee3926bcf62c992d84ba
void main() {
Log(Encode("raw", "raw", "hex", "example", "raw", "123")); // 6578616d706c65
Log(Encode("raw", "raw", "hex", "example")); // 6578616d706c65
Log(Encode("sha256", "raw", "hex", "example", "raw", "123")); // 698d54f0494528a759f19c8e87a9f99e75a5881b9267ee3926bcf62c992d84ba
Log(Encode("sha256", "raw", "hex", "example", "", "123")); // 50d858e0985ecc7f60418aaf0cc5ab587f42c2570a884095a9e8ccacd0f6545c
Log(Encode("sha256", "raw", "hex", "example", "string", "123")); // 698d54f0494528a759f19c8e87a9f99e75a5881b9267ee3926bcf62c992d84ba
Log(Encode("raw", "raw", "hex", "123")); // 313233
Log(Encode("raw", "raw", "base64", "123")); // MTIz
Log(Encode("sha256", "raw", "hex", "example", "hex", "313233")); // 698d54f0494528a759f19c8e87a9f99e75a5881b9267ee3926bcf62c992d84ba
Log(Encode("sha256", "raw", "hex", "example", "base64", "MTIz")); // 698d54f0494528a759f19c8e87a9f99e75a5881b9267ee3926bcf62c992d84ba
}
انکوڈ فنکشن کال کا مثال.
function main(){
var ret1 = Encode("text.encoder.utf8", "raw", "hex", "hello") // e4bda0e5a5bd
Log(ret1)
var ret2 = Encode("text.decoder.utf8", "hex", "string", ret1)
Log(ret2)
var ret3 = Encode("text.encoder.gbk", "raw", "hex", "hello") // c4e3bac3
Log(ret3)
var ret4 = Encode("text.decoder.gbk", "hex", "string", ret3)
Log(ret4)
}
def main():
ret1 = Encode("text.encoder.utf8", "raw", "hex", "hello", "", "") # e4bda0e5a5bd
Log(ret1)
ret2 = Encode("text.decoder.utf8", "hex", "string", ret1, "", "")
Log(ret2)
ret3 = Encode("text.encoder.gbk", "raw", "hex", "hello", "", "") # c4e3bac3
Log(ret3)
ret4 = Encode("text.decoder.gbk", "hex", "string", ret3, "", "")
Log(ret4)
void main(){
auto ret1 = Encode("text.encoder.utf8", "raw", "hex", "hello"); // e4bda0e5a5bd
Log(ret1);
auto ret2 = Encode("text.decoder.utf8", "hex", "string", ret1);
Log(ret2);
auto ret3 = Encode("text.encoder.gbk", "raw", "hex", "hello"); // c4e3bac3
Log(ret3);
auto ret4 = Encode("text.decoder.gbk", "hex", "string", ret3);
Log(ret4);
}
پیرامیٹرalgo
بھی حمایت کرتا ہے:
کےEncode()
صرف لائیو ٹریڈنگ کے لئے حمایت کی جاتی ہے.key
اورkeyFormat
پیرامیٹرز منظور نہیں کر رہے ہیں، توkey
خفیہ کاری استعمال نہیں کی جاتی ہے۔
موجودہ لمحے کا نانوسکنڈ ٹائم اسٹیمپ حاصل کریں۔
کےUnixNano()
فنکشن نینو سیکنڈ ٹائم اسٹیمپ لوٹاتا ہے۔
نمبر
یونیکس نانو ((()
function main() {
var time = UnixNano() / 1000000
Log(_N(time, 0))
}
def main():
time = UnixNano()
Log(time)
void main() {
auto time = UnixNano();
Log(time);
}
اگر آپ کو ملی سیکنڈ کے ٹائم اسٹیمپ حاصل کرنے کی ضرورت ہے، تو آپ مندرجہ ذیل کوڈ استعمال کر سکتے ہیں:
{@ تفریح/گلوبل/یونیکس یونیکس}
دوسری سطح پر موجودہ لمحے کا ٹائم اسٹیمپ حاصل کریں۔
دوسری سطح کا ٹائم اسٹیمپ لوٹاتا ہے۔ نمبر
یونیکس ((()
function main() {
var t = Unix()
Log(t)
}
def main():
t = Unix()
Log(t)
void main() {
auto t = Unix();
Log(t);
}
{@fun/Global/UnixNano یونیکس نانو}
جہاں ڈوکر واقع ہے آلہ کے نظام کی معلومات حاصل کریں.
نظام کی معلومات. سٹرنگ
GetOS()
function main() {
Log("GetOS:", GetOS())
}
def main():
Log("GetOS:", GetOS())
void main() {
Log("GetOS:", GetOS());
}
مثال کے طور پر،GetOS()
پر چل رہا ہے ایک docker کے لئے تقریبمیک او ایسآپریٹنگ سسٹم واپس آ سکتا ہے:darwin/amd64
کیونکہ ایپل کمپیوٹرز میں متعدد ہارڈ ویئر فن تعمیرات ہیں۔darwin
کا نام ہےمیک او ایس system.
پیرامیٹر کے MD5 ہیش کا حساب لگاتا ہےdata
.
MD5 ہیش ویلیو۔ سٹرنگ
MD5 (ڈیٹا)
MD5 حساب کی ضرورت ہے کہ ڈیٹا. اعداد و شمار سچ سٹرنگ
function main() {
Log("MD5", MD5("hello world"))
}
def main():
Log("MD5", MD5("hello world"))
void main() {
Log("MD5", MD5("hello world"));
}
بلاتا ہےMD5("hello world")
فنکشن، واپسی کی قیمت ہے:5eb63bbbe01eeed093cb22bb8f5acdc3
.
{@fun/Global/EncodeEncode} {@fun/Global/EncodeEncode} {@fun/Global/EncodeEncode} {@fun/Global/EncodeEncode}
ڈیٹا بیس انٹرفیس افعال
ایک اعتراض جس میں ایک عمل کے عمل کا نتیجہ شامل ہےمربعبیان، مثال کے طور پر:
{"columns":["TS","HIGH","OPEN","LOW","CLOSE","VOLUME"],"values":[[1518970320000,100,99.1,90,100,12345.6]]}
چیز
DBExec ((sql)
مربعبیان کی تار. مربع سچ سٹرنگ
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)
// Add a piece of data
Log(DBExec(":INSERT INTO TEST_TABLE (TS, HIGH, OPEN, LOW, CLOSE, VOLUME) VALUES (1518970320000, 100, 99.1, 90, 100, 12345.6);"))
// Query data
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)
# Add a piece of data
Log(DBExec(":INSERT INTO TEST_TABLE (TS, HIGH, OPEN, LOW, CLOSE, VOLUME) VALUES (1518970320000, 100, 99.1, 90, 100, 12345.6);"))
# Query data
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);
// Add a piece of data
Log(DBExec(":INSERT INTO TEST_TABLE (TS, HIGH, OPEN, LOW, CLOSE, VOLUME) VALUES (1518970320000, 100, 99.1, 90, 100, 12345.6);"));
// Query data
Log(DBExec(":SELECT * FROM TEST_TABLE;"));
}
میموری میں ڈیٹا بیس کی حمایت،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)
}
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))
// Add a piece of data
Log(DBExec("INSERT INTO TEST_TABLE (TS, HIGH, OPEN, LOW, CLOSE, VOLUME) VALUES (1518970320000, 100, 99.1, 90, 100, 12345.6);"))
// Query data
Log(DBExec("SELECT * FROM TEST_TABLE;"))
// Modify data
Log(DBExec("UPDATE TEST_TABLE SET HIGH=? WHERE TS=?", 110, 1518970320000))
// Delete data
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))
# Add a piece of data
Log(DBExec("INSERT INTO TEST_TABLE (TS, HIGH, OPEN, LOW, CLOSE, VOLUME) VALUES (1518970320000, 100, 99.1, 90, 100, 12345.6);"))
# Query data
Log(DBExec("SELECT * FROM TEST_TABLE;"))
# Modify data
Log(DBExec("UPDATE TEST_TABLE SET HIGH=? WHERE TS=?", 110, 1518970320000))
# Delete data
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));
// Add a piece of data
Log(DBExec("INSERT INTO TEST_TABLE (TS, HIGH, OPEN, LOW, CLOSE, VOLUME) VALUES (1518970320000, 100, 99.1, 90, 100, 12345.6);"));
// Query data
Log(DBExec("SELECT * FROM TEST_TABLE;"));
// Modify data
Log(DBExec("UPDATE TEST_TABLE SET HIGH=? WHERE TS=?", 110, 1518970320000));
// Delete data
Log(DBExec("DELETE FROM TEST_TABLE WHERE HIGH=?", 110));
}
ٹیبل میں ریکارڈ شامل کریں، حذف کریں، چیک کریں اور تبدیل کریں۔
فنکشنDBExec()
پیرامیٹرز میں گزرنے کی طرف سے لائیو ٹریڈنگ ڈیٹا بیس (SQLite ڈیٹا بیس) کام کر سکتے ہیں. لائیو ٹریڈنگ ڈیٹا بیس میں اعداد و شمار کو شامل کرنے، حذف کرنے، چیک کرنے اور تبدیل کرنے کے آپریشن کا احساس، کی حمایتایس کیو ایلائٹنظام لائیو ٹریڈنگ ڈیٹا بیس میں محفوظ ٹیبلز:kvdb
, cfg
, log
, profit
, chart
، ان میزوں پر کام نہ کریں۔لین دینکی حمایت نہیں کی جاتی ہے اور اس طرح کے کاموں کو انجام دینے کی سفارش نہیں کی جاتی ہے، جس سے نظام میں تنازعات پیدا ہوسکتے ہیں.DBExec()
فنکشن صرف لائیو ٹریڈنگ کے لیے معاون ہے۔
{@fun/Global/_G _G}
ایک UUID بنائیں.
32 بٹ UUID. سٹرنگ
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);
}
کےUUID()
فنکشن صرف لائیو ٹریڈنگ کی حمایت کرتا ہے.
واقعات کے لئے سننے کے لئے، یہ کوئی بھی ہے جب واپس آتا ہےWebSocket
پڑھنے کے قابل اعداد و شمار یا بیک وقت کام، جیسے:exchange.Go()
, HttpQuery_Go()
، وغیرہ مکمل کر رہے ہیں.
اگر لوٹایا اعتراض صفر قدر نہیں ہے،Event
واپسی کے مواد میں موجود واقعہ ٹرگر کی قسم ہے۔ مثال کے طور پر مندرجہ ذیل واپسی کی قیمت کا ڈھانچہ:
{"Seq":1,"Event":"Exchange_GetTrades","ThreadId":0,"Index":3,"Nano":1682068771309583400}
چیز
ایونٹ لوپ ((() ایونٹ لوپ (ٹائم آؤٹ)
پیرامیٹرtimeout
ٹائم آؤٹ سیٹنگ ہے، ملی سیکنڈ میں۔ پیرامیٹرtimeout
اگر یہ 0 پر مقرر کیا جاتا ہے تو واپسی سے پہلے کسی ایونٹ کے ہونے کا انتظار کرتا ہے۔ اگر یہ 0 سے بڑا ہے تو ، یہ ایونٹ کو ٹائم آؤٹ کا انتظار کرنے کے لئے مقرر کرتا ہے ، اور اگر یہ 0 سے کم ہے تو فوری طور پر تازہ ترین ایونٹ واپس کرتا ہے۔
ٹائم آؤٹ
غلط
نمبر
function main() {
var routine_getTicker = exchange.Go("GetTicker")
var routine_getDepth = exchange.Go("GetDepth")
var routine_getTrades = exchange.Go("GetTrades")
// Sleep(2000), if the Sleep statement is used here, it will cause the subsequent EventLoop function to miss the previous events, because after waiting for 2 seconds, the concurrent function has received the data, and the subsequent EventLoop listening mechanism started, it misses these events.
// These events will not be missed unless EventLoop(-1) is called at the beginning of the first line of code to first initialize the EventLoop's listening mechanism.
// Log("GetDepth:", routine_getDepth.wait()) If the wait function is called in advance to retrieve the result of a concurrent call to the GetDepth function, the event that the GetDepth function receives the result of the request will not be returned in the EventLoop function.
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("The first concurrent task completed was:", _D(ts1), ret1)
Log("The second concurrent task completed was:", _D(ts2), ret2)
Log("The third concurrent task completed was:", _D(ts3), ret3)
Log("GetTicker:", routine_getTicker.wait())
Log("GetDepth:", routine_getDepth.wait())
Log("GetTrades:", routine_getTrades.wait())
}
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("The first concurrent task completed was:", _D(ts1), ret1)
Log("The second concurrent task completed was:", _D(ts2), ret2)
Log("The third concurrent task completed was:", _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("The first concurrent task completed was:", _D(ts1), ret1);
Log("The second concurrent task completed was:", _D(ts2), ret2);
Log("The third concurrent task completed was:", _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);
}
کی پہلی کالEventLoop()
کوڈ میں تقریب اس سننے واقعہ کے لئے میکانزم کو شروع کرتا ہے، اور اگر پہلیEventLoop()
کال ایونٹ کال بیک کے بعد شروع ہوتی ہے ، یہ پچھلے واقعات کو یاد کرے گی۔ بنیادی نظام ایک قطار کی ساخت کو لپیٹتا ہے جو زیادہ سے زیادہ 500 ایونٹ کال بیک کو کیش کرتا ہے۔ اگرEventLoop()
تقریب کو وقت پر نہیں بلایا جاتا ہے تاکہ انہیں پروگرام کے عملدرآمد کے دوران نکال دیا جاسکے ، بعد میں 500 کیشے سے باہر ہونے والی ایونٹ کال بیک ضائع ہوجائیں گی۔EventLoop()
تقریب بنیادی نظام WebSocket کی کیشے قطار یا متوازی افعال کی کیشے کو متاثر نہیں کرتا جیسےexchange.Go()
. ان کیشوں کے لئے ، اعداد و شمار کو بازیافت کرنے کے لئے اب بھی متعلقہ طریقوں کا استعمال کرنا ضروری ہے۔EventLoop()
اعداد و شمار کے لئے تقریب ہے کہ اس سے پہلے حاصل کیا گیا ہےEventLoop()
فنکشن کی واپسی.EventLoop()
اسٹریٹجی کی سطح کو مطلع کرنا ہے کہ بنیادی نظام کو نئے نیٹ ورک کے ڈیٹا موصول ہوئے ہیں۔ پوری حکمت عملی واقعات سے چلتی ہے۔EventLoop()
تقریب ایک واقعہ لوٹاتا ہے، صرف تمام ڈیٹا ذرائع کو عبور کرتا ہے. مثال کے طور پر، ویب ساکٹ کنکشن، اشیاء کی طرف سے پیداexchange.Go()
ڈیٹا حاصل کرنے کی کوشش کریں.EventLoop()
فنکشن صرف لائیو ٹریڈنگ کی حمایت کرتا ہے.
اہم تقریب سے بلایا جب مرکزی موضوع میں واقعات کے لئے سنیںmain()
میں لکھے گئے حکمت عملیوں میںJavaScript
زبان،threading.Thread()
فنکشن ایک تھریڈ بناتا ہے، جسے موجودہ تھریڈ میں ہونے والے واقعات کو سننے کے لیے تھریڈ
{@fun/Global/Dial Dial}، {@fun/Trade/exchange.Go exchange.Go}، {@fun/Global/HttpQuery_Go HttpQuery_Go}
کے__Serve
یہ فنکشن HTTP سروس، TCP سروس، اور Websocket سروس (Http پروٹوکول پر مبنی) بنانے کے لئے استعمال کیا جاتا ہے.
ایک تار لوٹاتا ہے جو تخلیق کردہ سروس کا آئی پی ایڈریس اور پورٹ ریکارڈ کرتا ہے۔ مثال کے طور پر:127.0.0.1:8088
, [::]:8089
.
سٹرنگ
__Serve ((serveURI، ہینڈلر) __Serve ((serveURI، ہینڈلر،...args)
کےserveURI
پیرامیٹر پروٹوکول، آئی پی ایڈریس، بندرگاہ اور سروس منسلک کرنے کی دیگر ترتیبات کو ترتیب دینے کے لئے استعمال کیا جاتا ہے، جیسےhttp://0.0.0.0:8088?gzip=true
، یعنیhttp://:8088?gzip=true
.
serveURI
پیرامیٹرز کی ترتیب، جیسےtcp://127.0.0.1:6666?tls=true
؛ آپ سرٹیفکیٹ اور نجی چابیاں شامل کر سکتے ہیں، جیسےtls=true&cert_pem=xxxx&cert_key_pem=xxxx
.serveURI
پیرامیٹر کی ترتیبات، جیسے:http://127.0.0.1:6666?gzip=true
؛ آپ کمپریشن کی ترتیبات مقرر کر سکتے ہیں:gzip=true
.
کےserveURI
پیرامیٹر Https کے لئے استعمال کیا جاتا ہے، جیسےhttps://127.0.0.1:6666?tls=true&gzip=true
؛ آپ شامل کر سکتے ہیںcert_pem
اورcert_key_pem
سرٹیفکیٹ لوڈ کرنے کے لئے پیرامیٹرز.خدمت کریںURI
سچ
سٹرنگ
کےhandler
پیرامیٹر روٹنگ پروسیسنگ فنکشن (Http پروٹوکول) ، پیغام پروسیسنگ فنکشن (TCP پروٹوکول) ، اور سٹریم پروسیسنگ فنکشن (ویب ساکٹ) میں منتقل کرنے کے لئے استعمال کیا جاتا ہے.
کال بیک فنکشن پیرامیٹر کی طرف سے منتقلhandler
متعدد پیرامیٹرز کی وضاحت کر سکتے ہیں، پہلا پیرامیٹر ctx اعتراض (سیاق و سباق اعتراض) ہے.
ہینڈلر
سچ
فنکشن
کال بیک فنکشن کے اصل پیرامیٹر پیرامیٹر کے طور پر منظورhandler
. کئی پیرامیٹرز ہو سکتے ہیںarg
مثال کے طور پر:
__Serve("http://:8088", function(ctx, a, b, c) {
Log(`ctx.host():`, ctx.host(), ", a=", a, ", b=", b, ", c=", c)
}, 1, 2, 3)
پیرامیٹرز1
, 2
, 3
میں منتقل کر دیا جب فون__Serve()
تقریب پیرامیٹرز کے مطابقa
, b
, c
کال بیک فنکشن میں منظور.
ارگ غلط string، number، bool، object، array، function، null value اور نظام کی حمایت کی دیگر اقسام
function main() {
let httpServer = __Serve("http://:8088?gzip=true", function (ctx) {
Log("http connect from: ", ctx.remoteAddr(), "->", ctx.localAddr())
let path = ctx.path()
if (path == "/") {
ctx.write(JSON.stringify({
path: ctx.path(),
method: ctx.method(),
headers: ctx.headers(),
cookie: ctx.header("Cookie"),
remote: ctx.remoteAddr(),
query: ctx.rawQuery()
}))
} else if (path == "/tickers") {
let ret = exchange.GetTickers()
if (!ret) {
ctx.setStatus(500)
ctx.write(GetLastError())
} else {
ctx.write(JSON.stringify(ret))
}
} else if (path == "/wss") {
if (ctx.upgrade("websocket")) { // upgrade to websocket
while (true) {
let r = ctx.read(10)
if (r == "") {
break
} else if (r) {
if (r == "ticker") {
ctx.write(JSON.stringify(exchange.GetTicker()))
} else {
ctx.write("not support")
}
}
}
Log("websocket closed", ctx.remoteAddr())
}
} else {
ctx.setStatus(404)
}
})
let echoServer = __Serve("tcp://:8089", function (ctx) {
Log("tcp connect from: ", ctx.remoteAddr(), "->", ctx.localAddr())
while (true) {
let d = ctx.read()
if (!d) {
break
}
ctx.write(d)
}
Log("connect closed")
})
Log("http serve on", httpServer, "tcp serve on", echoServer)
for (var i = 0; i < 5; i++) {
if (i == 2) {
// test Http
var retHttp = HttpQuery("http://127.0.0.1:8088?num=123&limit=100", {"debug": true})
Log("retHttp:", retHttp)
} else if (i == 3) {
// test TCP
var tcpConn = Dial("tcp://127.0.0.1:8089")
tcpConn.write("Hello TCP Server")
var retTCP = tcpConn.read()
Log("retTCP:", retTCP)
} else if (i == 4) {
// test Websocket
var wsConn = Dial("ws://127.0.0.1:8088/wss|compress=gzip")
wsConn.write("ticker")
var retWS = wsConn.read(1000)
Log("retWS:", retWS)
// no depth
wsConn.write("depth")
retWS = wsConn.read(1000)
Log("retWS:", retWS)
}
Sleep(1000)
}
}
# Unsupported
// Unsupported
Websocket
سروس HTTP پروٹوکول کی بنیاد پر لاگو کیا جاتا ہے. آپ کے راستے میں ایک روٹنگ شاخ مقرر کر سکتے ہیں اور کے لئے لاگو کرنے کا کوڈ ڈیزائنWebsocket
آپ اس سیکشن میں نمونہ کوڈ کا حوالہ دے سکتے ہیں۔کال بیک فنکشن پیرامیٹر کی طرف سے منتقلhandler
وصول کرتا ہےctx
پیرامیٹر.ctx
پیرامیٹر ایک سیاق و سباق کا اعتراض ہے جو مندرجہ ذیل طریقوں کے ساتھ ڈیٹا حاصل کرنے اور لکھنے کے لئے استعمال ہوتا ہے۔
HTTP/1.1
, tcp
.http://127.0.0.1:8088?num=123
، اور پیرامیٹر کی طرف سے منتقل کال بیک پروسیسنگ تقریبhandler
واپسی"123"
کبctx.query("num")
کہا جاتا ہے.User-Agent
موجودہ درخواست کے عنوانات میں:ctx.header("User-Agent")
.GET
, POST
، وغیرہctx
ویب ساکٹ پروٹوکول میں سیاق و سباق کا اعتراض؛ اگر سوئچ کامیاب ہو تو ایک بولین ویلیو (سچ) ، اور اگر یہ ناکام ہو تو ایک بولین ویلیو (جھوٹا) لوٹاتا ہے۔read
طریقہ عام HTTP پروٹوکول میں معاون نہیں ہے. آپ ٹائم آؤٹ پیرامیٹر کی وضاحت کر سکتے ہیںtimeout_ms
ملی سیکنڈ میں.JSON.stringify()
ایک تار میں JSON اعتراض کوڈ اور پھر اسے لکھنے کے لئے.WebSocket
پروٹوکول، آپ کو کلائنٹ کو کوڈت تار منتقل کرنے کے لئے اس طریقہ کار کا استعمال کر سکتے ہیں.{@fun/Global/HttpQuery HttpQuery}، {@fun/Global/HttpQuery_Go HttpQuery_Go}
ڈیٹا کو مستقل طور پر محفوظ کریں ، فنکشن ایک عالمی لغت فنکشن کو نافذ کرتا ہے جسے محفوظ کیا جاسکتا ہے۔ ڈیٹا کا ڈھانچہ ایک KV ٹیبل ہے جو مستقل طور پر ڈوکر کی مقامی ڈیٹا بیس فائل میں محفوظ ہوتا ہے۔
میں مستقل طور پر محفوظ کلیدی قدر کے اعداد و شمارk-v
کلیدی قدر کے جوڑے.
سٹرنگ، نمبر، بول، آبجیکٹ، صف، صفر قدر
_G() _G(k) _G(k، v)
پیرامیٹرk
محفوظ کردہ کلید-قدر جوڑی میں کلید کا نام ہے، اور بڑے اور چھوٹے نمبر پر حساس نہیں ہے۔
k
غلط
تار، صفر قدر
پیرامیٹرv
محفوظ کلید قدر جوڑی میں کلیدی قدر ہے، جو کسی بھی ڈیٹا ہو سکتا ہے کہ کیا جا سکتا ہےJSON
سلسلہ بندی کی.
v
غلط
سٹرنگ، نمبر، بول، آبجیکٹ، صف، صفر قدر
function main(){
// Set a global variable num with a value of 1
_G("num", 1)
// Change a global variable num to the value of the string ok
_G("num", "ok")
// Delete the global variable num
_G("num", null)
// Returns the value of the global variable num
Log(_G("num"))
// Delete all global variables
_G(null)
// Return to live trading 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);
// Not support auto robotId = _G();
}
ایک علیحدہ ڈیٹا بیس ہر زندہ ٹریڈنگ کے لئے،_G()
اگر حکمت عملی کو دوبارہ شروع کیا جاتا ہے یا ڈوکر چلانے سے روکتا ہے تو یہ فنکشن ہمیشہ موجود رہے گا۔ اگر بیک ٹسٹنگ ختم ہو جاتی ہے تو ، بیک ٹسٹنگ سسٹم میں محفوظ کردہ ڈیٹا کو ڈوکر کے ذریعہ حذف کردیا جاتا ہے۔_G()
استعمال کرتے وقت_G()
محفوظ کردہ ڈیٹا کو برقرار رکھنے کے لئے، یہ ہارڈ ویئر ڈیوائس کی میموری اور ہارڈ ڈسک کی جگہ کے مطابق معقول طور پر استعمال کیا جانا چاہئے، اور غلط استعمال نہیں کیا جانا چاہئے.
جب کال کریں_G()
ایک زندہ ٹریڈنگ میں کام کرتے ہیں اور کوئی پیرامیٹرز منظور کر رہے ہیں،_G()
فنکشن واپس کرتا ہےId
موجودہ لائیو ٹریڈنگ کے._G()
فنکشن، پیرامیٹرv
کی حذف کا اشارہ کرنے کے لئے null کے طور پر منظور کیا جاتا ہےk-v
کلیدی قدر جوڑی._G()
فنکشن، صرف پیرامیٹرk
تار میں منتقل کیا جاتا ہے، اور_G()
فنکشن محفوظ پیرامیٹر کے مساوی کلید قدر لوٹاتا ہےk
._G()
فنکشن، صرف پیرامیٹرk
صفر قدر میں منظور کیا جاتا ہے، اس بات کا اشارہ ہے کہ تمام ریکارڈk-v
کلید قدر جوڑی خارج کر دیا جاتا ہے.k-v
کلیدی قدر کے جوڑے کو مستقل طور پر محفوظ کیا گیا ہے،_G()
تقریب کو دوبارہ بلایا جاتا ہے، جو پیرامیٹر کے طور پر مستقل طور پر محفوظ کیا گیا ہے کی چابی کے نام میں گزر جاتا ہےk
. پیرامیٹر کے طور پر نئی کلید قدر میں منتقلv
اس کو اپ ڈیٹ کریں گےk-v
کلیدی قدر کی جوڑی.
{@fun/Global/DBExec DBExec}
ملی سیکنڈ ٹائم اسٹیمپ یاDate
وقت کی تاروں کے لئے اشیاء.
وقت کی تار. سٹرنگ
_D() _D (وقت کا نشان) _D ((ٹائم اسٹیمپ، ایف ایم ٹی)
ملی سیکنڈ ٹائم اسٹیمپ یاDate
اعتراض.
ٹائم اسٹیمپ
غلط
نمبر، مقصد
فارمیٹ تار،JavaScript
زبان کا ڈیفالٹ فارمیٹ:yyyy-MM-dd hh:mm:ss
; Python
زبان کا ڈیفالٹ فارمیٹ:%Y-%m-%d %H:%M:%S
; C++
زبان کا ڈیفالٹ فارمیٹ:%Y-%m-%d %H:%M:%S
.
ایف ایم ٹی
غلط
سٹرنگ
function main(){
var time = _D()
Log(time)
}
def main():
strTime = _D()
Log(strTime)
void main() {
auto strTime = _D();
Log(strTime);
}
موجودہ ٹائم سٹرنگ حاصل کریں اور پرنٹ کریں:
function main() {
Log(_D(1574993606000))
}
def main():
# Running this code on a server in Beijing time: 2019-11-29 10:13:26 , a docker on another server in another region results in: 2019-11-29 02:13:26
Log(_D(1574993606))
void main() {
Log(_D(1574993606000));
}
ٹائم اسٹیمپ 1574993606000 ہے، کوڈ تبادلوں کا استعمال کرتے ہوئے:
function main() {
Log(_D(1574993606000, "yyyy--MM--dd hh--mm--ss")) // 2019--11--29 10--13--26
}
def main():
# 1574993606 is timestamped in seconds.
Log(_D(1574993606, "%Y--%m--%d %H--%M--%S")) # 2019--11--29 10--13--26
void main() {
Log(_D(1574993606000, "%Y--%m--%d %H--%M--%S")); // 2019--11--29 10--13--26
}
پیرامیٹر کے ساتھ فارمیٹنگfmt
مختلف ہےJavaScript
, Python
، اورC++
زبانیں، جیسا کہ مندرجہ ذیل مثالوں میں دکھایا گیا ہے۔
کسی بھی پیرامیٹرز کو منتقل کئے بغیر موجودہ وقت کی تار لوٹاتا ہے._D()
میں کردارPython
حکمت عملی، آپ کو پتہ ہونا ضروری ہے کہ پیرامیٹرز منظور دوسرے سطح کے ٹائم اسٹیمپ ہیں (جاس کارپٹ اور C ++ حکمت عملی میں ملی سیکنڈ کی سطح کے ٹائم اسٹیمپ، جہاں 1 سیکنڈ 1000 ملی سیکنڈ کے برابر ہے)._D()
براہ راست ٹریڈنگ میں پڑھنے کے قابل ٹائم اسٹیمپ کے ساتھ ایک وقت کی تار کو تجزیہ کرنے کے لئے، آپ کو آپریٹنگ سسٹم کے ٹائم زون اور وقت کی ترتیب پر توجہ دینے کی ضرورت ہے جہاں ڈاکر پروگرام واقع ہے._D()
فنکشن ایک ٹائم اسٹیمپ کو ڈاکر
{@fun/Global/UnixNano UnixNano}، {@fun/Global/Unix Unix}
ایک فلوٹنگ کامنٹ نمبر فارمیٹ کریں.
درستگی کی ترتیب کے مطابق فارمیٹ شدہ فلوٹنگ کامنٹ نمبر نمبر
_N() _N(نمبر) _N ((نمبر، درستگی)
فلوٹنگ کامن نمبر جس کو فارمیٹ کرنے کی ضرورت ہے۔
نمبر
سچ
نمبر
فارمیٹنگ کے لئے درستگی کی ترتیب، پیرامیٹرprecision
ایک عدد ہے، اور پیرامیٹرprecision
ڈیفالٹس 4 پر.
درستگی
غلط
نمبر
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(3.1415, 2)
کے بعد قدر کو حذف کریں گے3.1415
دو اعشاریہ مقامات اور تقریب لوٹاتا ہے3.14
.
function main(){
var i = 1300
Log(i)
var ii = _N(i, -3)
// Check the logs and see that it is 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);
}
اگر آپ کو دسویں ہندسہ کے بائیں طرف تمام N ہندسوں کو 0 میں تبدیل کرنے کی ضرورت ہے، تو آپ اسے اس طرح لکھ سکتے ہیں:
پیرامیٹرprecision
ایک مثبت عدد، منفی عدد ہو سکتا ہے.
{@fun/Trade/exchange.SetPrecision تبادلہ.SetPrecision}
انٹرفیس غلطی رواداری کے لئے دوبارہ کوشش کریں.
کال بیک فنکشن کی واپسی کی قیمت جب یہ عملدرآمد کیا جاتا ہے. تمام اقسام نظام کی طرف سے حمایت کر رہے ہیں سوائےمنطقی غلط قدراورnull قدر.
_C(pfn) _C ((pfn،...args)
پیرامیٹرpfn
ایک تقریب حوالہ ہے، جو ایک ہےکال بیک فنکشن.
پی ایف این
سچ
فنکشن
پیرامیٹرزکال بیک افعال، ایک سے زیادہ پیرامیٹر ہو سکتا ہےarg
. پیرامیٹرز کی قسم اور تعدادarg
کے پیرامیٹرز پر منحصرکال بیک فنکشن.
ارگ
غلط
تار، نمبر، بول، آبجیکٹ، صف، فنکشن، تمام اقسام نظام کی طرف سے حمایت کر رہے ہیں، جیسے null اقدار
function main(){
var ticker = _C(exchange.GetTicker)
// Adjust _C() function retry interval to 2 seconds
_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);
}
بغیر پیرامیٹرز کے غلطی برداشت کرنے والے افعال کے لئے:
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("Eligible!", "#FF0000")
return true
}
Log("Retry!", "#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("Eligible!", "#FF0000")
return True
Log("Retry!", "#FF0000")
return False
def main():
ret = _C(test, 1, 5)
Log(ret)
// C++ does not support fault tolerance for custom functions in this way
یہ اپنی مرضی کے افعال کی خرابی برداشت کے لئے بھی استعمال کیا جا سکتا ہے:
کے_C()
function جب تک یہ کامیابی کے ساتھ واپس آتا ہے (پیرامیٹر کی طرف سے حوالہ دیا گیا تقریب) مخصوص تقریب کو فون کرنے کے لئے جاری رکھیں گےpfn
واپسیصفریاغلطجب بلایا جائے گا دوبارہ کوشش کریں گےpfn
) مثال کے طور پر_C(exchange.GetTicker)
. ڈیفالٹ دوبارہ کوشش کے وقفہ 3 سیکنڈ ہے، آپ کو کال کر سکتے ہیں_CDelay()
تقریب دوبارہ کوشش کے وقفے مقرر کرنے کے لئے. مثال کے طور پر،_CDelay(1000)
کے دوبارہ ٹیسٹ کے وقفے کو تبدیل کرنے کا مطلب ہے_C()
1 سیکنڈ کے لئے کام.
غلطی رواداری مندرجہ ذیل افعال کے لئے کیا جا سکتا ہے، لیکن اس تک محدود نہیں ہے:
exchange.GetTicker()
exchange.GetDepth()
exchange.GetTrades()
exchange.GetRecords()
exchange.GetAccount()
exchange.GetOrders()
exchange.GetOrder()
exchange.GetPositions()
سب کو بلایا جا سکتا ہے_C()
غلطی رواداری کے لئے تقریب._C()
تقریب مندرجہ بالا درج تقریب غلطی رواداری تک محدود نہیں ہے، پیرامیٹرpfn
ایک فنکشن کال کے بجائے ایک فنکشن ریفرنس ہے.
نوٹ کریں کہ یہ_C(exchange.GetTicker)
نہیں_C(exchange.GetTicker())
.صف کے چوراہے کے ادوار کی تعداد لوٹاتا ہےarr1
اور صفarr2
.
صف کے کراس پیریڈس کی تعدادarr1
اور صفarr2
.
نمبر
_Cross ((arr1، arr2)
عناصر قسم کی صفیں ہیںnumber
.
ارر1
سچ
صف
عناصر قسم کی صفیں ہیںnumber
.
arr2
سچ
صف
// Fast line indicator
var arr1 = [1,2,3,4,5,6,8,8,9]
// Slow line indicator
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 ((Arr1، Arr2) فنکشن کی جانچ کرنے کے لئے تیار کیا جا سکتا ہے:
اگر واپسی کی قیمت_Cross()
فنکشن ایک مثبت نمبر ہے، یہ اوپر کی طرف دخول کی مدت کی نشاندہی کرتا ہے، اگر یہ منفی نمبر ہے، تو یہ نیچے کی طرف دخول کی مدت کی نشاندہی کرتا ہے، 0 کا مطلب موجودہ قیمت کے برابر ہے. استعمال کے لئے مخصوص ہدایات:تجزیہ اور استعمال کے لئے ہدایات کے بارے میں بلٹ ان تقریب _Cross.
فنکشنJSONParse()
تجزیہ کرنے کے لئے استعمال کیا جاتا ہےJSON
strings.
JSON
اعتراض.
چیز
JSONParse (s)
JSON
تار.
s
سچ
سٹرنگ
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)); // The function is not supported.
auto s2 = "{\"num\":123}";
Log("json::parse:", json::parse(s2));
// Log("JSONParse:", JSONParse(s2)); // The function is not supported.
}
بڑے اقدار کے ساتھ JSON تاروں کو درست طریقے سے تجزیہ کیا جا سکتا ہے، اور یہ تار اقسام کے طور پر بڑے اقدار تجزیہ کرے گا.JSONParse()
فنکشن backtest کے نظام میں حمایت نہیں کی جاتی ہے.