
جب میں حال ہی میں اپنے دوستوں کے ساتھ حکمت عملیوں کے بارے میں بات کر رہا تھا تو میں نے سیکھا کہ بہت سے لوگ جو حکمت عملی لکھنے کے لیے میری زبان کا استعمال کرتے ہیں لچک کے مسئلے کا شکار ہیں۔ بہت سے معاملات میں، ایک معیاری K-لائن کی مدت کا استعمال کرنا ضروری ہے جو کہ سسٹم کے ذریعہ فراہم نہیں کیا گیا ہے، مثال کے طور پر، سب سے زیادہ مطلوبہ ضرورت 4 گھنٹے کی K-لائن کا استعمال کرنا ہے۔ یہ مسئلہ ایک مضمون میں حل کر دیا گیا ہے، اگر آپ دلچسپی رکھتے ہیں، تو آپ پہلے اس پر ایک نظر ڈال سکتے ہیں:لنک. تاہم، میری زبان کی حکمت عملی میں، میری زبان کی انتہائی گھمبیر نوعیت کی وجہ سے، یہ مسئلہ اپنے طور پر ڈیٹا پر لچکدار طریقے سے کارروائی نہیں کر سکتا۔ اس وقت اسٹریٹجک سوچ کو دوسری زبانوں میں ٹرانسپلانٹ کرنے کی ضرورت ہے۔
ٹرینڈ اسٹریٹیجز کو ٹرانسپلانٹ کرنا بہت آسان ہے ہم ڈرائیونگ اسٹریٹجی کے ڈیٹا کیلکولیشن حصے کو بھرنے اور ٹریڈنگ سگنل ٹرگر کی شرائط کو بھرنے کے لیے ایک نمونہ کوڈ استعمال کر سکتے ہیں۔
مثال کے طور پر OKEX مستقبل کے لیے استعمال ہونے والی حکمت عملی کو لیں۔
// 全局变量
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)
}
}
مائی لینگویج بیک ٹیسٹ:

مائی زبان کی حکمت عملی کوڈ:
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یہی اشارے کے اعداد و شمار پر لاگو ہوتا ہے۔ پھر آپ گولڈن کراس اور ڈیڈ کراس کا فیصلہ کرنے کے لیے ان اشارے کے اعداد و شمار کا استعمال کر سکتے ہیں، جیسا کہ تصویر میں دکھایا گیا ہے:
جب تک ایسی ریاست قائم رہتی ہے، یہ ایک تصدیق شدہ گولڈن کراس یا مردہ کراس ہے۔
پھر سگنل کے فیصلے کا حصہ اس طرح لکھا جا سکتا ہے:
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
}
اس کا مطلب ہے کہ ٹرانسپلانٹ ٹھیک ہے، اور آپ واپس جا کر اس کی جانچ کر سکتے ہیں:
جاوا اسکرپٹ کی حکمت عملیوں کی بیک ٹیسٹنگ
بیک ٹیسٹ کنفیگریشن:

回测结果:

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

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