সিস্টেমের বর্তমান সংস্করণ নম্বর প্রদান করে।
বর্তমান সিস্টেম সংস্করণ নম্বর, যেমনঃ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 মিলিসেকেন্ডের কম ঘুমের সময় অপারেশন সমর্থন করে, উদাহরণস্বরূপ সেটিংSleep(0.1)
. এটি একটি সর্বনিম্ন প্যারামিটার সমর্থন করে0.000001
, অর্থাৎ ন্যানোসেকেন্ড হাইবারনেশন, যেখানে 1 ন্যানোসেকেন্ড সমান1e-6
মিলিসেকেন্ড।
যখন কৌশল লিখতেPython
ভাষা,Sleep(millisecond)
ভোটদানের সময়সীমা, সময়-থেকে-অপেক্ষা অপারেশনগুলির জন্য এই ফাংশনটি ব্যবহার করা উচিত নয়।time.sleep(second)
ফাংশনPython
এরtime
গ্রন্থাগার. এটি কারণ ব্যবহারtime.sleep(second)
একটি কৌশল মধ্যে ফাংশন কৌশল প্রোগ্রাম একটি নির্দিষ্ট সময়ের জন্য অপেক্ষা করতে actually যখন backtesting (backtesting সিস্টেমের সময় সিরিজ এড়িয়ে না), তাই এটি কৌশল backtest খুব ধীরে ধীরে কারণ.
কৌশলটির চলমান পরিবেশ একটি ব্যাকটেস্টিং সিস্টেম কিনা তা নির্ধারণ করুন।
কৌশল একটি সত্য মান ফেরত, উদাহরণস্বরূপঃ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
ইমেইল প্রেরকের সার্ভিস ঠিকানা।
smtpServer
সত্য
স্ট্রিং
ইমেইল প্রেরকের ইমেইল ঠিকানা নির্দিষ্ট করতে ব্যবহৃত হয়।
smtpUsername
সত্য
স্ট্রিং
দ্যSMTP
ইমেইল প্রেরকের মেইলবক্সের পাসওয়ার্ড।
smtp পাসওয়ার্ড
সত্য
স্ট্রিং
ইমেইল প্রাপকের ইমেইল ঠিকানা নির্দিষ্ট করতে ব্যবহৃত হয়।
mailTo
সত্য
স্ট্রিং
ই-মেইল ঠিকানা।
নাম
সত্য
স্ট্রিং
ইমেইল শরীর.
শরীর
সত্য
স্ট্রিং
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
উদাহরণস্বরূপঃ QQ মেইলsmtp.qq.com:587
, যা পরীক্ষার জন্য উপলব্ধ।
যদি কোনো ত্রুটি রিপোর্ট করা হয়ঃunencryped connection
, আপনি পরিবর্তন করতে হবেsmtpServer
এরMail
ফাংশন। প্যারামিটার বিন্যাস হলঃssl://xxx.com:xxx
উদাহরণস্বরূপssl
পদ্ধতিSMTP
QQ মেইলের জন্যঃssl://smtp.qq.com:465
অথবাsmtp://xxx.com:xxx
.
এটা ব্যাকটেস্টিং সিস্টেমে কাজ করে না।
{@ফান/গ্লোবাল/মেইল_গো মেইল_গো}
অ্যাসিনক্রোন সংস্করণMail
function.
দ্যMail_Go
ফাংশন অবিলম্বে একটি সমান্তরাল বস্তু ফেরত, এবং আপনি ব্যবহার করতে পারেনwait
একটি সফল মেইল ডেলিভারি একটি সত্য মান ফেরত দেয়, উদাহরণস্বরূপ,true
, এবং একটি ব্যর্থ ডেলিভারি একটি মিথ্যা মান ফেরত দেয়, উদাহরণস্বরূপ,false
.
বস্তু
মেইল_গো ((smtp সার্ভার, smtpUsername, smtpPassword, mailTo, শিরোনাম, শরীর)
এটি নির্দিষ্ট করতে ব্যবহৃত হয়SMTP
ইমেইল প্রেরকের সার্ভিস ঠিকানা।
smtpServer
সত্য
স্ট্রিং
এটি ইমেইল প্রেরকের ইমেইল ঠিকানা নির্দিষ্ট করতে ব্যবহৃত হয়।
smtpUsername
সত্য
স্ট্রিং
দ্যSMTP
ইমেইল প্রেরকের মেইলবক্সের পাসওয়ার্ড।
smtp পাসওয়ার্ড
সত্য
স্ট্রিং
এটি ইমেল প্রাপকের ইমেইল ঠিকানা নির্দিষ্ট করতে ব্যবহৃত হয়।
mailTo
সত্য
স্ট্রিং
ই-মেইল ঠিকানা।
নাম্বার
সত্য
স্ট্রিং
ইমেইল শরীর.
শরীর
সত্য
স্ট্রিং
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.
এটা ব্যাকটেস্টিং সিস্টেমে কাজ করে না।
{@fun/Global/Mail Mail}
ফিল্টার ত্রুটি লগ।
সেটErrorFilter ((ফিল্টার)
নিয়মিত এক্সপ্রেশন স্ট্রিং। ফিল্টার সত্য স্ট্রিং
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("")
. ফিল্টার করা লগগুলি ডাটাবেস ফাইলটি ফুটে উঠতে বাধা দেওয়ার জন্য ডকার ডিরেক্টরিতে লাইভ ট্রেডিং আইডির সাথে সম্পর্কিত ডাটাবেস ফাইলটিতে আর লেখা হয় না।
লাইভ ট্রেডিং প্রক্রিয়া আইডি পান.
লাইভ ট্রেডিং প্রসেস আইডি ফেরত দিন। স্ট্রিং
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
, যা শুধুমাত্র কন্ট্রোল নাম ফেরত দেয়।
স্ট্রিং
GetCommand ((()
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
চারটি জনপ্রিয় যোগাযোগ প্রোটোকল সমর্থন করেঃmqtt
, nats
, amqp
, kafka
. ডাটাবেসের সাথে সংযোগের জন্য সমর্থনঃsqlite3
, mysql
, postgres
, clickhouse
.
দ্যDial()
ফাংশনটি যদি এটি টাইম আউট করে তবে শূন্য ফেরত দেয়। একটি সাধারণ কল একটি সংযোগ অবজেক্ট ফেরত দেয় যার তিনটি পদ্ধতি রয়েছেঃread
, write
এবংclose
.read
পদ্ধতিটি ডেটা পড়তে ব্যবহৃত হয়,write
তথ্য পাঠানোর জন্য ব্যবহৃত হয় এবংclose
সংযোগ বন্ধ করতে এই পদ্ধতি ব্যবহার করা হয়।
দ্যread
পদ্ধতি নিম্নলিখিত পরামিতি সমর্থন করেঃ
ws.read()
.ws.read(2000)
দুই সেকেন্ডের টাইমআউট (২০০০ মিলিসেকেন্ড) নির্দিষ্ট করে।-1
মানে ফাংশনটি অবিলম্বে বার্তাগুলির উপস্থিতি বা অনুপস্থিতি নির্বিশেষে ফেরত দেয়, উদাহরণস্বরূপঃws.read(-1)
.
প্যারামিটার পাস করা হচ্ছে-2
এর মানে হল যে ফাংশনটি অবিলম্বে একটি বার্তা সহ বা ছাড়াই ফিরে আসে, তবে কেবলমাত্র সর্বশেষ বার্তাটি ফিরে আসে এবং বাফারযুক্ত বার্তাটি বাদ দেওয়া হয়। উদাহরণস্বরূপ,ws.read(-2)
.read()
ফাংশন বাফারের বর্ণনাঃ
ওয়েবসকেট প্রোটোকলের দ্বারা প্রেরিত ইনকামিং ডেটা যদি কৌশলটির মধ্যে সময়ের ব্যবধানread()
ফাংশন কলগুলি খুব দীর্ঘ। এই ডেটাগুলি বাফারে সংরক্ষণ করা হয়, যার সর্বাধিক 2000 এর সাথে একটি সারি ডেটা কাঠামো রয়েছে। 2000 অতিক্রম করার পরে, সর্বশেষতম ডেটা বাফারে প্রবেশ করে এবং প্রাচীনতম ডেটা মুছে ফেলা হয়।
দৃশ্যকল্প | কোন প্যারামিটার নেই | প্যারামিটারঃ -1 | প্যারামিটার: -২ | প্যারামিটারঃ 2000 মিলিসেকেন্ডে |
---|---|---|---|---|
ডেটা ইতিমধ্যে বাফারে রয়েছে | অবিলম্বে পুরোনো তথ্য ফেরত দিন | অবিলম্বে পুরোনো তথ্য ফেরত দিন | অবিলম্বে সর্বশেষ তথ্য ফেরত দিন | অবিলম্বে পুরোনো তথ্য ফেরত দিন |
বাফারে কোন তথ্য নেই | ডাটা ব্লক করা হলে পুনরুদ্ধার করুন | অবিলম্বে null ফেরত দিন | অবিলম্বে null ফেরত দিন | অপেক্ষা করুন 2000 এমএস, যদি কোন তথ্য না থাকে তাহলে 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)
: এসকিউএল স্ট্র্যাটেজ এক্সিকিউট করার জন্য ব্যবহৃত হয়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 হল কম্প্রেশন পদ্ধতি, কম্প্রেস প্যারামিটার অপশন হল: gzip_raw, gzip, ইত্যাদি. যদি gzip পদ্ধতিটি স্ট্যান্ডার্ড gzip না হয়, আপনি বর্ধিত পদ্ধতি ব্যবহার করতে পারেনঃ gzip_raw |
ওয়েবসকেট প্রোটোকলের ডেটা সংকোচনের সাথে সম্পর্কিত পরামিতিঃ mode=parameter value | মোড হল কম্প্রেশন মোড, মোড প্যারামিটারটি দ্বৈত হতে পারে, পাঠান, recv. দ্বৈত হল দ্বি-মুখী কম্প্রেশন, সংকুচিত ডেটা প্রেরণ করুন, সংকুচিত ডেটা গ্রহণ করুন। প্রেরণ হল সংকুচিত ডেটা প্রেরণ করুন। recv হল সংকুচিত ডেটা গ্রহণ করুন, স্থানীয় ডিকম্প্রেশন। |
ওয়েবসকেট প্রোটোকল অন্তর্নিহিত স্বয়ংক্রিয় পুনরায় সংযোগ সম্পর্কিত পরামিতি সেট করেঃ পুনরায় সংযোগ = পরামিতি মান | reconnect হল reconnect সেট করতে হবে কিনা, reconnect=true হল reconnect সক্ষম করতে হবে। এই প্যারামিটারটি সেট না হলে ডিফল্ট কোন reconnect হয় না। |
ওয়েবসকেট প্রোটোকল অন্তর্নিহিত স্বয়ংক্রিয় পুনরায় সংযোগ সম্পর্কিত পরামিতি সেট করেঃ interval=parameter value | interval হল পুনরায় চেষ্টা করার সময়সীমা, মিলিসেকেন্ডে, interval=10000 হল 10 সেকেন্ডের পুনরায় চেষ্টা করার সময়সীমা, ডিফল্টটি 1 সেকেন্ড যখন এটি সেট করা হয় না, অর্থাৎ interval=1000. |
ওয়েবসকেট প্রোটোকল অন্তর্নিহিত স্বয়ংক্রিয় পুনরায় সংযোগ সম্পর্কিত পরামিতি সেট করেঃ payload=parameter value | payload হল সাবস্ক্রিপশন বার্তা যা WebSocket পুনরায় সংযুক্ত হলে পাঠানো প্রয়োজন, উদাহরণস্বরূপঃ payload=okokok। |
Socks5 proxy এর সাথে সম্পর্কিত পরামিতিঃ proxy=প্যারামিটার মান | প্রক্সি হল ss5 প্রক্সি সেটিং, প্যারামিটার মান বিন্যাসঃ socks5://name:pwd@192.168.0.1:1080, নাম হচ্ছে এসএস৫ সার্ভারের ইউজার নেম, পিডব্লিউডি হচ্ছে এসএস৫ সার্ভারের লগইন পাসওয়ার্ড, ১০৮০ হচ্ছে এসএস৫ সার্ভিস পোর্ট। |
দ্যDial()
এই ফাংশনটি শুধুমাত্র লাইভ ট্রেডিং এর জন্য সমর্থিত।
ডায়াল ফাংশন ব্যবহার করে একটি ডাটাবেসের সাথে সংযোগ করার সময়, সংযোগ স্ট্রিং প্রতিটি ডাটাবেসের জন্য go ভাষা ড্রাইভার প্রকল্পের উল্লেখ করে লেখা হয়।
সমর্থিত ডাটাবেস | চালিকাশক্তি প্রকল্প | সংযোগ স্ট্রিং | মন্তব্যসমূহ |
---|---|---|---|
স্কিলেট3 | github.com/mattn/go-sqlite3 | sqlite3://file:test.db?cache=shared&mode=memory | দ্যsqlite3:// প্রিফিক্স নির্দেশ করে যে sqlite3 ডাটাবেস ব্যবহার করা হচ্ছে, উদাহরণ কলঃDial("sqlite3://test1.db") |
মাইএসকিউএল | github.com/go-sql-driver/mysql | mysql://username:yourpassword@tcp(localhost:3306)/আপনার ডাটাবেজ? | – |
পশুপালন | github.com/lib/pq | postgres://user=postgres dbname=yourdatabase sslmode=disable password=yourpassword হোস্ট=স্থানীয় হোস্ট পোর্ট=5432 | – |
ক্লিকহাউস | github.com/ClickHouse/clickhouse-go | clickhouse://tcp://host:9000?username=username&password=yourpassword&database=youdatabase ব্যবহারকারীর নাম এবং পাসওয়ার্ড | – |
দয়া করে মনে রাখবেন যে যখনpayload
বিষয়বস্তু সেটaddress
প্যারামিটারে অক্ষর রয়েছে=
অথবা অন্যান্য বিশেষ অক্ষর, এটা প্যারসিং প্রভাবিত করতে পারেaddress
প্যারামিটারDial
ফাংশন, যেমন নিম্নলিখিত উদাহরণ।
ব্যাকপ্যাক এক্সচেঞ্জ ওয়েবসকেট ব্যক্তিগত ইন্টারফেস কল উদাহরণঃ
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")
}
}
বিস্তারিত ডকুমেন্টেশন রেফারেন্সঃএফএমজেড এক্সপ্লোরিংঃ লাইভ ট্রেডিং কৌশলগুলির মধ্যে যোগাযোগ প্রোটোকলের অনুশীলন
এইচটিটিপি অনুরোধ পাঠান।
অনুরোধের প্রতিক্রিয়া তথ্য ফেরত দেয়। যদি ফেরত মান একটিJSON
স্ট্রিং, এটা দ্বারা বিশ্লেষণ করা যেতে পারেJSON.parse()
কর্মক্ষমতাJavaScript
ভাষা কৌশল, এবংjson::parse()
কর্মক্ষমতাC++
যদি ডিবাগটি বিকল্প কাঠামোতে সত্য হিসাবে সেট করা থাকে, তবে রিটার্ন মানটি একটি অবজেক্ট (জেএসওএন); যদি ডিবাগটি মিথ্যাতে সেট করা থাকে, তবে রিটার্ন মানটি একটি স্ট্রিং।
স্ট্রিং, বস্তু
HttpQuery ((url) HttpQuery ((URL, অপশন)
এইচটিটিপি অনুরোধ ইউআরএল। ইউআরএল সত্য স্ট্রিং এইচটিপি অনুরোধ সম্পর্কিত সেটিংস, উদাহরণস্বরূপ, নিম্নরূপ কাঠামোগত করা যেতে পারেঃ
{
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_ios_mobile"
, "nike_android_mobile"
,
মেঘঘঘাট্টা:"cloudscraper"
,
এমএমএস_:"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
এইচটিটিপি অনুরোধ সরাসরি পাঠাতে লাইব্রেরি.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, অপশন)
এইচটিটিপি অনুরোধ ইউআরএল। ইউআরএল সত্য স্ট্রিং এইচটিপি অনুরোধ সম্পর্কিত সেটিংস, উদাহরণস্বরূপ, নিম্নরূপ কাঠামোগত করা যেতে পারেঃ
{
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
এইচটিটিপি অনুরোধ সরাসরি পাঠাতে লাইব্রেরি.HttpQuery_Go()
মূলত ইন্টারফেস অ্যাক্সেস করতে ব্যবহৃত হয় যা এক্সচেঞ্জে স্বাক্ষরের প্রয়োজন হয় না, যেমন টিকার তথ্যের মতো পাবলিক ইন্টারফেস।HttpQuery_Go
ফাংশনটি ব্যাকটেস্টিং সিস্টেমে সমর্থিত নয়।
{@fun/Global/HttpQuery HttpQuery}
এই ফাংশনটি পাস করা পরামিতি অনুযায়ী ডেটা কোড করে।
দ্যEncode
ফাংশন এনকোডিং এবং এনক্রিপশন পরে তথ্য ফেরত দেয়।
স্ট্রিং
এনকোড ((algo, inputFormat, outputFormat, data) এনকোড ((algo, ইনপুটফর্ম্যাট, আউটপুটফর্ম্যাট, ডেটা, কীফর্ম্যাট, কী)
প্যারামিটার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);
}
যদি আপনার মিলিসেকেন্ডের টাইমস্ট্যাম্প পেতে হয়, তাহলে আপনি নিম্নলিখিত কোডটি ব্যবহার করতে পারেন:
{@fun/Global/Unix Unix}
দ্বিতীয় স্তরের বর্তমান মুহুর্তের টাইমস্ট্যাম্প পান।
দ্বিতীয় স্তরের টাইমস্ট্যাম্প রিটার্ন করে। সংখ্যা
ইউনিক্স ((()
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()
একটি ডকারের জন্য ফাংশনম্যাক ওএসঅপারেটিং সিস্টেম ফিরে আসতে পারেঃdarwin/amd64
কারণ অ্যাপলের কম্পিউটারে একাধিক হার্ডওয়্যার আর্কিটেকচার রয়েছে।darwin
নাম হলম্যাক ওএস system.
প্যারামিটারের MD5 হ্যাশ গণনা করেdata
.
এমডি৫ হ্যাশ মান। স্ট্রিং
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
.
{@ফান/গ্লোবাল/এনকোড এনকোড}
ডাটাবেজ ইন্টারফেস ফাংশন।
একটি বস্তু যা একটি কার্য সম্পাদনের ফলাফল ধারণ করেsqlবিবৃতি, উদাহরণস্বরূপঃ
{"columns":["TS","HIGH","OPEN","LOW","CLOSE","VOLUME"],"values":[[1518970320000,100,99.1,90,100,12345.6]]}
বস্তু
DBExec ((sql)
sqlবিবৃতি স্ট্রিং. 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
ফাংশন পরামিতি, যদি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)
}
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()
লাইভ ট্রেডিং ডাটাবেস (এসকিউএলাইট ডাটাবেস) পরিচালনা করতে পারে প্যারামিটারগুলি পাস করে। লাইভ ট্রেডিং ডাটাবেসে ডেটা যুক্ত, মুছে ফেলা, পরীক্ষা এবং পরিবর্তন করার অপারেশনটি উপলব্ধি করুন,এসকিউএলাইটলাইভ ট্রেডিং ডাটাবেসের সিস্টেম সংরক্ষিত টেবিলঃkvdb
, cfg
, log
, profit
, chart
এই টেবিলে কাজ করবেন না।লেনদেনএই ধরনের অপারেশনগুলি সমর্থিত নয় এবং সিস্টেমে দ্বন্দ্ব সৃষ্টি করতে পারে এমন অপারেশনগুলি সম্পাদন করার পরামর্শ দেওয়া হয় না।DBExec()
এই ফাংশনটি শুধুমাত্র লাইভ ট্রেডিং এর জন্য সমর্থিত।
{@ফান/গ্লোবাল/_জি _জি}
একটি 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
এইচটিটিপি পরিষেবা, টিসিপি পরিষেবা এবং ওয়েবসকেট পরিষেবা (এইচটিটিপি প্রোটোকলের উপর ভিত্তি করে) তৈরি করতে ফাংশন ব্যবহার করা হয়।
একটি স্ট্রিং ফেরত দেয় যা তৈরি পরিষেবার আইপি ঠিকানা এবং পোর্ট রেকর্ড করে। উদাহরণস্বরূপঃ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://127.0.0.1:6666?tls=true&gzip=true
; আপনি যোগ করতে পারেনcert_pem
এবংcert_key_pem
সার্টিফিকেট লোড করার পরামিতি।serveURI
সত্য
স্ট্রিং
দ্যhandler
প্যারামিটারটি রাউটিং প্রসেসিং ফাংশন (এইচটিটিপি প্রোটোকল), বার্তা প্রসেসিং ফাংশন (টিসিপি প্রোটোকল) এবং স্ট্রিম প্রসেসিং ফাংশন (ওয়েবসকেট) এ পাস করতে ব্যবহৃত হয়।
প্যারামিটার দ্বারা পাস করা কলব্যাক ফাংশনhandler
একাধিক প্যারামিটার সংজ্ঞায়িত করতে পারেন, প্রথম প্যারামিটারটি হল ctx বস্তু (context object) ।
হ্যান্ডলার
সত্য
ফাংশন
কলব্যাক ফাংশনের প্রকৃত প্যারামিটার প্যারামিটার হিসাবে পাস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
এইচটিটিপি প্রোটোকলের উপর ভিত্তি করে পরিষেবাটি বাস্তবায়িত হয়। আপনি পাথে একটি রাউটিং শাখা সেট করতে পারেন এবং এর জন্য বাস্তবায়ন কোড ডিজাইন করতে পারেন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}
ধারাবাহিকভাবে ডেটা সংরক্ষণ করুন, ফাংশনটি একটি বিশ্বব্যাপী অভিধান ফাংশন বাস্তবায়ন করে যা সংরক্ষণ করা যেতে পারে। ডেটা কাঠামো একটি কেভি টেবিল যা স্থায়ীভাবে ডকারের স্থানীয় ডাটাবেস ফাইলটিতে সংরক্ষণ করা হয়।
ক্রমাগত সংরক্ষিত কী-মানের তথ্যk-v
কী-ভ্যালু জোড়া।
string, number, bool, object, array, null মান
_G() _G(k) _G(k, v)
প্যারামিটারk
সংরক্ষিত কী-মান জোড়ায় কীটির নাম, এবং এটি বড় এবং ছোট আকারের সংবেদনশীল নয়।
ক
মিথ্যা
স্ট্রিং, null মান
প্যারামিটারv
সংরক্ষিত কী-মান জোড়া মধ্যে কী মান, যা যে কোন তথ্য হতে পারেJSON
সিরিয়ালাইজড।
v
মিথ্যা
string, number, bool, object, array, null মান
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
এটি শূন্য হিসাবে পাস করা হয় যা মুছে ফেলার নির্দেশ করে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 ((সময় স্ট্যাম্প, fmt)
মিলিসেকেন্ড টাইমস্ট্যাম্প অথবা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
কৌশল, আপনি পাস পরামিতি দ্বিতীয় স্তরের টাইমস্ট্যাম্প (জাভাস্ক্রিপ্ট এবং সি ++ কৌশলগুলিতে মিলিসেকেন্ড-স্তরের টাইমস্ট্যাম্প, যেখানে 1 সেকেন্ড 1000 মিলিসেকেন্ডের সমান) সচেতন হতে হবে।_D()
লাইভ ট্রেডিং একটি পাঠযোগ্য টাইমস্ট্যাম্প সঙ্গে একটি সময় স্ট্রিং বিশ্লেষণ করার জন্য, আপনি সময় অঞ্চল এবং সময় সেটিং অপারেটিং সিস্টেম যেখানে ডকার প্রোগ্রাম অবস্থিত মনোযোগ দিতে হবে._D()
ফাংশনটি ডকার সিস্টেমের সময় অনুযায়ী একটি টাইমস্ট্যাম্পকে একটি পাঠযোগ্য টাইম স্ট্রিংয়ে বিশ্লেষণ করে।
{@fun/Global/UnixNano UnixNano}, {@fun/Global/Unix Unix}
একটি ভাসমান বিন্দু নম্বর ফরম্যাট করুন।
নির্ভুলতা সেটিং অনুযায়ী ফরম্যাট করা ভ্লাইভিং কমা নম্বর। সংখ্যা
_N() _N ((num) _N (num, precision)
ফরম্যাট করা প্রয়োজন যে উদ্ভিজ্জ বিন্দু সংখ্যা.
নং
সত্য
সংখ্যা
ফরম্যাটিংয়ের জন্য নির্ভুলতা সেটিং, প্যারামিটারprecision
একটি পূর্ণসংখ্যা, এবং পরামিতিprecision
ডিফল্টরূপে ৪।
নির্ভুলতা
মিথ্যা
সংখ্যা
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}
ইন্টারফেস ত্রুটি সহনশীলতার জন্য ফাংশন পুনরায় চেষ্টা করুন।
কলব্যাক ফাংশনের রিটার্ন মান যখন এটি কার্যকর করা হয়। সিস্টেম সব ধরনের ব্যতীত সমর্থন করেযৌক্তিক মিথ্যা মানএবংশূন্য মান.
_C(pfn) _C ((pfn,...args)
প্যারামিটারpfn
একটি ফাংশন রেফারেন্স, যা একটিকলব্যাক ফাংশন.
পিএফএন
সত্য
ফাংশন
প্যারামিটারকলব্যাক ফাংশন, একের বেশি প্যারামিটার থাকতে পারেarg
. প্যারামিটারের ধরন এবং সংখ্যাarg
প্যারামিটার উপর নির্ভর করেকলব্যাক ফাংশন.
আরজি
মিথ্যা
string, number, bool, object, array, function, সমস্ত ধরনের সিস্টেম দ্বারা সমর্থিত, যেমন null values
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()
১ সেকেন্ডে ফাংশন।
নিম্নলিখিত ফাংশনগুলির জন্য ত্রুটি সহনশীলতা করা যেতে পারে, তবে সীমাবদ্ধ নয়ঃ
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
.
সংখ্যা
_ক্রস ((arr1, arr2)
এলিমেন্টগুলি হল টাইপের অ্যারেnumber
.
arr1
সত্য
অ্যারে
এলিমেন্টগুলি হল টাইপের অ্যারে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 বর্তমান মূল্যের সমান। ব্যবহারের নির্দিষ্ট নির্দেশাবলীঃঅন্তর্নির্মিত ফাংশন সম্পর্কে বিশ্লেষণ এবং ব্যবহারের নির্দেশাবলী _ ক্রস.
ফাংশনJSONParse()
বিশ্লেষণ করতে ব্যবহৃত হয়JSON
strings.
JSON
বস্তু।
বস্তু
JSONParse (গুলি)
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()
ব্যাকটেস্ট সিস্টেমে এই ফাংশনটি সমর্থিত নয়।