রিসোর্স লোড হচ্ছে... লোডিং...

জাভাস্ক্রিপ্ট কৌশল নকশায় "__ থ্রেড" ফাংশনটির প্রয়োগ

লেখক:এফএমজেড-লিডিয়া, তৈরিঃ ২০২৩-০৭-০৭ 13:56:17, আপডেটঃ ২০২৪-১১-১১ 22:42:27

img

জাভাস্ক্রিপ্ট কৌশল নকশায় __Thread ফাংশন প্রয়োগ

FMZ কৌশল প্রাথমিক নকশায়, যদি অ্যাসিনক্রোন সমান্তরাল অপারেশন প্রয়োজন হয়,exchange.Go()এই ফাংশনটি শুধুমাত্র FMZ encapsulated ইন্টারফেসের সমান্তরাল এক্সিকিউশন অর্জনের জন্য ব্যবহার করা যেতে পারে, এবং কিছু কাস্টম অপারেশন (ফাংশন) একযোগে সম্পাদন করা সম্ভব নয়। যদিও এই নকশাটি কৌশল প্রোগ্রামের দক্ষতাকে ব্যাপকভাবে উন্নত করে, তবে স্থানীয় প্রোগ্রামিং ভাষাগুলিতে সমান্তরাল নকশায় অভিজ্ঞ শিক্ষার্থীরা প্রায়শই খুব অস্বস্তিকর বোধ করে।

এমনকি নতুন শিক্ষার্থীরা যারা FMZ ব্যবহার করে প্রাথমিক পরিমাণগত ট্রেডিংয়ের জন্যexchange.Go()ব্যবহারexchange.Go()এই প্রবন্ধে, আমরা নতুন যোগ করা সমান্তরাল থ্রেড ফাংশনালটি FMZ প্ল্যাটফর্মে ব্যবহারের বিষয়ে আলোচনা করবঃ__Thread()এবং অন্যান্য সংশ্লিষ্ট ফাংশন, সেইসাথে কৌশল প্রোগ্রামের অ্যাসিনক্রোন ডিজাইন।

১. সহজ সমান্তরাল নকশা

যদি আমরা কৌশলটির প্রধান থ্রেডটি একটি কাস্টম ফাংশন সম্পাদনকারী একটি উপ-থ্রেডের সাথে সমান্তরালভাবে চালাতে চাই তবে আমরা নিম্নলিখিত কোডের অনুরূপ একটি নকশা ব্যবহার করতে পারি। কৌশল কোডে, একটি কাস্টম ফাংশন সংজ্ঞায়িত করুনGetTickerAsync()এবং এই ফাংশন নির্দিষ্ট কার্যকারিতা লিখুন. এই ফাংশন একটি অসীম লুপ চালায় এবং ক্রমাগত FMZ API ইন্টারফেস কলGetTicker()বাজারের তথ্য সংগ্রহের জন্য।

তারপর, বিবৃতি ব্যবহার করুন__threadSetData(0, "ticker", t)মূল থ্রেডে তথ্য লিখতে. ডাটা নাম হলtickerএবং ডাটা মান হলt, যা রিটার্ন মানGetTicker().

__threadSetData(0, "ticker", t)

সমান্তরাল থ্রেড এক্সিকিউশনের জন্য কাস্টম ফাংশন ডিজাইন করার পর, আমরা কোড লিখতে পারেনmain()কর্মের শুরুতেmain()ফাংশন, আমরা ব্যবহারঃ

__Thread(GetTickerAsync, 0)   // GetTickerAsync is a custom function that needs to be executed concurrently, and 0 is the parameter that is passed to the GetTickerAsync function.

একটি সমান্তরাল থ্রেড তৈরি করুন যা এক্সিকিউশন শুরু করেGetTickerAsync()কাজ. তারপর,main()ফাংশন তার নিজস্ব কার্যকর শুরুwhileলুপ, যেখানে এটি তথ্য আপডেটGetTickerAsync()ফাংশন এবং এটি মুদ্রণঃ

var t = __threadGetData(0, "ticker")
Log(t)

সম্পূর্ণ কোড উদাহরণঃ

function GetTickerAsync(index) {
    while (true) {
        var t = exchanges[index].GetTicker()
        __threadSetData(0, "ticker", t)
        Sleep(500)
    }
}

function main() {
    __Thread(GetTickerAsync, 0)

    while(true) {
        var t = __threadGetData(0, "ticker")
        Log(t)
        Sleep(1000)
    }
}

লাইভ ট্রেডিং টেস্টঃ

img

এটি সবচেয়ে সহজ অ্যাপ্লিকেশন ডিজাইনগুলির মধ্যে একটি, তাই আসুন কিছু অন্যান্য প্রয়োজনীয়তা ডিজাইনগুলি দেখুন।

২. একযোগে অর্ডার দেওয়ার নকশা

আমরা একটি ফাংশন ডিজাইন করতে পারি যাতে একযোগে ১০টি থ্রেড তৈরি করা যায়, প্রত্যেকটি একটি অর্ডার প্লেসমেন্ট ফাংশন সম্পাদন করে।main()ফাংশন, আমরা একটি ডিজাইন করতে পারেনwhileকৌশল মিথস্ক্রিয়া কমান্ড সনাক্ত করতে লুপ. যখন আমরা মিথস্ক্রিয়া কমান্ড গ্রহণplaceMultipleOrders, আমরা সমান্তরাল অর্ডার স্থাপন ফাংশন কলtestPlaceMultipleOrders().

if (cmd == "placeMultipleOrders") {
    // ...
}

কমান্ড সহ একটি বোতাম যুক্ত করে কৌশল সম্পাদনা পৃষ্ঠায় কৌশল মিথস্ক্রিয়া নকশা যুক্ত করুনঃ placeMultipleOrders.

img

সম্পূর্ণ কোড উদাহরণঃ

function placeOrder(exIndex, type, price, amount) {
    var id = null 
    if (type == "Buy") {
        id = exchanges[exIndex].Buy(price, amount)
    } else if (type == "Sell") {
        id = exchanges[exIndex].Sell(price, amount)
    } else {
        throw "type error! type:" + type
    }
}

function testPlaceMultipleOrders(index, beginPrice, endPrice, step, type, amount) {
    Log("beginPrice:", beginPrice, ", endPrice:", endPrice, ", step:", step, ", type:", type, ", amount:", amount)
    var tids = []
    for (var p = beginPrice; p <= endPrice; p += step) {
        var tid = __Thread(placeOrder, index, type, p, amount)
        tids.push(tid)
        Sleep(10)
    }
    Sleep(1000)
    for (var i = 0; i < tids.length; i++) {
        __threadTerminate(tids[i])
    }
}

function main() {
    while(true) {
        LogStatus(_D())
        var cmd = GetCommand()
        if (cmd) {
            if (cmd == "placeMultipleOrders") {
                var t = _C(exchange.GetTicker)
                var beginPrice = t.Last * 0.8
                var endPrice = t.Last * 0.9
                var step = t.Last * 0.01
                testPlaceMultipleOrders(0, beginPrice, endPrice, step, "Buy", 0.01)
                var orders = exchange.GetOrders()
                for (var i = 0; i < orders.length; i++) {
                    Log(orders[i])
                }
            }
        }
        Sleep(1000)
    }
}
  • পরীক্ষাটি একটি সিমুলেটেড ট্রেডিং পরিবেশে অপেক্ষমান অর্ডার গ্রহণ করে, বর্তমান মূল্যের 80% থেকে 90% বৃদ্ধি করে। পরীক্ষার অর্ডার স্থাপন শুরু করতে ইন্টারঅ্যাকশন বোতামটি ক্লিক করুন।

placeMultipleOrders বোতামে ক্লিক করার পর, একটি বার্তা প্রদর্শিত হবেঃ placeMultipleOrders কমান্ড সফলভাবে পাঠানো হয়েছে, লাইভ ট্রেডিং থেকে একটি প্রতিক্রিয়ার জন্য অপেক্ষা করুন!

  • কৌশল লগ একই সাথে অর্ডার স্থানান্তর অপারেশন প্রদর্শন করেঃ

img

3. একটি সমান্তরাল থ্রেড এক্সিকিউশন ফাংশনে একটি ওয়েবসকেট সংযোগ তৈরি করুন

এই প্রয়োজনীয়তা একটি FMZ ব্যবহারকারী দ্বারা উত্থাপিত হয়েছিল যিনি একটি সহজ উদাহরণ চান কিভাবে একটিওয়েবসকেটএকই সময়ে থ্রেড সংযোগ এবং কিভাবে ডাটা পাস করতেmain()প্রধান থ্রেডে ফাংশন।

আসলে, এটি বেশ সহজ এবং পূর্ববর্তী উদাহরণে সমান্তরাল থ্রেড তৈরির অনুরূপ। একমাত্র পার্থক্য হল যে আমরা ব্যবহার__threadPeekMessage()এবং__threadPostMessage()ইন্টার-থ্রেড যোগাযোগের জন্য ফাংশন। উদাহরণস্বরূপ বাইনারেন্স এক্সচেঞ্জের জন্য ওয়েবসকেট এপিআই কল গ্রহণ করে, আমাদের ওয়েবসকেট সংযোগের বন্ধ অপারেশনটিও পরিচালনা করতে হবে। নিম্নলিখিত উদাহরণটি দেখায় যে কীভাবে একটি সমান্তরাল থ্রেডকে থামতে জানানো যায়।

সম্পূর্ণ কোড উদাহরণঃ

var tid = null 

function createWS() {
    // wss://stream.binance.com:9443/ws/<streamName> , <symbol>@ticker
    
    var stream = "wss://stream.binance.com:9443/ws/btcusdt@ticker"    
    var ws = Dial(stream)
    Log("Create a WS connection:", stream)
    
    while (true) {
        var data = ws.read()
        if (data) {            
            __threadPostMessage(0, data)
        }
        Log("receiving data pushed by the WS link, data:", data)
        
        // __threadPeekMessage timeout parameter set to -1, no blocking
        var msg = __threadPeekMessage(-1)
        if (msg) {
            if (msg == "stop") {
                Log("Concurrent Thread Id:", __threadId(), "Received stop command")
                break
            }
        }
    }

    Log("Concurrent threads finish execution, close ws connection")
    ws.close()
}

function main() {
    tid = __Thread(createWS)
    Log("Create concurrent threads, thread Id:", tid)

    while(true) {
        // __threadPeekMessage's timeout parameter is set to 0, blocking for data
        var data = __threadPeekMessage(0)
        Log("Received from concurrent thread", ", Id:", tid, ", the data sent, data:", data, "#FF0000")
        
        var tbl = {
            type : "table", 
            title : "<symbol>@ticker channel push message",
            cols : ["Event Type", "Event Time", "Trading Pairs", "24 Hour Price Change", "24 Hour Price Change %", "Average Price", "Last Traded Price", "Volume in 24 Hours", "Turnover in 24 Hours"],
            rows : []
        }

        try {
            data = JSON.parse(data)
            tbl.rows.push([data.e, _D(data.E), data.s, data.p, data.P, data.w, data.c, data.v, data.q])
        } catch (e) {
            Log("e.name:", e.name, "e.stack:", e.stack, "e.message:", e.message)
        }
        LogStatus(_D(), "\n`" + JSON.stringify(tbl) + "`")
    }
}

function onexit() {
    Log("Finalize function, send a stop command to the concurrent thread with ID ", tid,"")
    __threadPostMessage(tid, "stop")
    Log("Wait for the concurrent thread with ID ", tid, " to stop")
    __threadJoin(tid)
    Log("Finalize function execution completed")
}

লাইভ ট্রেডিং পরীক্ষার সময়, আমরা দেখতে পাচ্ছি যেmain()ফাংশন ধারাবাহিকভাবে একই সময়ে থ্রেড দ্বারা তৈরি ওয়েবসকেট সংযোগ থেকে বাজার তথ্য গ্রহণ করে।

লাইভ ট্রেডিং কৌশল বন্ধ করার সময়, ফাইনালাইজ ফাংশন কাজ শুরু করবে।


সম্পর্কিত

আরো