آپ کو ہارڈ کور حکمت عملی سیکھنے کے لئے لے جاتا ہے "C++ OKEX معاہدہ ہیجنگ حکمت عملی"

مصنف:چھوٹا سا خواب, تخلیق: 2019-08-26 14:30:47, تازہ کاری: 2023-10-19 21:09:01

img

آپ کو ہارڈ کور حکمت عملی سیکھنے کے لئے لے جاتا ہے "C++ OKEX معاہدہ ہیجنگ حکمت عملی"

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

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

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

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

    اس کوڈ کو تقریباً ایک نظر ڈال کر یہ نتیجہ اخذ کیا جا سکتا ہے کہ اس کوڈ کو تقریباً چار حصوں میں تقسیم کیا گیا ہے۔

    • 1. فہرست کی قدر کی تعریف ، کچھ حیثیت کی اقدار کی وضاحت ، جو حالت کو نشان زد کرنے کے لئے استعمال ہوتی ہے۔ کچھ فنکشنل افعال جو حکمت عملی کے خیال سے وابستہ نہیں ہیں ، جیسے یو آر ایل انکوڈنگ افعال ، وقت کی تبدیلی کے افعال وغیرہ ، ان افعال اور حکمت عملی کے خیال سے وابستہ نہیں ہیں ، جو صرف ڈیٹا کو پروسیسنگ کے لئے استعمال ہوتے ہیں۔
    • 2.K线数据生成器类:策略由该生成器类对象生成的K线数据驱动。
    • 3.对冲类:该类的对象可以执行具体的交易逻辑,对冲操作、策略细节的处理机制等。
    • 4.策略主函数,也就是 mainفنکشن۔mainفنکشن پالیسی کا ان پٹ فنکشن ہوتا ہے، جس میں بنیادی طور پر اس فنکشن کے اندر لوپ کیا جاتا ہے، اس کے علاوہ اس فنکشن میں ایک اہم آپریشن بھی انجام دیا جاتا ہے، جو ایکسچینج کے ویب سوکٹ انٹرفیس تک رسائی حاصل کرتا ہے، اور آگے بڑھانے والے ٹک مارکیٹ کے اعداد و شمار کو حاصل کرتا ہے، جو K لائن ڈیٹا جنریٹر کے خام ڈیٹا کے طور پر کام کرتا ہے.

    اس حکمت عملی کے کوڈ کے بارے میں مجموعی طور پر جاننے کے بعد ، ہم ذیل میں اس حکمت عملی کے ڈیزائن ، خیالات اور تکنیکوں کو مکمل طور پر سیکھنے کے ل the ، اس کے مختلف حصوں کو مرحلہ وار تجزیہ کرکے سیکھ سکتے ہیں۔

    • فہرست سازی کی تعریف، دیگر فنکشنل افعال

      1، فہرست کی اقسامStateاعلانات

      enum State {                    // 枚举类型  定义一些 状态
          STATE_NA,                   // 非正常状态
          STATE_IDLE,                 // 空闲
          STATE_HOLD_LONG,            // 持多仓
          STATE_HOLD_SHORT,           // 持空仓
      };
      

      کیونکہ کچھ فنکشنز کوڈ میں ایک مخصوص حالت میں واپس آتے ہیں، لہذا یہ حالتیں فہرست کی قسم میں بیان کی جاتی ہیں.Stateمڈل۔ کوڈ میں ظاہر ہوتا ہےSTATE_NAاس کے علاوہ، اس کے بارے میں مزید معلومات حاصل کریں:STATE_IDLEاس کا مطلب یہ ہے کہ آپ کو اس کی ضرورت نہیں ہے۔STATE_HOLD_LONGاس کے علاوہ، یہ بھی کہا جاتا ہے کہ یہ ایک بہت بڑا خطرہ ہے.STATE_HOLD_SHORTاسٹیٹ آف ہولڈنگ آف اینٹرسٹی ہیجنگ پوزیشن۔

      2، سٹرنگ متبادل، اس پالیسی میں کوئی کال نہیں کی گئی ہے، یہ ایک بیک اپ ٹول فنکشن ہے جو بنیادی طور پر سٹرنگز کو سنبھالتا ہے۔

      string replace(string s, const string from, const string& to)   
      

      3، ایک فنکشن جو سولہ ہندسوں میں تبدیل ہوتا ہےtoHex

      inline unsigned char toHex(unsigned char x)
      

      4، یو آر ایل کوڈ کے ساتھ کام کرنے والے افعال

      std::string urlencode(const std::string& str)
      

      5، ٹائم کنورٹ فنکشن، سٹرنگ فارمیٹ کے وقت کو ٹائم ٹیب میں تبدیل کرتا ہے۔

      uint64_t _Time(string &s)
      
    • K لائن ڈیٹا جنریٹر کلاس

      class BarFeeder {                                                                       // K线 数据生成器类
          public:
              BarFeeder(int period) : _period(period) {                                       // 构造函数,参数为 period 周期, 初始化列表中初始化
                  _rs.Valid = true;                                                           // 构造函数体中初始化 K线数据的 Valid属性。
              }    
      
              void feed(double price, Chart *c=nullptr, int chartIdx=0) {                     // 输入数据,nullptr 空指针类型,chartIdx 索引默认参数为 0
                  uint64_t epoch = uint64_t(Unix() / _period) * _period * 1000;               // 秒级时间戳祛除不完整时间周期(不完整的_period 秒数),转为 毫秒级时间戳。
                  bool newBar = false;                                                        // 标记 新K线Bar 的标记变量
                  if (_rs.size() == 0 || _rs[_rs.size()-1].Time < epoch) {                    // 如果 K线数据 长度为 0 。 或者 最后一bar 的时间戳小于 epoch(K线最后一bar 比当前最近的周期时间戳还要靠前)
                      Record r;                                                               // 声明一个 K线bar 结构
                      r.Time = epoch;                                                         // 构造当前周期的K线bar 
                      r.Open = r.High = r.Low = r.Close = price;                              // 初始化 属性
                      _rs.push_back(r);                                                       // K线bar 压入 K线数据结构
                      if (_rs.size() > 2000) {                                                // 如果K线数据结构长度超过 2000 , 就剔除最早的数据。
                          _rs.erase(_rs.begin());
                      }
                      newBar = true;                                                          // 标记
                  } else {                                                                    // 其它情况,不是出现新bar 的情况下的处理。
                      Record &r = _rs[_rs.size() - 1];                                        // 引用 数据中最后一bar 的数据。
                      r.High = max(r.High, price);                                            // 对引用数据的最高价更新操作。
                      r.Low = min(r.Low, price);                                              // 对引用数据的最低价更新操作。
                      r.Close = price;                                                        // 对引用数据的收盘价更新操作。
                  }
          
                  auto bar = _rs[_rs.size()-1];                                               // 取最后一柱数据 ,赋值给 bar 变量
                  json point = {bar.Time, bar.Open, bar.High, bar.Low, bar.Close};            // 构造一个 json 类型数据
                  if (c != nullptr) {                                                         // 图表对象指针不等于 空指针,执行以下。
                     if (newBar) {                                                            // 根据标记判断,如果出现新Bar 
                          c->add(chartIdx, point);                                            // 调用图表对象成员函数add,向图表对象中插入数据(新增K线bar)
                          c->reset(1000);                                                     // 只保留1000 bar的数据
                      } else {
                          c->add(chartIdx, point, -1);                                        // 否则就更新(不是新bar),这个点(更新这个bar)。
                      } 
                  }
              }
              Records & get() {                                                               // 成员函数,获取K线数据的方法。
                  return _rs;                                                                 // 返回对象的私有变量 _rs 。(即 生成的K线数据)
              }
          private:
              int _period;
              Records _rs;
      };
      

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

    • ہیجنگ کلاس

      class Hedge {                                                                           // 对冲类,策略主要逻辑。
        public:
          Hedge() {                                                                           // 构造函数
              ...
          };
          
          State getState(string &symbolA, Depth &depthA, string &symbolB, Depth &depthB) {        // 获取状态,参数: 合约A名称 、合约A深度数据, 合约B名称、 合约B深度数据
              
              ...
          }
          bool Loop(string &symbolA, Depth &depthA, string &symbolB, Depth &depthB, string extra="") {       // 开平仓 策略主要逻辑
              
              ...
          }    
      
        private:
          vector<double> _addArr;                                     // 对冲加仓列表
          string _state_desc[4] = {"NA", "IDLE", "LONG", "SHORT"};    // 状态值 描述信息
          int _countOpen = 0;                                 // 开仓次数
          int _countCover = 0;                                // 平仓次数
          int _lastCache = 0;                                 // 
          int _hedgeCount = 0;                                // 对冲次数
          int _loopCount = 0;                                 // 循环计数(循环累计次数)
          double _holdPrice = 0;                              // 持仓价格
          BarFeeder _feederA = BarFeeder(DPeriod);            // A合约 行情 K线生成器
          BarFeeder _feederB = BarFeeder(DPeriod);            // B合约 行情 K线生成器
          State _st = STATE_NA;                               // 对冲类型 对象的 对冲持仓状态
          string _cfgStr;                                     // 图表配置 字符串
          double _holdAmount = 0;                             // 持仓量
          bool _isCover = false;                              // 是否平仓 标记
          bool _needCheckOrder = true;                        // 设置是否 检查订单
          Chart _c = Chart("");                               // 图表对象,并初始化
      };
      
      
      

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

      • getState

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

      • لوپ

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

    • اسٹریٹجی مین فنکشن

      void main() {  
      
          ...
          
          string realSymbolA = exchange.SetContractType(symbolA)["instrument"];    // 获取设置的A合约(this_week / next_week / quarter ) ,在 OKEX 合约 当周、次周、季度 对应的真实合约ID 。
          string realSymbolB = exchange.SetContractType(symbolB)["instrument"];    // ...
          
          string qs = urlencode(json({{"op", "subscribe"}, {"args", {"futures/depth5:" + realSymbolA, "futures/depth5:" + realSymbolB}}}).dump());    // 对 ws 接口的要传的参数进行 json 编码、 url 编码
          Log("try connect to websocket");                                                                                                            // 打印连接 WS接口的信息。
          auto ws = Dial("wss://real.okex.com:10442/ws/v3|compress=gzip_raw&mode=recv&reconnect=true&payload="+qs);     // 调用FMZ API Dial 函数 访问  OKEX 期货的 WS 接口
          Log("connect to websocket success");
          
          Depth depthA, depthB;                               // 声明两个 深度数据结构的变量 用于储存A合约和B合约 的深度数据
          auto fillDepth = [](json &data, Depth &d) {         // 用接口返回的json 数据,构造 Depth 数据的代码。
              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;   // 时间 字符串 A 
          string timeB;   // 时间 字符串 B 
          while (true) {
              auto buf = ws.read();                           // 读取 WS接口 推送来的数据
              
              ...
              
      }
      

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

      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");
      

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

      Dialفنکشن کے پیرامیٹرز کا پہلا حصہ یہ ہے:

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

      ویب ساکٹ انٹرفیس کا پتہ ہے جس تک رسائی حاصل کی جانی چاہئے اور پھر استعمال کیا جاتا ہے|علیحدگی۔compress=gzip_raw&mode=recv&reconnect=true&payload="+qsیہ سب ترتیب کے پیرامیٹرز ہیں۔

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

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

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

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

    for (int i = 0; i < AddMax + 1; i++) {                                          // 构造 控制加仓数量的数据结构,类似 波菲纳契数列 对冲数量 比例。
        if (_addArr.size() < 2) {                                                   // 前两次加仓量变化为: 加一倍对冲数量 递增
            _addArr.push_back((i+1)*OpenAmount);
        }
        _addArr.push_back(_addArr[_addArr.size()-1] + _addArr[_addArr.size()-2]);   // 最后 两个加仓数量相加,算出当前的加仓数量储存到 _addArr数据结构中。
    }
    

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

  • ہم آہنگی: نقصانات کو روکنا

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

  • مارکیٹ میں آنے، باہر جانے، سائیکل ڈیزائن

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

  • حکمت عملی کا گراف

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

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

    _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);                 // 用图表配置 更新图表对象
    _c.reset();                         // 重置图表数据。
    
    • کال کریں_c.update(_cfgStr);_cfgStr کو گرافک آبجیکٹ میں ترتیب دیں۔
    • کال کریں_c.reset();چارٹ ڈیٹا کو دوبارہ ترتیب دیں۔

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

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

    ایک بار جب آپ نے آرڈر کیا ہے تو ، آپ کو K لائن چارٹ پر لیبل ریکارڈ کرنا ہوگا۔

    ذیل میں، K لائنوں کو بار فیڈر کلاس کے ممبر فنکشن کو کال کرکے ڈرائنگ کیا گیا ہے۔feedجب آپ کو ایک گرافک آبجیکٹ _c کا حوالہ بطور پیرامیٹر منتقل کرنا چاہئے۔

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

    یعنیfeedفنکشن کے متغیر c.

    json point = {bar.Time, bar.Open, bar.High, bar.Low, bar.Close};            // 构造一个 json 类型数据
    if (c != nullptr) {                                                         // 图表对象指针不等于 空指针,执行以下。
       if (newBar) {                                                            // 根据标记判断,如果出现新Bar 
            c->add(chartIdx, point);                                            // 调用图表对象成员函数add,向图表对象中插入数据(新增K线bar)
            c->reset(1000);                                                     // 只保留1000 bar个数据
        } else {
            c->add(chartIdx, point, -1);                                        // 否则就更新(不是新bar),这个点(更新这个bar)。
        } 
    }
    

    چارٹ آبجیکٹ _c کو کال کر کےaddممبر فنکشن، چارٹ میں نئے K لائن بار ڈیٹا داخل کریں۔ کوڈ:c->add(chartIdx, point);

  • دوبارہ جانچ پڑتال

    img

    img

    img

یہ حکمت عملی صرف سیکھنے کی بات چیت کے لئے استعمال کی جاتی ہے ، براہ کرم اپنی مرضی کے مطابق اصلاحات کریں جب آپ اسے استعمال کرتے ہیں۔

اسٹریٹجک ایڈریس:https://www.fmz.com/strategy/163447

مزید دلچسپ حکمت عملی کے لیے ملاحظہ کریں: Inventors Quantify Trading Platform:https://www.fmz.com


متعلقہ

مزید