এই নিবন্ধের উদ্দেশ্য কৌশল বিকাশের কিছু অভিজ্ঞতা বর্ণনা করা, সেইসাথে কিছু টিপস, যা পাঠকদের দ্রুত ট্রেডিং কৌশল বিকাশের মূল পয়েন্ট বুঝতে অনুমতি দেবে।
যখন আপনি কোন কৌশল নকশায় অনুরূপ বিবরণের মুখোমুখি হন, তখন আপনি অবিলম্বে একটি যুক্তিসঙ্গত সমাধান নিয়ে আসতে পারেন।
আমরা ব্যাখ্যা, পরীক্ষা এবং অনুশীলনের জন্য উদাহরণ হিসাবে এফএমজেড কোয়ান্ট প্ল্যাটফর্ম ব্যবহার করি।
কৌশল প্রোগ্রামিং ভাষা আমরা জাভাস্ক্রিপ্ট ব্যবহার করব
ট্রেডিং লক্ষ্যের জন্য, আমরা আমাদের অবজেক্ট হিসাবে ব্লকচেইন সম্পদ বাজার (বিটিসি, ইটিএইচ, ইত্যাদি) গ্রহণ করি
সাধারণত, কৌশল যৌক্তিকতার উপর নির্ভর করে, এটি বাজার তথ্য পেতে নিম্নলিখিত বিভিন্ন ইন্টারফেস ব্যবহার করতে পারে, বেশিরভাগ কৌশল যৌক্তিকতা বাজার তথ্য দ্বারা চালিত হয় (অবশ্যই, কিছু কৌশল মূল্যের তথ্য সম্পর্কে যত্নশীল নয়, যেমন একটি স্থায়ী বিনিয়োগ কৌশল) ।
GetTicker: রিয়েল টাইমে টিক কোটেশন পান।
সাধারণত বর্তমান সর্বশেষ মূল্য দ্রুত পেতে ব্যবহৃত হয়,
গভীরতা পান: অর্ডার বইয়ের অর্ডার গভীরতা পান। সাধারণত অর্ডার বুক গভীরতার প্রতিটি স্তরের মূল্য এবং অপেক্ষমান অর্ডারের আকার পেতে ব্যবহৃত হয়। হেজিং কৌশল, বাজার তৈরির কৌশল ইত্যাদির জন্য ব্যবহৃত হয়।
GetTrade: বাজারের সর্বশেষ লেনদেনের রেকর্ড পান। সাধারণত একটি সংক্ষিপ্ত সময়ের মধ্যে বাজার আচরণ বিশ্লেষণ এবং বাজারে মাইক্রোস্কোপিক পরিবর্তন বিশ্লেষণ করতে ব্যবহৃত হয়। সাধারণত উচ্চ ফ্রিকোয়েন্সি কৌশল এবং অ্যালগরিদম কৌশল জন্য ব্যবহৃত হয়।
গেট রেকর্ডসঃ বাজারের কে-লাইন ডেটা পান। সাধারণত ট্রেন্ড ট্র্যাকিং কৌশল এবং সূচক গণনা করার জন্য ব্যবহৃত হয়।
কৌশলটি ডিজাইন করার সময়, শিক্ষানবিস সাধারণত বিভিন্ন ত্রুটিগুলি উপেক্ষা করে এবং স্বজ্ঞাতভাবে বিশ্বাস করে যে কৌশলটির প্রতিটি অংশের ফলাফলগুলি প্রতিষ্ঠিত। তবে এটি সত্য নয়, কৌশল প্রোগ্রামের ক্রিয়াকলাপে, বাজারের ডেটা অনুরোধ করার সময়, আপনি বিভিন্ন অপ্রত্যাশিত পরিস্থিতির মুখোমুখি হবেন।
উদাহরণস্বরূপ, কিছু বাজার ইন্টারফেসগুলি অকার্যকর ডেটা ফেরত দেয়ঃ
var depth = exchange.GetDepth()
// depth.Asks[0].Price < depth.Bids[0].Price "Selling 1" price is lower than "buying 1" price, this situation cannot exist on the market.
// Because the selling price is lower than the buying price, the order must have been executed.
// depth.Bids[n].Amount = 0 Order book buying list "nth" layer, order quantity is 0
// depth.Asks[m].Price = 0 Order book selling list "mth" layer, the order price is 0
অথবা সরাসরি exchange.GetDepth() একটি শূন্য মান প্রদান করে।
এই ধরনের অনেক অদ্ভুত পরিস্থিতি আছে। অতএব, এই পূর্বাভাসযোগ্য সমস্যা মোকাবেলা করা প্রয়োজন। এই ধরনের চিকিত্সা স্কিম ত্রুটি-সহনশীল প্রক্রিয়াকরণ বলা হয়।
ত্রুটিগুলি মোকাবেলার স্বাভাবিক উপায় হ'ল ডেটা ফেলে দেওয়া এবং এটি পুনরুদ্ধার করা।
উদাহরণস্বরূপঃ
function main () {
while (true) {
onTick()
Sleep(500)
}
}
function GetTicker () {
while (true) {
var ticker = exchange.GetTicker()
if (ticker.Sell > ticker.Buy) { // Take the example of fault-tolerant processing that detects whether the "Selling 1" price is less than the "Buying 1" price.
// Exclude this error, the current function returns "ticker".
Return ticker
}
Sleep(500)
}
}
function onTick () {
var ticker = GetTicker() // Make sure the "ticker" you get doesn't exist the situation that "Selling 1" price is less than the "Buying 1" price.
// ... specific strategy logic
}
অন্যান্য পূর্বাভাসযোগ্য ত্রুটি-সহিষ্ণু প্রক্রিয়াগুলির জন্য অনুরূপ পদ্ধতি ব্যবহার করা যেতে পারে।
ডিজাইনের মূলনীতি হচ্ছে আপনি কখনোই ভুল যুক্তি ব্যবহার করে কৌশলগত যুক্তি চালাতে পারবেন না।
কে লাইন ডেটা সংগ্রহ, কলঃ
var r = exchange.GetRecords()
প্রাপ্ত K লাইন ডেটা একটি অ্যারে, যেমনঃ
[
{"Time":1562068800000,"Open":10000.7,"High":10208.9,"Low":9942.4,"Close":10058.8,"Volume":6281.887000000001},
{"Time":1562072400000,"Open":10058.6,"High":10154.4,"Low":9914.5,"Close":9990.7,"Volume":4322.099},
...
{"Time":1562079600000,"Open":10535.1,"High":10654.6,"Low":10383.6,"Close":10630.7,"Volume":5163.484000000004}
]
আপনি দেখতে পারেন যে প্রতিটি কোঁকড়ানো brace {} সময়, খোলার মূল্য, সর্বোচ্চ মূল্য, সর্বনিম্ন মূল্য, বন্ধ মূল্য, এবং ভলিউম রয়েছে.
এটি একটি কে-লাইন বার। সাধারণ কে-লাইন ডেটা মুভিং গড়, এমএসিডি ইত্যাদির মতো সূচক গণনা করতে ব্যবহৃত হয়।
কে-লাইন ডেটা একটি প্যারামিটার (কঁচামালের ডেটা) হিসাবে পাস করা হয়, এবং তারপর সূচক প্যারামিটারগুলি সূচক ডেটার ফাংশন গণনা করতে সেট করা হয়, যা আমরা সূচক ফাংশন বলি।
এফএমজেড কোয়ান্ট পরিমাণগত ট্রেডিং প্ল্যাটফর্মে অনেকগুলি সূচক ফাংশন রয়েছে।
উদাহরণস্বরূপ, আমরা চলমান গড় সূচক গণনা করি। পাস করা কে-লাইন ডেটার চক্র অনুযায়ী, আমরা সংশ্লিষ্ট চক্রের চলমান গড় গণনা করি।
উদাহরণস্বরূপ, পাসিং কে-লাইন ডেটা (একটি কে-লাইন বার এক দিন প্রতিনিধিত্ব করে), দৈনিক গড় লাইন গণনা করে, একই জিনিস, যদি পাসিং গড় সূচক ফাংশনের কে-লাইন ডেটা 1 ঘন্টা চক্র হয়, তবে গণনা করা সূচকটি 1 ঘন্টা চলমান গড় হয়।
সাধারণত আমরা সূচক গণনা করার সময় একটি সমস্যা উপেক্ষা করি। যদি আমি 5 দিনের চলমান গড় সূচক গণনা করতে চাই, তাহলে আমরা প্রথমে দৈনিক কে-লাইন ডেটা প্রস্তুত করিঃ
var r = exchange.GetRecords(PERIOD_D1) // Pass parameters to the "GetRecords" function "PERIOD_D1" specifies the day K line to be acquired.
// Specific function using method can be seen at: https://www.fmz.com/api#GetRecords
দৈনিক কে-লাইন ডেটা দিয়ে, আমরা চলমান গড় সূচক গণনা করতে পারি। যদি আমরা 5 দিনের চলমান গড় গণনা করতে চাই, তাহলে আমাদের সূচক ফাংশনের সূচক প্যারামিটার 5 এ সেট করতে হবে।
var ma = TA.MA(r, 5) // "TA.MA()" is the indicator function used to calculate the moving average indicator. The first parameter sets the daily K-line data r just obtained.
// The second parameter is set to 5. The calculated 5-day moving average is the same as the other indicators.
আমরা একটি সম্ভাব্য সমস্যা উপেক্ষা করেছি। যদি K-লাইন ডেটাতে K-লাইন বারের সংখ্যা 5 এর চেয়ে কম হয়, তাহলে আমরা একটি বৈধ 5 দিনের চলমান গড় গণনা করতে কি করতে পারি?
উত্তর হচ্ছে, তুমি কিছুই করতে পারবে না।
কারণ চলমান গড়ের সূচকটি একটি নির্দিষ্ট সংখ্যক কে-লাইন বারের বন্ধের মূল্যের গড়।
অতএব, সূচক তথ্য গণনার জন্য K-লাইন ডেটা এবং সূচক ফাংশন ব্যবহার করার আগে, K-লাইন ডেটাতে K-লাইন বার সংখ্যা সূচক গণনার শর্ত (সূচক পরামিতি) পূরণ করে কিনা তা নির্ধারণ করা প্রয়োজন।
সুতরাং 5 দিনের চলমান গড় গণনা করার আগে, আপনাকে প্রথমে এটি পরীক্ষা করতে হবে। সম্পূর্ণ কোডটি নিম্নরূপঃ
function CalcMA () {
var r = _C(exchange.GetRecords, PERIOD_D1) // _C() is a fault-tolerant function, the purpose is to avoid r being null, you can get more information at: https://www.fmz.com/api#_C
if (r.length > 5) {
Return TA.MA(r, 5) // Calculate the moving average data with the moving average indicator function "TA.MA", return it as a function return value.
}
Return false
}
function main () {
var ma = CalcMA()
Log(ma)
}
ব্যাকটেস্ট প্রদর্শনঃ
[null,null,null,null,4228.7,4402.9400000000005, ... ]
আপনি গণনা করা 5 দিনের চলমান গড় সূচক দেখতে পারেন। প্রথম চারটি শূন্য, কারণ কে-লাইন বার সংখ্যা 5 এর চেয়ে কম, এবং গড় গণনা করা যাবে না। যখন আপনি 5 তম কে-লাইন বার পৌঁছান, আপনি এটি গণনা করতে পারেন।
যখন আমরা কৌশল লিখতে, প্রায়ই যেমন একটি দৃশ্যকল্প আছে, যেমন কৌশল প্রয়োজন প্রক্রিয়া কিছু অপারেশন যখন প্রতিটি কে-লাইন চক্র সম্পন্ন হয়, বা কিছু লগ মুদ্রণ.
কিভাবে আমরা এই ধরনের ফাংশন বাস্তবায়ন করি? যারা প্রোগ্রামিং অভিজ্ঞতা নেই তাদের জন্য, এটি একটি সমস্যা হতে পারে। এখানে আমরা আপনাকে সমাধান দিচ্ছি।
কিভাবে একটি কে-লাইন বার চক্র বিচার করা হয় সম্পন্ন হয়। আমরা কে-লাইন ডেটাতে সময় বৈশিষ্ট্য দিয়ে শুরু করতে পারি। প্রতিবার আমরা কে-লাইন ডেটা পাই, আমরা এই কে-লাইন ডেটার শেষ কে-লাইন বারের সময় বৈশিষ্ট্যটি পরিবর্তন বা না বিচার করব। যদি এটি পরিবর্তন করা হয়, তবে এর অর্থ হল যে একটি নতুন কে-লাইন বার উত্পন্ন হয়েছে (নতুন উত্পন্ন কে-লাইন বারের পূর্ববর্তী কে-লাইন বার চক্রটি সম্পন্ন হয়েছে তা প্রমাণ করে), যদি কোনও পরিবর্তন না হয় তবে এর অর্থ হল কোনও নতুন কে-লাইন বার উত্পন্ন হয়নি (বর্তমান শেষ কে-লাইন বার চক্রটি এখনও সম্পন্ন হয়নি) ।
সুতরাং আমাদের একটি ভেরিয়েবল দরকার K-লাইন ডেটার শেষ K-লাইন বারের সময় রেকর্ড করার জন্য।
var r = exchange.GetRecords()
var lastTime = r[r.length - 1].Time // "lastTime" used to record the last K-line bar time.
বাস্তবে, এটি সাধারণত হয়ঃ
function main () {
var lastTime = 0
while (true) {
var r = _C(exchange.GetRecords)
if (r[r.length - 1].Time != lastTime) {
Log ("New K-line bar generated")
lastTime = r[r.length - 1].Time // Be sure to update "lastTime", this is crucial.
// ... other processing logic
// ...
}
Sleep(500)
}
}
আপনি দেখতে পারেন যে ব্যাকটেস্টে, কে লাইন চক্র দৈনিক সেট করা হয় (প্যারামিটারটি নির্দিষ্ট করা হয় না যখনexchange.GetRecords
ফাংশনটি কল করা হয়, এবং ব্যাকটেস্ট অনুযায়ী সেট করা K লাইন চক্রটি ডিফল্ট প্যারামিটার) । যখনই নতুন K-লাইন বার প্রদর্শিত হয়, এটি একটি লগ মুদ্রণ করে।
আপনি যদি এক্সচেঞ্জের ইন্টারফেসে অ্যাক্সেস করতে কৌশলটির জন্য যে সময় লাগে তার উপর একটি নির্দিষ্ট প্রদর্শন বা নিয়ন্ত্রণ রাখতে চান তবে আপনি নিম্নলিখিত কোডটি ব্যবহার করতে পারেনঃ
function main () {
while (true) {
var beginTime = new Date().getTime()
var ticker = exchange.GetTicker()
var endTime = new Date().getTime()
LogStatus(_D(), "GetTicker() function time-consuming:", endTime - beginTime, "millisecond")
Sleep(1000)
}
}
সহজভাবে বলতে গেলে, সময় স্ট্যাম্প কল করার পর রেকর্ডGetTicker
ফাংশন কল করার আগে টাইমস্ট্যাম্প থেকে বিয়োগ করা হয়, এবং অভিজ্ঞতা মিলিসেকেন্ডের সংখ্যা গণনা করা হয়, অর্থাৎ, সময় দ্বারা গৃহীতGetTicker
কার্যকরকরণ থেকে ফেরত ফাংশন.
উদাহরণস্বরূপ, বিক্রয় অর্ডার দেওয়ার প্রক্রিয়াতে, বিক্রয় অর্ডারের পরিমাণ অ্যাকাউন্টে মুদ্রার সংখ্যার চেয়ে বেশি হতে পারে না। কারণ যদি এটি অ্যাকাউন্টে উপলব্ধ মুদ্রার সংখ্যার চেয়ে বেশি হয়, তাহলে অর্ডারটি ত্রুটির কারণ হবে।
আমরা এটাকে এভাবে নিয়ন্ত্রণ করি:
উদাহরণস্বরূপ, আমরা 0.2 মুদ্রা শর্ট বিক্রি করার পরিকল্পনা করছি।
var planAmount = 0.2
var account = _C(exchange.GetAccount)
var amount = Math.min(account.Stocks, planAmount)
এটি নিশ্চিত করে যে অর্ডারের সংখ্যা অ্যাকাউন্টে উপলব্ধ মুদ্রার সংখ্যা অতিক্রম করবে না।
একই কারণে,Math.max
একটি মানের নিম্ন সীমা নিশ্চিত করতে ব্যবহৃত হয়।
সাধারণভাবে, সাধারণ বিনিময় নির্দিষ্ট ট্রেড জোড়ার জন্য একটি সর্বনিম্ন পাঠানোর অর্ডার সীমা আছে। যদি এটি সর্বনিম্ন পরিমাণের চেয়ে কম হয়, অর্ডারটি প্রত্যাখ্যান করা হবে। এটি প্রোগ্রাম ব্যর্থতার কারণ হবে।
অনুমান করা হচ্ছে যে বিটিসির সর্বনিম্ন অর্ডার পরিমাণ সাধারণত ০.০১ হয়।
ট্রেডিং কৌশল কখনও কখনও 0.01 অর্ডার পরিমাণ কম হতে পারে, তাই আমরা ব্যবহার করতে পারেনMath.max
ন্যূনতম অর্ডার পরিমাণ নিশ্চিত করার জন্য।
যথার্থতা ব্যবহার করে নিয়ন্ত্রিত হতে পারে_N()
ফাংশন বাSetPrecision
function.
দ্যSetPrecision()
ফাংশন শুধুমাত্র একবার সেট করা প্রয়োজন, এবং অর্ডার পরিমাণ এবং মূল্য মান দশমিক সংখ্যা স্বয়ংক্রিয়ভাবে সিস্টেমে truncated হয়।
দ্য_N()
ফাংশন একটি নির্দিষ্ট মানের জন্য দশমিক বিন্দু truncation (নির্ভুলতা নিয়ন্ত্রণ) সঞ্চালন করা হয়।
উদাহরণস্বরূপঃ
var pi = _N(3.141592653, 2)
Log(pi)
পাই এর মানটি দশমিকের দ্বারা কেটে দেওয়া হয়, এবং 2 দশমিক স্থান সংরক্ষিত হয়, যা হলঃ 3.14
বিস্তারিত জানার জন্য API ডকুমেন্টেশন দেখুন।
আপনি টাইমস্ট্যাম্প সনাক্তকরণ পদ্ধতি ব্যবহার করে বর্তমান টাইমস্ট্যাম্প বিয়োগ শেষবারের টাইমস্ট্যাম্প নির্ধারণ করতে এবং রিয়েল টাইমে সময়সীমা গণনা করতে টাইমস্ট্যাম্প সনাক্তকরণ পদ্ধতি ব্যবহার করতে পারেন। যখন সময়সীমা নির্দিষ্ট সময়সীমা অতিক্রম করে তখন একটি নতুন অপারেশন সম্পাদন করা হয়।
উদাহরণস্বরূপ, একটি স্থায়ী বিনিয়োগ কৌশল ব্যবহৃত।
var lastActTime = 0
var waitTime = 1000 * 60 * 60 * 12 // number of milliseconds a day
function main () {
while (true) {
var nowTime = new Date().getTime()
if (nowTime - lastActTime > waitTime) {
Log ("Execution Fixed")
// ... specific fixed investment operation, buying operation.
lastActTime = nowTime
}
Sleep(500)
}
}
এটি একটি সহজ উদাহরণ।
এফএমজেড কোয়ান্ট ব্যবহার করে_G()
ফাংশন, এবং সংরক্ষণ ফাংশন প্রস্থান, এটি সংরক্ষণ অগ্রগতি প্রস্থান এবং স্বয়ংক্রিয় পুনরুদ্ধার রাষ্ট্র পুনরায় আরম্ভ করার জন্য একটি কৌশল ডিজাইন করা সুবিধাজনক।
var hold = {
Price : 0,
Amount : 0,
}
function main () {
if (_G("hold")) {
var ret = _G("hold")
hold.price = ret.price
hold.amount = ret.amount
Log("restore hold:", hold)
}
var count = 1
while (true) {
// ... strategy logic
// ... In the strategy operation, it is possible that when opening a position, then assign the position price of the open position to "hold.price", and the amount of open positions is assigned to "hold.amount" to record the position information.
hold.price = count++ // simulate some values
hold.amount = count/10 // Simulate some values
Sleep(500)
}
}
function onexit () { // Click the stop button on the robot to trigger the execution of this function. After the execution, the robot stops.
_G("hold", hold)
Log("save hold:", JSON.stringify(hold))
}
এটি দেখা যায় যে তথ্যhold
প্রতিবার রোবট বন্ধ করা হয় বস্তুর সংরক্ষণ করা হয়. এবং যখন প্রতিটি সময় তথ্য পুনরায় চালু করা হয়, তথ্য পড়া হয় এবং মানhold
থামার আগের অবস্থায় ফিরে আসে।
অবশ্যই, উপরের একটি সহজ উদাহরণ। যদি এটি একটি প্রকৃত ট্রেডিং কৌশল ব্যবহার করা হয়, এটি কৌশল পুনরুদ্ধার করা প্রয়োজন যে মূল তথ্য অনুযায়ী ডিজাইন করা উচিত (সাধারণত অ্যাকাউন্ট তথ্য, অবস্থান, মুনাফা মান, ট্রেডিং দিক ইত্যাদি।).
এছাড়াও, আপনি পুনরুদ্ধারের জন্য কিছু অন্যান্য শর্তও নির্ধারণ করতে পারেন।
ট্রেডিং কৌশল তৈরির জন্য কিছু টিপস, এবং আমি আশা করি এটা নতুনদের সাহায্য করতে পারে!
হ্যান্ডস-অন অনুশীলন প্রশিক্ষণ নিজেকে উন্নত করার দ্রুততম উপায়! আমি আপনাদের সবাইকে শুভকামনা জানাচ্ছি।