3
ফোকাস
1444
অনুসারী

জাভাস্ক্রিপ্ট ব্যবহার করে কোয়ান্টাইজেশন কৌশলগুলির সমসাময়িক সঞ্চালন কার্যকর করা - Go ফাংশনগুলিকে এনক্যাপসুলেট করা

তৈরি: 2019-06-29 11:24:57, আপডেট করা হয়েছে: 2023-10-26 20:06:10
comments   3
hits   2797

জাভাস্ক্রিপ্ট ব্যবহার করে কোয়ান্টাইজেশন কৌশলগুলির সমসাময়িক সঞ্চালন কার্যকর করা - Go ফাংশনগুলিকে এনক্যাপসুলেট করা

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

var depthA = exchanges[0].GetDepth()
var depthB = exchanges[1].GetDepth()

বিশ্রামের এপিআই একবার অনুরোধ করতে দেরি হয়, ধরে নিলাম যে দুবার গভীরতা পাওয়ার সময়টি যদি আরও বেশি অ্যাক্সেসের প্রয়োজন হয়, তাহলে বিলম্বের সমস্যাটি আরও প্রকট হবে এবং কৌশলটি কার্যকর করাকে প্রভাবিত করবে৷

যেহেতু জাভাস্ক্রিপ্টে মাল্টি-থ্রেডিং নেই, তাই এই সমস্যাটি সমাধান করার জন্য নিচের স্তরটি গো ফাংশনকে এনক্যাপসুলেট করে, তবে ডিজাইন মেকানিজমের কারণে বাস্তবায়ন করা আরও জটিল।

var a = exchanges[0].Go("GetDepth")
var b = exchanges[1].Go("GetDepth")
var depthA = a.wait() //调用wait方法等待返回异步获取depth结果 
var depthB = b.wait()

বেশিরভাগ সাধারণ ক্ষেত্রে, এইভাবে একটি নীতি লেখা ভাল। কিন্তু লক্ষ্য করুন যে কৌশলটি লুপ হওয়ার সময় এই প্রক্রিয়াটি অবশ্যই পুনরাবৃত্তি করতে হবে এবং মধ্যবর্তী ভেরিয়েবল a এবং b আসলে শুধুমাত্র অস্থায়ী সহায়ক। যদি আমাদের অনেকগুলি সমসাময়িক কাজ থাকে তবে আমাদের অবশ্যই a এবং depthA, b এবং depthB এর মধ্যে চিঠিপত্র রেকর্ড করতে হবে যখন আমাদের সমসাময়িক কাজগুলি অনিশ্চিত হয়, পরিস্থিতি আরও জটিল হয়ে যায়। অতএব, আমরা একটি ফাংশন বাস্তবায়নের আশা করি: যখন একই সাথে Go লেখার সময়, একটি ভেরিয়েবল একই সময়ে আবদ্ধ হয়, যখন সমসাময়িক চলমান ফলাফলটি ফেরত দেওয়া হয়, ফলাফলটি স্বয়ংক্রিয়ভাবে ভেরিয়েবলের সাথে বরাদ্দ করা হয়, এইভাবে মধ্যবর্তী ভেরিয়েবলের প্রয়োজনীয়তা দূর করে। প্রোগ্রাম আরো সংক্ষিপ্ত. নির্দিষ্ট বাস্তবায়ন নিম্নরূপ:

function G(t, ctx, f) {
    return {run:function(){
        f(t.wait(1000), ctx)
    }}
}

আমরা একটি G ফাংশন সংজ্ঞায়িত করেছি, যেখানে প্যারামিটার t হল Go ফাংশন যা চালানো হবে, ctx হল রেকর্ড প্রোগ্রাম প্রসঙ্গ এবং f হল নির্দিষ্ট অ্যাসাইনমেন্টের ফাংশন। আপনি এক মুহূর্তের মধ্যে এই ফাংশন কি দেখতে পাবেন.

এই সময়ে, সামগ্রিক প্রোগ্রাম ফ্রেমওয়ার্কটি “প্রযোজক-ভোক্তা” মডেলের মতো লেখা যেতে পারে (কিছু পার্থক্য সহ) প্রযোজক ক্রমাগত কাজগুলি ইস্যু করে, এবং নিম্নলিখিত কোডটি শুধুমাত্র প্রদর্শনের জন্য প্রোগ্রাম চালান.

var Info = [{depth:null, account:null}, {depth:null, account:null}] //加入我们需要获取两个交易所的深度和账户,跟多的信息也可以放入,如订单Id,状态等。
var tasks = [ ] //全局的任务列表

function produce(){ //下发各种并发任务
  //这里省略了任务产生的逻辑,仅为演示
  tasks.push({exchange:0, ret:'depth', param:['GetDepth']})
  tasks.push({exchange:1, ret:'depth', param:['GetDepth']})
  tasks.push({exchange:0, ret:'sellID', param:['Buy', Info[0].depth.Asks[0].Price, 10]})
  tasks.push({exchange:1, ret:'buyID', param:['Sell', Info[1].depth.Bids[0].Price, 10]})
}
function worker(){
    var jobs = []
    for(var i=0;i<tasks.length;i++){
        var task = tasks[i]
        tasks.splice(i,1) //删掉已执行的任务
        jobs.push(G(exchanges[task.exchange].Go.apply(this, task.param), task, function(v, task) {
                    Info[task.exchange][task.ret] = v //这里的v就是并发Go函数wait()的返回值,可以仔细体会下
                }))
    }
    _.each(jobs, function(t){
            t.run() //在这里并发执行所有任务
        })
}
function main() {
    while(true){
        produce()         // 发出交易指令
        worker()        // 并发执行
        Sleep(1000)
    }
}

মনে হচ্ছে আমরা শুধুমাত্র একটি বৃত্তে একটি সাধারণ ফাংশন প্রয়োগ করেছি, কিন্তু প্রকৃতপক্ষে এটি কোডের জটিলতাকে ব্যাপকভাবে সরল করে। একই সাথে এবং সংশ্লিষ্ট ফলাফল ফেরত দিন। নমনীয়তা অনেক উন্নত করা হয়েছে.