[TOC]

মৌলিক নির্দেশাবলী

শুরু করা

এফএমজেড কোয়ান্ট ট্রেডিং প্ল্যাটফর্ম কী করতে পারে?

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

সম্পূর্ণ টিউটোরিয়াল সিরিজ

গ্রাফিকাল টিউটোরিয়ালঃ

যদি কোনো সমস্যা হয়, আপনি যেকোনো সময় প্রশ্ন পোস্ট করতে পারেন এবং ফোরামে আলোচনা করতে পারেন, অথবা টিকিট জমা দিতে পারেন, অথবা টেলিগ্রাম গ্রুপের একজন প্রশাসকের সাথে যোগাযোগ করতে পারেন (টেলিগ্রাম), সাধারণভাবে বলতে গেলে, এই প্রশ্নের উত্তর দ্রুত দেওয়া হবে।

উন্নয়ন সহায়তার জন্য চ্যাটজিপিটি সমর্থন

FMZ Quantitative Trading Platform ChatGPT কে একটি উন্নয়ন সহায়তা সরঞ্জাম হিসেবে গ্রহণ করেছে, যা ড্যাশবোর্ড এর শর্টকাট বারে ChatGPT ক্লিক করে অ্যাক্সেস করা যাবে।চ্যাট জিপিটি সহায়ক সরঞ্জাম পৃষ্ঠা.

আমার কৌশল বাস্তবায়নের জন্য কোন প্রোগ্রামিং ভাষা উপলব্ধ?

FMZ কোয়ান্ট ট্রেডিং প্ল্যাটফর্ম ব্যবহার করতে সমর্থন করেJavaScript, TypeScript, Python, C++, Pine MylanguageএবংBlockly Visualizationকৌশল লিখতে এবং ডিজাইন করতে।

এটি সমর্থন করেTypeScriptভাষা, এখনও এটি সেট করুনJavaScriptকৌশল যখন আমরা কৌশল তৈরি, তারপর আমরা লিখুন// @ts-checkকৌশল কোড শুরুতে অথবা বোতামে ক্লিক করুনTypeScriptকৌশল সম্পাদনা এলাকার উপরের ডানদিকেTypeScriptপ্ল্যাটফর্ম কোডটি চিনবেTypeScriptস্বয়ংক্রিয়ভাবে এবং আপনাকে নিম্নলিখিতগুলির জন্য উপযুক্ত সংকলন এবং টাইপ চেকিং সমর্থন প্রদান করেঃ

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

আপনি শুধুমাত্র এই ভাষাগুলির মধ্যে একটি আয়ত্ত করতে হবে। কোড লেখার মাধ্যমে কৌশল ডিজাইনের উপায় সমর্থন করার পাশাপাশি, আপনি ভিজ্যুয়াল মডিউল (ব্লকলি) ব্যবহার করে কৌশল তৈরি করতে পারেন। ভিজ্যুয়ালাইজেশন মডিউল স্প্লাইসিং এবং কোডিং ছাড়াই কৌশল নির্মাণ, কৌশল ডিজাইনের আরও স্বজ্ঞাত উপায় গ্রহণ করে, যা প্রোগ্রাম্যাটিক এবং পরিমাণগত ট্রেডিংয়ের সাথে দ্রুত শুরু করার জন্য কৌশল ডিজাইনে আগ্রহ গড়ে তোলার জন্য খুব উপযুক্ত।

Blocklyভিজ্যুয়ালাইজেশন টিউটোরিয়ালঃ

সেট করুনPythonঅনুবাদক দ্বারা ব্যবহৃতPythonকৌশলগত কর্মসূচি

কৌশলগুলি লিখিতPython, ব্যাকটেস্টিং বা লাইভ ট্রেডিংয়ের সময়, যদি ডকার সিস্টেম পরিবেশে উভয়ই থাকেপাইথন২এবংপাইথন ৩ইনস্টল করা, আপনি সেট করতে পারেনPythonকৌশলটির প্রথম লাইনে রানটাইমে চালু করা হবে, যেমনঃ#!python3এবং#!python2, যাতে সিস্টেম স্বয়ংক্রিয়ভাবে অনুবাদক খুঁজে পাবে। এবং আপনি একটি পরম পথ নির্দিষ্ট করতে পারেন, যেমনঃ#!/usr/bin/python3.

ডকার কি?

ডকারকে আপনার ট্রেডিং কৌশলটির নির্বাহী হিসাবে বোঝা যেতে পারে, যা জটিল ডেটা অনুরোধ, ডেটা গ্রহণ, নেটওয়ার্ক লিঙ্ক, লগ পোস্টব্যাক ইত্যাদির জন্য দায়ী। ডকার আপনার সার্ভারে চালিত হয়, এমনকি যদি এফএমজেড কোয়ান্ট ট্রেডিং প্ল্যাটফর্মের ওয়েবসাইটে নেটওয়ার্ক ব্যর্থতা থাকে তবে এটি আপনার ডকারের ক্রিয়াকলাপকে প্রভাবিত করবে না। ডকারটি চালিত হতে পারেলিনাক্স, উইন্ডোজ, ম্যাক ওএস, অ্যান্ড্রয়েড, রাস্পবেরি পাই এআরএম লিনাক্সএবং অন্যান্য সিস্টেম।ডকার পৃষ্ঠা, লিনাক্স ডকার ইনস্টলেশন এবং আপডেট পদক্ষেপ. বট এবং লগ ডকার দ্বারা পরিচালিত ডিরেক্টরিতে সংরক্ষিত হয়/logs/storage. ফাইলটি একটিSqliteসঙ্গে ডাটাবেস ফাইলdb3, যা সরাসরি সম্পাদনা করা যেতে পারেSqliteএক্সটেনশন সহ ফাইলের জন্যdb3আসল বট ডাটাবেসে, ফাইলের নাম হচ্ছে বট আইডি।

সমর্থিত প্রোটোকল

  • ব্লকচেইন সম্পদঃ আমাদের প্ল্যাটফর্মে এখন ৫০টিরও বেশি প্রধানধারার ব্লকচেইন সম্পদ (ক্রিপ্টোকারেন্সি) এক্সচেঞ্জ সমর্থিত।
  • সাধারণ প্রোটোকল অ্যাক্সেসঃসাধারণ প্রটোকল

কৌশলগত নিরাপত্তা

যখন FMZ Quant Trading প্ল্যাটফর্মে ট্রেডিং কৌশলগুলি বিকাশ করা হয়, তখন কৌশল সামগ্রীগুলি কেবলমাত্র FMZ অ্যাকাউন্টধারীদের কাছে দৃশ্যমান। এবং FMZ পরিমাণগত ট্রেডিং প্ল্যাটফর্মে, আপনি কৌশল কোডের সম্পূর্ণ স্থানীয়করণ অর্জন করতে পারেন। উদাহরণস্বরূপ, একটি কৌশল যুক্তি একটিতে ক্যাপসুল করা যেতে পারেPythonপ্যাকেজ, যা কৌশল কোডে লোড করা হয়, যাতে কৌশল বিষয়বস্তু স্থানীয়করণ বাস্তবায়ন করা যেতে পারে।

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

এনক্রিপশনPythonকৌশল কোডঃ ডিফল্টরূপে,Pythonকৌশল কোডটি লেখকের দ্বারা ব্যবহৃত হলে এনক্রিপ্ট করা হয় না এবং অন্যদের কাছে ভাড়া দেওয়া হলে এনক্রিপ্ট করা হয়। নিম্নলিখিত কোডটি সম্পাদনা করেPythonকৌশল, আপনি ব্যক্তিগত ব্যবহার বা ভাড়া জন্য কৌশল কোড এনক্রিপ্ট কিনা তা নির্দিষ্ট করতে পারেন.Pythonকৌশল কোডের এনক্রিপশন সমর্থনকারী সংস্করণগুলি নিম্নরূপঃPython 2.7, Python 3.5এবংPython 3.6.

  • কৌশল লেখকরা এটি নিজে চালান এবং নিবন্ধন কোডের মাধ্যমে অন্যদের ব্যবহারের জন্য কৌশল কোডটি এনক্রিপ্ট করেঃ নির্দিষ্ট করুন#!pythonপাইথন অনুবাদক সংস্করণ হিসাবে, এবং তারপর ব্যবহার,পৃথক রাখা; এনক্রিপশন কমান্ড লিখুনencrypt. যদি আপনি সংস্করণ নির্দিষ্ট নাPython, যোগ করুন#!,encrypt directly.
 #!python,encrypt

অথবা

  #!encrypt
  • এটি কৌশল কোডগুলি এনক্রিপ্ট করবে না যখন কৌশল লেখকরা তাদের নিজস্ব ব্যবহারের জন্য চালায় এবং নিবন্ধন কোডের মাধ্যমে অন্যদের সাথে ভাগ করে নেয়ঃ
  #!python, not encrypted

অথবা

  #!not encrypted

কোড ব্যবহার করুনos.getenv('__FMZ_ENV__')এনক্রিপশন কোডটি বৈধ কিনা তা নির্ধারণ করতে; স্ট্রিং ফেরত"encrypt"এটি শুধুমাত্র বাস্তব বট বৈধ, এবং ব্যাকটেস্ট এনক্রিপ্ট করবে নাPythonকৌশল কোড।

#!encrypt
def main():
    ret = os.getenv('__FMZ_ENV__')
    # If the print variable ret is the string "encrypt" or ret == "encrypt" is true, that means the encryption is valid. 
    Log(ret, ret == "encrypt")

মূল নিরাপত্তা

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

  • আমাদের প্ল্যাটফর্ম সংবেদনশীল তথ্য স্থানীয়করণ সমর্থন করে, যেমন বিনিময় অ্যাকাউন্ট তথ্য এবং গোপন কী যে পৃষ্ঠায় প্ল্যাটফর্ম বিনিময় তথ্য কনফিগার করে, মাস্ক সহ সমস্ত এনক্রিপ্ট করা টেক্সট বক্স কন্ট্রোলগুলি ডকারের স্থানীয় ফাইলটি লোড করার জন্য ফাইলের পথটি কনফিগার করার উপায়টি সমর্থন করে।RSA KEYএক্সচেঞ্জের প্রমাণীকরণ পদ্ধতি একটি উদাহরণ হিসাবে ডাকার প্রোগ্রাম অবস্থিত যেখানে ডিভাইসে স্থানীয়ভাবে সংবেদনশীল তথ্য কনফিগার কিভাবে বিস্তারিতভাবে ব্যাখ্যা করার জন্য।
  1. RSA পাবলিক কী এবং প্রাইভেট কী তৈরি করুন। উদাহরণস্বরূপ,PKCS#8, অনেক সরঞ্জাম তৈরির জন্য উপলব্ধ, যেমনঃopenssl.
  2. তৈরি করুনRSA KEYএক্সচেঞ্জ, এবং আপলোড পাবলিক কী তৈরি১ম ধাপসৃষ্টির সময়।
  3. এর মধ্যে তৈরি করা প্রাইভেট কী সংরক্ষণ করুন১ম ধাপএকই ডিরেক্টরিতে ডকার ফরম্যাটেtxtফাইল, অথবা ডকার প্রোগ্রামের ডিরেক্টরিতে অন্যান্য পাথ.
  4. FMZ প্ল্যাটফর্মে এক্সচেঞ্জ কনফিগার করার সময়,RSA KEYকনফিগারেশনের সম্পাদনা বাক্সে এক্সচেঞ্জ দ্বারা তৈরিAccess Key.
  5. FMZ প্ল্যাটফর্মে এক্সচেঞ্জ কনফিগার করার সময়,txtফাইল একই স্তরের ডকারের ডিরেক্টরিতে স্থাপন করাতৃতীয় ধাপকনফিগারেশনের সম্পাদনা বাক্সেSecret Key. উদাহরণস্বরূপ, যদি ফাইলের নাম স্থাপন করা হয়ঃrsaKey.txt, এবং ফাইল এবং ডকার একই স্তরের ডিরেক্টরিতে পূরণ করা হয়ঃfile:///rsaKey.txt. যদি ফাইল ডকার প্রোগ্রামের ডিরেক্টরির পাশে ডিরেক্টরিতে থাকেrsa_key, পূরণ করুনঃfile:///rsa_key//rsaKey.txt. যদি আপনি স্থানrsaKey. txtআপনার কম্পিউটার বা সার্ভারে অন্য কোথাও এই নির্দেশাবলী অনুসারে অনুসরণ করুন, এটি লক্ষ করা উচিত যে এই ফাইলটি শুধুমাত্র একই স্তরের ডিরেক্টরি বা ডকার সম্পর্কিত উপ-ডিরেক্টরিতে স্থাপন করা যেতে পারে।

এটি স্থানীয়করণ এবং ব্যক্তিগত কী সংরক্ষণ নিরাপদ করে তোলে, আপনি উল্লেখ করতে পারেনভিডিও ব্যাখ্যাবিস্তারিত প্রক্রিয়া জন্য.

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

ব্যাকটেস্ট সিস্টেম কী এবং এটি কীসের জন্য ব্যবহৃত হয়?

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

ব্যাকটেস্ট সিস্টেমের তথ্য কি সঠিক এবং ব্যাকটেস্টের ফলাফলের সঠিকতা সম্পর্কে কি?

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

বিভিন্ন প্রোগ্রামিং ভাষার কৌশল ব্যাকটেস্টিং করার সময় সচেতন হওয়া বিষয়গুলিঃ

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

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

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

ব্যাকটেস্টিং সিস্টেমে কৌশল ডিবাগ পদ্ধতি

ক্রোম ডেভটুলসে জাভাস্ক্রিপ্ট কৌশল ব্যাকটেস্টিং ডিবাগিং

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

  • এনক্রিপ্ট করা মুদ্রা (ক্রিপ্টোকারেন্সি)

    নাম প্রকার নির্দেশাবলী
    বিটফিনেক্স স্পট এক্সচেঞ্জ অবজেক্ট সীমিত সংখ্যক ট্রেডিং জোড়া সমর্থন, যেমনঃBTC_USD, ETH_USDএবংLTC_USD, ইত্যাদি (দ্রষ্টব্য যে ট্রেডিং জোড়ার কোট মুদ্রা হলUSDডলার)
    বিন্যান্স স্পট এক্সচেঞ্জ অবজেক্ট সীমিত সংখ্যক ট্রেডিং জোড়া সমর্থন, যেমনঃBTC_USDT, ETH_USDT, ETH_BTCএবংLTC_BTCইত্যাদি।
    ঠিক আছে স্পট এক্সচেঞ্জ অবজেক্ট সীমিত সংখ্যক ট্রেডিং জোড়া সমর্থন, যেমনঃBTC_USDT, ETH_USDT, ETH_BTCএবংLTC_BTCইত্যাদি।
    হুবি স্পট এক্সচেঞ্জ অবজেক্ট সীমিত সংখ্যক ট্রেডিং জোড়া সমর্থন, যেমনঃBTC_USDT, ETH_USDT, ETH_BTCএবংLTC_BTCইত্যাদি।
    OKX ফিউচার ফিউচার এক্সচেঞ্জ অবজেক্ট সীমিত সংখ্যক ট্রেডিং জোড়া সমর্থন, যেমনঃBTC_USDএবংETH_USD, ইত্যাদি; ট্রেডিং জোড়ার কোট মুদ্রা হলUSD; নির্দিষ্ট চুক্তির কোড নির্ধারণের পরে (অনুগ্রহ করে ফাংশনটি দেখুন)exchange.SetContractType), চুক্তিটি ক্রিপ্টো-মার্জিনযুক্ত চুক্তি; সমর্থিত চুক্তি কোডগুলির মধ্যে রয়েছেঃthis_week, next_week, quarterএবংswap
    হুওবিডিএম ফিউচার এক্সচেঞ্জ অবজেক্ট HuobiDM হল Huobi ফিউচারস (Huobi Contract), যা সীমিত ট্রেডিং জোড়া সমর্থন করে, যেমনঃBTC_USDএবংETH_USD, ইত্যাদি; ট্রেডিং জোড়ার কোট মুদ্রা হলUSD; নির্দিষ্ট চুক্তির কোড নির্ধারণের পরে (অনুগ্রহ করে ফাংশনটি দেখুন)exchange.SetContractType), চুক্তিটি ক্রিপ্টো-মার্জিনযুক্ত চুক্তি; সমর্থিত চুক্তি কোডগুলির মধ্যে রয়েছেঃthis_week, next_week, quarterএবংswap.
    বিটমেক্স ফিউচার এক্সচেঞ্জ অবজেক্ট ট্রেডিং জুটি হলXBT_USD; নির্দিষ্ট চুক্তির কোড নির্ধারণের পরে (অনুগ্রহ করে ফাংশনটি দেখুন)exchange.SetContractType), চুক্তিটি একটি ক্রিপ্টো-মার্জিনযুক্ত চুক্তি; সমর্থিত চুক্তি কোড হলঃXBTUSD
    বিন্যান্স ফিউচার ফিউচার এক্সচেঞ্জ অবজেক্ট সীমিত সংখ্যক ট্রেডিং জোড়া সমর্থন, যেমনঃBTC_USDTএবংETH_USDT, ইত্যাদি; ট্রেডিং জোড়ার কোট মুদ্রা হলUSD; নির্দিষ্ট চুক্তির কোড নির্ধারণের পরে (অনুগ্রহ করে ফাংশনটি দেখুন)exchange.SetContractType), চুক্তিটি একটিUSDT- মার্জিনযুক্ত চুক্তি; সমর্থিত চুক্তির কোড হলswap
    ডেরিবিট অপশন ফিউচার এক্সচেঞ্জ অবজেক্ট ট্রেডিং জোড়া হলঃBTC_USDএবংETH_USD; নির্দিষ্ট চুক্তির কোড নির্ধারণের পরে (অনুগ্রহ করে ফাংশনটি দেখুন)exchange.SetContractType), চুক্তিটি একটি ক্রিপ্টো-মার্জিনযুক্ত চুক্তি; নির্দিষ্ট বিকল্প চুক্তির কোড নির্ধারণ করা প্রয়োজন

    ব্যাকটেস্ট সিস্টেমের ফিউচার এক্সচেঞ্জ অবজেক্টগুলির জন্য, ট্রেডিং জোড়া পরিবর্তন করা সাময়িকভাবে কৌশল কোডগুলিতে সমর্থিত নয়।

সিমুলেশন স্তর

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

বাস্তব বাজারের স্তর

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

বাস্তব বাজারের স্তরের ব্যাকটেস্ট বর্তমানে সমর্থন করে:

  • বিন্যান্স
  • OKX (OKX স্পট)
  • হুইবিডিএম (হুইবি ফিউচার)

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

এফএমজেড কোয়ান্ট ট্রেডিং প্ল্যাটফর্মের ব্যাকটেস্ট সিস্টেমের প্যারামিটার অপ্টিমাইজেশন ফাংশনটি ব্যাকটেস্টের সময় প্রতিটি প্যারামিটার অপ্টিমাইজেশান বিকল্প অনুসারে অপ্টিমাইজেশন সেট করা এবং বিকল্পগুলি নিম্নরূপ দেখানো হয়েছেঃ

  • ন্যূনতম মানঃ পরামিতিগুলির প্রাথমিক মান সীমাবদ্ধ করতে।
  • সর্বাধিক মানঃ ধ্রুবক পরিবর্তনের পরে পরামিতিগুলির সর্বাধিক মান সীমাবদ্ধ করতে।
  • ধাপের আকারঃ পরামিতিগুলির ইনক্রিমেন্টাল ভেরিয়েবল পরিমাণ।

প্যারামিটার সমন্বয় উৎপন্ন, এবং ব্যাকটেস্টিং (অর্থাৎ প্রতি প্যারামিটার সমন্বয় একবার ব্যাকটেস্টিং) জন্য ঐ সব সমন্বয় অতিক্রম। শুধুমাত্র কৌশল পরামিতিসংখ্যাব্যাকটেস্টিং সিস্টেমে টাইপ অপ্টিমাইজ করা যায়।

উদাহরণস্বরূপ, ব্যাকটেস্ট পৃষ্ঠায় প্যারামিটার অপ্টিমাইজেশান অপশন সেট করুনঃ

img

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

img

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

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

img

নিনJavaScriptউদাহরণস্বরূপ, এবং ক্লিক করুন Save Backtest Settings to Source File:

img

সোর্স ফাইলে ব্যাকটেস্ট সেটিংস সংরক্ষণ করুন এর মধ্যে সামান্য পার্থক্য রয়েছেJavaScript, Python, cppএবংMylanguage:

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

মাইল্যাঙ্গুয়েজ:

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

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

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

প্যারামিটার অর্থ ব্যাখ্যা
প্রতীক প্রতীকের নাম যেমন BTC_USD_OKCoin_EN
ঈদ বিনিময় যেমন OKCoin_EN
বৃত্তাকার দামের সঠিকতা যেমন 3, ফেরত তথ্য মূল্য 1000 দ্বারা গুণিত এবং ঘূর্ণিত করা আবশ্যক
চারপাশে পরিমাণগত নির্ভুলতা যেমন 2, ফেরত তথ্য পরিমাণ 100 দ্বারা গুণিত এবং ঘূর্ণিত করা আবশ্যক
সময়কাল বার পিরিয়ড (মিলিসেকেন্ড) যেমন ৬০,০০০ বার নির্দেশ করে এক মিনিট অনুরোধ করে
গভীরতা গভীরতা স্তর 1-20
বাণিজ্য ডেটা বিভক্ত করা প্রয়োজন কিনা সত্য/মিথ্যা
থেকে শুরু সময় ইউনিক্স টাইমস্ট্যাম্প
থেকে শেষ সময় ইউনিক্স টাইমস্ট্যাম্প

নোটঃ

Round and V-Round are two parameters designed to avoid losing the precision of floating-point numbers during network transmission. The price data, trading volume and order amount, are all transmitted using integers.

সেলাই করা তথ্যের একটি উদাহরণঃ

http://customserver:80/data?symbol=BTC_USD_OKCoin_EN&eid=OKCoin_EN&round=3&vround=3&period=900000&from=1564315200&to=1567267200

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

সাধারণ বার-লেভেল ব্যাকটেস্ট

{
    "schema":["time","open","high","low","close","vol"],
    "data":[[1564315200000,9531300,9531300,9497060,9497060,787],[1564316100000,9495160,9495160,9474260,9489460,338]]
}

টিক-লেভেল ব্যাকটেস্ট ডেটা (বাজার গভীরতার তথ্য সহ, [মূল্য, ভলিউম] এর গভীরতার বিন্যাস সহ একটি অ্যারে; গভীরতার একাধিক স্তর থাকতে পারে; Asks দামের ক্রমবর্ধমান আদেশকে বোঝায় এবং Bids দামের বিপরীত আদেশকে বোঝায়।)

{
    "schema":["time","asks", "bids","trades","close","vol"],
    "data":[[1564315200000,[[9531300,10]], [[9531300,10]],[[1564315200000,0,9531300,10]],9497060,787]]
}

বর্ণনা

ক্ষেত্র বর্ণনা
স্কিম এটি ডেটা অ্যারেতে কলামগুলির বৈশিষ্ট্যগুলি নির্দিষ্ট করে, যা কেস সংবেদনশীল এবং কেবল time, open, high, low, close, vol, asks এবং bids এর মধ্যে সীমাবদ্ধ
তথ্য একটি অ্যারে যা স্কিম অনুসারে ডেটা সঞ্চয় করে

তথ্য বিন্যাস

ক্ষেত্র বর্ণনা
অনুরোধ/প্রস্তাব [মূল্য, পরিমাণ,...]
বাণিজ্য [সময়, দিকনির্দেশনা, ০: কিনুন, ১ঃ বিক্রয়, মূল্য, পরিমাণ,...]

অর্থায়ন হার সংক্রান্ত তথ্য প্রদানঃ

উদাহরণস্বরূপ, বাইনারেন্স ফিউচারস ব্যাকটেস্টিংয়ের সময়, তহবিলের হারের অতিরিক্ত ডেটা থাকা প্রয়োজন, যা কাস্টম ডেটা উত্স দ্বারা সরবরাহ করা দরকার। উদাহরণস্বরূপ, বাইনারেন্স ফিউচারসের ব্যাকটেস্টিংয়ের সময় অনুরোধ করা তহবিলের হারের ডেটা কাঠামো নিম্নরূপ দেখানো হয়েছেঃ

{
  "detail": {},
  "symbol": "futures_binance.eth_usdt.funding",
  "schema": ["time", "open", "high", "low", "close", "vol"],
  "data": [
    [1582876800000, 25289, 25289, 25289, 25289, 0],
    [1582905600000, 30522, 30522, 30522, 30522, 0],
    [1582934400000, 40998, 40998, 40998, 40998, 0],
        ...
    [1626652800000, 198, 198, 198, 198, 0],
    [1626681600000, 691, 691, 691, 691, 0],                  // The adjacent periodic interval is 8 hours
    [1626710400000, 310, 310, 310, 310, 0],                  // The funding rate of Binance updates every 8 hours, and why the data of the funding rate turns out to be 310?
    [1626739200000, 310, 310, 310, 310, 0],                  // Like the bars data, to avoid losing the precision of floating-point numbers during network transmission, the data uses integer, so the data needs to be processed according to round parameter; the data, returned to the backtest system after processing, is 310 
    [1626768000000, -41610, -41610, -41610, -41610, 0],      // The funding rate might be a negative value
    [1626796800000, -5125, -5125, -5125, -5125, 0],
        ...   
    [1627977600000, 10000, 10000, 10000, 10000, 0]
  ]
}

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

http://customserver:80/data?symbol=futures_binance.eth_usdt.funding&eid=Futures_Binance&round=8&vround=5&depth=20&trades=1&custom=0&period=3600000&from=1360771200&to=1628006400

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

তথ্য উৎস, ইউআরএল উল্লেখ করুনঃhttp://xxx.xx.x.xx:9090/dataডাটা সার্ভার কাস্টমাইজ করুন, গোলংয়ে লেখাঃ

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
    // r.URL: /data?depth=20&detail=true&eid=Binance&from=1566820800&period=900000&round=3&symbol=BTC_USDT_Binance&to=1569686400&trades=1&vround=5
    // response
    defer func() {
        // response data
        /* e.g. data
        {
            "schema":["time","open","high","low","close","vol"],
            "data":[
                [1564315200000,9531300,9531300,9497060,9497060,787],
                [1564316100000,9495160,9495160,9474260,9489460,338]
            ]
        }
        */
        ret := map[string]interface{}{
            "schema" : []string{"time","open","high","low","close","vol"},
            "data" : []interface{}{
                []int64{1564315200000,9531300,9531300,9497060,9497060,787},
                []int64{1564316100000,9495160,9495160,9474260,9489460,338},
            },
        }
        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: 2019-07-28 00:00:00
end: 2019-07-29 00:00:00
period: 1m
platforms: [{"eid":"OKX","currency":"BTC_USDT","feeder":"http://120.24.2.20:9090/data"}]
*/

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

ব্যাকটেস্ট সিস্টেমে কাস্টম ডেটা দ্বারা আঁকা চার্টঃ

কৌশল মুদ্রণ তথ্যঃ

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

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

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

  • কৌশল সম্পাদনা পৃষ্ঠা এবং ব্যাকটেস্টিং পৃষ্ঠার মধ্যে স্যুইচ করার জন্য শর্টকাট কী

    চাবি ব্যবহার করুনCtrl +,Backtest পাতা এবং Edit Strategy পাতা ফিরে স্যুইচ করতে.Ctrl, কী চাপুন,.

  • সংরক্ষণ কৌশল জন্য শর্টকাট কী

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

  • কৌশল ব্যাকটেস্ট শুরু করার জন্য শর্টকাট

    চাবি ব্যবহার করুনCtrl + bStart Backtest সক্ষম করার জন্য।

কোডের বর্ণনা

এন্ট্রি ফাংশন

ফাংশনের নাম বর্ণনা
main() এটি একটি এন্ট্রি ফাংশন।
onexit() এটি একটি পরিষ্কার ফাংশন যখন স্বাভাবিকভাবে প্রস্থান, তার সর্বোচ্চ এক্সিকিউশন সময় 5 মিনিট, যা undeclared ছেড়ে দেওয়া যেতে পারে; যদি সময়সীমা ঘটে, একটিবিরতি দিনত্রুটি রিপোর্ট করা হবে।
onerror() এটি একটি অস্বাভাবিক প্রস্থান ফাংশন, এর সর্বোচ্চ এক্সিকিউশন সময় 5 মিনিট, যা undeclared ছেড়ে দেওয়া যেতে পারে।Pythonএবংcppএই ফাংশন সমর্থন করে না.
init() এটি একটি প্রারম্ভিকীকরণ ফাংশন, তার কৌশল প্রোগ্রাম স্বয়ংক্রিয়ভাবে কল করা হবে যখন এটি চালানো শুরু, যা undeclared ছেড়ে দেওয়া যেতে পারে।
  • বর্ণনাঃ
    1. ব্যাকটেস্ট সিস্টেম ফাংশন সমর্থন করে নাonerror().
    1. যদি ফাংশনonerror()বট, ফাংশন ট্রিগার করা হয়onexit()সক্রিয় করা হবে না।

এক্সিট ((()

onexit(), ব্যবহারকারী দ্বারা উপলব্ধ সর্বোচ্চ 5 মিনিটের এক্সিকিউশন সময় সঙ্গে পরিস্কার কাজ প্রক্রিয়া।

function main(){
    Log("Start running, stop after 5 seconds, and execute onexit function!")
    Sleep(1000 * 5)
}

// onexit function implementation
function onexit(){
    var beginTime = new Date().getTime()
    while(true){
        var nowTime = new Date().getTime()
        Log("The program stops counting down..The cleaning starts and has passed:", (nowTime - beginTime) / 1000, "Seconds!")
        Sleep(1000)
    }
}
import time 
def main():
    Log("Start running, stop after 5 seconds, and execute onexit function!")
    Sleep(1000 * 5)

def onexit():
    beginTime = time.time() * 1000
    while True:
        ts = time.time() * 1000
        Log("The program stops counting down..The cleaning starts and has passed:", (ts - beginTime) / 1000, "Seconds!")
        Sleep(1000)
void main() {
    Log("Start running, stop after 5 seconds, and execute onexit function!");
    Sleep(1000 * 5);
}

void onexit() {
    auto beginTime = Unix() * 1000;
    while(true) {
        auto ts = Unix() * 1000;
        Log("The program stops counting down..The cleaning starts and has passed:", (ts - beginTime) / 1000, "Seconds!");
        Sleep(1000);
    }
}

ইনস্টল করুন

ব্যবহারকারী সূচনা ফাংশন বাস্তবায়নinit(), যা স্বয়ংক্রিয়ভাবে ফাংশন চালানো হবেinit()কৌশল শুরুতে প্রাথমিকীকরণ টাস্ক সম্পন্ন করার জন্য।

function main(){
    Log("The first line of the code executed in the program!", "#FF0000")
    Log("Exit!")
}

// Initialization Function
function init(){     
    Log("Initialization!")
}
def main():
    Log("The first line of the code is executed!", "#FF0000")
    Log("Exit!")

def init():
    Log("Initialization!")
void main() {
    Log("The first line of the code is executed!", "#FF0000");
    Log("Exit!");
}

void init() {
    Log("Initialization!");
}

ত্রুটি ((()

ফাংশন সম্পাদনonerror()একটি ব্যতিক্রম ঘটে যখন ট্রিগার করা হবে.Pythonএবংcpp.

function main() {
    var arr = []
    Log(arr[6].Close)
}

function onerror() {
    Log("error")
}
# not supported by python 
// not supported by C++ 

ক্লাসিক কৌশল কাঠামো

এর মধ্যে লেখা কৌশলগুলোতেJavaScript, Pythonএবংcpp,Sleep()ফাংশনটি এই কৌশলগুলির মূল লুপে কল করা দরকার। এটি ব্যাকট্র্যাকিং গতি নিয়ন্ত্রণ করতে ব্যবহৃত হবে। বটে, এটি কৌশল পোলিং ব্যবধান নিয়ন্ত্রণ করতে ব্যবহৃত হয়, এবং এক্সচেঞ্জের এপিআই ইন্টারফেসে অ্যাক্সেসের অনুরোধের ফ্রিকোয়েন্সিও নিয়ন্ত্রণ করে।

  • ক্রিপ্টোকারেন্সি কৌশলগুলির মৌলিক কাঠামোগত উদাহরণঃ

    function onTick(){
        //Write strategy logic here, and it will be called constantly, such as printing market information
        Log(exchange.GetTicker())
    }
    
    function main(){
        while(true){
            onTick()
            //The function "Sleep" is mainly used to control the polling frequency of cryptocurrency strategies to prevent accessing the exchange API interafce too frequently 
            Sleep(60000)
        }
    }
    
    def onTick():
        Log(exchange.GetTicker())
    
    def main():
        while True:
            onTick()
            Sleep(60000)
    
    void onTick() {
        Log(exchange.GetTicker());
    }
    
    void main() {
        while(true) {
            onTick();
            Sleep(60000);
        }
    }
    

    সবচেয়ে সহজ উদাহরণটি নিই, যদি আমি প্রতি সেকেন্ডে এক্সচেঞ্জে 100 এর দাম এবং 1 এর পরিমাণের সাথে একটি ক্রয় অর্ডার দিতে চাই, আমি এটি এভাবে লিখতে পারিঃ

    function onTick(){
        // It is just an example; for all the assets will be used to place orders fast during backtest or in the bot, do not implement the example in the bot
        exchange. Buy(100, 1)
    }
    
    function main(){
        while(true){
            onTick()
            // The pause period can be customized in millisecond (1 second = 1000 milliseconds)
            Sleep(1000)
        }
    }
    
    def onTick():
        exchange.Buy(100, 1)
    
    def main():
        while True:
            onTick()
            Sleep(1000)
    
    void onTick() {
        exchange.Buy(100, 1);
    }
    
    void main() {
        while(true) {
            onTick();
            Sleep(1000);
        }
    }
    

টেমপ্লেট লাইব্রেরি

দ্যটেমপ্লেট লাইব্রেরিFMZ Quant Trading প্ল্যাটফর্মের একটি পুনরায় ব্যবহারযোগ্য কোড মডিউল, ট্রেডিং কৌশল কোডগুলির একটি বিভাগ হিসাবে কাজ করে।টেমপ্লেট লাইব্রেরি, একটি টেমপ্লেট Strategy পৃষ্ঠায় যোগ করা হয় যা বর্তমানে FMZ Quant Trading প্ল্যাটফর্মে লগ ইন করা অ্যাকাউন্ট। তৈরির পরে, এটি আর স্বাভাবিক কৌশল বিভাগে পরিবর্তন করা সম্ভব নয়।

টেমপ্লেট লাইব্রেরি ইনJavaScript:

img

টেমপ্লেট লাইব্রেরি ইনPython:

img

টেমপ্লেট লাইব্রেরি ইনcpp:

img

  • টেমপ্লেট লাইব্রেরির এক্সপোর্ট ফাংশন এক্সপোর্ট ফাংশনটি টেমপ্লেট লাইব্রেরি এর একটি ইন্টারফেস ফাংশন, এবং এটি টেমপ্লেট লাইব্রেরি এর সাথে সম্পর্কিত কৌশল দ্বারা কল করা যেতে পারে। টেমপ্লেট লাইব্রেরিতে এক্সপোর্ট করা ফাংশনটি ঘোষণা এবং বাস্তবায়নের উদাহরণ কোডটি নিম্নরূপঃ

    /*
    -- This method is called directly with $.Test() after the strategy refers to the template
    -- The "main" function will not be triggered in the strategy, and it is only used as the entry point for template debugging
    */
    $.Test = function() {
        Log('Test')
    }
    
    function main() {
        $.Test()
    }
    
    def Test():
        Log("template call")
    
    # Export "Test" function; the main strategy can be called by ext.Test()
    ext.Test = Test 
    
    // The strategy refers to the template and calls this method directly with ext::Test()
    void Test() {
        Log("template call");
    }
    
  • টেমপ্লেট লাইব্রেরি প্যারামিটার টেমপ্লেট লাইব্রেরি এর কোডে গ্লোবাল ভেরিয়েবলের আকারে ব্যবহৃত নিজস্ব ইন্টারফেস প্যারামিটারও সেট করতে পারে।

    টেমপ্লেট লাইব্রেরি প্যারামিটার সেটিংসঃ

    img

    টেমপ্লেট লাইব্রেরি কোডঃ

    $.SetParam1 = function(p1) {
        param1 = p1
    }
    
    $.GetParam1 = function() {
        Log("param1:", param1)
        return param1
    }
    
    def SetParam1(p1):
        global param1
        param1 = p1
    
    def GetParam1():
        Log("param1:", param1)
        return param1
    
    ext.SetParam1 = SetParam1
    ext.GetParam1 = GetParam1
    
    void SetParam1(float p1) {
        param1 = p1;
    }
    
    float GetParam1() {
        Log("param1:", param1);
        return param1;
    }
    

    এই নিবন্ধে কৌশল কোড দেখুন।টেমপ্লেট লাইব্রেরিউপরে উল্লিখিত উদাহরণঃ

    function main () {
        Log("call $.GetParam1:", $.GetParam1())
        Log("call $.SetParam1:", "#FF0000")
        $.SetParam1(20)
        Log("call $.GetParam1:", $.GetParam1())
    }
    
    def main():
        Log("call ext.GetParam1:", ext.GetParam1())
        Log("call ext.SetParam1:", "#FF0000")
        ext.SetParam1(20)
        Log("call ext.GetParam1:", ext.GetParam1())
    
    void main() {
        Log("call ext::GetParam1:", ext::GetParam1());
        Log("call ext::SetParam1:", "#FF0000");
        ext::SetParam1(20);
        Log("call ext::GetParam1:", ext::GetParam1());
    }
    

    img

  • উদ্ধৃতি টেমপ্লেট লাইব্রেরি

    কৌশল সম্পাদনা পৃষ্ঠার টেমপ্লেট কলামে উল্লেখটি পরীক্ষা করার পরে, কৌশল সংরক্ষণ করুন।

    img

অন্তর্নির্মিত কাঠামো

গ্লোবাল ভেরিয়েবল

বিনিময়

Exchangeএক্সচেঞ্জ অবজেক্ট হিসাবে বিবেচিত হতে পারে। ডিফল্টরূপে, এটি কৌশল পরামিতিগুলিতে যুক্ত প্রথম এক্সচেঞ্জ অবজেক্ট হিসাবে বিবেচিত হয়। এক্সচেঞ্জের সাথে সমস্ত ডেটা মিথস্ক্রিয়া এই অবজেক্টের ফাংশনগুলির মাধ্যমে উপলব্ধি করা হয়।

  • Backtest এ এক্সচেঞ্জ অবজেক্ট যোগ করা হচ্ছে

  • Bot পাতায় বিনিময় বস্তু যোগ করা হচ্ছে

যোগ করা বিনিময় বস্তুর সাথে মিলে যায়exchangeকোডের বিষয়বস্তুঃ

function main() {
    Log("The name of the first exchange object added on the bot page or backtest page:", exchange.GetName(), ", Label:", exchange.GetLabel())
}
def main():
    Log("The name of the first exchange object added on the bot page or backtest page:", exchange.GetName(), ", Label:", exchange.GetLabel())
void main() {
    Log("The name of the first exchange object added on the bot page or backtest page:", exchange.GetName(), ", Label:", exchange.GetLabel());
}
বিনিময়

এটি একটি অ্যারে হিসাবে বোঝা যেতে পারে যা সমস্ত বিনিময় বস্তু যেমনexchangeএক্সচেঞ্জ অবজেক্ট, যার মধ্যে একাধিক এক্সচেঞ্জ অবজেক্ট থাকতে পারে;exchanges[0]হয়exchange.

যোগ করা বিনিময় বস্তুর সাথে মিলে যায়exchanges[0], exchanges[1], exchanges[2]... এবং কৌশল কোড ইত্যাদি।

function main() {
    for(var i = 0; i < exchanges.length; i++) {
        Log("Index of the exchange object added (the first one is 0 and so on):", i, "Name:", exchanges[i].GetName(), "Label:", exchanges[i].GetLabel())
    }
}
def main():
    for i in range(len(exchanges)):
        Log("Index of the exchange object added (the first one is 0 and so on):", i, "Name:", exchanges[i].GetName(), "Label:", exchanges[i].GetLabel())
void main() {
    for(int i = 0; i < exchanges.size(); i++) {
        Log("Index of the exchange object added (the first one is 0 and so on):", i, "Name:", exchanges[i].GetName(), "Label:", exchanges[i].GetLabel());
    }
}
অর্ডারের অবস্থা

বৈশিষ্ট্যStatusমধ্যেOrder structure.

ধ্রুবক নাম সংজ্ঞা মূল্য
অর্ডার_স্টেট_পেন্ডিং অপূর্ণ 0
ORDER_STATE_CLOSED শেষ 1
ORDER_STATE_CANCELED-এর জন্য অনুরোধ বাতিল 2
ORDER_STATE_UNKNOWN অজানা অবস্থা (অন্যান্য অবস্থা) 3

ORDER_STATE_UNKNOWNস্ট্যাটাস কল করতে পারেনexchange.GetRawJSON()মূল অর্ডার অবস্থা তথ্য পেতে, এক্সচেঞ্জ ফাইল অনুসন্ধান, এবং নির্দিষ্ট বিবরণ দেখতে. ফর্মের ধ্রুবক নামগুলি সরাসরি কৌশল কোডের সাথে তুলনা করতে ব্যবহার করা যেতে পারেStatusমধ্যেOrderএই ধ্রুবক নামগুলি মুদ্রণ করলে অর্ডারের স্থিতি প্রদর্শিত হবে।ধ্রুব নামএবং তাদের সংশ্লিষ্টমান, এবং নীচের অন্যান্য ধ্রুবক নামগুলি একইভাবে কাজ করে, তাই তাদের সম্পর্কে আরও বিস্তারিত বিবরণ থাকবে না।

অর্ডার লেনদেনের ধরন

বৈশিষ্ট্যTypeমধ্যেOrder structure.

ধ্রুবক নাম সংজ্ঞা মূল্য
ORDER_TYPE_BUY ক্রয় আদেশ 0
ORDER_TYPE_SELL বিক্রয় আদেশ 1
পজিশনের ধরন

বৈশিষ্ট্যTypeমধ্যেPosition structure.

ধ্রুবক নাম সংজ্ঞা বর্ণনা প্রযোজ্য মূল্য
PD_LONG দীর্ঘ অবস্থান ক্রিপ্টোকারেন্সি ফিউচার ব্যবহারexchange.SetDirection("closebuy")বন্ধ অবস্থান দিক সেট করতে, এবং অবস্থান এই ধরনের বন্ধ ক্রিপ্টোকারেন্সি ফিউচার 0
PD_SHORT শর্ট পজিশন ক্রিপ্টোকারেন্সি ফিউচার ব্যবহারexchange.SetDirection("closesell")বন্ধ অবস্থান দিক সেট করতে, এবং অবস্থান এই ধরনের বন্ধ ক্রিপ্টোকারেন্সি ফিউচার 1
ফিউচার ওপেনিং ও ক্লোজিং পজিশনের দিকনির্দেশ

বৈশিষ্ট্যOffsetমধ্যেOrder structure.

ধ্রুবক নাম সংজ্ঞা মূল্য
ORDER_OFFSET_OPEN ওপেন পজিশন অর্ডার 0
ORDER_OFFSET_CLOSE ক্লোজ পজিশন অর্ডার 1
কৌশল পরামিতি

ট্রেডিং কৌশল কোডগুলিতে, কৌশল ইন্টারফেসে সেট করা কৌশল পরামিতিগুলি গ্লোবাল ভেরিয়েবলের আকারে প্রতিফলিত হয়।JavaScriptভাষা সরাসরি পরামিতি মান সেট বা কৌশল ইন্টারফেসে পরিবর্তিত অ্যাক্সেস করতে পারেন;Pythonকৌশল, মূল শব্দglobalকৌশলটির সামগ্রিক ভেরিয়েবলগুলি পরিবর্তন করার জন্য এটি প্রয়োজনীয়।

প্যারামিটার প্রকারঃ

img

ভেরিয়েবল বর্ণনা মন্তব্যসমূহ প্রকার ডিফল্ট মান বর্ণনা
সংখ্যা সংখ্যাসূচক প্রকার মন্তব্যসমূহ সংখ্যা (সংখ্যা) 1 সি++ কৌশল একটি ফ্লোটিং-পয়েন্ট টাইপ
স্ট্রিং স্ট্রিং মন্তব্যসমূহ স্ট্রিং (স্ট্রিং) হ্যালো এফএমজেড ডিফল্ট মান উদ্ধৃত করা প্রয়োজন হয় না. ইনপুট একটি স্ট্রিং হিসাবে চিকিত্সা করা হয়
কমবক্স কম্বোবক্স মন্তব্যসমূহ কম্বোবক্স (নির্বাচিত) 1|2|3 কমবক্স ভেরিয়েবল নিজেই একটি সংখ্যাসূচক মান, যা কমবক্স কন্ট্রোল দ্বারা নির্বাচিত কলামের সূচককে উপস্থাপন করে। প্রথম কমবক্সের মান 1 এবং অন্যান্যগুলি 0 ইত্যাদি
বুল চেক অপশন মন্তব্যসমূহ বুলিয়ান (সত্য/মিথ্যা) সত্য যদি চেক করা হয়, ভেরিয়েবল bool true হয়; যদি চেক না করা হয়, ভেরিয়েবল bool false হয়
সিক্রেটস্ট্রিং এনক্রিপ্ট করা স্ট্রিং মন্তব্যসমূহ এনক্রিপ্ট করা স্ট্রিং (স্ট্রিং) পাসওয়ার্ড স্ট্রিংয়ের মতো একই ব্যবহারের সাথে, এনক্রিপ্ট করা স্ট্রিংটি এনক্রিপশন দ্বারা প্রেরণ করা হবে এবং সরল পাঠ্যে প্রেরণ করা হবে না
  • ইন্টারফেস প্যারামিটারগুলি কৌশল সম্পাদনা পৃষ্ঠার কোড সম্পাদনা বিভাগের নীচে কৌশল প্যারামিটার বিভাগে সেট করা হয়।
  • ইন্টারফেস পরামিতিগুলি কৌশল কোডে গ্লোবাল ভেরিয়েবল হিসাবে বিদ্যমান, অর্থাৎ, ইন্টারফেস পরামিতিগুলি কোডে সংশোধন করা যেতে পারে।
  • কৌশল কোডের ইন্টারফেস পরামিতিগুলির ভেরিয়েবল নাম (উপরের ফর্মটিতে দেখা গেছে):number, string, combox, bool, secretString.
  • বর্ণনা বিকল্পঃ কৌশল ইন্টারফেসের ইন্টারফেস পরামিতিগুলির নাম।
  • মন্তব্য বিকল্পঃ ইন্টারফেস পরামিতিগুলির বিস্তারিত বিবরণ; যখন মাউসটি ইন্টারফেস পরামিতিগুলির উপরে থাকে তখন বিবরণ প্রদর্শিত হবে।
  • টাইপ অপশনঃ ইন্টারফেস পরামিতির ধরন।
  • ডিফল্ট মান বিকল্পঃ ইন্টারফেস পরামিতিগুলির ডিফল্ট মান।

প্যারামিটার নির্ভরতা সেটিংসঃ একটি প্যারামিটার সেট করা যেতে পারে অন্য প্যারামিটার প্রদর্শিত এবং প্যারামিটার নির্বাচন উপর ভিত্তি করে লুকানো করার অনুমতি দেয়. উদাহরণস্বরূপ, আমরা প্যারামিটার সেটnumberA, যা একটি সংখ্যাসূচক টাইপ. আমরা যাকnumberAপ্যারামিটার কিনা তার উপর ভিত্তি করে প্রদর্শিত বা লুকানো হবেisShowA(বুলিয়ান টাইপ) সত্য বা মিথ্যা হয়. আমরা পরিবর্তনশীল সেট করতে হবেnumberAইন্টারফেস প্যারামিটার সম্পর্কেঃnumberA@isShowA.

img

এই ভাবে, যদি প্যারামিটারisShowAচেক করা হয় না, প্যারামিটারnumberAComboBox নিয়ন্ত্রণ টাইপ পরামিতি হিসাবে, পরামিতির নির্ভর অংশ পরামিতি মান সমান কিনা তা বিচার করা হয়সূচক মানএকই ভাবে, প্যারামিটার নিতেisShowAউদাহরণস্বরূপ, যখন পরামিতিতে ভেরিয়েবল সেট, লিখুনঃnumberA@combox==2. প্যারামিটারnumberAপ্যারামিটার প্রদর্শন বা লুকিয়ে রাখা হবে কিনা তার উপর ভিত্তি করেcomboxতৃতীয় বিকল্প হিসাবে পরীক্ষা করা হবে (যেখানে সূচক 0 প্রথম বিকল্পের সাথে মিলে যায়, সূচক 1 দ্বিতীয়টির সাথে মিলে যায় এবং সূচক 2 তৃতীয়টির সাথে মিলে যায়) ।

কৌশল ইন্টারফেস পরামিতি, ইন্টারেক্টিভ কন্ট্রোল এবং প্যারামিটার গ্রুপিং ফাংশন টেমপ্লেট এঃ শুধু যোগ করুন(?First group)যে প্যারামিটারটি গ্রুপিং শুরু করে তার বর্ণনার শুরুতে, নিম্নলিখিত চিত্র অনুযায়ীঃ

img

আপনি যখন কৌশলটি ব্যবহার করছেন, তখন প্যারামিটারগুলি গ্রুপে প্রদর্শিত হয়ঃ

img

প্যারামিটার ডিফল্ট মান সংরক্ষণ করুনঃ কৌশল পরামিতি চিত্র দেখানো হয়. ব্যাকটেস্ট সময়, আপনি যদি কৌশল পরামিতি ডিফল্ট মান সংরক্ষণ করতে চান, আপনি ক্লিক করতে পারেনSave settingsকৌশল পরামিতি পরিবর্তন করার পর বোতাম.

img

img

আপনি কোড আকারে কৌশল পরামিতি সেটিংস সংরক্ষণ করতে পারেনঃ

/*backtest
start: 2020-02-29 00:00:00
end: 2020-03-29 00:00:00
period: 1d
args: [["number",2],["string","Hello FMZ.COM"],["combox",2],["bool",false],["numberA@isShowA",666],["isShowA",true]]
*/
'''backtest
start: 2020-02-29 00:00:00
end: 2020-03-29 00:00:00
period: 1d
args: [["number",2],["string","Hello FMZ.COM"],["combox",2],["bool",false],["numberA@isShowA",666],["isShowA",true]]
'''
/*backtest
start: 2020-02-29 00:00:00
end: 2020-03-29 00:00:00
period: 1d
args: [["number",2],["string","Hello FMZ.COM"],["combox",2],["bool",false],["numberA@isShowA",666],["isShowA",true]]
*/

তথ্য কাঠামো

কিছু ফাংশন মূল সঙ্গে থাকবেJSONকলের সময় অনুরোধ করা তথ্য।JSONডেটা অ্যাট্রিবিউটে সংরক্ষণ করা হয়Infoযেহেতু ব্যাকটেস্ট একটি প্ল্যাটফর্ম ইন্টারফেস অ্যাক্সেস করা হয় না, ব্যাকটেস্টের সময় ফেরত দেওয়া ডেটা কোন বৈশিষ্ট্য নেইInfoনিম্নলিখিত প্রতিটি ডাটা স্ট্রাকচারের প্রধান বৈশিষ্ট্যগুলির একটি বর্ণনা।

বাণিজ্য

ফাংশন দ্বারা ফেরত সমস্ত লেনদেনের ইতিহাস (নিজেকে নয়) পানexchange.GetTrades().

{
    Id      : 9585306,          // Trading record ID; if the exchange interface does not provide order ID, use the timestamp to fill in 
    Time    : 1567736576000,    // Time (Unix timestamp milliseconds)
    Price   : 1000,             // Price
    Amount  : 1,                // Volume
    Type    : 0                 // Order Type; refer to the order type in the constants; 0 is ORDER_TYPE_BUY, meaning the value of ORDER_TYPE_BUY is 0
}
টিককার

মার্কেট কোট ফাংশন দ্বারা ফিরে আসেexchange.GetTicker().

{
    Info    : {...},             // After requesting the platform interface, this attribute is not available in the raw data that the exchange interface responds to, during the backtest
    High    : 1000,              // Highest price; if the platform interface does not provide the 24-hour highest price, use sell price 1 to fill in 
    Low     : 500,               // Lowest price; if the platform interface does not provide the 24-hour lowest price, use buy price 1 to fill in 
    Sell    : 900,               // Sell price 1
    Buy     : 899,               // Buy price 1 
    Last    : 900,               // Last executed price
    Volume  : 10000000,          // Recent trading volume; in principle, the unit of spot trading volume is base currency, and the unit of futures trading volume is contract quantity. If the platform interface does not provide this kind of data, use the existing data of the platform interface to fill in; for instance, it might be a trading volume in the unit of quote currency  
    Time    : 1567736576000      // Millisecond-level timestamp
}
রেকর্ড

স্ট্যান্ডার্ডOHLCকাঠামোটি কে-লাইন এবং প্রক্রিয়া সূচক গণনা এবং বিশ্লেষণ আঁকতে ব্যবহৃত হয়।exchange.GetRecords()গঠন অ্যারে ফেরত দেয়. প্রতিটিRecordকাঠামো একটি k-লাইন বার প্রতিনিধিত্ব করে, যথা এক k-লাইনBAR.Timeমধ্যেRecordK-লাইন বার সময়ের শুরু সময়।

{
    Time    : 1567736576000,     // A timestamp, accurate to millisecond, in the same format as the result obtained by Javascript's newDate().GetTime()
    Open    : 1000,              // Open price
    High    : 1500,              // Highest price
    Low     : 900,               // Lowest price
    Close   : 1200,              // Close price 
    Volume  : 1000000            // Trading volume; in principle, the unit of spot trading volume is base currency, and the unit of futures trading volume is contract quantity. If the platform interface does not provide this kind of data, use the existing data of the platform interface to fill in; for instance, it might be a trading volume in the unit of quote currency
}
ক্রম

অর্ডার কাঠামো ফাংশন দ্বারা ফেরত দেওয়া যেতে পারে, সহexchange.GetOrder()এবংexchange.GetOrders(). ফাংশনexchange.GetOrders()অ্যারে বা স্ট্রাকচার একটি খালি অ্যারে ফেরত (যদি কোনবর্তমান অসম্পূর্ণ অর্ডার, ফেরত[], অর্থাৎ, একটি খালি অ্যারে) ।

{
    Info        : {...},         // After requesting the platform interface, this attribute is not available in the raw data that the exchange interface responds to, during the backtest
    Id          : 123456,        // Unique ide