avatar of 发明者量化-小小梦 发明者量化-小小梦
پر توجہ دیں نجی پیغام
4
پر توجہ دیں
1271
پیروکار

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

میں تخلیق کیا: 2019-10-21 14:59:12, تازہ کاری: 2024-12-17 20:37:18
comments   1
hits   2733

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

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

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

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

回测结果:
![آپ کو مرحلہ وار حکمت عملی لکھنے کا طریقہ سکھائیں - میری زبان کی حکمت عملی کو ٹرانسپلانٹ کریں۔](/upload/asset/16baa65d35e034e06a58.png) 

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

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

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