[TOC] এই টিউটোরিয়ালে এপিআই ভূমিকা, ব্যাকটেস্ট, চার্ট এবং আরও অনেক কিছু সহ কৌশল লেখার মৌলিক জ্ঞান রয়েছে। এই মৌলিক টিউটোরিয়ালটি শেখার পরে, ব্যবহারকারীরা মৌলিক এপিআই দক্ষতার সাথে ব্যবহার করতে এবং একটি স্থিতিশীল বট কৌশল লিখতে সক্ষম হবে। টিউটোরিয়ালটি শেখার আগে, আপনাকে কীভাবে ব্যবহার করতে হবে তা শিখতে হবে।এফএমজেড কোয়ান্ট প্ল্যাটফর্ম চালু করুন.
পুরাতন সংস্করণ টিউটোরিয়ালঃFMZ Quant (FMZ.COM) কৌশল লেখার ম্যানুয়াল ২.০ (টিউটোরিয়াল)টিউটোরিয়ালে অনেক পোস্ট ইন্ডেক্স রয়েছে, যা পড়ার পরামর্শ দেওয়া হচ্ছে।
প্রোগ্রাম ট্রেডিং হ'ল অ্যাপ্লিকেশন প্রোগ্রামিং ইন্টারফেসকে প্রতিনিধিত্ব করে।
বর্তমানে, ক্রিপ্টোকারেন্সি প্ল্যাটফর্মগুলির জন্য দুটি প্রধান ইন্টারফেস প্রোটোকল রয়েছেঃ REST এবং ওয়েবসকেট। প্রতিবার যখন REST প্রোটোকল ডেটা অর্জন করে, তখন এটি একবার অ্যাক্সেস করা দরকার। উদাহরণস্বরূপ সিমুলেটেড প্ল্যাটফর্ম
{"data:{"buy":"11351.73","high":"11595.77","last":"11351.85","low":"11118.45","open":"11358.74","quoteVol":"95995607137.00903936","sell":"11356.02","time":1565593489318,"vol":"3552.5153"}}
এইভাবে, আপনি দেখতে পারেন যে ট্রেডিং জোড়া বিটিসি_ইউএসডিটি এর সর্বশেষ বাজার কোট অনুসরণ করে ট্রেডিং, প্রতিবার এটি রিফ্রেশ হওয়ার পরে পরিবর্তন হবে;
এফএমজেড কোয়ান্ট ট্রেডিং প্ল্যাটফর্ম প্রতিটি প্ল্যাটফর্মের আরইএসটি ইন্টারফেসকে ক্যাপসুল করে এবং কল করার জন্য একটি ইউনিফাইড উপায় এবং একটি ইউনিফাইড ডেটা ফর্ম্যাট ব্যবহার করে, কৌশল লেখাকে সহজ এবং আরও সাধারণ করে তোলে। ওয়েবসকেট সহজেই এফএমজেড প্ল্যাটফর্মে সমর্থিত হতে পারে, যা পরবর্তী টিউটোরিয়ালে বিস্তারিতভাবে চালু করা হবে।
এফএমজেড প্ল্যাটফর্ম এপিআই ডকুমেন্টের বেশিরভাগ অংশ জাভাস্ক্রিপ্টকে উদাহরণ হিসাবে ব্যবহার করে, তবে ইনক্যাপসুলার কারণে, বিভিন্ন ভাষার মধ্যে প্রায় কোনও পার্থক্য নেই, এবং আপনাকে কেবল সিনট্যাক্স ইস্যুতে মনোযোগ দিতে হবে।
যেহেতু পাইথনের বিভিন্ন সংস্করণ রয়েছে, তাই এটি প্রোগ্রামের শুরুতে নির্দিষ্ট করা যেতে পারে, যেমনঃ#!Python2
এবং#!Python3
. মনে রাখবেন যে জাভাস্ক্রিপ্ট সম্প্রতি তার ES6 সিনট্যাক্স আপগ্রেড করেছে, এবং যারা আগ্রহী তারা এটি সম্পর্কে শিখতে পারেন। একই ফাংশন সহ পাইথন এবং জাভাস্ক্রিপ্ট কোডগুলি নীচে দেখানো হয়েছে। এটি দেখা যায় যে কেবল সিনট্যাক্স পার্থক্য রয়েছে, তাই এপিআই নথিটি কেবল জাভাস্ক্রিপ্টের উদাহরণ দেয় এবং এই টিউটোরিয়ালটি পাইথনের বিশেষ ব্যবহারের ক্ষেত্রেও বিবেচনা করবে।
#python code
def main():
while True:
Log(exchange.GetAccount().Balance)
Sleep(2000)
#the corresponding Js code
function main(){
while(true){
Log(exchange.GetAccount().Balance)
Sleep(2000)
}
}
FMZ Quant প্ল্যাটফর্ম
কৌশল প্রোগ্রামটি একটি সাধারণ প্রোগ্রামের মতোই, যা কোড আদেশে কার্যকর করা হয়। বিশেষ অংশটি হ'ল একটি
বিশেষ কর্মের সাথে অন্যান্য ফাংশনগুলি নিম্নরূপ দেখানো হয়েছেঃ
function onTick(){
var ticker = exchange.GetTicker()
var account = exchange.GetAccount()
//write the strategy logic here, and it will be called ever 6 seconds
}
function main(){
while(true){
onTick()
Sleep(6000)
}
}
পূর্ববর্তী উদাহরণে, যদি নেটওয়ার্ক অ্যাক্সেসে একটি ত্রুটি থাকে তবে কৌশলটি সরাসরি বন্ধ হতে পারে। যদি আপনি এমন একটি কৌশল চান যা স্বয়ংক্রিয় পুনরায় চালু করার মতো এবং বন্ধ হবে না, আপনি বট কৌশলটিতে
function onTick(){
var ticker = exchange.GetTicker()
var account = exchange.GetAccount()
//write the strategy logic here, and it will be called ever 6 seconds
}
function main(){
try{
while(true){
onTick()
Sleep(6000)
}
}catch(err){
Log(err)
}
}
যখন কোনো প্ল্যাটফর্ম-সম্পর্কিত API কল, আপনি প্ল্যাটফর্ম এবং ট্রেডিং জোড়া নির্দিষ্ট করতে হবে. যদি শুধুমাত্র এক exchange
এই বস্তুর প্রতিনিধিত্ব করতে. উদাহরণস্বরূপ, কিexchange.GetTicker()
এই
এফএমজেড কোয়ান্ট প্ল্যাটফর্ম একই সময়ে একাধিক exchanges
তাদের প্রতিনিধিত্ব করার জন্য অ্যারে, যথাexchanges[0]
এবংexchanges[1]
... এবং তাই উপর, যোগ আদেশ অনুযায়ী যখন বট তৈরি করা হয়. ট্রেডিং জোড়া বিন্যাসে, মতBTC_USDT
, পূর্ববর্তী
স্পষ্টতই, যদি আমরা অনেক ট্রেডিং জোড়া পরিচালনা করি, এই পদ্ধতিটি খুব অসুবিধাজনক হবে। এই পরিস্থিতিতে, আমরা ট্রেডিং জোড়া স্যুইচ করতে SetCurrency ব্যবহার করতে পারি, যেমনexchange.SetCurrency("BTC_USDT")
তারপর, ট্রেডিং জোড়া আবদ্ধexchange
হয়ে যায়BTC_USDT
, যা ট্রেডিং জোড়ার পরিবর্তনের পরবর্তী কল পর্যন্ত বৈধ থাকবে।মনে রাখবেন যে ব্যাকটেস্ট সম্প্রতি ট্রেডিং জোড়া স্যুইচিং সমর্থন করেনিচে একটি নির্দিষ্ট উদাহরণ দেওয়া হল:
var symbols = ["BTC_USDT", "LTC_USDT", "EOS_USDT", "ETH_USDT"]
var buyValue = 1000
function main(){
for(var i=0;i<symbols.length;i++){
exchange.SetCurrency(symbols[i])
var ticker = exchange.GetTicker()
var amount = _N(buyValue/ticker.Sell, 3)
exchange.Buy(ticker.Sell, amount)
Sleep(1000)
}
}
পূর্ববর্তী উদাহরণে উল্লিখিত হিসাবে, বাজার ইন্টারফেসটি সাধারণত একটি পাবলিক ইন্টারফেস, যা প্রত্যেকের দ্বারা অ্যাক্সেস করা যায়। সাধারণ বাজার ইন্টারফেসগুলি হলঃ GetTicker, GetDepth, GetRecords এবং GetTrades। বাজার উদ্ধৃতি ট্রেডিং রায় দেওয়ার কৌশলটির ভিত্তি। পরে, আমি তাদের একের পর এক পরিচয় করিয়ে দেব।
প্রতিটি ইন্টারফেসের সাধারণত একটিInfo
ক্ষেত্র, যা প্ল্যাটফর্ম দ্বারা ফিরে আসা মূল ডেটা স্ট্রিং প্রতিনিধিত্ব করে, এবং যা অতিরিক্ত তথ্য পরিপূরক করতে ব্যবহার করা যেতে পারে। এটি ব্যবহারের আগে বিশ্লেষণ করা প্রয়োজন। জাভাস্ক্রিপ্ট ব্যবহার করেJSON.parse()
, যখন পাইথন json লাইব্রেরি ব্যবহার করে.Time
ক্ষেত্রটি অনুরোধের সময় চিহ্নিত করে, যা বিলম্বের বিচার করতে ব্যবহার করা যেতে পারে।
বট এ কোন এপিআই ব্যবহার করার সময়, অ্যাক্সেস ব্যর্থ হতে পারে এবং ফিরেnull
, এবং পাইথন ফিরে আসেNone
. এই সময়ে, ব্যবহার করা তথ্য একটি ত্রুটি রিপোর্ট করবে এবং বট বন্ধ করতে হবে, তাই ত্রুটি সহনশীলতা খুবই গুরুত্বপূর্ণ. এই টিউটোরিয়াল ত্রুটি সহনশীলতা বিশেষভাবে পরিচয় করিয়ে দেবে.
GetTicker সম্ভবত সর্বাধিক ব্যবহৃত ইন্টারফেস। আপনি সর্বশেষ সময় কার্যকর মূল্য, কিনুন1 মূল্য এবং বিক্রয়1 মূল্য, এবং সর্বশেষ ট্রেডিং ভলিউম খুঁজে পেতে পারেন। একটি অর্ডার স্থাপন করার আগে, কার্যকর মূল্য টিকার তথ্য অনুযায়ী নির্ধারণ করা যেতে পারে। একটি বট রিটার্ন একটি উদাহরণঃ{"Info:{}, "High":5226.69, "Low":5086.37,"Sell":5210.63, "Buy":5208.5, "Last":5208.51, "Volume":1703.1245, "OpenInterest":0, "Time":1554884195976}
.
function main() {
var ticker = exchange.GetTicker()
Log(ticker) //return ticker in the debugging tool, and you can see the specific result
Log('Last time executed price:',ticker.Last, 'Buy1 price:', ticker.Buy)
}
অবশিষ্ট অর্ডারের গভীরতা তথ্য পেতে GetDepth ব্যবহার করুন। যদিও GetTicker কেনার 1 এবং বিক্রয় 1 দাম অন্তর্ভুক্ত করে, আপনি যদি গভীর অবশিষ্ট অর্ডার অনুসন্ধান করতে চান তবে আপনি এই ইন্টারফেসটি ব্যবহার করতে পারেন, সাধারণত 200 অবশিষ্ট অর্ডার আপ এবং ডাউন চেক করতে। এই ইন্টারফেসটি ব্যবহার করে শক দাম গণনা করা যেতে পারে। নীচে একটি বাস্তব রিটার্ন ফলাফল রয়েছে। তাদের মধ্যে,
{
"Info":null,
"Asks":[
{"Price":5866.38,"Amount":0.068644},
{"Price":5866.39,"Amount":0.263985},
......
]
"Bids":[
{"Price":5865.13,"Amount":0.001898},
{"Price":5865,"Amount":0.085575},
......
],
"Time":1530241857399
}
Asks & Bids এর জন্য GetDepth ব্যবহারের উদাহরণঃ
function main() {
var depth = exchange.GetDepth()
Log('Buy 1 price:', depth.Bids[0].Price, 'Sell 1 price:', depth.Asks[0].Price)
}
GetRecords হল সর্বাধিক ব্যবহৃত ইন্টারফেসগুলির মধ্যে একটি, একটি সময়ে একটি দীর্ঘ সময়ের মধ্যে মূল্য তথ্য ফেরত দিতে পারে, যা বিভিন্ন সূচক গণনার ভিত্তি। যদি কে-লাইন সময় নির্দিষ্ট না করা হয়, তবে এটি একটি বট যোগ করার সময় ডিফল্ট সময়কাল ব্যবহার করার অর্থ। কে-লাইন দৈর্ঘ্য নির্দিষ্ট করা যায় না, এবং এটি সময়ের সাথে সাথে বৃদ্ধি অব্যাহত থাকবে। সর্বাধিক সংখ্যা 2000 এবং প্রথম কলটিতে সংখ্যাটি প্রায় 200 (বিভিন্ন প্ল্যাটফর্মগুলি বিভিন্ন নম্বর ফেরত দেয়) । শেষ কে-লাইন সর্বশেষ কে-লাইন, তাই বাজার কোট পরিবর্তন হিসাবে ডেটা পরিবর্তন হবে; প্রথম কে-লাইন হল প্রাচীনতম ডেটা।
exchange.SetMaxBarLen(Len)
প্রথমবারের জন্য অর্জিত কে-লাইন সংখ্যা সেট করতে পারেন (কিছু প্ল্যাটফর্ম দ্বারা সমর্থিত), এবং কে-লাইন সর্বোচ্চ সংখ্যা সেট করতে পারেন।যেমনঃexchange.SetMaxBarLen(500)
.
GetRecords PERIOD_M1: 1 মিনিট, PERIOD_M5: 5 মিনিট, PERIOD_M15: 15 মিনিট, PERIOD_M30: 30 মিনিট, PERIOD_H1: 1 ঘন্টা এবং PERIOD_D1: 1 দিনের মতো সময় নির্দিষ্ট করতে পারে। নির্দিষ্ট ব্যবহারটি হলexchange.GetRecords(PERIOD_M1)
. সর্বশেষ ডকার আপগ্রেড করার পরে, এটি সময়কাল কাস্টমাইজিং সমর্থন করবে, যা কেবলমাত্র প্যারামিটার হিসাবে সময়ের দ্বিতীয় সংখ্যাটি পাস করে। মিনিটের স্তরের কাস্টমাইজেশনটি 1 মিনিটের কে-লাইন অনুসারে সংশ্লেষিত হবে, 1 মিনিটের নীচে কে-লাইনটি গেটট্রেডসের মাধ্যমে সংশ্লেষিত হবে))) এবং পণ্যের ফিউচারগুলি টিক অনুসারে সংশ্লেষিত হবে।মনে রাখবেন যে অন্যান্য পূর্ণ বড় অক্ষর ভেরিয়েবল আছে যেমনPERIOD_M1
টিউটোরিয়ালে. তারা FMZ এর ডিফল্ট গ্লোবাল ভেরিয়েবল হয়. আপনি আগ্রহী হলে, আপনি নিজের দ্বারা তাদের নির্দিষ্ট মান
রিটার্ন ডেটা উদাহরণঃ
[
{"Time":1526616000000,"Open":7995,"High":8067.65,"Low":7986.6,"Close":8027.22,"Volume":9444676.27669432},
{"Time":1526619600000,"Open":8019.03,"High":8049.99,"Low":7982.78,"Close":8027,"Volume":5354251.80804935},
{"Time":1526623200000,"Open":8027.01,"High":8036.41,"Low":7955.24,"Close":7955.39,"Volume":6659842.42025361},
......
]
পুনরাবৃত্তি করা কে-লাইনের উদাহরণঃ
function main(){
var close = []
var records = exchange.GetRecords(PERIOD_H1)
Log('total bars: ', records.length)
for(var i=0;i<records.length;i++){
close.push(records[i].Close)
}
return close
}
GetTrades একটি নির্দিষ্ট সময়সীমার মধ্যে ট্রেডিং ডেটা পায় (আপনার নিজের ট্রেডিং ডেটা নয়), যা কিছু প্ল্যাটফর্ম দ্বারা সমর্থিত নয়। এটি সাধারণত ব্যবহৃত হয় না, এবং আপনি API নথিতে বিস্তারিত ভূমিকা পরীক্ষা করতে পারেন।
এই ইন্টারফেসগুলি অ্যাকাউন্টের সাথে সম্পর্কিত, তাই এগুলি সরাসরি প্রাপ্ত করা যায় না। এগুলি পেতে আপনাকে সাইন ইন করতে API-KEY ব্যবহার করতে হবে। FMZ প্ল্যাটফর্মের ইউনিফাইড স্বয়ংক্রিয় ব্যাকগ্রাউন্ড প্রসেসিংয়ের পরে, আপনি এগুলি সরাসরি ব্যবহার করতে পারেন।
অ্যাকাউন্টের তথ্য পেতে GetAccount ব্যবহার করুন। এটি সর্বাধিক ব্যবহৃত ইন্টারফেসগুলির মধ্যে একটি হিসাবে, অর্ডার দেওয়ার আগে এটি কল করা দরকার, যাতে অপর্যাপ্ত ভারসাম্য এড়ানো যায়। রিটার্ন ফলাফলটি হলঃ{"Stocks":0.38594816,"FrozenStocks":0,"Balance":542.858308,"FrozenBalance":0,"Info":{}}
যেখানে BTC_USDT
,
মনে রাখবেন যে রিটার্ন ফলাফলটি নির্দিষ্ট ট্রেডিং জোড়ার ফলাফল, এবং ট্রেডিং অ্যাকাউন্টের অন্যান্য মুদ্রার তথ্য
বর্তমান ট্রেডিং জোড়ার মোট মূল্য ক্রমাগত মুদ্রণ করছে এমন একটি বট:
function main(){
while(true){
var ticker = exchange.GetTicker()
var account = exchange.GetAccount()
var price = ticker.Buy
var stocks = account.Stocks + account.FrozenStocks
var balance = account.Balance + account.FrozenBalance
var value = stocks*price + balance
Log('Account value is: ', value)
LogProfit(value)
Sleep(3000)//sleep 3000ms(3s), A loop must has a sleep, or the rate-limit of the exchange will be exceed
//when run in debug tool, add a break here
}
}
ক্রয় অর্ডার. আহ্বানের পদ্ধতি অন্তর্ভুক্তexchange.Buy(Price, Amount)
এবংexchange.Buy(Price, Amount, Msg)
, যেখানে null
অর্ডারটি ব্যর্থ হলে ফেরত দেওয়া হবে, যা অর্ডারের অবস্থা অনুসন্ধান করতে ব্যবহৃত হয়।
আপনি যদি বাজার মূল্যে ক্রয় অর্ডার দিতে চান, exchange.Buy(-1, 0.5)
; যদি ট্রেডিং জুটিETH_BTC
কিছু প্ল্যাটফর্ম মার্কেট অর্ডার সমর্থন করে না, এবং ফিউচার ব্যাকটেস্টও করে না।
কিছু প্ল্যাটফর্মের দাম এবং পরিমাণের জন্য নির্ভুলতার প্রয়োজনীয়তা রয়েছে যা নির্ভুলতা ফাংশন দিয়ে নিয়ন্ত্রণ করা যেতে পারে_N()
ফিউচার ট্রেডিংয়ের ক্ষেত্রে,
সংশ্লিষ্ট মূল্যে পৌঁছানোর পর কিনে নেওয়ার একটি উদাহরণঃ
function main(){
while(true){
var ticker = exchange.GetTicker()
var price = ticker.Sell
if(price >= 7000){
exchange.Buy(_N(price+5,2), 1, 'BTC-USDT')
break
}
Sleep(3000)//Sleep 3000ms
}
Log('done')
}
বিক্রয় আদেশ। পরামিতিগুলি exchange.Sell(-1, 0.2)
, মানে ০.২ ইটিএইচ বাজার মূল্যে বিক্রি করা।
GetOrder অর্ডার আইডি উপর ভিত্তি করে অর্ডার তথ্য পায়. যখন এই সাধারণ ইন্টারফেস পদ্ধতি কলexchange.GetOrder(OrderId)
, Type
এবং অর্ডার প্রকৃত মানStatus
FMZ এই মানগুলির প্রতিনিধিত্ব করতে গ্লোবাল ধ্রুবক ব্যবহার করে। উদাহরণস্বরূপ,Status
একটি অসম্পূর্ণ অর্ডার মান 0, যা সমতুল্যORDER_STATE_PENDING
. এই সব গ্লোবাল ধ্রুবক নথিতে দেখা যাবে... রিটার্ন ফলাফলঃ
{
"Id":125723661, //Order id
"Amount":0.01, //Order ammount
"Price":7000, //Order price
"DealAmount":0, //Executed amount
"AvgPrice":0, //executed average price
"Status":0, //0: not completely executed; 1: executed; 2: canceled
"Type":1,//Order type; 0: buy order; 1: sell order
"ContractType":"",//contract type, used in futures trading
"Info":{} //the platform returns the raw information
}
}
নির্দিষ্ট পরিমাণ মুদ্রা কেনার কৌশলঃ
function main(){
while(true){
var amount = exchange.GetAccount().Stocks
var ticker = exchange.GetTicker()
var id = null
if(5-amount>0.01){
id = exchange.Buy(ticker.Sell, Math.min(5-amount,0.2))
}else{
Log('Job completed')
return //return the main function, bot will stop
}
Sleep(3000) //Sleep 3000ms
if(id){
var status = exchange.GetOrder(id).Status
if(status == 0){ //Here you can aslo use "status == ORDER_STATE_PENDING" to judge
exchange.CancelOrder(id)
}
}
}
}
GetOrder বর্তমান ট্রেডিং জোড়ার সমস্ত অসম্পূর্ণ অর্ডারের তালিকা পায়। যদি কোন অসম্পূর্ণ অর্ডার না থাকে তবে একটি খালি অ্যারে ফেরত দেয়। অর্ডার তালিকার নির্দিষ্ট ফলাফল, যেমন
বর্তমান ট্রেডিং জোড়ার সমস্ত অর্ডার বাতিল করার উদাহরণঃ
function CancelAll(){
var orders = exchange.GetOrders()
for(var i=0;i<orders.length;i++){
exchange.CancelOrder(orders[i].Id) // cancel order by orderID
}
}
function main(){
CancelAll()
while(true){
//do something
Sleep(10000)
}
}
অর্ডার আইডি অনুযায়ী, অর্ডার বাতিল করুন।exchange.CancelOrder(OrderId)
. যদি বাতিল সফল হয়, তাহলে
ক্রিপ্টোকারেন্সির জন্য, ফিউচার ট্রেডিং স্পট ট্রেডিং থেকে আলাদা। স্পট ট্রেডিংয়ের উপরের ফাংশনগুলি ফিউচার ট্রেডিংয়ের জন্যও প্রযোজ্য, এবং একক ফিউচার ট্রেডিংয়ের নিজস্ব ফাংশন রয়েছে। ক্রিপ্টোকারেন্সি ফিউচারগুলির প্রোগ্রাম ট্রেডিং পরিচালনার আগে, আপনাকে ওয়েবসাইটে ম্যানুয়াল অপারেশনগুলির সাথে পরিচিত হওয়া উচিত এবং মূল ধারণাগুলি যেমন খোলা, বন্ধ, ক্রস, বিচ্ছিন্ন, লিভারেজ, বন্ধ লাভ এবং ক্ষতি, ভাসমান আয়, মার্জিন এবং অন্যান্য ধারণাগুলি, পাশাপাশি সংশ্লিষ্ট গণনার সূত্রগুলি বুঝতে হবে। সংশ্লিষ্ট টিউটোরিয়ালগুলি বিভিন্ন ফিউচার প্ল্যাটফর্মে পাওয়া যাবে এবং আপনাকে সেগুলি নিজেরাই শিখতে হবে।
চিরস্থায়ী চুক্তিগুলি ফিউচার চুক্তির অনুরূপ, তবে পার্থক্যটি হ'ল একই সময়ে দীর্ঘ এবং সংক্ষিপ্ত অবস্থান রাখার কোনও ধারণা নেই।
যদি প্ল্যাটফর্মটি ওকেএক্স এবং হুওবির ফিউচার এবং স্পট উভয়ই সমর্থন করে তবে আপনাকে প্ল্যাটফর্ম ইন্টারফেসে আলাদাভাবে
ফিউচার ট্রেডিংয়ের প্রথম ধাপ হল ট্রেড করার জন্য চুক্তি সেট করা। উদাহরণস্বরূপ ওকেএক্স ফিউচার গ্রহণ করে, একটি বট বা ব্যাকটেস্টিং তৈরি করার সময় একটি বিটিসি ট্রেডিং জোড়া নির্বাচন করুন এবং আপনাকে কোডে সাপ্তাহিক, পরের সপ্তাহ বা ত্রৈমাসিক চুক্তিও সেট করতে হবে। যদি এটি সেট না হয় তবে এটি আপনাকে অনুরোধ করবেinvalid contract type
. স্পট ট্রেডিং জোড়া থেকে পৃথক, ফিউচার চুক্তিগুলি প্রায়শই মার্জিন হিসাবে বিটিসির মতো ট্রেডিং মুদ্রা ব্যবহার করে। একটি ট্রেডিং জোড়ায় বিটিসি যুক্ত করা সাধারণত বিটিসি_ইউএসডি ট্রেডিং জোড়ার প্রতিনিধিত্ব করে যা মার্জিন হিসাবে বিটিসি ব্যবহার করে। যদি মার্জিন হিসাবে ইউএসডিটি সহ কোনও ফিউচার চুক্তি থাকে তবে বিটিসি_ইউএসডিটি ট্রেডিং জোড়া যুক্ত করতে একটি বট তৈরি করতে হবে। উদাহরণস্বরূপ, বাইনারেন্স ওকেএক্স ফিউচারগুলির মতো চিরস্থায়ী চুক্তি, উভয় ক্রিপ্টো-মার্জিনযুক্ত এবং ইউএসডিটি-মার্জিনযুক্ত চুক্তি সহ।ট্রেডিং জোড়া সেট করার পরে, আপনাকে নির্দিষ্ট চুক্তির ধরন যেমন চিরস্থায়ী, সাপ্তাহিক, পরের সপ্তাহ ইত্যাদি সেট করতে হবে। চুক্তিটি সেট করার পরে, আপনি বাজার কোট, ক্রয় এবং বিক্রয় পাওয়ার মতো ক্রিয়াকলাপ সম্পাদন করতে পারেন।
বিন্যান্স, ওকেএক্স, হুবিডিএম ইত্যাদিতে ক্রিপ্টো-মার্জিনযুক্ত এবং ইউএসডিটি-মার্জিনযুক্ত উভয় চুক্তি রয়েছে, যা একটি বট যুক্ত করার সময় এবং একটি চুক্তি সেট করার সময় আলাদা করা দরকার। নির্দিষ্ট সেটিংস নিম্নরূপঃ
//OKEX Futures
exchange.SetContractType("swap") // set to perpetual contract
exchange.SetContractType("this_week") // set to weekly contract
exchange.SetContractType("next_week") // set to next week contract
exchange.SetContractType("quarter") // set to quarterly contract
//HuobiDM
exchange.SetContractType("this_week") // set to weekly contract
exchange.SetContractType("next_week") // set to next week contract
exchange.SetContractType("quarter") // set to quarterly contract
exchange.SetContractType("swap") // set to perpetual contract
//Binance Futures
exchange.SetContractType("swap") // set to perpetual contract, and notice that crypto-margined and USDT-margined contracts are all in the perpetual contract
exchange.SetContractType("quarter") // set to quarterly contract
exchange.SetContractType("next_quarter") // set to next quarter contract
//BitMEX
exchange.SetContractType("XBTUSD") // set to perpetual contract
exchange.SetContractType("XBTM19") // the contract settled at a specific time; for more details, please log in BitMEX to check each contract code
//GateIO
exchange.SetContractType("swap") // set to perpetual contract, and do not set the default as swap perpetual contract
//Deribit
exchange.SetContractType("BTC-27APR18") // the contract settled at a specific time; for more details, please log in Deribit to check out
বর্তমান অবস্থান তথ্য তালিকা পেতে, OKEX (OKCOIN) ফিউচার একটি পরামিতি পাস করতে পারেন প্রাপ্ত চুক্তি টাইপ নির্দিষ্ট করতে। একটি খালি তালিকা ফেরত[]
, যদি কোন অবস্থান না থাকে। অবস্থান তথ্য নিম্নরূপ ফেরত দেওয়া হয়। অনেক নির্দিষ্ট তথ্য আছে, যা ট্রেডিং জোড়া সঙ্গে সমন্বয়ে বিশ্লেষণ করা প্রয়োজন।
ডেটা টাইপ | ভেরিয়েবল নাম | বর্ণনা |
---|---|---|
বস্তু | তথ্য | প্ল্যাটফর্ম রিটার্ন করে এমন কাঁচা কাঠামো |
সংখ্যা | মার্জিন লেভেল | লিভারেজ আকার; OKCoin 10 বা 20 হয়, এবং OK ফিউচার ক্রস পজিশন 10 (স্থির) ফেরত, জন্য কাঁচা API সমর্থন করে না |
সংখ্যা | পরিমাণ | পজিশনের পরিমাণ; OKCoin চুক্তির পরিমাণ নির্দেশ করে (১ এর পূর্ণসংখ্যা) |
সংখ্যা | হিমায়িত পরিমাণ | হিমায়িত পজিশন পরিমাণ |
সংখ্যা | দাম | পজিশনের গড় মূল্য |
সংখ্যা | মার্জিন | ফ্রিজড মার্জিন |
সংখ্যা | মুনাফা | কমোডিটি ফিউচারঃ মার্কেটে অবস্থানের মুনাফা এবং ক্ষতির চিহ্ন; ক্রিপ্টোকারেন্সিঃ ক্রিপ্টোকারেন্সি ইউনিটঃ বিটিসি / এলটিসি, traditionalতিহ্যবাহী ফিউচার ইউনিটঃ আরএমবি (দ্রষ্টব্যঃওকেকয়েনের ফিউচারগুলির ক্রস পজিশনের ক্ষেত্রে, এটি উপলব্ধ মুনাফা এবং ক্ষতি বোঝায়, অবস্থানের মুনাফা এবং ক্ষতি নয়। বিচ্ছিন্ন অবস্থানের অধীনে, এটি অবস্থানের মুনাফা এবং ক্ষতি বোঝায়।) |
কনস্ট | প্রকার | PD_LONG হল লং পজিশন (CTP একটি পজিশন বন্ধ করতে |
স্ট্রিং | চুক্তির ধরন | কমোডিটি ফিউচার হল চুক্তির কোড, এবং স্টক হল |
function main(){
exchange.SetContractType("this_week");
var position = exchange.GetPosition();
if(position.length>0){ //especially pay attention to judging the length of position before call, or an error will occur
Log("Amount:", position[0].Amount, "FrozenAmount:", position[0].FrozenAmount, "Price:",
position[0].Price, "Profit:", position[0].Profit, "Type:", position[0].Type,"ContractType:", position[0].ContractType)
}
}
প্রথমত, আপনি লিভারেজ আকার সেট করতে হবে; কল পদ্ধতিঃexchange.SetMarginLevel(10)
, যেখানে exchange.SetDirection(Direction)
, যা খোলা ও বন্ধ পজিশনের সাথে মিলে যায়।ফিউচারগুলির বিপরীতে, যদি একটি চিরস্থায়ী চুক্তি একই সময়ে দীর্ঘ এবং সংক্ষিপ্ত ধারণাগুলি ধারণ করে না, অর্থাৎ একটি একক অবস্থান অনুমোদিত নয়। যখন আপনি একটি দীর্ঘ অবস্থানের উপর খোলা সংক্ষিপ্ত কাজ করেন, তখন দীর্ঘ অবস্থানটি স্বয়ংক্রিয়ভাবে বন্ধ হয়ে যাবে, তাই আপনাকে কেবল সেট করতে হবেbuy
এবংsell
. যদি এটি উভয় দিক অবস্থান সমর্থন করে, আপনি সেট করতে হবেclosebuy
, closesell
.বিশেষ সম্পর্কঃ
অপারেশন | সেটডিরেকশন প্যারামিটার | অর্ডার দেওয়ার কাজ |
---|---|---|
খোলা লং পজিশন | exchange.SetDirection (( |
বিনিময়.কপাই ((() |
লং পজিশন বন্ধ করুন | exchange.SetDirection (( |
বিনিময়.বিক্রয় ((() |
খোলা শর্ট পজিশন | exchange.SetDirection (( |
বিনিময়.বিক্রয় ((() |
শর্ট পজিশন বন্ধ করুন | exchange.SetDirection (( |
বিনিময়.কপাই ((() |
অবশেষে, খোলা এবং বন্ধ অবস্থানের জন্য নির্দিষ্ট কোড রয়েছে। স্থাপন করা অর্ডারের পরিমাণ প্ল্যাটফর্ম থেকে প্ল্যাটফর্মে পরিবর্তিত হয়। উদাহরণস্বরূপ, হুবি ফিউচারগুলি চুক্তির পরিমাণের উপর ভিত্তি করে এবং একটি চুক্তি 100 মার্কিন ডলার। মনে রাখবেন যে ফিউচার ব্যাকটেস্ট বাজার অর্ডার সমর্থন করে না।
function main(){
exchange.SetContractType("this_week") // for example, set OKEX futures to weekly contract
price = exchange.GetTicker().Last
exchange.SetMarginLevel(10) // set to 10 times of leverage
exchange.SetDirection("buy") // set the order type as buy long
exchange.Buy(price+10, 20) // set contract quantity as 20 orders
pos = exchange.GetPosition()
Log(pos)
Log(exchange.GetOrders()) // check out if there is any unfinished order
exchange.SetDirection("closebuy"); // if it is a perpetual contract, directly set exchange.SetDirection("sell")
exchange.Sell(price-10, 20)
}
নিম্নরূপ পূর্ণ বন্ধ পজিশনের একটি নির্দিষ্ট কৌশল উদাহরণ দিনঃ
function main(){
while(true){
var pos = exchange.GetPosition()
var ticker = exchange.GetTicekr()
if(!ticker){
Log('not able to obtain ticker')
return
}
if(!pos || pos.length == 0 ){
Log('no position')
return
}
for(var i=0;i<pos.length;i++){
if(pos[i].Type == PD_LONG){
exchange.SetContractType(pos[i].ContractType)
exchange.SetDirection('closebuy')
exchange.Sell(ticker.Buy, pos[i].Amount - pos[i].FrozenAmount)
}
if(pos[i].Type == PD_SHORT){
exchange.SetContractType(pos[i].ContractType)
exchange.SetDirection('closesell')
exchange.Buy(ticker.Sell, pos[i].Amount - pos[i].FrozenAmount)
}
}
var orders = exchange.Getorders()
Sleep(500)
for(var j=0;j<orders.length;j++){
if(orders[i].Status == ORDER_STATE_PENDING){
exchange.CancelOrder(orders[i].Id)
}
}
}
}
ক্রিপ্টোকারেন্সি লিভারেজ ট্রেডিং কোডের লিভারেজ অ্যাকাউন্টে স্যুইচ করতে হবে, এবং অন্যান্য অংশগুলি স্পট ট্রেডিংয়ের মতোই।
ব্যবহারexchange.IO("trade_margin") লিভারেজ অ্যাকাউন্ট মোডে স্যুইচ করতে; একটি অর্ডার স্থাপন এবং অ্যাকাউন্ট সম্পদ প্রাপ্তি প্ল্যাটফর্ম লিভারেজের ইন্টারফেস অ্যাক্সেস করবে। ব্যবহারexchange.IO("trade_normal") সাধারণ অ্যাকাউন্ট মোডে ফিরে যেতে।
সমর্থিত প্ল্যাটফর্মঃ
কমোডিটি ফিউচার ট্রেডিং এবং ক্রিপ্টোকারেন্সি ফিউচার ট্রেডিং বেশ আলাদা। প্রথমত, কমোডিটি ফিউচারগুলির ট্রেডিংয়ের সময় খুব কম, তবে ক্রিপ্টোকারেন্সি 24 ঘন্টা ধরে ট্রেড করা হয়; কমোডিটি ফিউচারগুলির প্রোটোকলটি সাধারণত ব্যবহৃত REST API নয়; কমোডিটি ফিউচারগুলির ট্রেডিং ফ্রিকোয়েন্সি এবং মুলতুবি অর্ডার পরিমাণ সীমিত, তবে ক্রিপ্টোকারেন্সিগুলির খুব আলগা, ইত্যাদি। অতএব, কমোডিটি ফিউচার ট্রেডিংয়ের সময় বিশেষ মনোযোগের প্রয়োজন এমন অনেকগুলি বিষয় রয়েছে এবং ম্যানুয়াল অপারেশনে সমৃদ্ধ অভিজ্ঞতার জন্য এটি প্রস্তাবিত। এফএমজেড এখন কমোডিটি ফিউচার সিমুলেটেড বট সমর্থন করে এবং আপনি উল্লেখ করতে পারেনঃhttps://www.fmz.com/bbs-topic/325কমোডিটি ফিউচার কোম্পানি যোগ করার জন্যঃhttps://www.fmz.com/bbs-topic/371
কমোডিটি ফিউচারগুলি জুন 2019 এ see-through তদারকি বাস্তবায়ন করেছে; পৃথক প্রোগ্রামের জন্য, পৃথক ব্যবহারকারীদের ফিউচার ব্রোকারদের জন্য অনুমোদনের কোডের জন্য আবেদন করার জন্য একটি অ্যাকাউন্ট খুলতে হবে (নির্দিষ্ট অ্যাপ্লিকেশন তথ্য টেম্পলেটটি ওয়েচ্যাট গ্রুপ বা কিউকিউ গ্রুপে প্রেরণ করা যেতে পারে), যা সাধারণত 4-5 দিন সময় নেয়; পদ্ধতিগুলি বেশ জটিল। একটি প্রোগ্রাম্যাটিক ট্রেডিং সরবরাহকারী হিসাবে, এফএমজেড প্ল্যাটফর্মটি বিভিন্ন ফিউচার পরিষেবা সরবরাহকারীদের কাছ থেকে সফ্টওয়্যার অনুমোদনের কোডগুলির জন্য আবেদন করেছে। ব্যবহারকারীরা আবেদন না করেই সরাসরি সেগুলি ব্যবহার করতে পারে। একটি ফিউচার ব্রোকার যুক্ত করার সময়, এফএমজেডের জন্য আবেদন করা তালিকাটি দেখতে
এফএমজেড কোয়ান্ট প্ল্যাটফর্মের কাঠামোর সুবিধার কারণে, ব্যবহারকারীরা একাধিক ফিউচার ব্রোকার অ্যাকাউন্ট যুক্ত করতে পারে এবং অন্যান্য পণ্যের ফিউচার প্রোগ্রাম ট্রেডিং সফ্টওয়্যার যেমন উচ্চ-ফ্রিকোয়েন্সি টিকের সংশ্লেষণ সম্পন্ন করতে পারে না এমন কিছু ফাংশন বাস্তবায়ন করতে পারে; আপনি উল্লেখ করতে পারেনঃhttps://www.fmz.com/bbs-topic/1184
প্রথমত, এটি ২৪ ঘণ্টার ট্রেডিং নয় এবং এর জন্য লগইন অপারেশন প্রয়োজন, তাই ট্রেডিংয়ের আগে লিংক স্ট্যাটাস বিচার করা প্রয়োজন।exchange.IO("status")
হয়true
, যা প্ল্যাটফর্মের সাথে সফল সংযোগের ইঙ্গিত দেয়। লগইন সফল না হলে যদি এপিআই কল করা হয় তবে _C(exchange.SetContractType,"MA888")
, যা সফলভাবে লগইন নিশ্চিত করবে।
কমোডিটি ফিউচারগুলির বাজার কোট অধিগ্রহণ এবং ট্রেডিং কোডগুলি ক্রিপ্টোকারেন্সি ফিউচারের সাথে একই। এখানে আমরা পার্থক্য এবং পয়েন্টগুলি পরিচয় করিয়ে দেব যা মনোযোগ দেওয়ার প্রয়োজন।
function main(){
_C(exchange.SetContractType,"MA888") //If you do not log in successfully, you cannot subscribe to the contract, so better to try again
while(true){
if(exchange.IO("status")){
var ticker = exchange.GetTicker()
Log("MA888 ticker:", ticker)
LogStatus(_D(), "Already connected with CTP !")//_D obtain event
} else {
LogStatus(_D(), "Not connected with CTP !")
Sleep(1000)
}
}
}
ট্রেডিংয়ের জন্য কমোডিটি ফিউচার লাইব্রেরি ব্যবহার করার পরামর্শ দেওয়া হয় (যা পরে বর্ণনা করা হবে), কোডটি এই সময়ে খুব সহজ হবে, এবং ক্লান্তিকর বিবরণ মোকাবেলা করার প্রয়োজন নেই। উত্স কোড কপি ঠিকানাঃhttps://www.fmz.com/strategy/57029
function main() {
// Use the CTA strategy framework of commodity futures library
$.CTA(Symbols, function(st) {
var r = st.records
var mp = st.position.amount
var symbol = st.symbol
/*
"r" represents K-line, "mp" indicates the position amount of the current variety; positive number means long position, negative number means short position, and 0 means no position; "symbol" is the variety name
if the return value is n:
n = 0 : full close positions (no matter now they are long or short)
n > 0 : if right now long positions are held, add n long positions; if now they are short positions, close n short posiitons; if n is over the position amount right now, reverse to open long positions
n < 0 : if right now short positions are held, add n short positions; if now they are long positions, close n long posiitons; if -n is over the position amount right now, reverse to open short positions
*/
if (r.length < SlowPeriod) {
return
}
var cross = _Cross(TA.EMA(r, FastPeriod), TA.EMA(r, SlowPeriod));
if (mp <= 0 && cross > ConfirmPeriod) {
Log(symbol, "Golden Cross Period", cross, "the moment position", mp);
return Lots * (mp < 0 ? 2 : 1)
} else if (mp >= 0 && cross < -ConfirmPeriod) {
Log(symbol, "Death Cross Period", cross, "the moment position", mp);
return -Lots * (mp > 0 ? 2 : 1)
}
});
}
কমোডিটি ফিউচারগুলি সিটিপি প্রোটোকল ব্যবহার করে এবং সমস্ত বাজার কোট এবং অর্ডার কার্যকরকরণ পরিবর্তন হওয়ার পরে কেবলমাত্র বিজ্ঞাপিত হবে, যখন অর্ডার, অ্যাকাউন্ট এবং অবস্থান সম্পর্কে অনুসন্ধানগুলি সক্রিয় অনুসন্ধান। অতএব, এটি ইভেন্ট-চালিত উচ্চ-ফ্রিকোয়েন্সি কৌশল লেখার জন্য উপযুক্ত। ডিফল্ট মোডে বাজার কোট পাওয়ার জন্য ইন্টারফেসগুলি, যেমনGetTicker
, GetDepth
এবংGetRecords
, সর্বশেষতম তথ্য পেতে সকলকে ক্যাশেড ডেটা থাকতে হবে। যদি কোনও ডেটা না থাকে তবে এটি ডেটা না পাওয়া পর্যন্ত অপেক্ষা করবে, তাই কৌশলটির জন্য
আপনি যদি বাজার কোট পেতে প্রতিবার তথ্য পেতে চান, এমনকি যদি এটি পুরানো তথ্য, আপনি বাজারের কোট অবিলম্বে আপডেট মোডে স্যুইচ করতে পারেনexchange.IO("mode", 0)
. এই সময়ে, কৌশলটি ইভেন্ট-চালিত হিসাবে লেখা যাবে না, এবং একটি দ্রুত অসীম লুপ এড়াতে একটি exchange.IO("mode", 1)
ডিফল্ট ক্যাশে মোডে ফিরে যেতে।
একটি একক চুক্তি পরিচালনা করার সময়, ডিফল্ট মোডটি ব্যবহার করুন। তবে, যদি একাধিক চুক্তি থাকে তবে এটি সম্ভব যে চুক্তিগুলির মধ্যে একটি বাজার কোট আপডেট করে না, যার ফলে বাজার কোট পাওয়ার জন্য ইন্টারফেস ব্লক হয় এবং অন্যান্য চুক্তির কোট আপডেটগুলিও পাওয়া যায় না। এই সমস্যাটি সমাধানের জন্য, তাত্ক্ষণিক আপডেট মোড ব্যবহার করা যেতে পারে, তবে উচ্চ-ফ্রিকোয়েন্সি কৌশলগুলি লিখতে অসুবিধা হয়। এই সময়ে আপনি অর্ডার এবং কোটগুলির ধাক্কা পেতে ইভেন্ট পুশ মোড ব্যবহার করতে পারেন। সেটিং পদ্ধতিটি হলexchange.IO("wait")
. যদি একাধিক বিনিময় বস্তু যোগ করা হয়, যা কমোডিটি ফিউচার মধ্যে বিরল, আপনি ব্যবহার করতে পারেনexchange.IO("wait_any")
, এবং ফেরত
বাজার টিক পরিবর্তন ধাক্কাঃ{Event:"tick", Index: platform index (in the order of the platforms added in the bot), Nano: event of nanosecond-level time, Symbol: contract name}
অর্ডার চাপঃ{Event:"order", Index:Exchange index, Nano:Event of nanosecond-level time, Order:Order information (same as GetOrder)}
এই সময়ে, কৌশল কাঠামো হিসাবে লেখা যেতে পারেঃ
function on_tick(symbol){
Log("symbol update")
exchange.SetContractType(symbol)
Log(exchange.GetTicker())
}
function on_order(order){
Log("order update", order)
}
function main(){
while(true){
if(exchange.IO("status")){ //Judge the link status
exchange.IO("mode", 0)
_C(exchange.SetContractType, "MA888")//Subscribe to MA; only the subscription request for the first time is ture, and the later ones are program switches, which do not consume time
_C(exchange.SetContractType, "rb888")//Subscribe to rb
while(true){
var e = exchange.IO("wait")
if(e){
if(e.event == "tick"){
on_tick(e.Symbol)
}else if(e.event == "order"){
on_order(e.Order)
}
}
}
}else{
Sleep(10*1000)
}
}
}
এছাড়াও কমোডিটি ফিউচার এবং ক্রিপ্টোকারেন্সি প্ল্যাটফর্মগুলির মধ্যে পার্থক্যটি লক্ষ্য করুন। উদাহরণস্বরূপ,
exchange.IO("ইনস্ট্রুমেন্টস"): এটি প্ল্যাটফর্মে {কন্ট্রাক্টের নামঃ বিস্তারিত} এর সমস্ত চুক্তির তালিকাটি অভিধানের আকারে ফেরত দেয় এবং শুধুমাত্র বটগুলিকে সমর্থন করে।exchange.IO("পণ্য"): এটি প্ল্যাটফর্মের সমস্ত আইটেমগুলির তালিকাটি অভিধানের আকারে ফেরত দেয় এবং কেবল বটগুলিকে সমর্থন করে।exchange.IO("সাবস্ক্রিপ্ট"): এটি প্ল্যাটফর্মে অভিধানের আকারে সাবস্ক্রাইব করা বাজার কোটগুলি ফেরত দেয় এবং কেবল বটগুলিকে সমর্থন করে।
দ্যContractType
ঐতিহ্যগত সিটিপি ফিউচার্স চুক্তি আইডি বোঝায়, যা বড় এবং ছোট ক্ষেত্রে সংবেদনশীল। যেমনexchange.SetContractType("au1506")
. চুক্তিটি সফলভাবে সেট করার পরে, এটি চুক্তির বিশদ তথ্য, যেমন সর্বনিম্ন ক্রয়ের পরিমাণ, পরিষেবা ফি, বিতরণ সময় ইত্যাদি ফিরিয়ে দেবে। একাধিক চুক্তিতে সাবস্ক্রাইব করার সময়, কেবলমাত্র প্রথমবারের জন্য একটি সাবস্ক্রিপশন অনুরোধ পাঠানো হয় এবং তারপরে ট্রেডিং জোড়াটি কেবল কোড স্তরে স্যুইচ করা হয়, যা সময় নেয় না। প্রধান অবিচ্ছিন্ন চুক্তিটি হ'ল কোড 888, যেমন এমএ 888, অবিচ্ছিন্ন হার চুক্তিটি 000, যেমন এমএ 000; 888 এবং 000 হ'ল ভার্চুয়াল চুক্তি বাণিজ্য যা কেবল ব্যাকটেস্ট সমর্থন করে এবং আসল বটগুলি কেবল বাজার কোট সমর্থন করে।যাইহোক, মাইল্যাঙ্গুয়েজ মূল চুক্তি পরিচালনা করতে পারে, এবং প্রোগ্রামটি স্বয়ংক্রিয়ভাবে অবস্থান পরিবর্তন করবে, অর্থাৎ, অ-মূল অবস্থানগুলি বন্ধ করবে এবং প্রধান অবস্থানে নতুন অবস্থানগুলি খুলবে।
ব্যর্থ লগইন চুক্তি সেট করতে পারে না, কিন্তু অবিলম্বে ফিরে আসবে, তাই আপনি
SetDirection
চারটি পরামিতি পেতে পারেঃbuy, closebuy, sell, closesell
কমোডিটি ফিউচারগুলোতে বেশিclosebuy_today
এবংclosesell_today
, যা বর্তমান পজিশনের সমাপ্তি নির্দেশ করে; ডিফল্ট হলclosebuy/ closesell
, গতকালের অবস্থান বন্ধের ইঙ্গিত দেয়; শুধুমাত্র সাংহাই ফিউচার এক্সচেঞ্জের জাতগুলি আজ বন্ধ এবং গতকাল বন্ধে বিভক্ত, যা পরিষেবা ফিকে প্রভাবিত করতে পারে, তাই গতকালের অবস্থান বন্ধের অগ্রাধিকার দেওয়া প্রয়োজন। সিটিপি ঐতিহ্যগত ফিউচারগুলির জন্য, আপনি দ্বিতীয় পরামিতিটি
অপারেশন | সেটডিরেকশন প্যারামিটার | অর্ডার দেওয়ার কাজ |
---|---|---|
খোলা লং পজিশন | exchange.SetDirection (( |
বিনিময়.কপাই ((() |
লং পজিশন বন্ধ করুন | exchange.SetDirection (( |
বিনিময়.বিক্রয় ((() |
খোলা শর্ট পজিশন | exchange.SetDirection (( |
বিনিময়.বিক্রয় ((() |
শর্ট পজিশন বন্ধ করুন | exchange.SetDirection (( |
বিনিময়.কপাই ((() |
নিম্নলিখিত উদাহরণটি একটি নির্দিষ্ট ক্লোজিং পজিশন ফাংশন। মনে রাখবেন যে এই উদাহরণটি খুব সহজ। আপনাকে বিবেচনা করতে হবে যে এটি ট্রেডিং সময়ের মধ্যে রয়েছে কিনা, যদি এটি সম্পূর্ণরূপে পূরণ না হয় তবে অপেক্ষমান অর্ডারটি কীভাবে পুনরায় চেষ্টা করা যায়, সর্বোচ্চ অর্ডার ভলিউম কী, ফ্রিকোয়েন্সিটি খুব বেশি কিনা এবং এটি স্লাইডিং মূল্য বা বাজার মূল্য ইত্যাদি কিনা। কেবলমাত্র রেফারেন্সের জন্য,এটি একটি লাইব্রেরি প্যাকেজ যা বাস্তব বটগুলিতে পজিশন খোলার এবং বন্ধ করার জন্য প্রস্তাবিত প্ল্যাটফর্মগুলির একটি সংগ্রহস্থলঃhttps://www.fmz.com/strategy/12961লাইব্রেরী বিভাগে একটি নির্দিষ্ট ভূমিকা রয়েছে, এবং লাইব্রেরির সোর্স কোডগুলি অধ্যয়ন করার পরামর্শ দেওয়া হয়।
function Cover(contractType, amount, slide) {
for (var i = 0; i < positions.length; i++) {
if (positions[i].ContractType != contractType) {
continue;
}
var depth = _C(e.GetDepth);
if (positions[i].Type == PD_LONG || positions[i].Type == PD_LONG_YD) {
exchange.SetDirection(positions[i].Type == PD_LONG ? "closebuy_today" : "closebuy");
exchange.Sell(depth.Bids[0]-slide, amount, contractType, positions[i].Type == PD_LONG ? "Close today" : "Close yesterday", 'Bid', depth.Bids[0]);
} else {
exchange.SetDirection(positions[i].Type == PD_SHORT ? "closesell_today" : "closesell");
exchange.Buy(depth.Asks[0]+slide, amount, contractType, positions[i].Type == PD_SHORT ? "Close today" : "Close yesterday", 'Ask', depth.Asks[0]);
}
}
}
কমোডিটি ফিউচারগুলি কাস্টম অর্ডার টাইপগুলি সমর্থন করে (বটগুলির জন্য সমর্থন, তবে ব্যাকটেস্টের জন্য নয়), যা
exchange.SetDirection("buy_ioc");
exchange.SetDirection("sell_gtd-20170111")
নির্দিষ্ট উপসর্গঃ
ডিফল্টরূপে, কমোডিটি ফিউচার ব্রোকারগুলিতে খোলা ইন্টারফেসগুলি সমস্ত সিটিপি ইন্টারফেস। যদি প্রয়োজন হয় তবে এগুলি ইসুনি ইন্টারফেস দ্বারা প্রতিস্থাপিত হতে পারে। এফএমজেডের ইনক্যাপসুলারিংয়ের মাধ্যমে, কল পদ্ধতিটি একই। পার্থক্যটি হ'ল অ্যাকাউন্ট, অর্ডার এবং অবস্থানগুলি সমস্তই পুশ মোডে রয়েছে, তাই ডকার এই ডেটাগুলি স্থানীয়ভাবে বজায় রাখবে এবং প্রকৃতপক্ষে কোনও অনুরোধ না করেই সংশ্লিষ্ট ইন্টারফেসটি কল করার সাথে সাথে অবিলম্বে ফিরে আসবে।
Esunny প্রোটোকল কাস্টম অর্ডার প্রকারঃ
বট ইন্টারফেসে লগ রেকর্ড লগ করার সময়, এবং স্ট্রিংয়ের পরে অক্ষর Log('Push to WeChat@')
.
লগ রঙ এছাড়াও কাস্টমাইজ করা যাবে, যেমনLog('this is a log in red font #ff0000')
.
#ff0000
হল RGB রঙের ষোড়শ, যা নির্দেশ করে যে সমস্ত লগ ফাইলগুলি ডকারের অবস্থানের ডিরেক্টরিতে বটের SqLit ডাটাবেসে সংরক্ষণ করা হয়, যা ডাটাবেস সফ্টওয়্যার দিয়ে ডাউনলোড এবং খোলা যেতে পারে, অথবা ব্যাকআপ এবং পুনরুদ্ধারের জন্য কপি করতে ব্যবহার করা যেতে পারে (ডাটাবেস নাম এবং বট আইডি একই) ।
এটি মুনাফা রেকর্ড করে, এবং বট ইন্টারফেসে মুনাফা বক্ররেখা আঁকে, যা বট পুনরায় চালু হওয়ার পরে ধরে রাখা যেতে পারে।LogProfit(1000)
. লক্ষ্য করুন যে প্যারামিটারLogProfit
এটা অবশ্যই মুনাফা নয়, এবং এটা যে কোন সংখ্যা হতে পারে এবং নিজের দ্বারা পূরণ করা প্রয়োজন।
যদি বট অবস্থা, যেহেতু লগ প্রথম সংরক্ষণ করা হবে এবং ক্রমাগত আপডেট, শুধুমাত্র প্রদর্শন জন্য তথ্য প্রয়োজন না সংরক্ষণের জন্য, আপনি ব্যবহার করতে পারেনLogStatus
ফাংশন।LogStatus
তারা স্ট্রিং, যা টেবিল তথ্য প্রতিনিধিত্ব করতে ব্যবহার করা যেতে পারে।
একটি নির্দিষ্ট বাস্তব বট অবস্থান প্রদর্শন টেবিলের উদাহরণঃ
var table = {type: 'table', title: 'position information', cols: ['Column1', 'Column2'], rows: [ ['abc', 'def'], ['ABC', 'support color #ff0000']]};
LogStatus('`' + JSON.stringify(table) + '`'); // After serialization, JSON will be added the character "'" on both sides, which is regarded as a comlpex messag format (now supporting tables)
LogStatus('The first line information\n`' + JSON.stringify(table) + '`\nthe third line information'); // the table information can be displayed in multiple lines
LogStatus('`' + JSON.stringify([table, table]) + '`'); // Multiple tables are supported to be displayed at the same time, which will be displayed in one group by TAB
LogStatus('`' + JSON.stringify(tab1) + '`\n' + '`' + JSON.stringify(tab2) + '`\n'); // Multiple tables are displayed up and down by arrangement
এর পরামিতি হল মিলিসেকেন্ডের সংখ্যা, যেমনSleep(1000)
সমস্ত প্ল্যাটফর্মের সীমিত অ্যাক্সেস ফ্রিকোয়েন্সির কারণে, সাধারণ কৌশলগুলিতে ঘুমের সময়কে অসীম লুপে যুক্ত করা উচিত।
যদি আপনি কিছু স্থায়ী তথ্য সংরক্ষণ করতে চান,_G
খুব সুবিধাজনক এবং ব্যবহারিক, এবং এটি JSON সিরিয়ালাইজড কন্টেন্ট সংরক্ষণ করতে পারেন।_G
ফাংশন লিখিত হয়onexit()
, যাতে যখনই কৌশলটি বন্ধ করা হয়, তখন প্রয়োজনীয় তথ্য স্বয়ংক্রিয়ভাবে সংরক্ষণ করা হবে।
আপনি যদি আরো ফরম্যাট তথ্য সংরক্ষণ করতে চান, _G ফাংশন উপযুক্ত নয়, কিন্তু