"ওকেএক্স ফিউচার কন্ট্রাক্ট হেজিং কৌশল এর সি++ সংস্করণ" যা আপনাকে হার্ডকোর পরিমাণগত কৌশল মাধ্যমে নিয়ে যায়

লেখক:ভাল, তৈরিঃ 2019-08-29 16:05:07, আপডেটঃ 2023-11-07 20:53:27

img

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

কৌশল নীতি

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

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

  • স্প্রেড পজিটিভ, শর্ট ফরওয়ার্ড কন্ট্রাক্ট বিক্রি, লং সাম্প্রতিক কন্ট্রাক্ট কেনা।
  • নেগেটিভ স্প্রেড, লং ফরওয়ার্ড কন্ট্রাক্ট কেনা, সাম্প্রতিক কন্ট্রাক্ট কেনা।

মৌলিক নীতিগুলি বোঝার পর, বাকিটি হল কিভাবে কৌশলটি হেজিংয়ের উদ্বোধনী অবস্থানকে ট্রিগার করে, কিভাবে অবস্থান বন্ধ করে, কিভাবে অবস্থান যোগ করে, মোট অবস্থান নিয়ন্ত্রণ পদ্ধতি এবং অন্যান্য কৌশল বিশদ প্রক্রিয়াজাতকরণ।

হিজিং কৌশল মূলত বিষয় মূল্য পার্থক্য (স্প্রেড) এবং তার রিগ্রেশন এর ওঠানামা নিয়ে উদ্বেগ প্রকাশ করে। তবে, পার্থক্য সামান্য ওঠানামা, বা তীব্র ওঠানামা, বা এক দিকের হতে পারে।

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

কৌশল কোড বিশ্লেষণ

কোডটি পুরোটা দেখে, আপনি সিদ্ধান্ত নিতে পারেন যে কোডটি মোটামুটিভাবে চারটি অংশে বিভক্ত।

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

  2. কে-লাইন ডেটা জেনারেটর ক্লাসঃ কৌশলটি জেনারেটর ক্লাস অবজেক্ট দ্বারা উত্পন্ন কে-লাইন ডেটা দ্বারা চালিত হয়।

  3. হেজিং ক্লাসঃ এই শ্রেণীর বস্তুগুলি নির্দিষ্ট ট্রেডিং লজিক, হেজিং অপারেশন এবং কৌশলটির বিবরণ প্রক্রিয়া করতে পারে।

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

কৌশল কোডের সামগ্রিক বোঝার মাধ্যমে, আমরা ধীরে ধীরে কৌশলটির বিভিন্ন দিক শিখতে পারি এবং তারপরে কৌশলটির নকশা, ধারণা এবং দক্ষতা অধ্যয়ন করতে পারি।

  • তালিকাভুক্ত মান সংজ্ঞা, অন্যান্য ফাংশন ফাংশন
  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)
  • কে লাইন ডেটা জেনারেটর ক্লাস
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;
};

এই শ্রেণীটি মূলত কৌশল হেজিং লজিক চালানোর জন্য অর্জিত টিক ডেটাকে একটি পার্থক্য কে লাইনে প্রক্রিয়াকরণের জন্য দায়ী।

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

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

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

  • হেজিং ক্লাস
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
};

কারণ কোডটি তুলনামূলকভাবে দীর্ঘ, কিছু অংশ বাদ দেওয়া হয়েছে, এটি মূলত এই হেজ ক্লাসের কাঠামো দেখায়, কনস্ট্রাক্টর হেজ ফাংশন বাদ দেওয়া হয়েছে, মূলত উদ্দেশ্য অবজেক্ট প্রারম্ভিকীকরণ। পরবর্তী, আমরা দুটি প্রধান 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 acess the WS interface of OKEX Futures
    Log("connect to websocket sucess");
    
    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 sucess");

প্রথমত, সাবস্ক্রাইব বার্তা json পরামিতি দ্বারা পাস সাবস্ক্রাইব ইন্টারফেস এর url এনকোডিং, অর্থাৎ মানpayloadপরামিতি. তারপর একটি গুরুত্বপূর্ণ ধাপ FMZ Quant প্ল্যাটফর্মের API ইন্টারফেস ফাংশন কল করা হয়Dialফাংশন।Dialএক্সচেঞ্জের ওয়েবসকেট ইন্টারফেসে অ্যাক্সেস করতে ফাংশন ব্যবহার করা যেতে পারে। এখানে আমরা কিছু সেটিংস তৈরি করি, ওয়েবসকেট সংযোগ নিয়ন্ত্রণ অবজেক্টকে তৈরি করতে হবে যা সংযোগ বিচ্ছিন্ন করার স্বয়ংক্রিয় পুনরায় সংযোগ রয়েছে (সাবস্ক্রিপশন বার্তাটি এখনও মানটি ব্যবহার করেqsস্ট্রিংpayloadপ্যারামিটার), এই ফাংশন অর্জন করার জন্য, আপনি প্যারামিটার স্ট্রিং এর কনফিগারেশন যোগ করতে হবেDial function.

এর সূচনাDialফাংশন পরামিতি নিম্নরূপঃ

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

এটি ওয়েবসকেট ইন্টারফেসের ঠিকানা যা অ্যাক্সেস করা প্রয়োজন, এবং এটি you দ্বারা পৃথক করা হয়।

compress=gzip_raw&mode=recv&reconnect=true&payload="+qsসমস্ত কনফিগারেশন পরামিতি।

প্যারামিটারের নাম বর্ণনা
কম্প্রেস কম্প্রেস কম্প্রেশন মোড, OKEX ওয়েবসকেট ইন্টারফেস এই ভাবে gzip_raw ব্যবহার করে, তাই এটি gzip_raw সেট করা হয়
মোড মোড হল মোড, ঐচ্ছিক দ্বৈত, প্রেরণ এবং পুনরুদ্ধার তিন ধরণের। দ্বৈত দ্বৈত, সংকুচিত ডেটা প্রেরণ এবং সংকুচিত ডেটা গ্রহণ করে। প্রেরণ সংকুচিত ডেটা প্রেরণ করে। Recv সংকুচিত ডেটা গ্রহণ করে এবং স্থানীয়ভাবে এটিকে ডিকম্প্রেস করে।
পুনরায় সংযোগ করুন পুনরায় সংযুক্ত করুন পুনরায় সংযুক্ত করার জন্য সেট করা হয়েছে, পুনরায় সংযোগ সক্ষম করতে পুনরায় সংযুক্ত করুন = সত্য, কোনও ডিফল্ট পুনরায় সংযুক্ত করা হয়নি।
পয়লড লোড ইউললোড একটি সাবস্ক্রিপশন বার্তা যা ws পুনরায় সংযুক্ত হলে পাঠানো প্রয়োজন।

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

প্রতিটি মূল্যের ওঠানামা ধরুন এবং দ্রুত সঠিক হেজ ধরুন।

  • অবস্থান নিয়ন্ত্রণ

পজিশন কন্ট্রোল ফিবোনাচি সিরিজের অনুরূপ হেজিং পজিশনের অনুপাত ব্যবহার করে নিয়ন্ত্রিত হয়।

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.
}

এটা দেখা যায় যে প্রতিবার যোগ করা অতিরিক্ত পজিশনের সংখ্যা শেষ দুটি পজিশনের যোগফল।

এই ধরনের পজিশন কন্ট্রোল পার্থক্যের বৃহত্তর, সালিশ হেজিং এর আপেক্ষিক বৃদ্ধি, এবং অবস্থান ছড়িয়ে বুঝতে পারে, যাতে ছোট দামের ওঠানামা ছোট অবস্থান বুঝতে পারে, এবং বড় দামের ওঠানামা অবস্থান যথাযথভাবে বৃদ্ধি পায়।

  • বন্ধ পজিশনঃ স্টপ লস এবং লাভ নিন

স্থির স্টপ লস স্প্রেড এবং লাভের স্প্রেড।

যখন পজিশনের পার্থক্য লাভের অবস্থান এবং স্টপ লস পজিশনে পৌঁছে যায়, তখন লাভের অবস্থান এবং স্টপ লস পজিশন সম্পন্ন হয়।

  • বাজারে প্রবেশ এবং বাজার থেকে বেরিয়ে আসার নকশা

প্যারামিটারের সময়কালNPeriodকন্ট্রোল কৌশল খোলার এবং বন্ধের অবস্থানের উপর কিছু গতিশীল নিয়ন্ত্রণ প্রদান করে।

  • কৌশল চার্ট

কৌশলটি স্বয়ংক্রিয়ভাবে প্রাসঙ্গিক লেনদেনের তথ্য চিহ্নিত করার জন্য একটি স্প্রেড কে-লাইন চার্ট তৈরি করে।

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 লাইন অঙ্কন, চার্ট বস্তুর একটি রেফারেন্স_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).
     }
}

চার্টে একটি নতুন কে-লাইন বার ডেটা সন্নিবেশ করানaddচার্ট অবজেক্টের সদস্য ফাংশন_c.

c->add(chartIdx, point);

ব্যাকটেস্ট

img img img

এই কৌশলটি শুধুমাত্র শেখার এবং যোগাযোগের উদ্দেশ্যে। যখন এটি বাস্তব বাজারে প্রয়োগ করা হয়, দয়া করে বাজারের বাস্তব পরিস্থিতি অনুযায়ী সংশোধন এবং অপ্টিমাইজ করুন।

কৌশল ঠিকানাঃhttps://www.fmz.com/strategy/163447

আরো আকর্ষণীয় কৌশল FMZ Quant প্ল্যাটফর্মে রয়েছে":https://www.fmz.com


সম্পর্কিত

আরো