وسائل لوڈ ہو رہے ہیں... لوڈنگ...

سی ++ کا استعمال کرتے ہوئے اوکیکس مستقبل کے معاہدے کی ہیجنگ کی حکمت عملی

مصنف:نیکی, تخلیق: 2020-08-05 09:54:32, تازہ کاری: 2023-10-10 21:13:01

img

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

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

حکمت عملی کسی حد تک ہارڈ کور کیوں ہے کیونکہ حکمت عملی C ++ میں لکھی گئی ہے اور حکمت عملی کو پڑھنا قدرے مشکل ہے۔ لیکن اس سے قارئین کو اس حکمت عملی کے ڈیزائن اور نظریات کا جوہر سیکھنے سے نہیں روکتا ہے۔ حکمت عملی کا منطق نسبتا simple آسان ہے ، کوڈ کی لمبائی اعتدال پسند ہے ، صرف 500 لائنیں۔ مارکیٹ کے اعداد و شمار کے حصول کے لحاظ سے ، rest انٹرفیس کا استعمال کرنے والی دیگر حکمت عملیوں کے برعکس۔ یہ حکمت عملی ایکسچینج مارکیٹ کے کوٹس کو قبول کرنے کے لئے websocket انٹرفیس کا استعمال کرتی ہے۔

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

- پھیلاؤ مثبت، مختصر مستقبل کے معاہدوں کی فروخت، طویل حالیہ معاہدوں کی خریداری. - منفی پھیلاؤ، طویل مستقبل کے معاہدوں کی خریداری، مختصر حالیہ معاہدوں کی فروخت.

بنیادی اصولوں کو سمجھنے کے بعد، باقی یہ ہے کہ حکمت عملی ہیج کی افتتاحی پوزیشن کو کیسے چالو کرتی ہے، پوزیشن کو کیسے بند کرنا ہے، پوزیشنوں کو کیسے شامل کرنا ہے، کل پوزیشن کنٹرول کا طریقہ اور حکمت عملی کی دیگر تفصیلات کی پروسیسنگ.

ہیجنگ کی حکمت عملی بنیادی طور پر موضوع کی قیمت کے فرق (اسپرڈ) کے اتار چڑھاؤ اور اس کے رجعت سے متعلق ہے۔ تاہم ، فرق میں قدرے اتار چڑھاؤ ، یا تیزی سے اتار چڑھاؤ ، یا ایک ہی سمت میں ہونے کا امکان ہے۔

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

حکمت عملی کوڈ کا تجزیہ

پورے کوڈ کو دیکھ کر آپ یہ نتیجہ اخذ کر سکتے ہیں کہ کوڈ تقریباً چار حصوں میں تقسیم ہے۔

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

  2. K لائن ڈیٹا جنریٹر کلاس: حکمت عملی جنریٹر کلاس آبجیکٹ کے ذریعہ تیار کردہ K لائن ڈیٹا سے چلتی ہے۔

  3. ہیجنگ کلاس: اس کلاس کے اشیاء مخصوص ٹریڈنگ منطق، ہیجنگ آپریشنز اور حکمت عملی کی تفصیلات کی پروسیسنگ انجام دے سکتے ہیں۔

  4. حکمت عملی کا بنیادی کام ، جو main فنکشن ہے۔ اہم کام حکمت عملی کا انٹری فنکشن ہے۔ مرکزی لوپ اس فنکشن کے اندر ہی انجام دیا جاتا ہے۔ اس کے علاوہ ، یہ فنکشن ایک اہم آپریشن بھی انجام دیتا ہے ، یعنی ، تبادلے کے ویب ساکٹ انٹرفیس تک رسائی حاصل کرنا ، اور K- لائن ڈیٹا جنریٹر کی حیثیت سے پش شدہ خام ٹِک مارکیٹ ڈیٹا حاصل کرنا۔

حکمت عملی کے کوڈ کی مجموعی تفہیم کے ذریعے، ہم آہستہ آہستہ حکمت عملی کے مختلف پہلوؤں کو سیکھ سکتے ہیں، اور پھر حکمت عملی کے ڈیزائن، خیالات اور مہارتوں کا مطالعہ کرسکتے ہیں.

  • تعداد کی قدر کی تعریف، دیگر فنکشن افعال
  1. درج کردہ قسمStateبیان
enum State {                    // Enum type defines some states
    STATE_NA,                   // Abnormal state
    STATE_IDLE,                 // idle
    STATE_HOLD_LONG,            // holding long positions
    STATE_HOLD_SHORT,           // holding short positions
};

کیونکہ کوڈ میں کچھ افعال ایک ریاست واپس، ان ریاستوں enumeration کی قسم میں بیان کر رہے ہیںState.

یہ دیکھ کرSTATE_NAکوڈ میں ظاہر غیر معمولی ہے، اورSTATE_IDLEغیر فعال ہے، یعنی آپریشن کی حالت کو ہیج کیا جا سکتا ہے۔STATE_HOLD_LONGوہ حالت ہے جس میں مثبت ہیج پوزیشن رکھی جاتی ہے۔STATE_HOLD_SHORTوہ حالت ہے جس میں منفی ہیج پوزیشن رکھی جاتی ہے۔

  1. سٹرنگ کی تبدیلی، اس حکمت عملی میں نہیں بلایا جاتا ہے، ایک متبادل افادیت فنکشن ہے، بنیادی طور پر سٹرنگ کے ساتھ نمٹنے.
string replace(string s, const string from, const string& to)
  1. ہیکساڈیسمل حروف میں تبدیل کرنے کے لئے ایک فنکشنtoHex
inline unsigned char toHex(unsigned char x)
  1. ہینڈلنگ یو آر ایل کوڈت افعال
std::string urlencode(const std::string& str)
  1. ایک ٹائم کنورشن فنکشن جو سٹرنگ فارمیٹ میں وقت کو ٹائم اسٹیمپ میں تبدیل کرتا ہے۔
uint64_t _Time(string &s)
  • K لائن ڈیٹا جنریٹر کلاس
Class BarFeeder { // K line data generator class
    Public:
        BarFeeder(int period) : _period(period) { // constructor with argument "period" period, initialized in initialization list
            _rs.Valid = true; // Initialize the "Valid" property of the K-line data in the constructor body.
        }

        Void feed(double price, Chart *c=nullptr, int chartIdx=0) { // input data, "nullptr" null pointer type, "chartIdx" index default parameter is 0
            Uint64_t epoch = uint64_t(Unix() / _period) * _period * 1000; // The second-level timestamp removes the incomplete time period (incomplete _period seconds) and is converted to a millisecond timestamp.
            Bool newBar = false; // mark the tag variable of the new K line Bar
            If (_rs.size() == 0 || _rs[_rs.size()-1].Time < epoch) { // If the K line data is 0 in length. Or the last bar's timestamp is less than epoch (the last bar of the K line is more than the current most recent cycle timestamp)
                Record r; // declare a K line bar structure
                r.Time = epoch; // Construct the K line bar of the current cycle
                r.Open = r.High = r.Low = r.Close = price; // Initialize the property
                _rs.push_back(r); // K line bar is pressed into the K line data structure
                If (_rs.size() > 2000) { // If the K-line data structure length exceeds 2000, the oldest data is removed.
                    _rs.erase(_rs.begin());
                }
                newBar = true; // tag
            } else { // In other cases, it is not the case of a new bar.
                Record &r = _rs[_rs.size() - 1]; // Reference the data of the last bar in the data.
                r.High = max(r.High, price); // The highest price update operation for the referenced data.
                r.Low = min(r.Low, price); // The lowest price update operation for the referenced data.
                r.Close = price; // Update the closing price of the referenced data.
            }
    
            Auto bar = _rs[_rs.size()-1]; // Take the last column data and assign it to the bar variable
            Json point = {bar.Time, bar.Open, bar.High, bar.Low, bar.Close}; // Construct a json type data
            If (c != nullptr) { // The chart object pointer is not equal to the null pointer, do the following.
               If (newBar) { // judge if the new Bar appears
                    C->add(chartIdx, point); // Call the chart object member function add to insert data into the chart object (new k line bar)
                    C->reset(1000); // retain only 1000 bar of data
                } else {
                    C->add(chartIdx, point, -1); // Otherwise update (not new bar), this point (update this bar).
                }
            }
        }
        Records & get() { // member function, method for getting K line data.
            Return _rs; // Returns the object's private variable _rs . (ie generated K-line data)
        }
    Private:
        Int _period;
        Records _rs;
};

یہ کلاس بنیادی طور پر حکمت عملی ہیجنگ منطق کو چلانے کے لئے ایک فرق K لائن میں حاصل کردہ ٹک ڈیٹا کو پروسیسنگ کے لئے ذمہ دار ہے.

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

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

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

  • ہیجنگ کلاس
Class Hedge { // Hedging class, the main logic of the strategy.
  Public:
    Hedge() { // constructor
        ...
    };
    
    State getState(string &symbolA, Depth &depthA, string &symbolB, Depth &depthB) { // Get state, parameters: contract A name, contract A depth data, contract B name, contract B depth data
        
        ...
    }
    Bool Loop(string &symbolA, Depth &depthA, string &symbolB, Depth &depthB, string extra="") { // Opening and closing position main logic
        
        ...
    }

  Private:
    Vector<double> _addArr; // Hedging adding position list
    String _state_desc[4] = {"NA", "IDLE", "LONG", "SHORT"}; // Status value Description
    Int _countOpen = 0; // number of opening positions
    Int _countCover = 0; // number of closing positions
    Int _lastCache = 0; //
    Int _hedgeCount = 0; // number of hedging
    Int _loopCount = 0; // loop count (cycle count)
    Double _holdPrice = 0; // holding position price
    BarFeeder _feederA = BarFeeder(DPeriod); // A contract Quote K line generator
    BarFeeder _feederB = BarFeeder(DPeriod); // B contract Quote K line generator
    State _st = STATE_NA; // Hedging type Object Hedging position status
    String _cfgStr; // chart configuration string
    Double _holdAmount = 0; // holding position amount
    Bool _isCover = false; // the tag of whether to close the position
    Bool _needCheckOrder = true; // Set whether to check the order
    Chart _c = Chart(""); // chart object and initialize
};

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

getState

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

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

لوپ

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

  • حکمت عملی کا بنیادی کام
Void main() {

    ...
    
    String realSymbolA = exchange.SetContractType(symbolA)["instrument"]; // Get the A contract (this_week / next_week / quarter ), the real contract ID corresponding to the week, next week, and quarter of the OKEX futures contract.
    String realSymbolB = exchange.SetContractType(symbolB)["instrument"]; // ...
    
    String qs = urlencode(json({{"op", "subscribe"}, {"args", {"futures/depth5:" + realSymbolA, "futures/depth5:" + realSymbolB}}}).dump()) ; // JSON encoding, url encoding for the parameters to be passed on the ws interface
    Log("try connect to websocket"); // Print the information of the connection WS interface.
    Auto ws = Dial("wss://real.okex.com:10442/ws/v3|compress=gzip_raw&mode=recv&reconnect=true&payload="+qs); // Call the FMZ API "Dial" function to access the WS interface of OKEX Futures
    Log("connect to websocket success");
    
    Depth depthA, depthB; // Declare two variables of the depth data structure to store the depth data of the A contract and the B contract
    Auto fillDepth = [](json &data, Depth &d) { // Construct the code for the Depth data with the json data returned by the interface.
        d.Valid = true;
        d.Asks.clear();
        d.Asks.push_back({atof(string(data["asks"][0][0]).c_str()), atof(string(data["asks"][0][1]).c_str( ))});
        d.Bids.clear();
        d.Bids.push_back({atof(string(data["bids"][0][0]).c_str()), atof(string(data["bids"][0][1]).c_str( ))});
    };
    String timeA; // time string A
    String timeB; // time string B
    While (true) {
        Auto buf = ws.read(); // Read the data pushed by the WS interface
        
        ...
        
}

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

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

ویب ساکٹ انٹرفیس کے اعداد و شمار کو کس طرح سبسکرائب کرتا ہے اور یہ کس طرح ترتیب دیا جاتا ہے اس پر قریب سے نظر ڈالیں.

string qs = urlencode(json({{"op", "subscribe"}, {"args", {"futures/depth5:" + realSymbolA, "futures/depth5:" + realSymbolB}}}).dump());    
Log("try connect to websocket");                                                                                                            
auto ws = Dial("wss://real.okex.com:10442/ws/v3|compress=gzip_raw&mode=recv&reconnect=true&payload="+qs);     
Log("connect to websocket success");

سب سے پہلے، سبسکرپشن پیغام json پیرامیٹر سبسکرپٹ انٹرفیس کی طرف سے منظور کی url کوڈنگ، یعنی قدرpayloadپیرامیٹر۔ پھر ایک اہم قدم FMZ کوانٹ پلیٹ فارم کی API انٹرفیس فنکشن کو کال کرنا ہے۔Dialفنکشن.Dialتقریب کا استعمال کیا جا سکتا ہے تک رسائی حاصل کرنے کے لئے تبادلےs ویب ساکٹ انٹرفیس. یہاں ہم کچھ ترتیبات کرتے ہیں, کی اجازت دیتے ہیں ویب ساکٹ کنکشن کنٹرول آبجیکٹ ws پیدا کیا جائے گا کرنے کے لئے ہے خود کار طریقے سے دوبارہ منسلک کرنے کے منقطع (سبسکرپشن پیغام اب بھی قدر کا استعمال کرتا ہےqsسلسلہpayloadپیرامیٹر) ، اس فنکشن کو حاصل کرنے کے لئے، آپ کی ضرورت ہے کی پیرامیٹر تار میں ترتیب شامل کریںDial function.

کے آغازDialفنکشن پیرامیٹر مندرجہ ذیل ہے:

wss://real.okex.com:10442/ws/v3

یہ ویب ساکٹ انٹرفیس کا پتہ ہے جس تک رسائی حاصل کرنے کی ضرورت ہے، اور سے الگ ہے.

Compress=gzip_raw&mode=recv&reconnect=true&payload="+qsتمام ترتیب پیرامیٹرز ہیں.

پیرامیٹر کا نام تفصیل
کمپریس سکیڑیں سکیڑیں موڈ ہے، OKEX ویب ساکٹ انٹرفیس اس طرح gzip_raw استعمال کرتا ہے، تو یہ gzip_raw پر مقرر کیا جاتا ہے
موڈ موڈ موڈ ، اختیاری دوہری ، بھیجنے اور وصول کرنے کی تین قسم ہے۔ دوہری دو طرفہ ہے ، کمپریسڈ ڈیٹا بھیجنا اور کمپریسڈ ڈیٹا وصول کرنا۔ بھیجنا کمپریسڈ ڈیٹا بھیجنا ہے۔ Recv کمپریسڈ ڈیٹا وصول کرتا ہے اور اسے مقامی طور پر ڈیکمپریس کرتا ہے۔
دوبارہ مربوط کریں reconnect دوبارہ مربوط کرنے کے لئے مقرر کیا گیا ہے، reconnect=true دوبارہ مربوط کرنے کے قابل بنانے کے لئے، کوئی ڈیفالٹ دوبارہ مربوط نہیں ہے.
پےلوڈ پےلوڈ ایک سبسکرپشن پیغام ہے جسے ws دوبارہ منسلک ہونے پر بھیجنے کی ضرورت ہے۔

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

ہر قیمت کے اتار چڑھاؤ کو پکڑو اور فوری طور پر صحیح ہیج کو پکڑو.

  • پوزیشن کنٹرول

پوزیشن کنٹرول بوفیناچی سیریز کی طرح ہیج پوزیشنوں کے تناسب کا استعمال کرتے ہوئے کنٹرول کیا جاتا ہے۔

For (int i = 0; i < AddMax + 1; i++) { // Construct a data structure that controls the number of scalping, similar to the ratio of the Bofinac sequence to the number of hedges.
     If (_addArr.size() < 2) { // The first two added positions are changed as: Double the number of hedges
         _addArr.push_back((i+1)*OpenAmount);
     }
     _addArr.push_back(_addArr[_addArr.size()-1] + _addArr[_addArr.size()-2]); // The last two adding positions are added together, and the current position quantity is calculated and stored in the "_addArr" data structure.
}

یہ دیکھا جا سکتا ہے کہ ہر بار شامل ہونے والی اضافی پوزیشنوں کی تعداد آخری دو پوزیشنوں کا مجموعہ ہے۔

اس طرح کی پوزیشن کنٹرول فرق، arbitrage کے ہیج کے نسبتا اضافہ، اور پوزیشن کی بازی کا احساس کر سکتے ہیں، تاکہ چھوٹے قیمت اتار چڑھاؤ کی چھوٹی پوزیشن کو پکڑنے کے لئے، اور بڑی قیمت اتار چڑھاؤ کی پوزیشن مناسب طریقے سے اضافہ کیا جاتا ہے.

  • بند ہونے والی پوزیشن: سٹاپ نقصان اور منافع حاصل کریں

فکسڈ سٹاپ نقصان پھیلاؤ اور منافع پھیلاؤ.

جب پوزیشن کا فرق منافع حاصل کرنے کی پوزیشن اور سٹاپ نقصان کی پوزیشن تک پہنچ جاتا ہے، تو منافع حاصل کرنے اور نقصان کو روکنے کی پوزیشن کی جاتی ہے.

  • مارکیٹ میں داخل ہونے اور مارکیٹ سے باہر نکلنے کا ڈیزائن

پیرامیٹر کی مدتNPeriodکنٹرول حکمت عملی کی افتتاحی اور اختتامی پوزیشن پر کچھ متحرک کنٹرول فراہم کرتا ہے۔

  • حکمت عملی کا چارٹ

حکمت عملی خود بخود ایک پھیلاؤ K لائن چارٹ پیدا کرتی ہے تاکہ متعلقہ ٹرانزیکشن کی معلومات کو نشان زد کیا جاسکے۔

C ++ حکمت عملی اپنی مرضی کے مطابق چارٹ ڈرائنگ آپریشن بھی بہت آسان ہے۔ آپ دیکھ سکتے ہیں کہ ہیج کلاس کے کنسٹرکٹر میں ، ہم تحریری چارٹ کی تشکیل کی تار کا استعمال کرتے ہیں۔_cfgStrچارٹ آبجیکٹ کو ترتیب دینے کے لئے_c, _cہیج کلاس کا نجی جزو ہے۔ جب نجی ممبر کو شروع کیا جاتا ہے تو ،chartFMZ Quant پلیٹ فارم اپنی مرضی کے مطابق چارٹ API انٹرفیس تقریب کی طرف سے تعمیر اعتراض بلایا جاتا ہے.

_cfgStr = R"EOF(
[{
"extension": { "layout": "single", "col": 6, "height": "500px"},
"rangeSelector": {"enabled": false},
"tooltip": {"xDateFormat": "%Y-%m-%d %H:%M:%S, %A"},
"plotOptions": {"candlestick": {"color": "#d75442", "upColor": "#6ba583"}},
"chart":{"type":"line"},
"title":{"text":"Spread Long"},
"xAxis":{"title":{"text":"Date"}},
"series":[
    {"type":"candlestick", "name":"Long Spread","data":[], "id":"dataseriesA"},
    {"type":"flags","data":[], "onSeries": "dataseriesA"}
    ]
},
{
"extension": { "layout": "single", "col": 6, "height": "500px"},
"rangeSelector": {"enabled": false},
"tooltip": {"xDateFormat": "%Y-%m-%d %H:%M:%S, %A"},
"plotOptions": {"candlestick": {"color": "#d75442", "upColor": "#6ba583"}},
"chart":{"type":"line"},
"title":{"text":"Spread Short"},
"xAxis":{"title":{"text":"Date"}},
"series":[
    {"type":"candlestick", "name":"Long Spread","data":[], "id":"dataseriesA"},
    {"type":"flags","data":[], "onSeries": "dataseriesA"}
    ]
}
]
)EOF";
_c.update(_cfgStr);                 // Update chart objects with chart configuration
_c.reset();                         // Reset chart data。
Call _c.update(_cfgStr); Use _cfgStr to configure to the chart object.

Call _c.reset(); to reset the chart data.

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

مثلاً:

_c.add(chartIdx, {{"x", UnixNano()/1000000}, {"title", action},  {"text", format("diff: %f", opPrice)}, {"color", color}});

آرڈر دینے کے بعد، K لائن چارٹ کو نشان زد کریں.

مندرجہ ذیل کے طور پر، ایک K لائن ڈرائنگ جب، چارٹ اعتراض کا حوالہ_cرکن فنکشن کو کال کرتے وقت ایک پیرامیٹر کے طور پر منظور کیا جاتا ہےfeedکےBarFeeder class.

void feed(double price, Chart *c=nullptr, int chartIdx=0)

یعنی، رسمی پیرامیٹرcکےfeed function.

Json point = {bar.Time, bar.Open, bar.High, bar.Low, bar.Close}; // Construct a json type data
If (c != nullptr) { // The chart object pointer is not equal to the null pointer, do the following.
    If (newBar) { // judge if the new Bar appears
         C->add(chartIdx, point); // Call the chart object member function "add" to insert data into the chart object (new k line bar)
         C->reset(1000); // only keep 1000 bar data
     } else {
         C->add(chartIdx, point, -1); // Otherwise update (not new bar), this point (update this bar).
     }
}

چارٹ میں ایک نیا K لائن بار ڈیٹا داخل کریںaddچارٹ آبجیکٹ کا رکن فنکشن_c.

c->add(chartIdx, point);

بیک ٹیسٹ

img img img

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

حکمت عملی کا پتہ:https://www.fmz.com/strategy/163447

مزید دلچسپ حکمت عملی FMZ Quant پلیٹ فارم میں ہیں":https://www.fmz.com


متعلقہ

مزید