রিসোর্স লোড হচ্ছে... লোডিং...

ব্যাকটেস্ট সিস্টেম

আপনি একটি পরিমাণগত ট্রেডিং কৌশল ডিজাইন সম্পন্ন করার পরে, আপনি কিভাবে আপনার কৌশল মৌলিক অবস্থা জানতে পারেন, যেমন কৌশল যুক্তি এবং কৌশল এর রিটার্ন দিক? অবশ্যই, আমরা সরাসরি বাস্তব ট্রেডিং বাজারে কৌশল চালানোর জন্য বাস্তব অর্থ ব্যবহার করতে পারবেন না, কিন্তু আমরা আপনার কৌশল পরীক্ষা করার জন্য ঐতিহাসিক তথ্য ব্যবহার করতে পারেন এবং ঐতিহাসিক তথ্য আপনার কৌশল মুনাফা জানতে।

ব্যাকটেস্ট সিস্টেম মডেল

এফএমজেড কোয়ান্ট ট্রেডিং প্ল্যাটফর্ম ব্যাকটেস্ট সিস্টেমকে বিভক্ত করেবট স্তরএবংসিমুলেশন স্তর. বট স্তর সম্পূর্ণ ঐতিহাসিক তথ্য অনুযায়ী সম্পূর্ণ ব্যাকটেস্ট করা হয়; যখন সিমুলেশন স্তর ব্যাকটেস্ট উৎপন্নtickব্যাকটেস্টের জন্য নিয়মিত ব্যবধানে বাস্তব কে-লাইন ডেটা অনুসারে ডেটা। এগুলি উভয়ই বাস্তব historicalতিহাসিক ডেটার উপর ভিত্তি করে, তবে বট স্তরের ডেটা আরও নির্ভুল এবং ফলাফলগুলি আরও বিশ্বাসযোগ্য। তবে, ব্যাকটেস্টিং কেবল historicalতিহাসিক ডেটা অনুসারে কৌশলটির পারফরম্যান্স। historicalতিহাসিক ডেটা ভবিষ্যতের বাজারকে পুরোপুরি উপস্থাপন করতে পারে না। historicalতিহাসিক বাজারটি পুনরাবৃত্তি হতে পারে, বা এটি ব্ল্যাক সোয়ানকেও নেতৃত্ব দিতে পারে। অতএব, ব্যাকটেস্টের ফলাফলগুলিকে যুক্তিসঙ্গতভাবে এবং বস্তুনিষ্ঠভাবে আচরণ করা উচিত।

দ্যসিমুলেশন স্তর টিকসিমুলেটেড উৎপন্নটিক ডেটাভিত্তিক K-লাইন সময়ের উপর ভিত্তি করে, প্রতিটি ভিত্তিক K-লাইন সময়ের সর্বাধিক 12 ব্যাকটেস্ট সময় পয়েন্ট উৎপন্ন হবে;বাস্তব বাজার স্তর টিকব্যাকটেস্টিং সেকেন্ডে সেকেন্ডে সংগ্রহ করা বাস্তব টিক ডেটা ব্যবহার করে, ডেটা ভলিউম খুব বড় এবং ব্যাকটেস্টিং গতি ধীর, তাই এটি খুব দীর্ঘ সময়ের জন্য ব্যাকটেস্টিং করা যায় না। এফএমজেড কোয়ান্টের ব্যাকটেস্টিং প্রক্রিয়াটি কৌশলটিকে একক কে-লাইনে একাধিকবার ট্রেড করার অনুমতি দেয়, এমন পরিস্থিতি এড়ানো যেখানে ট্রেডিং কেবল বন্ধের মূল্যে সম্পাদিত হতে পারে। ব্যাকটেস্টিংয়ের গতি বিবেচনা করে এটি আরও নির্ভুল।

ব্যাকটেস্টিং সিস্টেমের প্রক্রিয়া বর্ণনা

  • সিমুলেশন লেভেল টিক দ্যসিমুলেশন স্তর টিকএকটি নির্দিষ্ট অ্যালগরিদম অনুসারে একটি প্রদত্ত অন্তর্নিহিত কে-লাইন বারের সর্বোচ্চ মূল্য, সর্বনিম্ন মূল্য, খোলার মূল্য এবং বন্ধের মূল্যের মানের কাঠামোর মধ্যে ব্যাকটেস্টিং সিস্টেমের অন্তর্নিহিত কে-লাইন ডেটা ভিত্তিক, টিক ডেটা ব্যাকটেস্টিংয়ের জন্য সিমুলেট করে। ব্যাকটেস্টিং টাইম সিরিজের রিয়েল-টাইম টিক ডেটা হিসাবে, এটি কৌশল প্রোগ্রামটি ইন্টারফেসটি কল করার সময় ফিরে আসে। বিস্তারিত জানার জন্য, দয়া করে পড়ুনঃব্যাকটেস্টিং সিস্টেম সিমুলেশন লেভেল মেকানিজম বর্ণনা.

  • বট লেভেল টিক বট লেভেল ব্যাকটেস্ট হল বার টাইম সিরিজের প্রকৃত টিক লেভেল ডেটা। টিক লেভেল ডেটার উপর ভিত্তি করে কৌশলগুলির জন্য, বাস্তব বাজারের স্তর ব্যবহার করে ব্যাকটেস্ট বাস্তবতার কাছাকাছি। বট লেভেল ব্যাকটেস্টে, টিক ডেটা বাস্তব রেকর্ড করা ডেটা, সিমুলেটেড নয়। এটি গভীরতার ডেটা, বাজারের ট্রেডিংয়ের রেকর্ড ডেটা প্লেব্যাক, কাস্টম গভীরতা এবং প্রতিটি পৃথক ট্রেডিং ডেটা সমর্থন করে। বাস্তব বাজার-স্তরের ডেটা ব্যাকটেস্টের সর্বাধিক আকার সর্বোচ্চ 50MB পর্যন্ত, ডেটাসেটের উপরের সীমার মধ্যে ব্যাকটেস্টের সময় পরিসীমাতে কোনও সীমা নেই। যদি আপনাকে যতটা সম্ভব ব্যাকটেস্টের সময় পরিসীমা বাড়ানোর প্রয়োজন হয় তবে আপনি গিয়ার গভীরতা সেটিংয়ের মান হ্রাস করতে পারেন এবং ব্যাকটেস্টের সময় পরিসীমা বাড়ানোর জন্য প্রতিটি পৃথক ট্রেডিং ডেটা ব্যবহার করবেন না।GetDepth, GetTradesবাজারের তথ্য পুনরায় খেলার জন্য ফাংশন।GetTicker, GetTrades, GetDepthএবংGetRecordsসময়টি ব্যাকটেস্ট টাইমলাইনে একাধিকবার সরানো হবে না (যা পরবর্তী বাজারের ডেটা মুহুর্তে একটি লাফকে ট্রিগার করবে না) । উপরের ফাংশনগুলির মধ্যে একটিতে পুনরাবৃত্তি কলগুলি ব্যাকটেস্ট সময়কে ব্যাকটেস্ট টাইমলাইনে সরানোর জন্য চাপ দেবে (পরবর্তী বাজারের ডেটা মুহুর্তে লাফ দিন) । যখন ব্যাকটেস্টের জন্য বাস্তব বাজারের স্তর ব্যবহার করা হয়, তখন পূর্ববর্তী সময়টি বেছে নেওয়ার পরামর্শ দেওয়া হয় না। অকাল সময়ের মধ্যে বাস্তব বাজারের স্তরের ডেটা নাও থাকতে পারে।

বট-স্তরের টিকএবংসিমুলেশন স্তরের টিকমোড, ব্যাকটেস্ট সিস্টেমের লেনদেনের মিলন প্রক্রিয়াঃ অর্ডার লেনদেনের মিলন দেখা দাম অনুযায়ী সম্পন্ন হয় এবং পুরো ভলিউমটি ট্রেড করা হয়। অতএব, আংশিক লেনদেনের দৃশ্যটি ব্যাকটেস্ট সিস্টেমে পরীক্ষা করা যায় না।

ব্যাকটেস্টিং সিস্টেম একাধিক প্রোগ্রামিং ভাষা সমর্থন করে

ব্যাকটেস্টিং সিস্টেম ব্যাকটেস্টিং কৌশলগুলিকে সমর্থন করে যা নিম্নলিখিত দ্বারা লিখিত এবং ডিজাইন করা হয়েছেঃJavaScript, TypeScript, Python, C++, PINE, MyLanguage, Blocklyকল্পনা। এর ব্যাকটেস্টজাভাস্ক্রিপ্টএবংসি++ট্রেডিং কৌশল ব্রাউজারে পরিচালিত হয়, এবং বাস্তব বাজার বট বাWexAppঅনুকরণ করা বিনিময় বাস্তব বাজার (যেমনWexAppFMZ Quant Trading প্ল্যাটফর্মের এমুলেটেড এক্সচেঞ্জ) অন্য কোন সফটওয়্যার, লাইব্রেরি বা মডিউল ইনস্টল না করেই চলে। এর ব্যাকটেস্টপাইথনএটি ডকারের উপর সঞ্চালিত হয়; এটি FMZ কোয়ান্ট ট্রেডিং প্ল্যাটফর্ম দ্বারা যুক্ত পাবলিক সার্ভারে সঞ্চালিত হতে পারে এবং এটি ব্যবহারকারীর নিজস্ব ডকারের উপরও সঞ্চালিত হতে পারে। বাস্তব বাজার অপারেশন এবং ব্যাকটেস্ট উভয়ইপাইথনযদি কিছু লাইব্রেরি প্রয়োজন হয়, তাদের ম্যানুয়ালি ইনস্টল করা প্রয়োজন (শুধুমাত্র সাধারণপাইথনগ্রন্থাগারগুলি FMZ Quant পাবলিক সার্ভারে সমর্থিত।

এটি সমর্থন করেজাভাস্ক্রিপ্টক্রোম ডেভটুলসে কৌশল ব্যাকটেস্টিং ডিবাগিং,অনুগ্রহ করে দেখুন.

ব্যাকটেস্টিং সিস্টেমে সমর্থিত এক্সচেঞ্জ

  • ক্রিপ্টোকারেন্সি ক্রিপ্টোকারেন্সির জন্য প্রধান স্পট এবং ফিউচার এক্সচেঞ্জ; সমস্ত ধরণের এক্সচেঞ্জের ডেটা সমর্থন করে।
  • ফুটু সিকিউরিটিজ হংকংয়ের শেয়ার, মার্কিন শেয়ার এবং অন্যান্য বাজার।

ব্যাকটেস্টিং সিস্টেম প্যারামিটার অপ্টিমাইজেশন

এফএমজেড কোয়ান্ট ট্রেডিং প্ল্যাটফর্মের ব্যাকটেস্ট সিস্টেমের প্যারামিটার অপ্টিমাইজেশান ফাংশনটি ব্যাকটেস্টিংয়ের সময় প্রতিটি প্যারামিটার অপ্টিমাইজেশান বিকল্প অনুযায়ী প্যারামিটার সংমিশ্রণগুলি সেট করা। সিমুলেশন ব্যাকটেস্টিং পৃষ্ঠার কৌশল প্যারামিটার বিভাগে, চেক করুনঅপ্টিমাইজেশনঅপ্টিমাইজেশান সেটিংস প্রদর্শন করার জন্য কৌশল প্যারামিটারের ডানদিকে বিকল্প।

  • ন্যূনতম মানঃ পরামিতিগুলির প্রাথমিক মান সীমাবদ্ধ করতে।
  • সর্বাধিক মানঃ ধ্রুবক পরিবর্তনের পরে পরামিতিগুলির সর্বাধিক মান সীমাবদ্ধ করতে।
  • ধাপের আকারঃ পরামিতিগুলির ইনক্রিমেন্টাল ভেরিয়েবল পরিমাণ।
  • একযোগে থ্রেডঃ প্যারামিটার অপ্টিমাইজেশান চলাকালীন, প্রতিটি ব্যাকটেস্ট প্যারামিটার সংমিশ্রণের সমান্তরাল এক্সিকিউশনের জন্য থ্রেডের সংখ্যা সেট করুন।JavaScript, PINE, এবংMy Language, এবং টেমপ্লেটগুলিতে প্যারামিটার অপ্টিমাইজেশান সমর্থন করে না।

প্যারামিটার সমন্বয়গুলিminimum, maximum, এবংstep sizeব্যাকটেস্টিং সিস্টেম ব্যাকটেস্টিংয়ের জন্য এই প্যারামিটার সমন্বয়গুলির মাধ্যমে পুনরাবৃত্তি করে (যেমন, প্রতিটি প্যারামিটার সমন্বয় একবার ব্যাকটেস্টিং করে) ।সংখ্যাব্যাকটেস্টিং সিস্টেমে টাইপ অপ্টিমাইজ করা যায়।

ব্যাকটেস্ট সেটিংস সংরক্ষণ করুন

এ বিষয়েকৌশল সম্পাদনা পাতা, ব্যাকটেস্ট (নামমাত্র ব্যাকটেস্ট সিস্টেম) এর পৃষ্ঠায়, আপনি কৌশলটি ব্যাকটেস্ট করার জন্য ব্যাকটেস্ট কনফিগারেশন এবং কৌশল পরামিতিগুলির মতো বিকল্পগুলি সেট করতে পারেন। ব্যাকটেস্ট সেটিংস ব্যাকটেস্ট সময়সীমা, এক্সচেঞ্জ প্ল্যাটফর্ম, স্লিপপপয়েন্ট এবং পরিষেবা ফি ইত্যাদি উল্লেখ করে; যখন কৌশল পরামিতিগুলি কৌশলগুলির জন্য প্যারামিটার বিকল্পগুলি সেট করতে ব্যবহৃত হয়। যখন এই প্যারামিটার সেট করা হয়, আপনি সেট ব্যাকটেস্টিং কৌশল অনুসরণ করতে পারেন, তারপর কিভাবে সেট কনফিগারেশন তথ্য সংরক্ষণ করতে?

    1. আপনি Save Backtest Settings বোতামটি ব্যবহার করতে পারেনকৌশল সম্পাদনা পাতাব্যাকটেস্ট কনফিগারেশনের সমস্ত তথ্য (ব্যাকটেস্ট সেটিংস এবং কৌশল প্যারামিটার সেটিংস সহ) কোডের আকারে কৌশল উৎস কোডে রেকর্ড করা।
    1. যখন আপনি কৌশল সম্পাদনা পৃষ্ঠায় Save Strategy বোতামে ক্লিক করে একটি কৌশল সংরক্ষণ করেন, তখন প্ল্যাটফর্ম স্বয়ংক্রিয়ভাবে বর্তমান ব্যাকটেস্ট সেটিংস, কৌশল পরামিতি কনফিগারেশন এবং অন্যান্য তথ্য রেকর্ড করবে। কিভাবে ব্যাকটেস্ট কনফিগারেশন ব্যাকটেস্ট সিস্টেমে লোড করবেন?
    1. কৌশল সম্পাদনা পৃষ্ঠাটি রিফ্রেশ করার সময় বা এই কৌশল সম্পাদনা পৃষ্ঠাটি পুনরায় খোলার সময়, Save Backtest Settings বোতাম দ্বারা রেকর্ড করা ব্যাকটেস্ট কনফিগারেশন তথ্য প্রথমে স্বয়ংক্রিয়ভাবে লোড হবে।
    1. যদি ব্যাকটেস্ট কনফিগারেশনের কোন তথ্য বর্তমান কৌশল কোডে একটি মন্তব্য হিসাবে রেকর্ড করা না হয়backtest(Save Backtest Settings বোতামের মাধ্যমে কৌশল কোডে সংরক্ষণ করা হয়), ব্যাকটেস্ট সিস্টেম স্বয়ংক্রিয়ভাবে বর্তমান কৌশলটির জন্য Save Strategy বোতামটি সর্বশেষ ক্লিক করার সময় ব্যাকটেস্ট কনফিগারেশন তথ্যের সাথে ব্যাকটেস্ট সেটিংস কনফিগার করে।
    1. যদি কৌশল কোডের শুরুতে মন্তব্য আকারে রেকর্ড ব্যাকটেস্ট কনফিগারেশন তথ্য কৌশল সম্পাদনা পৃষ্ঠায় পরিবর্তিত হয়, আপনি কৌশল ব্যাকটেস্ট ইন্টারফেস বিকল্পে বর্তমানে আপডেট ব্যাকটেস্ট কনফিগারেশন তথ্য সিঙ্ক্রোনাইজ করতে হবে. আপনি ক্লিক করতে পারেন Backtest সেটিংস বোতাম উপরেbacktestকৌশল সম্পাদনার ক্ষেত্রে।
/*backtest
start: 2021-06-26 00:00:00
end: 2021-09-23 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Binance","currency":"BTC_USDT"}]
*/
'''backtest
start: 2021-06-26 00:00:00
end: 2021-09-23 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Binance","currency":"BTC_USDT"}]
'''
/*backtest
start: 2021-06-26 00:00:00
end: 2021-09-23 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Binance","currency":"BTC_USDT"}]
*/

ক্লিক করুন Save backtest settings, কিছু বিন্যাস পার্থক্য আছেJavaScript/Python/C++/MyLanguage/PINEকৌশল কোডে ব্যাকটেস্ট সেটিংস সংরক্ষণ করার সময় ভাষাঃ মাইল্যাঙ্গুয়েজঃ

(*backtest
start: 2021-06-26 00:00:00
end: 2021-09-23 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Binance","currency":"BTC_USDT"}]
*)

পাইন ভাষা:

/*backtest
start: 2021-06-26 00:00:00
end: 2021-09-23 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Binance","currency":"BTC_USDT"}]
*/

কাস্টম ডেটা উৎস

এফএমজেড কোয়ান্ট ট্রেডিং প্ল্যাটফর্মের ব্যাকটেস্টিং সিস্টেম কাস্টম ডেটা উত্সগুলিকে সমর্থন করে, ব্যাকটেস্টিং সিস্টেমGETব্যাকটেস্টের জন্য একটি বাহ্যিক ডেটা উত্স পাওয়ার জন্য একটি কাস্টম URL (সর্বজনীনভাবে অ্যাক্সেসযোগ্য URL) অনুরোধ করার পদ্ধতি। অতিরিক্ত অনুরোধ পরামিতিগুলি নিম্নরূপঃ

প্যারামিটার অর্থ ব্যাখ্যা
প্রতীক প্রতীকের নাম স্পট মার্কেটের তথ্য, যেমনঃBTC_USDT, ফিউচার মার্কেটের তথ্য যেমনঃBTC_USDT.swap, ফিউচার চিরস্থায়ী চুক্তি তহবিলের হার সংক্রান্ত তথ্য যেমনঃBTC_USDT.funding, ফিউচার পারপেক্ট কন্ট্রাক্টের মূল্য সূচকের তথ্য যেমনঃBTC_USDT.index
ইড বিনিময় যেমন OKX, Futures_OKX
গোলাকার তথ্যের নির্ভুলতা সত্য মানে কাস্টম ডেটা উত্স দ্বারা ফিড করা ডেটাতে নির্দিষ্ট নির্ভুলতা সংজ্ঞায়িত করা হয়। কাস্টম ডেটা উত্সের কাছে এফএমজেড কোয়ান্ট ট্রেডিং প্ল্যাটফর্ম ব্যাকটেস্টিং সিস্টেম দ্বারা প্রেরিত অনুরোধটি স্থির করা হয়ঃround=true
সময়কাল কে-লাইন ডেটা পিরিয়ড (মিলিসেকেন্ড) যেমনঃ60000একটি ১ মিনিটের সময়কাল
গভীরতা গভীরতা স্তর 1-20
বাণিজ্য ডেটা বিভক্ত করা প্রয়োজন কিনা true ((1) / false ((0)
থেকে শুরু সময় ইউনিক্স টাইমস্ট্যাম্প
থেকে শেষ সময় ইউনিক্স টাইমস্ট্যাম্প
বিস্তারিত প্রতীক বিবরণ জন্য তথ্য অনুরোধ সত্য মানে এটি একটি কাস্টম ডেটা উত্স দ্বারা সরবরাহ করা প্রয়োজন। কাস্টম ডেটা উত্সের কাছে FMZ কোয়ান্ট ট্রেডিং প্ল্যাটফর্ম ব্যাকটেস্টিং সিস্টেম দ্বারা প্রেরিত অনুরোধটি স্থির করা হয়ঃdetail=true
কাস্টম এই প্যারামিটার উপেক্ষা করা যেতে পারে

যখন স্পট এক্সচেঞ্জ এবং ফিউচার এক্সচেঞ্জ অবজেক্টের ডেটা উত্স একটি কাস্টম ডেটা উত্স (ফিডার) এ সেট করা থাকে, তখন ব্যাকটেস্টিং সিস্টেম কাস্টম ডেটা উত্স পরিষেবাতে একটি অনুরোধ পাঠায়ঃ

http://customserver:9090/data?custom=0&depth=20&detail=true&eid=Bitget&from=1351641600&period=86400000&round=true&symbol=BTC_USDT&to=1611244800&trades=1
http://customserver:9090/data?custom=0&depth=20&detail=true&eid=Futures_OKX&from=1351641600&period=86400000&round=true&symbol=BTC_USDT.swap&to=1611244800&trades=1

তথ্য বিন্যাস

ফেরত ফরম্যাট নিম্নলিখিত দুটি ফরম্যাটের মধ্যে একটি হতে হবে (যা সিস্টেম স্বয়ংক্রিয়ভাবে স্বীকৃতি দেবে):

  • সিমুলেশন লেভেল টিক, নিচে JSON ডেটার একটি উদাহরণ দেওয়া হল:

    {
        "detail": {
            "eid": "Binance",
            "symbol": "BTC_USDT",
            "alias": "BTCUSDT",
            "baseCurrency": "BTC",
            "quoteCurrency": "USDT",
            "marginCurrency": "USDT",
            "basePrecision": 5,
            "quotePrecision": 2,
            "minQty": 0.00001,
            "maxQty": 9000,
            "minNotional": 5,
            "maxNotional": 9000000,
            "priceTick": 0.01,
            "volumeTick": 0.00001,
            "marginLevel": 10
        },
        "schema":["time", "open", "high", "low", "close", "vol"],
        "data":[
            [1564315200000, 9531300, 9531300, 9497060, 9497060, 787],
            [1564316100000, 9495160, 9495160, 9474260, 9489460, 338]
        ]
    }
    
  • বট লেভেল টিক, নিম্নলিখিত JSON ডেটার একটি উদাহরণঃ টিক-লেভেল ব্যাকটেস্ট ডেটা (বাজারের গভীরতার তথ্য ধারণ করে, এবং গভীরতার বিন্যাসটি[price, volume]এর গভীরতা একাধিক স্তরের হতে পারে,asksদামের ক্রমবর্ধমান আদেশের জন্য,bidsদামের হ্রাসের জন্য) ।

    {
        "detail": {
            "eid": "Binance",
            "symbol": "BTC_USDT",
            "alias": "BTCUSDT",
            "baseCurrency": "BTC",
            "quoteCurrency": "USDT",
            "marginCurrency": "USDT",
            "basePrecision": 5,
            "quotePrecision": 2,
            "minQty": 0.00001,
            "maxQty": 9000,
            "minNotional": 5,
            "maxNotional": 9000000,
            "priceTick": 0.01,
            "volumeTick": 0.00001,
            "marginLevel": 10
        },
        "schema":["time", "asks", "bids", "trades", "close", "vol"],
        "data":[
            [1564315200000, [[9531300, 10]], [[9531300, 10]], [[1564315200000, 0, 9531300, 10]], 9497060, 787],
            [1564316100000, [[9531300, 10]], [[9531300, 10]], [[1564316100000, 0, 9531300, 10]], 9497060, 787]
        ]
    }
    
ক্ষেত্র বর্ণনা
বিস্তারিত অনুরোধকৃত তথ্যের ধরণ সম্পর্কে বিস্তারিত তথ্য,

যার মধ্যে রয়েছে মুদ্রার নাম, ট্রেডিং মুদ্রা, নির্ভুলতা, ন্যূনতম অর্ডার পরিমাণ ইত্যাদি স্কিমা. এটি ডাটাতে কলামের বৈশিষ্ট্য নির্দিষ্ট করে অ্যারে, যা বড় অক্ষর সংবেদনশীল এবং শুধুমাত্র সময় সীমাবদ্ধ, খোলা, উচ্চ, নিম্ন, বন্ধ, ভোল, জিজ্ঞাসা, বিড, ট্রেডস ডাটা। কলামের কাঠামো, স্কিম অনুযায়ী রেকর্ড করা ডাটা। সেটিংস.

বিস্তারিত ক্ষেত্র

ক্ষেত্র বর্ণনা
ইড এক্সচেঞ্জ আইডি, দয়া করে মনে রাখবেন যে স্পট এবং একটি ভবিষ্যৎ
কিছু এক্সচেঞ্জের বিভিন্ন ইড থাকে।
প্রতীক ট্রেডিং প্রোডাক্ট কোড
উপনাম এক্সচেঞ্জের প্রতীক বর্তমান
ট্রেডিং প্রোডাক্ট কোড
বেস মুদ্রা ট্রেডিং মুদ্রা
উদ্ধৃতিমুদ্রা মুদ্রা
মার্জিনমুদ্রা মার্জিন মুদ্রা
বেসপ্রিসিশন লেনদেনের মুদ্রার সঠিকতা
উদ্ধৃতিপরিষ্কারতা মূল্য নির্ধারণের মুদ্রা সঠিকতা
মিনিট ন্যূনতম অর্ডার পরিমাণ
সর্বাধিক সর্বাধিক অর্ডার পরিমাণ
নূন্যতম ন্যূনতম অর্ডার পরিমাণ
maxনোটিকাল সর্বোচ্চ অর্ডার পরিমাণ
দাম টিক দামের লাফ
ভলিউমচিহ্ন অর্ডার পরিমাণের সর্বনিম্ন পরিবর্তন মান (একটি লাফ
অর্ডার পরিমাণ)
মার্জিন লেভেল ফিউচার লিভারেজ ভ্যালু
চুক্তিপ্রকার স্থায়ী চুক্তির জন্য নির্ধারিতঃswap,

ব্যাকটেস্ট সিস্টেম তহবিল হার এবং মূল্য সূচক পাঠাতে থাকবে অনুরোধ।

বিশেষ কলাম বৈশিষ্ট্যasks, bids, trades:

ক্ষেত্র বর্ণনা মন্তব্যসমূহ
জিজ্ঞাসা / দরপত্র [মূল্য, পরিমাণ],...] উদাহরণস্বরূপ,

পত্রিকাLive Trading Level Tickতথ্যের উদাহরণঃ[[9531300, 10]]∙∙ ∙ ∙ ∙ ∙ ∙ ∙ ∙ ∙ ∙ উদাহরণস্বরূপ,Live Trading Level Tickতথ্যের উদাহরণঃ[[1564315200000, 0, 9531300, 10]] |

ফিউচার এক্সচেঞ্জে স্থায়ী চুক্তি ব্যাকটেস্টিং করার সময়, কাস্টম তথ্য উৎস এছাড়াও অতিরিক্ত অর্থায়ন হার এবং মূল্য তথ্য প্রয়োজন ব্যাকটেস্টিং সিস্টেম অনুরোধ পাঠাতে থাকবে শুধুমাত্র যখন অনুরোধকৃত বাজার তথ্য ফেরত দেওয়া হয় তখনই অর্থায়নের হার এবং ফেরত কাঠামোর বিস্তারিত ক্ষেত্রের মধ্যে রয়েছে"contractType": "swap"কী-ভ্যালু জোড়া।

যখন ব্যাকটেস্টিং সিস্টেমটি অর্থায়ন হার সংক্রান্ত তথ্য পায়, তখন এটি দামের সূচক সংক্রান্ত তথ্যের জন্য অনুরোধ পাঠাতে থাকবে।

তহবিলের হার সংক্রান্ত তথ্যের কাঠামো নিম্নরূপঃ

{
    "detail": {
        "eid": "Futures_Binance",
        "symbol": "BTC_USDT.funding",
        "alias": "BTC_USDT.funding",
        "baseCurrency": "BTC",
        "quoteCurrency": "USDT",
        "marginCurrency": "",
        "basePrecision": 8,
        "quotePrecision": 8,
        "minQty": 1,
        "maxQty": 10000,
        "minNotional": 1,
        "maxNotional": 100000000,
        "priceTick": 1e-8,
        "volumeTick": 1e-8,
        "marginLevel": 10
    },
    "schema": [
        "time",
        "open",
        "high",
        "low",
        "close",
        "vol"
    ],
    "data": [
        [
            1584921600000,
            -16795,
            -16795,
            -16795,
            -16795,
            0
        ],
        [
            1584950400000,
            -16294,
            -16294,
            -16294,
            -16294,
            0
        ]
        // ...
    ]
}
  • প্রতিবেশী সময়ের মধ্যে ব্যবধান 8 ঘন্টা
  • উদাহরণস্বরূপ, বিন্যান্সের তহবিলের হার প্রতি ৮ ঘণ্টায় আপডেট করা হয়। কেন অর্থায়নের হার -১৬৭৯৫? কারণ কে-লাইন ডেটার মতো, নেটওয়ার্ক ট্রান্সমিশনের সময় ফ্লোটিং পয়েন্ট নির্ভুলতার ক্ষতি এড়ানোর জন্য, ডেটা পূর্ণসংখ্যা টাইপ ব্যবহার করে; তহবিলের হার ডেটাও নেতিবাচক হতে পারে।

ব্যাকটেস্টিং থেকে একটি তহবিলের হার তথ্য অনুরোধের উদাহরণ সিস্টেম হলঃ

http://customserver:9090/data?custom=0&depth=20&detail=true&eid=Futures_Binance&from=1351641600&period=86400000&round=true&symbol=BTC_USDT.funding&to=1611244800&trades=0

দামের সূচকের তথ্যের কাঠামো নিম্নরূপঃ


{
    "detail": {
        "eid": "Futures_Binance",
        "symbol": "BTC_USDT.index",
        "alias": "BTCUSDT",
        "baseCurrency": "BTC",
        "quoteCurrency": "USDT",
        "contractType": "index",
        "marginCurrency": "USDT",
        "basePrecision": 3,
        "quotePrecision": 1,
        "minQty": 0.001,
        "maxQty": 1000,
        "minNotional": 0,
        "maxNotional": 1.7976931348623157e+308,
        "priceTick": 0.1,
        "volumeTick": 0.001,
        "marginLevel": 10,
        "volumeMultiple": 1
    },
    "schema": [
        "time",
        "open",
        "high",
        "low",
        "close",
        "vol"
    ],
    "data": [
        [1584921600000, 58172, 59167, 56902, 58962, 0],
        [1584922500000, 58975, 59428, 58581, 59154, 0],
        // ...
    ]
}

ব্যাকটেস্টিং দ্বারা প্রেরিত একটি মূল্য সূচক তথ্য অনুরোধের উদাহরণ সিস্টেম হলঃ

http://customserver:9090/data?custom=0&depth=20&detail=true&eid=Futures_Binance&from=1351641600&period=86400000&round=true&symbol=BTC_USDT.index&to=1611244800&trades=0

কাস্টম ডেটা উৎসের উদাহরণ

তথ্য উৎস ঠিকানা উল্লেখ করুন, যেমন,http://120.24.2.20:9090/data. কাস্টম ডাটা উৎস সেবা প্রোগ্রাম ব্যবহার করে লেখা হয়Golang:

package main

import (
    "fmt"
    "net/http"
    "encoding/json"
)

func Handle (w http.ResponseWriter, r *http.Request) {
    // e.g. set on backtest DataSourse: http://xxx.xx.x.xx:9090/data

    // request: GET http://xxx.xx.x.xx:9090/data?custom=0&depth=20&detail=true&eid=OKX&from=1584921600&period=86400000&round=true&symbol=BTC_USDT&to=1611244800&trades=1
    //              http://xxx.xx.x.xx:9090/data?custom=0&depth=20&detail=true&eid=Futures_Binance&from=1599958800&period=3600000&round=true&symbol=BTC_USDT.swap&to=1611244800&trades=0
    fmt.Println("request:", r)

    // response
    defer func() {
        // response data
        /* e.g. data
        {
            "detail": {
                "eid": "Binance",
                "symbol": "BTC_USDT",
                "alias": "BTCUSDT",
                "baseCurrency": "BTC",
                "quoteCurrency": "USDT",
                "marginCurrency": "USDT",
                "basePrecision": 5,
                "quotePrecision": 2,
                "minQty": 0.00001,
                "maxQty": 9000,
                "minNotional": 5,
                "maxNotional": 9000000,
                "priceTick": 0.01,
                "volumeTick": 0.00001,
                "marginLevel": 10
            },
            "schema": [
                "time",
                "open",
                "high",
                "low",
                "close",
                "vol"
            ],
            "data": [
                [1610755200000, 3673743, 3795000, 3535780, 3599498, 8634843151],
                [1610841600000, 3599498, 3685250, 3385000, 3582861, 8015772738],
                [1610928000000, 3582499, 3746983, 3480000, 3663127, 7069811875],
                [1611014400000, 3662246, 3785000, 3584406, 3589149, 7961130777],
                [1611100800000, 3590194, 3641531, 3340000, 3546823, 8936842292],
                [1611187200000, 3546823, 3560000, 3007100, 3085013, 13500407666],
                [1611273600000, 3085199, 3382653, 2885000, 3294517, 14297168405],
                [1611360000000, 3295000, 3345600, 3139016, 3207800, 6459528768],
                [1611446400000, 3207800, 3307100, 3090000, 3225990, 5797803797],
                [1611532800000, 3225945, 3487500, 3191000, 3225420, 8849922692]
            ]
        }
        */
        
        // /* Simulation level Tick
        ret := map[string]interface{}{
            "detail": map[string]interface{}{
                "eid": "Binance",
                "symbol": "BTC_USDT",
                "alias": "BTCUSDT",
                "baseCurrency": "BTC",
                "quoteCurrency": "USDT",
                "marginCurrency": "USDT",
                "basePrecision": 5,
                "quotePrecision": 2,
                "minQty": 0.00001,
                "maxQty": 9000,
                "minNotional": 5,
                "maxNotional": 9000000,
                "priceTick": 0.01,
                "volumeTick": 0.00001,
                "marginLevel": 10,
            },
            "schema": []string{"time","open","high","low","close","vol"},
            "data": []interface{}{
                []int64{1610755200000, 3673743, 3795000, 3535780, 3599498, 8634843151},  // 1610755200000 : 2021-01-16 08:00:00
                []int64{1610841600000, 3599498, 3685250, 3385000, 3582861, 8015772738},  // 1610841600000 : 2021-01-17 08:00:00
                []int64{1610928000000, 3582499, 3746983, 3480000, 3663127, 7069811875},
                []int64{1611014400000, 3662246, 3785000, 3584406, 3589149, 7961130777},
                []int64{1611100800000, 3590194, 3641531, 3340000, 3546823, 8936842292},
                []int64{1611187200000, 3546823, 3560000, 3007100, 3085013, 13500407666},
                []int64{1611273600000, 3085199, 3382653, 2885000, 3294517, 14297168405},
                []int64{1611360000000, 3295000, 3345600, 3139016, 3207800, 6459528768},
                []int64{1611446400000, 3207800, 3307100, 3090000, 3225990, 5797803797},
                []int64{1611532800000, 3225945, 3487500, 3191000, 3225420, 8849922692},
            },
        }
        // */

        /* Bot level Tick
        ret := map[string]interface{}{
            "detail": map[string]interface{}{
                "eid": "Binance",
                "symbol": "BTC_USDT",
                "alias": "BTCUSDT",
                "baseCurrency": "BTC",
                "quoteCurrency": "USDT",
                "marginCurrency": "USDT",
                "basePrecision": 5,
                "quotePrecision": 2,
                "minQty": 0.00001,
                "maxQty": 9000,
                "minNotional": 5,
                "maxNotional": 9000000,
                "priceTick": 0.01,
                "volumeTick": 0.00001,
                "marginLevel": 10,
            },
            "schema": []string{"time", "asks", "bids", "trades", "close", "vol"},
            "data": []interface{}{
                []interface{}{1610755200000, []interface{}{[]int64{9531300, 10}}, []interface{}{[]int64{9531300, 10}}, []interface{}{[]int64{1610755200000, 0, 9531300, 10}}, 9497060, 787},
                []interface{}{1610841600000, []interface{}{[]int64{9531300, 15}}, []interface{}{[]int64{9531300, 15}}, []interface{}{[]int64{1610841600000, 0, 9531300, 11}}, 9497061, 789},                
            },
        }
        */

        b, _ := json.Marshal(ret)
        w.Write(b)
    }()
}
func main () {
    fmt.Println("listen http://localhost:9090")
    http.HandleFunc("/data", Handle)
    http.ListenAndServe(":9090", nil)
}

পরীক্ষার কৌশল,JavaScriptউদাহরণঃ

/*backtest
start: 2021-01-16 08:00:00
end: 2021-01-22 00:00:00
period: 1d
basePeriod: 1d
exchanges: [{"eid":"OKX","currency":"BTC_USDT","feeder":"http://120.24.2.20:9090/data"}]
args: [["number",2]]
*/

function main() {
    var ticker = exchange.GetTicker()
    var records = exchange.GetRecords()
    Log(exchange.GetName(), exchange.GetCurrency())
    Log(ticker)
    Log(records)
}

স্থানীয় ব্যাকটেস্ট ইঞ্জিন

এফএমজেড কোয়ান্ট ট্রেডিং প্ল্যাটফর্মটিJavaScriptভাষা এবংPythonস্থানীয় ব্যাকটেস্ট ইঞ্জিনের ভাষা, ব্যাকটেস্টিংয়ের সময় অন্তর্নিহিত কে-লাইন সময়কাল সেটিং সমর্থন করে।

ব্যাকটেস্ট পৃষ্ঠা শর্টকাট কী

  • কৌশল সম্পাদনা পৃষ্ঠা এবং ব্যাকটেস্টিং পৃষ্ঠার মধ্যে স্যুইচ করার জন্য শর্টকাট কী চাবি ব্যবহার করুনCtrl +,Backtest পাতা এবং Edit Strategy পাতা ফিরে স্যুইচ করতে.Ctrl, কী চাপুন,.

  • সংরক্ষণ কৌশল জন্য শর্টকাট কী চাবি ব্যবহার করুনCtrl + sকৌশল সংরক্ষণ করার জন্য।

  • কৌশল ব্যাকটেস্ট শুরু করার জন্য শর্টকাট চাবি ব্যবহার করুনCtrl + bStart Backtest সক্ষম করার জন্য।

ব্যাকটেস্ট ডেটা ডাউনলোড করুন

  • ব্যাকটেস্টিং সিস্টেম লগ ডেটা ডাউনলোড করুন নির্দিষ্ট কৌশলটি খুলুন এবং কৌশলটি ব্যাকটেস্ট করতে ব্যাকটেস্ট পৃষ্ঠা এ স্যুইচ করুন। ব্যাকটেস্টের পরে প্রদর্শিত কৌশলটির অবস্থা তথ্য কলামে, উপরের ডানদিকে ডাউনলোড টেবিল বোতাম রয়েছে। ব্যাকটেস্টের শেষে স্থিতি কলামের ডেটাগুলির একটি সিএসভি ফাইল ডাউনলোড করতে এটিতে ক্লিক করুন।
  • ব্যাকটেস্টিং সিস্টেম স্ট্যাটাস বার ডাটা ডাউনলোড নির্দিষ্ট কৌশলটি খুলুন এবং কৌশলটি ব্যাকটেস্ট করতে ব্যাকটেস্ট পৃষ্ঠা এ স্যুইচ করুন। ব্যাকটেস্টের পরে প্রদর্শিত কৌশলটির লগ তথ্য কলামে, উপরের ডানদিকে ডাউনলোড টেবিল বোতাম রয়েছে। ব্যাকটেস্টিং লগ ডেটার CSV ফর্ম্যাট ফাইলটি ডাউনলোড করতে এটিতে ক্লিক করুন।

ব্যাকটেস্টিং সিস্টেমে শার্প অ্যালগরিদম

ব্যাকটেস্টিং সিস্টেমে শার্প অ্যালগরিদমের সোর্স কোডঃ

function returnAnalyze(totalAssets, profits, ts, te, period, yearDays) {
    // force by days
    period = 86400000
    if (profits.length == 0) {
        return null
    }
    var freeProfit = 0.03 // 0.04
    var yearRange = yearDays * 86400000
    var totalReturns = profits[profits.length - 1][1] / totalAssets
    var annualizedReturns = (totalReturns * yearRange) / (te - ts)

    // MaxDrawDown
    var maxDrawdown = 0
    var maxAssets = totalAssets
    var maxAssetsTime = 0
    var maxDrawdownTime = 0
    var maxDrawdownStartTime = 0
    var winningRate = 0
    var winningResult = 0
    for (var i = 0; i < profits.length; i++) {
        if (i == 0) {
            if (profits[i][1] > 0) {
                winningResult++
            }
        } else {
            if (profits[i][1] > profits[i - 1][1]) {
                winningResult++
            }
        }
        if ((profits[i][1] + totalAssets) > maxAssets) {
            maxAssets = profits[i][1] + totalAssets
            maxAssetsTime = profits[i][0]
        }
        if (maxAssets > 0) {
            var drawDown = 1 - (profits[i][1] + totalAssets) / maxAssets
            if (drawDown > maxDrawdown) {
                maxDrawdown = drawDown
                maxDrawdownTime = profits[i][0]
                maxDrawdownStartTime = maxAssetsTime
            }
        }
    }
    if (profits.length > 0) {
        winningRate = winningResult / profits.length
    }
    // trim profits
    var i = 0
    var datas = []
    var sum = 0
    var preProfit = 0
    var perRatio = 0
    var rangeEnd = te
    if ((te - ts) % period > 0) {
        rangeEnd = (parseInt(te / period) + 1) * period
    }
    for (var n = ts; n < rangeEnd; n += period) {
        var dayProfit = 0.0
        var cut = n + period
        while (i < profits.length && profits[i][0] < cut) {
            dayProfit += (profits[i][1] - preProfit)
            preProfit = profits[i][1]
            i++
        }
        perRatio = ((dayProfit / totalAssets) * yearRange) / period
        sum += perRatio
        datas.push(perRatio)
    }

    var sharpeRatio = 0
    var volatility = 0
    if (datas.length > 0) {
        var avg = sum / datas.length;
        var std = 0;
        for (i = 0; i < datas.length; i++) {
            std += Math.pow(datas[i] - avg, 2);
        }
        volatility = Math.sqrt(std / datas.length);
        if (volatility !== 0) {
            sharpeRatio = (annualizedReturns - freeProfit) / volatility
        }
    }

    return {
        totalAssets: totalAssets,
        yearDays: yearDays,
        totalReturns: totalReturns,
        annualizedReturns: annualizedReturns,
        sharpeRatio: sharpeRatio,
        volatility: volatility,
        maxDrawdown: maxDrawdown,
        maxDrawdownTime: maxDrawdownTime,
        maxAssetsTime: maxAssetsTime,
        maxDrawdownStartTime: maxDrawdownStartTime,
        winningRate: winningRate
    }
}
কৌশল সম্পাদক কৌশল এন্ট্রি ফাংশন