ہاتھ جو آپ کو حکمت عملی لکھنے کا طریقہ سکھاتا ہے۔

مصنف:چھوٹا سا خواب, تخلیق: 2019-10-21 14:59:12, تازہ کاری: 2023-10-17 21:22:56

img

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

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

رجحان کی حکمت عملی کی نقل و حمل کے لئے یہ بہت آسان ہے، ہم ایک مثال کے کوڈ کا استعمال کرتے ہوئے، حکمت عملی کو چلانے والے اعداد و شمار کے حساب کے حصے کوڈ کو بھرنے کے لئے، تجارتی سگنل کے ٹرگر کی شرائط کو بھرنے کے لئے استعمال کر سکتے ہیں.

ایک بار پھر قابل استعمال نمونہ کوڈ:

مثال کے طور پر، 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)
    }
}

مثال کے طور پر: دو طرفہ یکساں حکمت عملی کی منتقلی

مائی زبان کا حوالہ: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 لائن کے اعداد و شمار کو حاصل کرنا ہے.records، اور پھر استعمال کریںTA函数库کے لئے ہموار لائن کی تقریبTA.MA5 دن کی اوسط لائن، 15 دن کی اوسط لائن کا حساب لگائیں (آپ کو واپس کی جانچ پڑتال کے انٹرفیس پر دیکھ سکتے ہیں، K لائن کا دورانیہ دن کی K لائن کے طور پر مقرر کیا جاتا ہے، لہذاTA.MA(records, 5)اس کا مطلب یہ ہے کہ آپ کے پاس 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

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

my زبان کی جانچ پڑتالimg

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

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


متعلقہ

مزید

چھوٹاسیکھنا