جب بات ہوتی ہے ہیجنگ کی حکمت عملیوں کی تو مختلف مارکیٹوں میں مختلف حکمت عملیاں، مختلف مرکبات، مختلف خیالات موجود ہیں۔ ہم سب سے کلاسک ٹرانس فریم ہیجنگ سے ہی ہیجنگ کی حکمت عملیوں کے ڈیزائن کے خیالات اور تصورات کی ابتدا کرتے ہیں۔ آج ، ڈیجیٹل کرنسی مارکیٹ کی سرگرمی مارکیٹ کے قیام کے آغاز سے کہیں زیادہ ہے ، اور بہت سارے معاہدہ ایکسچینجز بھی سامنے آئے ہیں ، جو فائدہ اٹھانے کے بہت سارے مواقع فراہم کرتے ہیں۔ فوری ٹرانس مارکیٹ سودے ، موجودہ سودے ، مستقبل کے ٹرانس فریم سودے ، مستقبل کے ٹرانس مارکیٹ سودے وغیرہ ، حکمت عملی کی لامحدود سطحیں ہیں۔ ہم نے ایک ساتھ مل کر C ++ زبان میں ایک تصور تیار کیا ہے ، جس میں تجارتی مارکیٹ OKEX معاہدے کی تجارت کے لئے "ہارڈ کور" ٹرانس فریم ہیجنگ کی حکمت عملی ہے ، جس کی حکمت عملی کو ایجاد کنندہ "انویشن ٹریڈنگ پلیٹ فارم" پر مبنی ہے۔
اس کی وجہ یہ ہے کہ یہ حکمت عملی C ++ زبان میں لکھی گئی ہے ، اور اس کی پڑھنے میں قدرے مشکل ہے۔ لیکن اس سے قارئین کو اس حکمت عملی کے ڈیزائن اور نظریات کے بارے میں جاننے میں کوئی حرج نہیں ہے۔ اس کی تفصیلات زیادہ جامع ہیں ، کوڈ کی لمبائی درمیانی ہے ، صرف 500 سے زیادہ لائنیں۔ تجارتی اعداد و شمار حاصل کرنے کے معاملے میں ، پچھلے حکمت عملی کے مقابلے میں ، یہ ویب سوکٹ انٹرفیس کا استعمال کرتا ہے ، جس میں ایکسچینج کے پیسے کو آگے بڑھایا جاتا ہے۔ ڈیزائن کے لحاظ سے ، حکمت عملی کا ڈھانچہ معقول ہے ، کوڈ کی پیچیدگی کم ہے ، توسیع یا اصلاح کے لئے آسان ہے۔ منطقی سوچ واضح ہے ، اس طرح کا ڈیزائن نہ صرف استعمال میں آسان ہے ، توسیع کے لئے آسان ہے۔ بطور تدریسی حکمت عملی ، سیکھنے کی حکمت عملی کا ڈیزائن بھی ایک عمدہ مثال ہے۔ حکمت عملی کا اصول نسبتا simple آسان ہے ، یعنی طویل مدتی معاہدے اور قریبی معاہدے کی اصلاح ، انسداد سیٹ ہیجنگ ، جو بنیادی طور پر تجارتی مستقبل کے لئے طویل مدتی ہیجنگ کے مطابق ہے۔ اس کے علاوہ ، اس نے ایک بار پھر اس کے بارے میں بات کی ، لیکن اس کے بعد بھی اس نے اس کے بارے میں بات نہیں کی۔ اس کے علاوہ ، ہم نے ایک بار پھر اس بات کا ذکر کیا ہے کہ ہم نے اس کے بارے میں کیا سوچا ہے۔ بنیادی اصولوں کو واضح کیا گیا ہے ، باقی یہ ہے کہ کس طرح کی حکمت عملی سے ہیجنگ کو شروع کیا جائے گا ، کس طرح کی تجارت کو ختم کیا جائے گا ، کس طرح کی تجارت کو بڑھا دیا جائے گا۔ پوزیشن کنٹرول کا طریقہ ، حکمت عملی کی تفصیلات کا انتظام۔ ہیجنگ کی حکمت عملی بنیادی طور پر اشارے کی قیمتوں میں اتار چڑھاؤ پر توجہ دیتی ہے ، اور اس فرق پر واپسی کی تجارت کرتی ہے۔ تاہم ، قیمتوں میں چھوٹی چھوٹی ہلچل ، یا بڑے پیمانے پر ہلچل ، یا ایک طرفہ رخ کا امکان ہے۔ اس کے نتیجے میں غیر یقینی صورتحال پیدا ہوتی ہے جس کی وجہ سے منافع اور نقصانات کا خطرہ ہوتا ہے ، لیکن یہ خطرہ بھی یکطرفہ رجحان سے بہت کم ہوتا ہے۔ طویل مدتی حکمت عملی کے ل many بہت ساری اصلاحات کا انتخاب پوزیشن کنٹرول کی سطح سے ہوتا ہے ، اور کھلے ہوئے پوزیشن کو متحرک کرنے سے شروع ہوتا ہے۔ مثال کے طور پر ، کلاسیکی برین اشارے کے ساتھ فرق کی لہر کے دوران ، کھلے ، کھلے ہوئے پوزیشنوں کو کھولنے ، کھلے ہوئے پوزیشنوں کو کھولنے کے لئے۔ یہ حکمت عملی مناسب ڈیزائن کی وجہ سے ، کم کنڈیشنگ کی وجہ سے ، اسے آسانی سے برین اشارے کے طویل مدتی ہیجنگ کی حکمت عملی میں بھی تبدیل کیا جاسکتا ہے۔
main
فنکشن۔main
فنکشن پالیسی کا ان پٹ فنکشن ہوتا ہے، جس میں بنیادی طور پر اس فنکشن کے اندر لوپ کیا جاتا ہے، اس کے علاوہ اس فنکشن میں ایک اہم آپریشن بھی انجام دیا جاتا ہے، جو ایکسچینج کے ویب سوکٹ انٹرفیس تک رسائی حاصل کرتا ہے، اور آگے بڑھانے والے ٹک مارکیٹ کے اعداد و شمار کو حاصل کرتا ہے، جو K لائن ڈیٹا جنریٹر کے خام ڈیٹا کے طور پر کام کرتا ہے.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)
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);
یہ حکمت عملی صرف سیکھنے کی بات چیت کے لئے استعمال کی جاتی ہے ، براہ کرم اپنی مرضی کے مطابق اصلاحات کریں جب آپ اسے استعمال کرتے ہیں۔
اسٹریٹجک ایڈریس:https://www.fmz.com/strategy/163447
مزید دلچسپ حکمت عملی کے لیے ملاحظہ کریں: Inventors Quantify Trading Platform:https://www.fmz.com