আপনাকে কৌশল লিখতে শেখাবে -- মাই ল্যাঙ্গুয়েজের কৌশল প্রতিস্থাপন করবে

লেখক:লিডিয়া, সৃষ্টিঃ ২০২২-১২-২৬ 15:23:০৮, আপডেটঃ ২০২৩-০৯-১৩ ১৯ঃ৪৪ঃ২৮

img

আপনাকে কৌশল লিখতে শেখান একটি মাইল্যাঙ্গুয়েজ কৌশল প্রতিস্থাপন

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

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

পুনরায় ব্যবহারযোগ্য নমুনা কোডঃ

উদাহরণস্বরূপ, OKX futures এর কৌশলটি দেখুন।

// Global variables
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                 // Record the number of positions
var TradeInterval = 500        // Polling intervals
var PriceTick = 1              // Price per jump
var Symbol = "this_week"  

function OnTick(){
    // Ticker processing part of the driving strategy
    // To be filled...
     
    // Trading signal trigger processing section
    // To be filled...  

    // Execution of trading logic
    var pos = null
    var price = null
    var currBar = records[records.length - 1]
    if(_State == OPENLONG){
        pos = GetPosition(PD_LONG)
        // Determine whether the state is satisfied, and if so, modify the state.
        if(pos[1] >= Amount){
            _State = LONG
            Amount = pos[1]   // Update the actual volume.
            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]   // Update the actual volume.
            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)
    }
}  

// Trading logic section
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){    // Processing transactions
    if(Type == OPENLONG || Type == OPENSHORT){                 // Processing of opening positions
        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){        // Processing of closing positions
        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() { 
    // Set up the contract
    exchange.SetContractType(Symbol)  

    while(1){
        OnTick()
        Sleep(1000)
    }
}

উদাহরণঃ ডাবল EMA কৌশল প্রতিস্থাপন

মাইল্যাঙ্গুয়েজ ব্যাকটেস্টঃ

img

মাইল্যাঙ্গুয়েজের কৌশল কোডঃ

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

জাভাস্ক্রিপ্ট স্ট্র্যাটেজিতে ট্রান্সপ্ল্যান্ট করুন

প্রথমত, পুনরায় ব্যবহারযোগ্য নমুনা কোডের জন্য টিকার অধিগ্রহণ এবং সূচক গণনার অংশগুলি পূরণ করুনঃ

// The ticker processing part of the driving strategy
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]

আপনি দেখতে পারেন, ডাবল EMA কৌশল খুব সহজ. প্রথম, K-লাইন তথ্য পেতেrecords, এবং তারপর EMA ফাংশন ব্যবহার করুনTA.MAএরTA function library৫ দিনের ইএমএ এবং ১৫ দিনের ইএমএ গণনা করার জন্য (যেমন আমরা ব্যাকটেস্ট ইন্টারফেসে দেখতে পাচ্ছি, কে-লাইন পিরিয়ড দৈনিক কে-লাইনে সেট করা আছে, তাইTA.MA(records, 5)৫ দিনের EMA গণনা করা হয়,TA.MA(records, 15)১৫ দিনের ইএমএ হিসাব করা হয়। তাহলে শেষের দুই পয়েন্টটা পান।ma5_curr(দর্শক মান), শেষ তৃতীয় বিন্দুma5_pre(দর্শক মান)ma5, এবং একইma15তারপর আমরা এই সূচক তথ্য ব্যবহার করতে পারেন গোল্ডেন ক্রস এবং bearish ক্রসওভার বিচার করার জন্য, চিত্র দেখানো হয়েছেঃ

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

মাইল্যাঙ্গুয়েজের ব্যাকটেস্টিং

img

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

আপনি যদি আগ্রহী হন, তাহলে চেষ্টা করুন।


সম্পর্কিত

আরো