হাত আপনাকে কৌশল লিখতে শেখায় - একটি মাই ভাষার কৌশল প্রতিস্থাপন

লেখক:ছোট্ট স্বপ্ন, তৈরিঃ 2019-10-21 14:59:12, আপডেটঃ 2023-10-17 21:22:56

img

হাতের কাজ আপনাকে কৌশল লিখতে শেখাবে এবং একটি My ভাষা কৌশল প্রতিস্থাপন করবে

সম্প্রতি আমার বন্ধুদের সাথে কৌশল নিয়ে কথা বলার সময়, আমি জানতে পেরেছি যে আমার ভাষায় কৌশলগুলি লেখার ক্ষেত্রে নমনীয়তার সমস্যা রয়েছে। অনেক ক্ষেত্রে, এটিকে অ-সিস্টেম সরবরাহ করা স্ট্যান্ডার্ড কে-লাইন চক্র ব্যবহার করতে হবে। উদাহরণস্বরূপ, সর্বাধিক প্রস্তাবিত প্রয়োজনটি 4 ঘন্টা কে-লাইন ব্যবহার করা। এই সমস্যাটি একটি নিবন্ধে সমাধান করা হয়েছে।লিঙ্ককিন্তু মাই ল্যাঙ্গুয়েজের কৌশলগত সমস্যা হচ্ছে যে, মাই ল্যাঙ্গুয়েজের উচ্চ প্যাকেজিং বৈশিষ্ট্যগুলি এর নিজস্ব ডেটা প্রক্রিয়াকরণের জন্য নমনীয়তা প্রদান করে না।

প্রবণতা কৌশল পোর্ট করার জন্য এটি খুব সহজ, আমরা একটি উদাহরণ কোড ব্যবহার করতে পারি, যা কৌশল চালানোর ডেটা গণনার অংশের কোড পূরণ করে, ট্রেডিং সিগন্যাল ট্রিগারের শর্ত পূরণ করে।

পুনরায় ব্যবহারযোগ্য উদাহরণ কোডঃ

উদাহরণস্বরূপ, ওকেএক্স ফিউচার ব্যবহারের কৌশল।

// 全局变量
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.MAআপনি দেখতে পাচ্ছেন যে রিমেট ইন্টারফেসে, K-রেখা চক্রটি K-রেখা হিসাবে সেট করা আছে, তাই আপনি এটি দেখতে পারেন।TA.MA(records, 5)এটি পাঁচ দিনের গড়।TA.MA(records, 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

আপনি মূলত একই ফলাফল দেখতে পারেন, যদি আপনি নীতির জন্য আরও ইন্টারঅ্যাকশন যুক্ত করতে চান, ডেটা প্রসেসিং (যেমন কে-লাইন সংশ্লেষণ) বা কাস্টম চার্ট অঙ্কন প্রদর্শন যুক্ত করতে চান তবে এটি সম্ভব।

আগ্রহী শিক্ষার্থীরা চেষ্টা করুন।


সম্পর্কিত

আরো

ক্ষুদ্রপড়াশোনা