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

কমোডিটি ফিউচার হাই ফ্রিকোয়েন্সি ট্রেডিং কৌশল C++ দ্বারা লিখিত

লেখক:ভাল, তৈরিঃ 2020-05-22 15:28:11, আপডেটঃ 2023-11-02 19:54:28

img

পেনি জাম্প কমোডিটি ফিউচার হাই ফ্রিকোয়েন্সি ট্রেডিং কৌশল C++ দ্বারা লিখিত

সংক্ষিপ্তসার

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

উচ্চ ফ্রিকোয়েন্সি কৌশল শ্রেণীবিভাগ

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

মার্কেট ম্যানেজমেন্ট বা মার্কেট ম্যানেজমেন্ট বা মার্কেট ম্যানেজমেন্ট বা মার্কেট ম্যানেজমেন্ট বা মার্কেট ম্যানেজমেন্ট বা মার্কেট ম্যানেজমেন্ট বা মার্কেট ম্যানেজমেন্ট বা মার্কেট ম্যানেজমেন্ট বা মার্কেট ম্যানেজমেন্ট বা মার্কেট ম্যানেজমেন্ট বা মার্কেট ম্যানেজমেন্ট বা মার্কেট ম্যানেজমেন্ট বা মার্কেট ম্যানেজমেন্ট বা মার্কেট ম্যানেজমেন্ট বা মার্কেট ম্যানেজমেন্ট বা মার্কেট ম্যানেজমেন্ট বা মার্কেট ম্যানেজমেন্ট বা মার্কেট ম্যানেজমেন্ট বা মার্কেট ম্যানেজমেন্ট বা মার্কেট ম্যানেজমেন্ট বা মার্কেট ম্যানেজমেন্ট বা মার্কেট ম্যানেজমেন্ট বা মার্কেট ম্যানেজমেন্ট বা মার্কেট ম্যানেজমেন্ট বা মার্কেট ম্যানেজমেন্ট বা মার্কেট ম্যানেজমেন্ট বা মার্কেট ম্যানেজমেন্ট বা মার্কেট ম্যানেজমেন্ট বা মার্কেট ম্যানেজমেন্ট বা মার্কেট ম্যানেজমেন্ট বা মার্কেট ম্যানেজমেন্ট বা মার্কেট ম্যানেজমেন্ট

পেনি জাম্প কৌশল কি?

পেনি জাম্প ইংরেজিতে অনুবাদ করা হয় মাইক্রো মূল্য বৃদ্ধি মানে. নীতি বাজার ক্রয় মূল্য এবং বিক্রয় মূল্য ট্র্যাক করা হয়. তারপর, বাজার মূল্য অনুযায়ী, প্লাস বা বিয়োগ ট্র্যাকিং মূল্যের মাইক্রো মূল্য বৃদ্ধি, এটা স্পষ্ট যে এই একটি প্যাসিভ ট্রেডিং কৌশল, এটি বিক্রেতা পক্ষের বাজার তৈরি কৌশল অন্তর্গত. এর ব্যবসায়িক মডেল এবং যুক্তি তরলতা প্রদানের জন্য এক্সচেঞ্জ তালিকাভুক্ত সীমা আদেশ দ্বিপাক্ষিক লেনদেন পরিচালনা করা হয়.

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

পেনি জাম্প কৌশল নীতি

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

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

এই বিশাল অর্ডারের কারণে, এটি বাজারে অসহায় দেখায়, কখনও কখনও আমরা এটিকে হাতি অর্ডার বলি। উদাহরণস্বরূপ, বর্তমান বাজার দেখায়ঃ

Selling Price 400.3, Order volume 50; buying price 400.1, Order volume 10. 

হঠাৎ করেই এই ভারী হাতি বাজারে লাফিয়ে উঠল, এবং বিডের দাম পাঠানো হল ৪০০.১ এর দামে। এই সময়ে বাজার হয়ে যায়ঃ

Selling Price 400.3, Order volume 50; Buying price 400.1, Order volume 510.

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

Selling Price 400.3, Order volume 50; Buying price 400.2, Order volume 1,

অর্ডার বুকের গভীরতায় ৪০০.১ মূল্য ক্রয় মূল্য হয়ে যায়। তারপর যদি দাম ৪০০.৩-এ উঠে যায়, তাহলে উচ্চ ফ্রিকোয়েন্সি ট্রেডার ০.১ মুনাফা অর্জন করবে।

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

পেনি জাম্প কৌশল বাস্তবায়ন

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

প্রাইস ফার্স্ট তারপর ভলিউম ফার্স্ট ব্যাকটেস্ট ইঞ্জিনকে সমর্থন করার অর্থ কী? আপনি এটি বুঝতে পারেনঃ আপনি 400.1 এ কিনতে একটি অপেক্ষমান অর্ডার প্রেরণ করেন, কেবলমাত্র যখন অর্ডার বুক গভীরতার বিক্রয় মূল্য 400.1 বা তার কম হয়, তখন আপনার অপেক্ষমান অর্ডারটি বন্ধ করা যেতে পারে। এটি কেবল অপেক্ষমান অর্ডারগুলির দামের ডেটা গণনা করে এবং অপেক্ষমান অর্ডারগুলির ভলিউম ডেটা গণনা করে না, যা কেবল এক্সচেঞ্জ অর্ডার মেলে এমন নিয়মগুলিতে দামের অগ্রাধিকার ((মূল্য প্রথমে) পূরণ করে।

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

উপরন্তু, কিছু পাঠক খুঁজে পেতে পারে যে পেনি জাম্প কৌশল বাজার ট্রেডিং সুযোগ প্রয়োজন, অর্থাৎ বাজার প্রয়োজন অন্তত দুটি hop মূল্য ফাঁক আছে। স্বাভাবিক পরিস্থিতিতে, পণ্য ফিউচার প্রধান ট্রেডিং চুক্তি তুলনামূলকভাবে busy হয়। Buying 1 এবং Selling 1hop মধ্যে পার্থক্য হল যে ট্রেডিং সুযোগ প্রায় নেই। তাই আমরা সাব-প্রাথমিক চুক্তিতে আমাদের শক্তি স্থাপন যেখানে ট্রেডিং খুব সক্রিয় নয়। এই ধরনের ট্রেডিং চুক্তি মাঝে মাঝে দুটি বা এমনকি তিনটি hop সুযোগ আছে। উদাহরণস্বরূপ, এমএ (Methanol কোড চীনা পণ্য ফিউচার) 1909 চুক্তিতে, নিম্নলিখিত পরিস্থিতি ঘটেঃ

img

ভলিউম 551 সহ 1 মূল্য 2225 বিক্রি, ভলিউম 565 সহ 1 মূল্য 2223 কেনা, কয়েক সেকেন্ডের জন্য নীচে তাকান। এটি হওয়ার পরে, এটি বেশ কয়েকটি টিকের পরে অদৃশ্য হয়ে যাবে। এই ক্ষেত্রে, আমরা বাজারকে স্ব-সংশোধন হিসাবে বিবেচনা করি। আমাদের যা করতে হবে তা হ'ল ধরে রাখা। বাজারটি সক্রিয়ভাবে এটি সংশোধন করার আগে। যদি আমরা এটি ম্যানুয়ালি করি তবে এটি অসম্ভব, স্বয়ংক্রিয় ব্যবসায়ের সাহায্যে আমরা এটি সম্ভব করতে পারি।

দুই hop মূল্য ফাঁক চেহারা পরিস্থিতি খুব প্রায়ই ঘটে, কিন্তু তিন hops সবচেয়ে নিরাপদ, কিন্তু তিন hops খুব কমই ঘটে, যার ফলে ট্রেডিং ফ্রিকোয়েন্সি খুব কম।

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

কৌশল কোড

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

  • পদক্ষেপ 1: প্রথমে কৌশলটির ফ্রেমওয়ার্ক তৈরি করুন, যেখানে একটি এইচএফটি ক্লাস এবং একটি প্রধান ফাংশন সংজ্ঞায়িত করা হয়। প্রধান ফাংশনের প্রথম লাইনটি হল লগটি সাফ করা। এর উদ্দেশ্য হ'ল কৌশলটি পুনরায় চালু হওয়ার প্রতিটি সময় পূর্বে চলমান লগের তথ্য সাফ করা। দ্বিতীয় লাইনটি এমন কিছু ত্রুটি বার্তা ফিল্টার করা যা প্রয়োজনীয় নয়, যেমন নেটওয়ার্ক বিলম্ব এবং কিছু টিপস প্রদর্শিত হয়, যাতে লগটি কেবল গুরুত্বপূর্ণ তথ্য রেকর্ড করে এবং আরও ঝরঝরে দেখায়; তৃতীয় লাইনটি হ'ল Init OK বার্তাটি মুদ্রণ করা, যার অর্থ প্রোগ্রামটি শুরু হয়েছে। চতুর্থ লাইনটি হ'ল এইচএফটি ক্লাস অনুযায়ী একটি বস্তু তৈরি করা, এবং বস্তুর নামটি hft; পঞ্চম লাইন প্রোগ্রামটি ওয়েলিং লুপে প্রবেশ করে, এবং সর্বদা hft পদ্ধতিতে লুপটি কার্যকর করে, এটি দেখা যায় যে লুপ পদ্ধতিটি এই প্রোগ্রামের যুক্তি। লাইন 6 হল মূল বার্তা। অন্য একটি প্রুফ পরিস্থিতিতে, প্রোগ্রামটি 6 চালাতে হবে না। যদি প্রোগ্রামটি শেষ হয় তবে প্রোগ্রামটি কার্যকর করার জন্য স্বাভাবিক

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

/ / Define the HFT class
Class HFT {
     Public:
         HFT() {
             // Constructor
         }
        
         Int getTradingWeekDay() {
             // Get the current day of the week to determine if it is a new K line
         }
        
         State getState() {
             / / Get order data
         }

         Void stop() {
             // Print orders and positions
         }
        
         Bool Loop() {
             // Strategy logic and placing orders
         }
};

// main function
Void main() {
     LogReset(); // clear the log
     SetErrorFilter("ready|timeout"); // Filter error messages
     Log("Init OK"); // Print the log
     HFT hft; // Create HFT object
     While (hft.Loop()); // enter loop
     Log("Exit"); // Program exits, prints the log
}

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

/ / Define the global enumeration type State
Enum State {
     STATE_NA, // store order status
     STATE_IDLE, // store position status
     STATE_HOLD_LONG, // store long position directions
     STATE_HOLD_SHORT, // store short position direction
};

/ / Define global floating point type variable
Typedef struct {
     Double bidPrice; // store the buying price
     Double bidAmount; // store the buying amount
     Double askPrice; // store the selling price
     Double askAmount; // store the selling amount
} Book;

উপরের গ্লোবাল ভেরিয়েবলগুলির সাথে, আমরা hft অবজেক্ট দ্বারা গণনা করা ফলাফলগুলি আলাদাভাবে সঞ্চয় করতে পারি, যা প্রোগ্রামের পরবর্তী কলগুলির জন্য সুবিধাজনক। পরবর্তী আমরা HFT শ্রেণীতে প্রতিটি পদ্ধতির নির্দিষ্ট বাস্তবায়ন সম্পর্কে কথা বলব। প্রথমত, প্রথম HFT পদ্ধতিটি একটি কনস্ট্রাক্টর যা দ্বিতীয় getTradingWeekDay পদ্ধতিটি কল করে এবং ফলাফলটি লগটিতে প্রিন্ট করে। দ্বিতীয় getTradingWeekDay পদ্ধতিটি এটি একটি নতুন কে লাইন কিনা তা নির্ধারণ করতে সপ্তাহের বর্তমান দিনটি পায়। এটি বাস্তবায়ন করা খুব সহজ, টাইমস্ট্যাম্প পান, ঘন্টা এবং সপ্তাহ গণনা করুন এবং অবশেষে সপ্তাহের সংখ্যা ফেরত দিন; তৃতীয় getState পদ্ধতিটি কিছুটা দীর্ঘ, আমি কেবল সাধারণ ধারণাটি বর্ণনা করব, নির্দিষ্ট ব্যাখ্যা জন্য, আপনি নিম্নলিখিত কোডিং ব্লকের মন্তব্যগুলি দেখতে পারেন।

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

Public:
    // Constructor
    HFT() {
        _tradingDay = getTradingWeekDay();
        Log("current trading weekday", _tradingDay);
    }
    
    // Get the current day of the week to determine if it is a new K line
    Int getTradingWeekDay() {
        Int seconds = Unix() + 28800; // get the timestamp
        Int hour = (seconds/3600)%24; // hour
        Int weekDay = (seconds/(60*60*24))%7+4; // week
        If (hour > 20) {
            weekDay += 1;
        }
        Return weekDay;
    }
    
    / / Get order data
    State getState() {
        Auto orders = exchange.GetOrders(); // Get all orders
        If (!orders.Valid || orders.size() == 2) { // If there is no order or the length of the order data is equal to 2
            Return STATE_NA;
        }
        
        Bool foundCover = false; // Temporary variable used to control the cancellation of all unexecuted orders
        // Traverse the order array and cancel all unexecuted orders
        For (auto &order : orders) {
            If (order.Id == _coverId) {
                If ((order.Type == ORDER_TYPE_BUY && order.Price < _book.bidPrice - _toleratePrice) ||
                    (order.Type == ORDER_TYPE_SELL && order.Price > _book.askPrice + _toleratePrice)) {
                    exchange.CancelOrder(order.Id, "Cancel Cover Order"); // Cancel order based on order ID
                    _countCancel++;
                    _countRetry++;
                } else {
                    foundCover = true;
                }
            } else {
                exchange.CancelOrder(order.Id); // Cancel order based on order ID
                _countCancel++;
            }
        }
        If (foundCover) {
            Return STATE_NA;
        }
        
        // Get position data
        Auto positions = exchange.GetPosition(); // Get position data
        If (!positions.Valid) { // if the position data is empty
            Return STATE_NA;
        }

        // Traverse the position array to get specific position information
        For (auto &pos : positions) {
            If (pos.ContractType == Symbol) {
                _holdPrice = pos.Price;
                _holdAmount = pos.Amount;
                _holdType = pos.Type;
                Return pos.Type == PD_LONG || pos.Type == PD_LONG_YD ? STATE_HOLD_LONG : STATE_HOLD_SHORT;
            }
        }
        Return STATE_IDLE;
    }
    
    // Print orders and positions information
    Void stop() {
        Log(exchange.GetOrders()); // print order
        Log(exchange.GetPosition()); // Print position
        Log("Stop");
    }

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

// Strategy logic and placing order
Bool Loop() {
    If (exchange.IO("status") == 0) { // If the CTP and the quote server are connected
        LogStatus(_D(), "Server not connect ...."); // Print information to the status bar
        Sleep(1000); // Sleep 1 second
        Return true;
    }
    
    If (_initBalance == 0) {
        _initBalance = _C(exchange.GetAccount).Balance; // Get account balance
    }
    
    Auto day = getTradingWeekDay(); // Get the number of weeks
    If (day != _tradingDay) {
        _tradingDay = day;
        _countCancel = 0;
    }
    
    // Set the futures contract type and get the contract specific information
    If (_ct.is_null()) {
        Log(_D(), "subscribe", Symbol); // Print the log
        _ct = exchange.SetContractType(Symbol); // Set futures contract type
        If (!_ct.is_null()) {
            Auto obj = _ct["Commodity"]["CommodityTickSize"];
            Int volumeMultiple = 1;
            If (obj.is_null()) { // CTP
                Obj = _ct["PriceTick"];
                volumeMultiple = _ct["VolumeMultiple"];
                _exchangeId = _ct["ExchangeID"];
            } else { // Esunny
                volumeMultiple = _ct["Commodity"]["ContractSize"];
                _exchangeId = _ct["Commodity"]["ExchangeNo"];
            }
            If (obj.is_null() || obj <= 0) {
                Panic("PriceTick not found");
            }
            If (_priceTick < 1) {
                exchange.SetPrecision(1, 0); // Set the decimal precision of the price and the quantity of the order.
            }
            _priceTick = double(obj);
            _toleratePrice = _priceTick * TolerateTick;
            _ins = _ct["InstrumentID"];
            Log(_ins, _exchangeId, "PriceTick:", _priceTick, "VolumeMultiple:", volumeMultiple); // print the log
        }
        Sleep(1000); // Sleep 1 second
        Return true;
    }
    
    // Check orders and positions to set status
    Auto depth = exchange.GetDepth(); // Get depth data
    If (!depth.Valid) { // if no depth data is obtained
        LogStatus(_D(), "Market not ready"); // Print status information
        Sleep(1000); // Sleep 1 second
        Return true;
    }
    _countTick++;
    _preBook = _book;
    _book.bidPrice = depth.Bids[0].Price; // "Buying 1" price
    _book.bidAmount = depth.Bids[0].Amount; // "Buying 1" amount
    _book.askPrice = depth.Asks[0].Price; // "Selling 1" price
    _book.askAmount = depth.Asks[0].Amount; // "Selling 1" amount
    // Determine the state of the port data assignment
    If (_preBook.bidAmount == 0) {
        Return true;
    }
    Auto st = getState(); // get the order data
    
    // Print the port data to the status bar
    LogStatus(_D(), _ins, "State:", st,
                "Ask:", depth.Asks[0].Price, depth.Asks[0].Amount,
                "Bid:", depth.Bids[0].Price, depth.Bids[0].Amount,
                "Cancel:", _countCancel,
                "Tick:", _countTick);
}

আমরা যদি একটি ট্রেডিং পজিশনের জন্য হোল্ডিং স্ট্যাটাস ব্যবহার করি তবে আমরা হোল্ডিং স্ট্যাটাসটি হোল্ডিং স্ট্যাটাস হিসাবে ব্যবহার করতে পারি। ট্রেডিংয়ের আগে, আমরা প্রথমে প্রোগ্রামের বর্তমান হোল্ডিং পজিশনের স্থিতি বিচার করি (কোনও হোল্ডিং পজিশন নেই, লং পজিশন অর্ডার, শর্ট পজিশন অর্ডার), এখানে আমরা যদি... অন্যথায় যদি... অন্যথায় যদি লজিক কন্ট্রোল ব্যবহার করি। তারা খুব সহজ, যদি কোনও হোল্ডিং পজিশন না থাকে তবে অবস্থানটি লজিক শর্ত অনুসারে খোলা হবে। যদি হোল্ডিং পজিশন থাকে তবে অবস্থানটি লজিক শর্ত অনুসারে বন্ধ হবে। সবার বোঝার জন্য, আমরা তিনটি অনুচ্ছেদ ব্যবহার করি লজিক ব্যাখ্যা করার জন্য, পজিশন খোলার অংশের জন্যঃ

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

এরপরে, আমরা ক্রয় 1 মূল্য এবং বিক্রয় 1 মূল্য পাই, যদি পূর্ববর্তী ক্রয় মূল্য বর্তমান ক্রয় মূল্যের চেয়ে বেশি হয়, এবং বর্তমান বিক্রয় পরিমাণ ক্রয়ের পরিমাণের চেয়ে কম হয়, এর অর্থ হ'ল ক্রয় 1 মূল্য অদৃশ্য হয়ে যায়। দীর্ঘ অবস্থানের উদ্বোধনী মূল্য এবং অর্ডার পরিমাণ সেট করা হয়; অন্যথায়, যদি পূর্ববর্তী বিক্রয় মূল্য বর্তমান বিক্রয় মূল্যের চেয়ে কম হয় এবং বর্তমান ক্রয় পরিমাণের চেয়ে কম হয়। বিক্রয় পরিমাণ প্রমাণ করে যে বিক্রয় 1 মূল্য অদৃশ্য হয়ে গেছে, শর্ট অবস্থানের উদ্বোধনী মূল্য এবং অর্ডার পরিমাণ সেট করা হয়; শেষ পর্যন্ত, দীর্ঘ অবস্থান এবং শর্ট অর্ডার একই সময়ে বাজারে প্রবেশ করে। নির্দিষ্ট কোডটি নিম্নরূপঃ

Bool forceCover = _countRetry >= _retryMax; // Boolean value used to control the number of closings
If (st == STATE_IDLE) { // if there is no holding position
    If (_holdAmount > 0) {
        If (_countRetry > 0) {
            _countLoss++; // failure count
        } else {
            _countWin++; // success count
        }
        Auto account = exchange.GetAccount(); // Get account information
        If (account.Valid) { // If get account information
            LogProfit(_N(account.Balance+account.FrozenBalance-_initBalance, 2), "Win:", _countWin, "Loss:", _countLoss); // Record profit value
        }
    }
    _countRetry = 0;
    _holdAmount = 0;
    
    // Judging the status of withdrawal
    If (_countCancel > _cancelMax) {
        Log("Cancel Exceed", _countCancel); // Print the log
        Return false;
    }

    Bool canDo = false; // temporary variable
    If (abs(_book.bidPrice - _book.askPrice) > _priceTick * 1) { // If there is more than 2 hops between the current bid and ask price
        canDo = true;
    }
    If (!canDo) {
        Return true;
    }
    
    Auto bidPrice = depth.Bids[0].Price; // Buying 1 price
    Auto askPrice = depth.Asks[0].Price; // Selling 1 price
    Auto bidAmount = 1.0;
    Auto askAmount = 1.0;
    
    If (_preBook.bidPrice > _book.bidPrice && _book.askAmount < _book.bidAmount) { // If the previous buying price is greater than the current buying price and the current selling volume is less than the buying volume
        bidPrice += _priceTick; // Set the opening long position price
        bidAmount = 2; // set the opening long position volume
    } else if (_preBook.askPrice < _book.askPrice && _book.bidAmount < _book.askAmount) { // If the previous selling price is less than the current selling price and the current buying volume is less than the selling volume
        askPrice -= _priceTick; // set the opening short position volume
        askAmount = 2; // set the opening short position volume
    } else {
        Return true;
    }
    Log(_book.bidPrice, _book.bidAmount, _book.askPrice, _book.askAmount); // Print current market data
    exchange.SetDirection("buy"); // Set the order type to buying long
    exchange.Buy(bidPrice, bidAmount); // buying long and open position
    exchange.SetDirection("sell"); // Set the order type to selling short
    exchange.Sell(askPrice, askAmount); // short sell and open position
}

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

Else if (st == STATE_HOLD_LONG) { // if holding long position
     exchange.SetDirection((_holdType == PD_LONG && _exchangeId == "SHFE") ? "closebuy_today" : "closebuy"); // Set the order type, and close position
     Auto sellPrice = depth.Asks[0].Price; // Get "Selling 1" price
     If (sellPrice > _holdPrice) { // If the current "selling 1" price is greater than the long position opening price
         Log(_holdPrice, "Hit #ff0000"); // Print long position opening price 
         sellPrice = _holdPrice + ProfitTick; // Set closing long position price
     } else if (sellPrice < _holdPrice) { // If the current "selling 1" price is less than the long position opening price
         forceCover = true;
     }
     If (forceCover) {
         Log("StopLoss");
     }
     _coverId = exchange.Sell(forceCover ? depth.Bids[0].Price : sellPrice, _holdAmount); // close long position
     If (!_coverId.Valid) {
         Return false;
     }
}

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

Else if (st == STATE_HOLD_SHORT) { // if holding short position
     exchange.SetDirection((_holdType == PD_SHORT && _exchangeId == "SHFE") ? "closesell_today" : "closesell"); // Set the order type, and close position
     Auto buyPrice = depth.Bids[0].Price; // Get "buying 1" price
     If (buyPrice < _holdPrice) { // If the current "buying 1" price is less than the opening short position price
         Log(_holdPrice, "Hit #ff0000"); // Print the log
         buyPrice = _holdPrice - ProfitTick; // Set the close short position price
     } else if (buyPrice > _holdPrice) { // If the current "buying 1" price is greater than the opening short position price
         forceCover = true;
     }
     If (forceCover) {
         Log("StopLoss");
     }
     _coverId = exchange.Buy(forceCover ? depth.Asks[0].Price : buyPrice, _holdAmount); // close short position
     If (!_coverId.Valid) {
         Return false;
     }
}

উপরের অংশে এই কৌশলটির একটি সম্পূর্ণ বিশ্লেষণ রয়েছে। এখানে ক্লিক করুন (https://www.fmz.com/strategy/163427) FMZ Quant এ ব্যাকটেস্ট পরিবেশ কনফিগার না করে সম্পূর্ণ কৌশল উৎস কোড কপি করতে।

ব্যাকটেস্টের ফলাফল

img

ট্রেডিং লজিক

img

কৌশলগত বিবৃতি

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

আমাদের সম্পর্কে

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


সম্পর্কিত

আরো