
جب ہیجنگ کی حکمت عملیوں کی بات آتی ہے تو، مختلف مارکیٹوں میں مختلف قسم کی حکمت عملی، مختلف قسم کے امتزاج، اور مختلف قسم کے خیالات ہوتے ہیں۔ ہم ہیجنگ کی حکمت عملیوں کے ڈیزائن کے خیالات اور تصورات کو دریافت کرنے کے لیے انتہائی کلاسک کراس پیریڈ ہیجنگ کے ساتھ شروع کریں گے۔ آج، ڈیجیٹل کرنسی مارکیٹ اس وقت سے کہیں زیادہ فعال ہے جب مارکیٹ پہلی بار بنی تھی، اور بہت سے معاہدے کے تبادلے ابھرے ہیں، جو کہ بڑی تعداد میں ثالثی اور ہیجنگ کے مواقع فراہم کرتے ہیں۔ لامتناہی حکمت عملی ہیں، جیسے اسپاٹ کراس مارکیٹ آربیٹریج، اسپاٹ فیوچرز ہیجنگ آربیٹریج، فیوچر کراس پیریڈ آربیٹریج، فیوچر کراس مارکیٹ آربیٹریج وغیرہ۔ اس کے بعد، آئیے C++ زبان میں لکھی گئی ایک “ہارڈکور” کراس پیریڈ ہیجنگ حکمت عملی پر ایک نظر ڈالتے ہیں، جس میں ٹریڈنگ مارکیٹ OKEX کنٹریکٹ ایکسچینج ہے جو کہ “موجد کوانٹیٹیو ٹریڈنگ پلیٹ فارم” پر مبنی ہے۔
حکمت عملی کے کچھ سخت ہونے کی وجہ یہ ہے کہ حکمت عملی C++ زبان میں لکھی گئی ہے، جس کی وجہ سے اسے پڑھنا قدرے مشکل ہو جاتا ہے۔ تاہم، یہ قارئین کو اس حکمت عملی کے ڈیزائن اور خیالات کے جوہر کو سیکھنے سے نہیں روکتا۔ حکمت عملی بھر میں نسبتاً جامع ہے، اور کوڈ کی لمبائی اعتدال پسند ہے، صرف 500 لائنوں سے زیادہ۔ مارکیٹ ڈیٹا کے حصول کے لحاظ سے، سابقہ حکمت عملیوں کے برعکس جو باقی انٹرفیس استعمال کرتی ہیں، یہ حکمت عملی ایکسچینجز سے مارکیٹ ڈیٹا پش حاصل کرنے کے لیے ویب ساکٹ انٹرفیس کا استعمال کرتی ہے۔ ڈیزائن کے لحاظ سے، حکمت عملی کا ڈھانچہ معقول ہے، کوڈ کپلنگ بہت کم ہے، اور اسے پھیلانا یا بہتر کرنا بہت آسان ہے۔ منطقی سوچ واضح ہے، اور یہ ڈیزائن نہ صرف استعمال کرنا اور پھیلانا آسان ہے۔ ایک تدریسی حکمت عملی کے طور پر، سیکھنے کی حکمت عملی ڈیزائن بھی ایک اچھی مثال ہے۔ حکمت عملی کا اصول نسبتاً آسان ہے، یعنی مثبت اور منفی ہیجنگ کے لیے فارورڈ کنٹریکٹس اور قریبی مدت کے معاہدوں کا استعمال کرنا، جو بنیادی طور پر کموڈٹی فیوچرز کی کراس پیریڈ ہیجنگ کی طرح ہے۔ مثبت ثالثی، مختصر آگے کے معاہدے اور طویل قریب مدتی معاہدے۔ ہیجنگ، آگے کے معاہدوں پر طویل اور قریبی مدت کے معاہدوں پر مختصر۔ اب جب کہ بنیادی اصول واضح ہیں، جو چیز باقی رہ جاتی ہے وہ یہ ہے کہ حکمت عملی کس طرح ہیجنگ پوزیشنز کو متحرک کرتی ہے، پوزیشنز کو کیسے بند کیا جائے، اور پوزیشنز کو کیسے بڑھایا جائے۔ پوزیشن کنٹرول کے طریقے اور حکمت عملی کی تفصیل پروسیسنگ۔ ہیجنگ کی حکمت عملی بنیادی طور پر بنیادی اثاثہ کی قیمت کے فرق کے اتار چڑھاؤ پر توجہ مرکوز کرتی ہے اور قیمت کے فرق پر ریگریشن ٹریڈنگ کرتی ہے۔ تاہم، پھیلاؤ میں تھوڑا سا، یا تیزی سے، یا ایک سمت میں اتار چڑھاؤ آ سکتا ہے۔ اس سے منافع اور نقصان کی ہیجنگ میں غیر یقینی صورتحال پیدا ہوتی ہے، لیکن خطرہ اب بھی یکطرفہ رجحان سے بہت کم ہے۔ کراس پیریڈ حکمت عملیوں کی بہت سی مختلف اصلاحیں پوزیشن کنٹرول لیول سے شروع کرنے کا انتخاب کرتی ہیں، شروع ہونے اور بند ہونے والے محرکات سے۔ مثال کے طور پر، کلاسک بولنگر انڈیکیٹر کو مثبت اور منفی ثالثی کے ابتدائی اور اختتامی مقامات کے طور پر استعمال کیا جاتا ہے جب قیمت کے فرق میں اتار چڑھاؤ آتا ہے۔ اس کے معقول ڈیزائن اور کم کپلنگ ڈگری کی وجہ سے، اس حکمت عملی کو آسانی سے بولنگر انڈیکیٹر کراس پیریڈ ہیجنگ حکمت عملی میں تبدیل کیا جا سکتا ہے۔
#### عام طور پر کوڈ کو دیکھتے ہوئے، ہم یہ نتیجہ اخذ کر سکتے ہیں کہ کوڈ کو بنیادی طور پر چار حصوں میں تقسیم کیا گیا ہے۔
main فنکشنmain فنکشن اسٹریٹیجی کا انٹری فنکشن ہے اس کے علاوہ، یہ فنکشن ایک اہم آپریشن بھی کرتا ہے، یعنی ایکسچینج کے ویب ساکٹ انٹرفیس کو خام کے طور پر حاصل کرنا۔ K-لائن ڈیٹا جنریٹر کا مواد۔#### حکمت عملی کوڈ کو مجموعی طور پر سمجھ کر، اب ہم حکمت عملی کے ڈیزائن، آئیڈیاز اور تکنیک کو مکمل طور پر سیکھنے کے لیے ہر لنک کا بتدریج تجزیہ کر سکتے ہیں۔
State بیانenum State { // 枚举类型 定义一些 状态
STATE_NA, // 非正常状态
STATE_IDLE, // 空闲
STATE_HOLD_LONG, // 持多仓
STATE_HOLD_SHORT, // 持空仓
};
چونکہ کوڈ میں کچھ افعال ایک خاص حیثیت واپس کرتے ہیں، ان ریاستوں کو شمار کی قسم میں بیان کیا گیا ہے۔Stateدرمیانی
کوڈ ظاہر ہوتا دیکھیںSTATE_NA یعنی یہ ایک غیر معمولی حالت ہے۔STATE_IDLE یہ ایک بیکار حالت میں ہے، یعنی ایک ایسی حالت جس میں ہیجنگ کی کارروائیاں کی جا سکتی ہیں۔STATE_HOLD_LONG مثبت ہیجنگ پوزیشن رکھنے کی حالت۔STATE_HOLD_SHORT ہیجنگ پوزیشن پر فائز ہونے کی حالت۔
string replace(string s, const string from, const string& to)
toHexinline unsigned char toHex(unsigned char x)
std::string urlencode(const std::string& str)
uint64_t _Time(string &s)
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-line ڈیٹا جنریٹر بنانے کی ضرورت کیوں ہے؟ کیا براہ راست K-line ڈیٹا استعمال کرنا بہتر نہیں ہے؟ یہ تین سوالات میرے ذہن میں اس وقت ابھرے جب میں کچھ ہیجنگ کی حکمت عملی لکھ رہا تھا۔ مجھے جواب اس وقت ملا جب میں نے اسپریڈ بولنگر ہیجنگ کی حکمت عملی لکھی۔ کیونکہ ایک معاہدے کا K-line ڈیٹا ایک مخصوص مدت کے اندر اس معاہدے کی قیمت میں تبدیلی کے اعداد و شمار ہے۔ دو معاہدوں کے درمیان قیمت کے فرق کا K-لائن ڈیٹا ایک مخصوص مدت کے اندر قیمت کے فرق کے اعدادوشمار ہے، لہذا، ہم ہر K- پر ہر ڈیٹا کے فرق کو شمار کرنے کے لیے دونوں معاہدوں کے K-لائن ڈیٹا کو صرف نہیں کر سکتے۔ لائن بار، قیمت کے فرق کے طور پر. سب سے واضح غلطی یہ ہے کہ دو معاہدوں کی سب سے زیادہ قیمت اور سب سے کم قیمت ایک ہی وقت میں ضروری نہیں ہے۔ لہذا، منہا کی گئی قدر زیادہ معنی نہیں رکھتی۔ اس لیے، ہمیں ریئل ٹائم ٹک ڈیٹا استعمال کرنے، ریئل ٹائم میں قیمت کے فرق کا حساب لگانے، اور ریئل ٹائم میں ایک خاص مدت کے اندر قیمتوں میں ہونے والی تبدیلیوں کے اعدادوشمار بنانے کی ضرورت ہے (یعنی K-line کالم پر زیادہ کھلنا اور کم بند ہونا)۔ اس طرح، ہمیں پروسیسنگ منطق کو الگ کرنے کے لیے ایک علیحدہ کلاس کے طور پر K-line ڈیٹا جنریٹر کی ضرورت ہے۔
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(""); // 图表对象,并初始化
};
چونکہ کوڈ کافی لمبا ہے، یہ بنیادی طور پر ہیج کلاس کی ساخت کو ظاہر کرتا ہے، کیونکہ یہ بنیادی طور پر آبجیکٹ کے آغاز کے لیے ہے۔ بنیادی طور پر دو فنکشنل فنکشن باقی ہیں۔
یہ فنکشن بنیادی طور پر آرڈر کا پتہ لگانے، آرڈر کی منسوخی، پوزیشن کا پتہ لگانے، پوزیشن بیلنسنگ وغیرہ کو ہینڈل کرتا ہے۔ کیونکہ ہیجنگ ٹرانزیکشن کے عمل میں، ایک ٹانگ کی صورت حال (یعنی، ایک معاہدہ ٹریڈ کیا جاتا ہے اور دوسرا نہیں ہوتا ہے) ناگزیر ہے اگر یہ آرڈر منطق میں پایا جاتا ہے اور پھر فالو اپ آرڈر یا پوزیشن کی بندش پر کارروائی کی جاتی ہے۔ ، حکمت عملی کی منطق افراتفری ہوگی۔ لہذا ہم نے اس حصے کو ڈیزائن کرتے وقت ایک اور طریقہ اختیار کیا۔ اگر ہیجنگ آپریشن کو متحرک کیا جاتا ہے تو، اس بات سے قطع نظر کہ ایک ٹانگ ہیجنگ ہوتی ہے، ہیجنگ کو بطور ڈیفالٹ کامیاب سمجھا جاتا ہے، اور چیکنگ اور پروسیسنگ کے لیے منطق توازن الگ کر دیا جاتا ہے.
حکمت عملی کی تجارتی منطق اس فنکشن میں شامل ہے، جہاں کال ہوتی ہے۔getState قیمت کے فرق کا K-لائن ڈیٹا بنانے کے لیے K-line ڈیٹا جنریٹر آبجیکٹ کا استعمال کریں، اور ہیجنگ کھولنے، بند کرنے اور پوزیشنز شامل کرنے کی منطق پر فیصلے کریں۔ چارٹس کے لیے کچھ ڈیٹا اپ ڈیٹ آپریشنز بھی ہیں۔
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");
سب سے پہلے، آپ کو سبسکرپشن انٹرفیس کے ذریعے منتقل کردہ سبسکرپشن میسج json پیرامیٹر کو یو آر ایل انکوڈ کرنے کی ضرورت ہے، یعنی،payload پیرامیٹر کی قدر۔ پھر زیادہ اہم مرحلہ موجد مقداری تجارتی پلیٹ فارم کے API انٹرفیس فنکشن کو کال کرنا ہے۔Dial فنکشنDial فنکشن کا استعمال ایکسچینج ویب ساکٹ انٹرفیس تک رسائی کے لیے کیا جا سکتا ہے۔ ہم یہاں کچھ سیٹنگز بناتے ہیں تاکہ ویب ساکٹ کنکشن کنٹرول آبجیکٹ ws کو خود بخود منقطع ہونے کے بعد دوبارہ جوڑنے کے قابل بنایا جا سکے (سبسکرپشن پیغام اب بھی پے لوڈ پیرامیٹر کی ویلیو qs سٹرنگ کا استعمال کرتا ہے، آپ کو اس فنکشن کو حاصل کرنے کی ضرورت ہے۔Dial فنکشن کے پیرامیٹر سٹرنگ میں کنفیگریشن کے اختیارات شامل کریں۔
Dialفنکشن پیرامیٹرز اس طرح شروع ہوتے ہیں:
wss://real.okex.com:10442/ws/v3
ویب ساکٹ انٹرفیس ایڈریس ہے جس تک رسائی حاصل کرنے اور پھر استعمال کرنے کی ضرورت ہے۔| علیحدگی۔
compress=gzip_raw&mode=recv&reconnect=true&payload="+qs یہ تمام کنفیگریشن پیرامیٹرز ہیں۔
| پیرامیٹر کا نام | تفصیل |
|---|---|
| کمپریس | |
| موڈ دوہری کا مطلب ہے دو طرفہ، کمپریسڈ ڈیٹا بھیجنا اور کمپریسڈ ڈیٹا وصول کرنا۔ بھیجنے کا مطلب کمپریسڈ ڈیٹا بھیجنا ہے۔ recv کمپریسڈ ڈیٹا وصول کرتا ہے اور اسے مقامی طور پر ڈیکمپریس کرتا ہے۔ | |
| reconnect | |
| پے لوڈ |
اس ترتیب کے بعد، یہاں تک کہ اگر ویب ساکٹ کنکشن منقطع ہو جاتا ہے، موجد کوانٹیٹیو ٹریڈنگ پلیٹ فارم کے نگران کا بنیادی نظام خود بخود دوبارہ جڑ جائے گا اور بروقت مارکیٹ کا تازہ ترین ڈیٹا حاصل کر لے گا۔ قیمت کے فرق کے ہر اتار چڑھاؤ کو پکڑیں اور فوری طور پر مناسب ہیجنگ مارکیٹ پر قبضہ کریں۔
پوزیشن کنٹرول کنٹرول کرنے کے لیے “Porfinacci” سیریز کی طرح ہیج پوزیشن کا تناسب استعمال کرتا ہے۔
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 کے ذریعے کنٹرول کردہ مدت حکمت عملی کے پوزیشنوں کے کھولنے اور بند ہونے پر ایک خاص حد تک متحرک کنٹرول فراہم کرتی ہے۔
حکمت عملی خود بخود قیمت میں فرق کینڈل سٹک چارٹ تیار کرتی ہے اور متعلقہ لین دین کی معلومات کو نشان زد کرتی ہے۔
C++ حکمت عملی اپنی مرضی کے مطابق چارٹ ڈرائنگ آپریشن بھی بہت آسان ہے آپ دیکھ سکتے ہیں کہ ہیج کلاس کے کنسٹرکٹر میں، ہم چارٹ آبجیکٹ _c کو ترتیب دینے کے لیے تحریری چارٹ کنفیگریشن سٹرنگ _cfgStr استعمال کرتے ہیں۔_c ہیج کلاس ہے جب پرائیویٹ ممبر کو شروع کیا جاتا ہے، موجد کا مقداری کسٹم چارٹ API انٹرفیس فنکشن کہا جاتا ہے۔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-لائن کھینچنا بارفیڈر کلاس کے ممبر فنکشن کو کال کرکے کیا جاتا ہے۔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)。
}
}
چارٹ آبجیکٹ کو کال کرکے_caddممبر فنکشن، چارٹ میں نیا K-line بار ڈیٹا داخل کرتا ہے۔
کوڈ:c->add(chartIdx, point);



یہ حکمت عملی صرف سیکھنے اور مواصلات کے لیے ہے جب اسے حقیقی ٹریڈنگ میں استعمال کیا جائے تو براہِ کرم ٹریڈنگ کی اصل صورتحال کے مطابق اس میں ترمیم اور اصلاح کریں۔
حکمت عملی کا پتہ: https://www.fmz.com/strategy/163447
مزید دلچسپ حکمت عملیوں کے لیے، براہ کرم “موجد مقداری تجارتی پلیٹ فارم” ملاحظہ کریں: https://www.fmz.com