سی ++ میں لکھی گئی کموڈٹی فیوچر ہائی فریکوئنسی ٹریڈنگ حکمت عملی

مصنف:نیکی, تخلیق: 2020-05-22 15:28:11, تازہ کاری: 2023-11-02 19:54:28

img

پینی جمپ سی ++ کی طرف سے لکھا کموڈٹی فیوچر ہائی فریکوئنسی ٹریڈنگ کی حکمت عملی

خلاصہ

مارکیٹ ایک میدان جنگ ہے ، خریدار اور بیچنے والا ہمیشہ کھیل میں رہتے ہیں ، جو کہ تجارتی کاروبار کا ابدی موضوع بھی ہے۔ آج مشترکہ پینی جمپ حکمت عملی ایک اعلی تعدد کی حکمت عملی ہے ، جو اصل میں بینک کے مابین غیر ملکی کرنسی کی مارکیٹ سے ماخوذ ہے ، اور اکثر مرکزی دھارے میں استعمال ہوتی ہے فیٹ کرنسی کے جوڑے.

ہائی فریکوئنسی حکمت عملی کی درجہ بندی

ہائی فریکوئنسی ٹریڈنگ میں ، دو اہم اقسام کی حکمت عملی ہیں۔ خریدار کی طرف کی حکمت عملی اور بیچنے والے کی طرف کی حکمت عملی۔ بیچنے والے کی طرف کی حکمت عملی عام طور پر مارکیٹ بنانے کی حکمت عملی ہے ، اور ان دونوں طرف کی حکمت عملی مخالف ہیں۔ مثال کے طور پر ، مارکیٹ میں تمام غیر معقول مظاہر کو تیز ترین رفتار سے ہموار کرنے ، قیمت پر تیزی سے حملہ کرنے کا اقدام اٹھانے ، یا دوسرے مارکیٹ سازوں کی غلط قیمت کھانے کی اعلی تعدد اعتدال پسندی خریدار کی حکمت عملی۔

مارکیٹ کے تاریخی اعداد و شمار یا آرڈر کے قوانین کا تجزیہ کرنے ، غیر معقول قیمت پر زیر التواء آرڈرز کو پہلے سے بھیجنے اور مارکیٹ کی قیمت میں تیزی سے تبدیلی کے ساتھ واپسی کے آرڈر بھیجنے کا بھی ایک طریقہ ہے۔ ایسی حکمت عملی غیر فعال مارکیٹ بنانے میں عام ہیں ، ایک بار جب زیر التواء آرڈرز پر عمل درآمد ہوجاتا ہے ، اور ایک خاص منافع یا اسٹاپ نقصان کی شرط تک پہنچنے کے بعد ، پوزیشن بند ہوجائے گی۔ غیر فعال مارکیٹ بنانے کی حکمت عملیوں میں عام طور پر زیادہ رفتار کی ضرورت نہیں ہوتی ہے ، لیکن اس میں مضبوط حکمت عملی منطق اور ساخت کی ضرورت ہوتی ہے۔

پینی جمپ کی حکمت عملی کیا ہے؟

پینی جمپ کا انگریزی میں ترجمہ مائکرو قیمت میں اضافے کا مطلب ہے۔ اس کا اصول مارکیٹ کی خریداری کی قیمت اور فروخت کی قیمت کو ٹریک کرنا ہے۔ پھر ، مارکیٹ کی قیمت کے مطابق ، ٹریکنگ کی قیمت میں مائکرو قیمت میں اضافے کے علاوہ یا مائنس ، یہ واضح ہے کہ یہ ایک غیر فعال تجارتی حکمت عملی ہے ، یہ بیچنے والے کی طرف سے مارکیٹ بنانے کی حکمت عملی سے تعلق رکھتی ہے۔ اس کا کاروباری ماڈل اور منطق مائع کو فراہم کرنے کے لئے ایکسچینج میں درج حد کے احکامات پر دوطرفہ لین دین کرنا ہے۔

مارکیٹ بنانے کی حکمت عملی کے لئے ہاتھ میں ایک خاص مقدار میں انوینٹری کی ضرورت ہوتی ہے ، اور پھر خریدار اور بیچنے والے دونوں طرف تجارت ہوتی ہے۔ اس حکمت عملی کی بنیادی آمدنی ایکسچینج کے ذریعہ فراہم کردہ کمیشن فیس کی واپسی ہے ، نیز کم خریدنے اور زیادہ فروخت کرکے حاصل کردہ قیمت کا فرق ہے۔ لیکن بہت سارے اعلی تعدد تاجروں کے لئے جو مارکیٹ بنانے کے خواہاں ہیں ، بولی مانگنے کا پھیلاؤ کمانا ایک اچھی بات ہے ، لیکن یہ منافع کا مطلق ذریعہ نہیں ہے۔

پینی جمپ حکمت عملی کا اصول

ہم جانتے ہیں کہ تجارتی مارکیٹ میں بہت سارے خوردہ سرمایہ کار ہیں ، اور بہت سارے بڑے سرمایہ کار بھی ہیں ، جیسے: گرم رقم ، عوامی فنڈز ، نجی فنڈز ، وغیرہ۔ خوردہ سرمایہ کاروں کے پاس عام طور پر کم فنڈز ہوتے ہیں ، ان کے احکامات کا مارکیٹ پر بہت کم اثر پڑتا ہے ، وہ کسی بھی وقت آسانی سے تجارتی ہدف خرید اور فروخت کرسکتے ہیں۔ لیکن بڑے فنڈز کے لئے مارکیٹ میں حصہ لینا اتنا آسان نہیں ہے۔

اگر کوئی بڑا سرمایہ کار خام تیل کے 500 لاٹ خریدنا چاہتا ہے تو ، فروخت کے لئے موجودہ قیمت پر اتنے آرڈر نہیں ہیں ، اور سرمایہ کار ان کو زیادہ قیمت پر خریدنا نہیں چاہتا ہے۔ اگر وہ موجودہ قیمت پر خریداری کا آرڈر بھیجنے پر اصرار کرتے ہیں تو ، سلائپ پوائنٹس کی لاگت بہت زیادہ ہوگی۔ لہذا ، اسے مطلوبہ قیمت پر زیر التواء آرڈر بھیجنا ہوگا۔ مارکیٹ کے تمام شرکاء کو ایک ہائی خریداری آرڈر نظر آئے گا جو مخصوص قیمت پر دکھایا گیا ہے۔

اس بڑے آرڈر کی وجہ سے، یہ مارکیٹ میں لاپرواہ لگتا ہے، کبھی کبھی ہم اسے کہتے ہیں فلی آرڈر. مثال کے طور پر موجودہ مارکیٹ دکھا:

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

اچانک اس پیچیدہ ہاتھی مارکیٹ میں کود، اور بولی کی قیمت 400.1 کی قیمت پر بھیجا گیا تھا. اس وقت مارکیٹ بن جاتا ہے:

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

تمام تاجروں کو معلوم ہے کہ اگر کسی خاص قیمت پر بڑی تعداد میں زیر التوا آرڈر موجود ہیں تو ، اس قیمت میں مضبوط مدد ((یا مزاحمت) ہوگی۔ مزید برآں ، اعلی تعدد کے تاجروں کو یہ بھی معلوم ہے ، اگر وہ آرڈر بک کی گہرائی میں خرید 1 قیمت سے اوپر خرید آرڈر بھیجتے ہیں تو ، پھر مارکیٹ بن جاتی ہے:

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

قیمت 400.1 آرڈر بک کی گہرائی میں خریداری 2 قیمت بن جاتی ہے۔ پھر اگر قیمت 400.3 تک بڑھ جاتی ہے تو ، اعلی تعدد تاجر 0.1 کا منافع حاصل کرے گا۔

یہاں تک کہ اگر قیمت میں اضافہ نہیں ہوتا ہے ، خریدنے کی پوزیشن میں 2 ، پھر بھی ہاتھی قیمت کو تھامے ہوئے ہے ، اور اسے تیزی سے 400.1 کی قیمت پر ہاتھی کو واپس فروخت کیا جاسکتا ہے۔ یہ پینی جمپ حکمت عملی کا عمومی خیال ہے۔ اس کا منطق اتنا ہی آسان ہے ، مارکیٹ آرڈر کی حیثیت کی نگرانی کرکے ، مخالفین کے ارادوں پر قیاس آرائیاں کرنا ، اور پھر سازگار پوزیشن بنانے میں برتری اختیار کرنا ، اور آخر کار مختصر مدت میں چھوٹے پھیلاؤ سے فائدہ اٹھانا۔ اس ہاتھی کے لئے ، کیونکہ وہ مارکیٹ میں خریداری کے آرڈر کی ایک بڑی مقدار لٹکا دیتا ہے ، اس نے اپنے تجارتی ارادوں کو بے نقاب کردیا ، اور قدرتی طور پر اعلی تعدد تاجروں کا شکار ہدف بن گیا۔

پینی جمپ حکمت عملی کا نفاذ

سب سے پہلے ، مارکیٹ کے بہت کم امکان کے ساتھ تجارتی مواقع کا مشاہدہ کریں ، اور تجارتی منطق کے مطابق اسی طرح کی حکمت عملی بنائیں۔ اگر منطق پیچیدہ ہے تو ، آپ کو موجودہ ریاضیاتی علم کا استعمال کرنے کی ضرورت ہے ، ماڈل کو غیر منطقی رجحان کی نوعیت کو زیادہ سے زیادہ بیان کرنے کے لئے استعمال کریں ، اور اوور فٹنگ کو کم سے کم کریں۔ اس کے علاوہ ، اس کی تصدیق بیک ٹسٹ انجن کے ذریعہ کی جانی چاہئے جو پہلے قیمت پھر حجم پہلے اصول کو پورا کرسکتا ہے۔ خوش قسمتی سے ، ہمارے پاس ایف ایم زیڈ کوانٹ پلیٹ فارم ہے جو فی الحال اس بیک ٹسٹنگ طریقوں کی حمایت کرتا ہے۔

پریس پہلے پھر حجم پہلے بیک ٹیسٹ انجن کی حمایت کا کیا مطلب ہے؟ آپ اسے اس طرح سمجھ سکتے ہیں: آپ خریدنے کے لئے 400.1 پر ایک زیر التواء آرڈر بھیجتے ہیں ، صرف اس وقت جب آرڈر بک کی گہرائی میں فروخت کی قیمت 400.1 یا اس سے کم ہو ، آپ کا زیر التواء آرڈر بند کیا جاسکتا ہے۔ یہ صرف زیر التواء آرڈرز کے قیمت کے اعداد و شمار کا حساب لگاتا ہے ، اور زیر التواء آرڈرز کے حجم کے اعداد و شمار کا حساب نہیں لگاتا ہے ، جو صرف ایکسچینج آرڈرز میچنگ رولز میں قیمت کی ترجیح ((قیمت پہلے) کو پورا کرتا ہے۔

پہلے حجم پہلے قیمت کا ایک اپ گریڈ شدہ ورژن ہے۔ یہ قیمت کی ترجیح اور وقت کی ترجیح دونوں ہے۔ یہ کہا جاسکتا ہے کہ یہ میچنگ موڈ ایکسچینج ماڈل کے بالکل برابر ہے۔ زیر التواء آرڈر کی رقم کا حساب لگاتے ہوئے ، یہ فیصلہ کیا جاتا ہے کہ آیا موجودہ زیر التواء آرڈر حجم کے لین دین کو حاصل کرنے کے لئے غیر فعال لین دین کی شرط تک پہنچتا ہے ، تاکہ حقیقی مارکیٹ کے ماحول کا حقیقی نقالی حاصل کیا جاسکے۔

اس کے علاوہ ، کچھ قارئین کو یہ معلوم ہوسکتا ہے کہ پینی جمپ حکمت عملی میں مارکیٹ ٹریڈنگ کے مواقع کی ضرورت ہوتی ہے ، یعنی مارکیٹ کی ضرورت میں کم از کم دو ہاپ قیمت کے فرق ہوتے ہیں۔ عام حالات میں ، اجناس کے فیوچر کا بنیادی تجارتی معاہدہ نسبتا مصروف ہوتا ہے۔ خریدنے 1 اور فروخت 1 ہاپ کے مابین فرق یہ ہے کہ تجارت کا کوئی موقع نہیں ہے۔ لہذا ہم اپنی توانائی سب پرائمری معاہدے پر ڈالتے ہیں جہاں تجارت زیادہ فعال نہیں ہوتی ہے۔ اس قسم کے تجارتی معاہدے میں کبھی کبھار دو یا یہاں تک کہ تین ہاپ مواقع ہوتے ہیں۔ مثال کے طور پر ، ایم اے (چین کے اجناس کے فیوچر میں میٹانول کوڈ) 1909 معاہدے میں ، مندرجہ ذیل صورتحال واقع ہوتی ہے:

img

حجم 551 کے ساتھ 1 قیمت 2225 فروخت کرنا حجم 565 کے ساتھ 1 قیمت 2223 خریدنا ، کچھ سیکنڈ کے لئے نیچے دیکھیں۔ اس کے بعد ، یہ کئی ٹکوں کے بعد غائب ہوجائے گا۔ اس معاملے میں ، ہم مارکیٹ کو خود اصلاح کے طور پر دیکھتے ہیں۔ ہمیں کیا کرنا ہے اس سے پہلے کہ مارکیٹ اسے فعال طور پر درست کرے۔ اگر ہم اسے دستی طور پر کریں تو ، یہ ناممکن ہوگا ، خودکار تجارت کی مدد سے ، ہم اسے ممکن بنا سکتے ہیں۔

دو ہاپ قیمت فرق ظہور کی صورت حال بہت کثرت سے ہوتا ہے، لیکن تین ہاپس سب سے محفوظ ہیں، لیکن تین ہاپس شاذ و نادر ہی واقع ہوتے ہیں، جس کے نتیجے میں تجارتی تعدد بہت کم ہے.

اگلا ، ہم پچھلے فروخت 1 خرید 1 اور خرید 1 فروخت 1 کے درمیان فرق کا مشاہدہ کرتے ہیں۔ مارکیٹ کے مابین قیمت کے فرق کو پُر کرنے کے ل if ، اگر رفتار کافی تیز ہے تو ، اسے دوسرے آرڈرز کے سب سے آگے رکھا جاسکتا ہے۔ نیز ، پوزیشن ہولڈنگ کا وقت بہت کم ہے ، اس تجارتی منطق کے ساتھ ، حکمت عملی کے احساس کے بعد ، MA909 کو مثال کے طور پر لیں ، حقیقی مارکیٹ ٹیسٹ میں سی ٹی پی انٹرفیس کے بجائے ایسونی کی سفارش کی جاتی ہے ، ایسونی کے لئے پوزیشن اور فنڈ کی صورتحال کو تبدیل کرنے کا طریقہ کار دھکا ڈیٹا کے ذریعہ ہے ، جو اعلی تعدد کی تجارت کے لئے بہت موزوں ہے۔

حکمت عملی کا کوڈ

تجارتی منطق کو صاف کرنے کے بعد ، ہم اسے حاصل کرنے کے لئے کوڈ کا استعمال کرسکتے ہیں۔ چونکہ ایف ایم زیڈ کوانٹ پلیٹ فارم سی ++ تحریری حکمت عملی کی مثالیں استعمال کرتا ہے بہت کم ہیں ، لہذا ہم یہاں اس حکمت عملی کو لکھنے کے لئے سی ++ کا استعمال کرتے ہیں ، جو ہر ایک کے لئے سیکھنے کے لئے آسان ہے ، اور مختلف قسم کی اجناس فیوچر ہے۔ پہلے کھولیں:fmz.com> لاگ ان کریں > ڈیش بورڈ > حکمت عملی لائبریری > نئی حکمت عملی > اوپر بائیں کونے میں ڈراپ ڈاؤن مینو پر کلک کریں > حکمت عملی لکھنے شروع کرنے کے لئے C ++ منتخب کریں، ذیل میں کوڈ میں تبصرے پر توجہ دیں.

  • مرحلہ 1: پہلے حکمت عملی کا فریم ورک بنائیں ، جس میں ایک ایچ ایف ٹی کلاس اور ایک اہم فنکشن کی وضاحت کی گئی ہے۔ اہم فنکشن میں پہلی لائن لاگ کو صاف کرنا ہے۔ اس کا مقصد ہر بار جب حکمت عملی کو دوبارہ شروع کیا جاتا ہے تو پہلے چلنے والے لاگ کی معلومات کو صاف کرنا ہے۔ دوسری لائن کچھ غلط پیغامات کو فلٹر کرنا ہے جو ضروری نہیں ہیں ، جیسے نیٹ ورک کی تاخیر اور کچھ اشارے ظاہر ہوتے ہیں ، تاکہ لاگ صرف اہم معلومات کو ریکارڈ کرے اور زیادہ صاف نظر آئے۔ تیسری لائن Init OK پیغام کو پرنٹ کرنا ہے ، جس کا مطلب ہے کہ پروگرام شروع ہوچکا ہے۔ چوتھی لائن ایچ ایف ٹی کلاس کے مطابق ایک آبجیکٹ بنانا ہے ، اور آبجیکٹ کا نام ایچ ایف ٹی ہے۔ پانچویں لائن کا پروگرام جبکہ لوپ میں داخل ہوتا ہے ، اور ہمیشہ ایچ ایف ٹی طریقہ کار میں آبجیکٹ لوپ کو انجام دیتا ہے ، یہ دیکھا جاسکتا ہے کہ لوپ اس پروگرام کی منطق ہے۔ لائن 6 ایک اور بنیادی پیغام ہے۔ کسی اور ثبوت کے تحت ، پروگرام عام حالات میں 6 کو انجام نہیں دے گا۔ اگر پروگرام لائن 6 کو ختم کردیا گیا ہے تو ، پروگرام کو انجام دینے

اگلا ، آئیے HFT کلاس کو دیکھیں ، جس میں پانچ طریقے ہیں۔ پہلا طریقہ تعمیراتی طریقہ ہے۔ دوسرا طریقہ یہ طے کرنے کے لئے ہفتے کا موجودہ دن حاصل کرنا ہے کہ آیا یہ ایک نئی K لائن ہے یا نہیں۔ تیسرا طریقہ بنیادی طور پر تمام خالی احکامات کو منسوخ کرنا ہے ، اور تفصیلی پوزیشن کی معلومات حاصل کرنا ہے ، کیونکہ آرڈر دینے سے پہلے ، اسے پہلے موجودہ پوزیشن کی حیثیت کا تعین کرنا چاہئے۔ چوتھا طریقہ بنیادی طور پر کچھ معلومات کو پرنٹ کرنے کے لئے استعمال کیا جاتا ہے ، اس حکمت عملی کے ل this ، یہ طریقہ اہم نہیں ہے۔ سب سے اہم طریقہ پانچویں طریقہ ہے ، یہ طریقہ بنیادی طور پر ٹریڈنگ منطق اور آرڈر دینے کے لئے ذمہ دار ہے۔

/ / 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 طریقہ کار ہفتے کا موجودہ دن حاصل کرتا ہے تاکہ یہ معلوم کیا جاسکے کہ آیا یہ ایک نئی K لائن ہے۔ اس کا نفاذ بھی بہت آسان ہے ، ٹائم اسٹیمپ حاصل کریں ، گھنٹہ اور ہفتہ کا حساب لگائیں ، اور آخر کار ہفتوں کی تعداد واپس کریں۔ تیسرا 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");
    }

آخر میں ، ہم اس بات پر توجہ مرکوز کرتے ہیں کہ لوپ فنکشن حکمت عملی کی منطق اور آرڈر کو کس طرح کنٹرول کرتا ہے۔ اگر آپ مزید احتیاط سے دیکھنا چاہتے ہیں تو ، آپ کوڈ میں موجود تبصروں کا حوالہ دے سکتے ہیں۔ پہلے یہ طے کریں کہ آیا سی ٹی پی ٹرانزیکشن اور مارکیٹ سرور منسلک ہیں؟ پھر اکاؤنٹ کا دستیاب بیلنس حاصل کریں اور ہفتوں کی تعداد حاصل کریں؛ پھر ایف ایم زیڈ کے سرکاری سیٹ کنٹریکٹ ٹائپ فنکشن کو کال کرکے تجارت کرنے کے لئے مختلف قسم کا کوڈ مرتب کریں ، اور اس فنکشن کا استعمال ٹریڈنگ کی قسم کی تفصیلات واپس کرنے کے لئے کرسکتے ہیں۔ پھر موجودہ مارکیٹ کی گہرائی کے اعداد و شمار حاصل کرنے کے لئے گیٹ ڈیپتھ فنکشن کو کال کریں۔ گہرائی کے اعداد و شمار میں شامل ہیں: خریداری کی قیمت ، خریداری کا حجم ، فروخت کی قیمت ، فروخت کا حجم ، وغیرہ ، اور ہم ان کو متغیرات کے ساتھ اسٹور کرتے ہیں ، کیونکہ وہ بعد میں استعمال ہوں گے۔ پھر صارف کو موجودہ مارکیٹ کی حیثیت کو دیکھنے میں سہولت فراہم کرنے کے ل these ان پورٹ ڈیٹا کو اسٹیٹس بار میں آؤٹ پٹ کریں۔

// 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);
}

بہت کچھ کرنے کے بعد ، ہم آخر کار آرڈر دے سکتے ہیں۔ تجارت سے پہلے ، پہلے ہم پروگرام کی موجودہ ہولڈنگ پوزیشن کی حیثیت کا فیصلہ کرتے ہیں (کوئی ہولڈنگ پوزیشن ، لمبی پوزیشن کے احکامات ، شارٹ پوزیشن کے احکامات) ، یہاں ہم نے اگر... دوسری صورت میں... دوسری صورت میں منطقی کنٹرول کا استعمال کیا۔ وہ بہت آسان ہیں ، اگر کوئی ہولڈنگ پوزیشن نہیں ہے تو ، پوزیشن منطقی شرط کے مطابق کھولی جائے گی۔ اگر ہولڈنگ پوزیشن ہے تو ، پوزیشن منطقی شرط کے مطابق بند ہوجائے گی۔ ہر ایک کی تفہیم میں آسانی کے ل we ، ہم منطق کی وضاحت کے لئے تین پیراگراف استعمال کرتے ہیں ، پوزیشن کھولنے کے حصے کے لئے:

سب سے پہلے ایک بولی متغیر کا اعلان کریں، ہم اسے بند پوزیشن کو کنٹرول کرنے کے لئے استعمال کرتے ہیں؛ اگلا ہمیں کرنٹ اکاؤنٹ کی معلومات حاصل کرنے کی ضرورت ہے، اور منافع کی قیمت کو ریکارڈ کریں، پھر واپسی کے آرڈر کی حیثیت کا تعین کریں، اگر واپسی کی تعداد مقرر کردہ زیادہ سے زیادہ سے زیادہ ہو تو، لاگ میں متعلقہ معلومات کو پرنٹ کریں؛ پھر موجودہ بولی اور پیشکش کی قیمت کے فرق کی مطلق قیمت کا حساب لگائیں تاکہ یہ معلوم ہو کہ موجودہ بولی کی قیمت اور پوچھ قیمت کے درمیان 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;
     }
}

آخر میں ، آئیے دیکھتے ہیں کہ مختصر پوزیشن کو کیسے بند کیا جائے۔ اصول مذکورہ بالا بندش طویل پوزیشن کے برعکس ہے۔ پہلے ، موجودہ پوزیشن کی حیثیت کے مطابق ، آرڈر کی قسم مرتب کریں ، اور پھر خرید 1 قیمت حاصل کریں ، اگر موجودہ خرید 1 قیمت مختصر پوزیشن کی افتتاحی قیمت سے کم ہے تو ، بندش مختصر پوزیشن کی قیمت مقرر کی جائے گی۔ اگر موجودہ خرید 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

حکمت عملی کا بیان

اعلی تعدد کی تجارت کے تجسس کو پورا کرنے اور نتائج کو زیادہ واضح طور پر دیکھنے کے ل this ، اس حکمت عملی کے بیک ٹیسٹ ماحول کی ٹرانزیکشن فیس کو 0 پر مقرر کیا گیا ہے ، جس کی وجہ سے ایک سادہ تیز رفتار منطق پیدا ہوتی ہے۔ اگر آپ حقیقی مارکیٹ میں منافع بخش ہونے کے ل the ٹرانزیکشن فیس کو پورا کرنا چاہتے ہیں۔ مزید اصلاح کی ضرورت ہے۔ جیسے جیت کی شرح کو بہتر بنانے کے لئے قلیل مدتی پیش گوئی کرنے کے لئے آرڈر اسٹریم کا استعمال کرنا ، اس کے علاوہ زر مبادلہ کی فیس کی واپسی ، پائیدار منافع بخش حکمت عملی کے حصول کے ل high ، اعلی تعدد کی تجارت سے متعلق بہت ساری کتابیں موجود ہیں۔ مجھے امید ہے کہ ہر کوئی زیادہ سوچ سکتا ہے اور اصول پر قائم رہنے کے بجائے حقیقی مارکیٹ میں جاسکتا ہے۔

ہمارے بارے میں

ایف ایم زیڈ کوانٹ ایک خالص طور پر ٹکنالوجی سے چلنے والی ٹیم ہے جو مقداری تجارت کے شوقین افراد کے لئے ایک انتہائی موثر دستیاب بیک ٹیسٹ میکانزم مہیا کرتی ہے۔ ہمارا بیک ٹیسٹ میکانزم ایک سادہ قیمت میچ کے بجائے ایک حقیقی تبادلے کی نقالی کررہا ہے۔ ہمیں امید ہے کہ صارفین اپنی صلاحیتوں کو بہتر بنانے کے لئے پلیٹ فارم سے فائدہ اٹھا سکتے ہیں۔


متعلقہ

مزید