Type/to search
8
Follow
1364
Followers
آپ کو مرحلہ وار حکمت عملی لکھنے کا طریقہ سکھائیں - میری زبان کی حکمت عملی کو ٹرانسپلانٹ کریں۔
Original
Created 2019-10-21 14:59:12  Updated 2024-12-17 20:37:18
 1
 2971

img

آپ کو مرحلہ وار حکمت عملی لکھنے کا طریقہ سکھائیں - میری زبان کی حکمت عملی کو ٹرانسپلانٹ کریں۔

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

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

دوبارہ قابل استعمال نمونہ کوڈ:

مثال کے طور پر OKEX مستقبل کے لیے استعمال ہونے والی حکمت عملی کو لیں۔

javascript
// 全局变量 var IDLE = 0 var LONG = 1 var SHORT = 2 var OPENLONG = 3 var OPENSHORT = 4 var COVERLONG = 5 var COVERSHORT = 6 var BREAK = 9 var SHOCK = 10 var _State = IDLE var Amount = 0 // 记录持仓数量 var TradeInterval = 500 // 轮询间隔 var PriceTick = 1 // 价格一跳 var Symbol = "this_week" function OnTick(){ // 驱动策略的行情处理部分 // 待填充... // 交易信号触发处理部分 // 待填充... // 执行交易逻辑 var pos = null var price = null var currBar = records[records.length - 1] if(_State == OPENLONG){ pos = GetPosition(PD_LONG) // 判断是不是 满足状态,如果满足 修改状态 if(pos[1] >= Amount){ _State = LONG Amount = pos[1] // 更新实际量 return } price = currBar.Close - (currBar.Close % PriceTick) + PriceTick * 2 Trade(OPENLONG, price, Amount - pos[1], pos, PriceTick) // (Type, Price, Amount, CurrPos, PriceTick) } if(_State == OPENSHORT){ pos = GetPosition(PD_SHORT) if(pos[1] >= Amount){ _State = SHORT Amount = pos[1] // 更新实际量 return } price = currBar.Close - (currBar.Close % PriceTick) - PriceTick * 2 Trade(OPENSHORT, price, Amount - pos[1], pos, PriceTick) } if(_State == COVERLONG){ pos = GetPosition(PD_LONG) if(pos[1] == 0){ _State = IDLE return } price = currBar.Close - (currBar.Close % PriceTick) - PriceTick * 2 Trade(COVERLONG, price, pos[1], pos, PriceTick) } if(_State == COVERSHORT){ pos = GetPosition(PD_SHORT) if(pos[1] == 0){ _State = IDLE return } price = currBar.Close - (currBar.Close % PriceTick) + PriceTick * 2 Trade(COVERSHORT, price, pos[1], pos, PriceTick) } } // 交易逻辑部分 function GetPosition(posType) { var positions = _C(exchange.GetPosition) var count = 0 for(var j = 0; j < positions.length; j++){ if(positions[j].ContractType == Symbol){ count++ } } if(count > 1){ throw "positions error:" + JSON.stringify(positions) } for (var i = 0; i < positions.length; i++) { if (positions[i].ContractType == Symbol && positions[i].Type === posType) { return [positions[i].Price, positions[i].Amount]; } } Sleep(TradeInterval); return [0, 0]; } function CancelPendingOrders() { while (true) { var orders = _C(exchange.GetOrders) for (var i = 0; i < orders.length; i++) { exchange.CancelOrder(orders[i].Id); Sleep(TradeInterval); } if (orders.length === 0) { break; } } } function Trade(Type, Price, Amount, CurrPos, OnePriceTick){ // 处理交易 if(Type == OPENLONG || Type == OPENSHORT){ // 处理开仓 exchange.SetDirection(Type == OPENLONG ? "buy" : "sell") var pfnOpen = Type == OPENLONG ? exchange.Buy : exchange.Sell var idOpen = pfnOpen(Price, Amount, CurrPos, OnePriceTick, Type) Sleep(TradeInterval) if(idOpen) { exchange.CancelOrder(idOpen) } else { CancelPendingOrders() } } else if(Type == COVERLONG || Type == COVERSHORT){ // 处理平仓 exchange.SetDirection(Type == COVERLONG ? "closebuy" : "closesell") var pfnCover = Type == COVERLONG ? exchange.Sell : exchange.Buy var idCover = pfnCover(Price, Amount, CurrPos, OnePriceTick, Type) Sleep(TradeInterval) if(idCover){ exchange.CancelOrder(idCover) } else { CancelPendingOrders() } } else { throw "Type error:" + Type } } function main() { // 设置合约 exchange.SetContractType(Symbol) while(1){ OnTick() Sleep(1000) } }

مثال: ڈبل موونگ ایوریج حکمت عملی کی پیوند کاری

مائی لینگویج بیک ٹیسٹ:
img

مائی زبان کی حکمت عملی کوڈ:

MA5^^MA(C,5); MA15^^MA(C,15); CROSSUP(MA5,MA15),BPK; CROSSDOWN(MA5,MA15),SPK;

جاوا اسکرپٹ کی حکمت عملی پر منتقل کریں۔

سب سے پہلے، دوبارہ قابل استعمال نمونہ کوڈ میں مارکیٹ کے حصول اور اشارے کیلکولیشن حصوں کو پُر کریں:

// 驱动策略的行情处理部分 var records = _C(exchange.GetRecords) if (records.length < 15) { return } var ma5 = TA.MA(records, 5) var ma15 = TA.MA(records, 15) var ma5_pre = ma5[ma5.length - 3] var ma15_pre = ma15[ma15.length - 3] var ma5_curr = ma5[ma5.length - 2] var ma15_curr = ma15[ma15.length - 2]

جیسا کہ آپ دیکھ سکتے ہیں، ڈبل موونگ ایوریج حکمت عملی بہت آسان ہے اسے پہلے K-line ڈیٹا حاصل کرنے کی ضرورت ہے۔records، پھر استعمال کریں۔TA函数库حرکت پذیر اوسط فنکشنTA.MA5 دن کی موونگ ایوریج اور 15 دن کی موونگ ایوریج کا حساب لگائیں (آپ بیکٹیسٹ انٹرفیس پر دیکھ سکتے ہیں کہ K-لائن کی مدت روزانہ K-line پر سیٹ کی گئی ہے، لہذاTA.MA(records, 5)5 دن کی متحرک اوسط کا حساب لگایا جاتا ہے۔TA.MA(records, 15)15 دن کی حرکت پذیری اوسط)۔
پھر حاصل کریں۔ma5اشارے کے اعداد و شمار کے دوسرے سے آخری نقطہma5_curr(انڈیکیٹر ویلیو)، تیسرے سے آخری پوائنٹma5_pre(انڈیکیٹر ویلیو)ma15یہی اشارے کے اعداد و شمار پر لاگو ہوتا ہے۔ پھر آپ گولڈن کراس اور ڈیڈ کراس کا فیصلہ کرنے کے لیے ان اشارے کے اعداد و شمار کا استعمال کر سکتے ہیں، جیسا کہ تصویر میں دکھایا گیا ہے:
img
جب تک ایسی ریاست قائم رہتی ہے، یہ ایک تصدیق شدہ گولڈن کراس یا مردہ کراس ہے۔

پھر سگنل کے فیصلے کا حصہ اس طرح لکھا جا سکتا ہے:

if(_State == IDLE && ma5_pre < ma15_pre && ma5_curr > ma15_curr){ _State = OPENLONG Amount = 1 } if(_State == IDLE && ma5_pre > ma15_pre && ma5_curr < ma15_curr){ _State = OPENSHORT Amount = 1 } if(_State == LONG && ma5_pre > ma15_pre && ma5_curr < ma15_curr){ _State = COVERLONG Amount = 1 } if(_State == SHORT && ma5_pre < ma15_pre && ma5_curr > ma15_curr){ _State = COVERSHORT Amount = 1 }

اس کا مطلب ہے کہ ٹرانسپلانٹ ٹھیک ہے، اور آپ واپس جا کر اس کی جانچ کر سکتے ہیں:
جاوا اسکرپٹ کی حکمت عملیوں کی بیک ٹیسٹنگ
بیک ٹیسٹ کنفیگریشن:
img

回测结果: [/upload/asset/16baa65d35e034e06a58.png](/upload/asset/16baa65d35e034e06a58.png)

میری زبان کی بیک ٹیسٹنگ
img

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

جو طلباء دلچسپی رکھتے ہیں وہ اسے آزما سکتے ہیں۔

Related Recommendations
Comment
All comments (1)

    学习下

    7 years ago
  • 1
iPhone Download
Forums
PINE Language
© 2015 - ∞ INVENTOR PTE LTD (SG)