FMZ কোয়ান্ট ডাটাবেস তৈরি করতে SQLite ব্যবহার করুন

লেখক:নিনাবাদাস, সৃষ্টিঃ ২০২২-০৪-২৪ ১১ঃ৩২ঃ৩৫, আপডেটঃ ২০২২-০৪-২৪ ১৬ঃ২১ঃ৩৮

FMZ কোয়ান্ট ডাটাবেস তৈরি করতে SQLite ব্যবহার করুন [TOC]

সংক্ষিপ্তসার

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

ডাটাবেস নির্বাচন করুন

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

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

FMZ Quant অন্তর্নির্মিত ডাটাবেজ

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

এছাড়া, এসকিউএলাইট ভাষা শেখার খরচ খুবই কম, এবং ডাটাবেসে বেশিরভাগ কাজ এসকিউএলাইট স্ট্র্যাটেক্স দ্বারা সম্পন্ন হয়। বেশিরভাগ চাহিদা মৌলিক সিনট্যাক্সের সাথে পরিচিত হয়ে পূরণ করা যেতে পারে। নিম্নলিখিতটি এসকিউএলাইটের মৌলিক সিনট্যাক্স।

বেসিক সিনট্যাক্স

এসকিউএলাইটের সিনট্যাক্স কেস-সেনসিটিভ নয়, তবে কিছু কমান্ড কেস-সেনসিটিভ, যেমন গ্লোব এবং গ্লোব, যার বিভিন্ন অর্থ রয়েছে। এসকিউএলাইট স্ট্রাকচারগুলি যে কোনও কীওয়ার্ড দিয়ে শুরু হতে পারে, যেমন SELECT, INSERT, UPDATE, DELETE, ALTER, DROP ইত্যাদি, যার যথাক্রমে অর্থঃ ডেটা এক্সট্রাক্ট করা, ডেটা সন্নিবেশ করা, ডেটা আপডেট করা, ডেটা মুছে ফেলা, ডাটাবেস সংশোধন করা এবং ডেটা টেবিল মুছে ফেলা। সমস্ত স্ট্র্যাকচার একটি সেমিকোলন দিয়ে শেষ হয়। নিম্নলিখিতগুলি একটি সাধারণ ডাটাবেসের তৈরি, যোগ, মুছে ফেলা, সংশোধন এবং অনুসন্ধানের মতো ক্রিয়াকলাপঃ

function main() {
    // create: if the table of "users" do not exist, create one; "id" is integer and increases automatically; "name" is in form of text and not null 
    Log(DBExec('CREATE TABLE IF NOT EXISTS "users" (id INTEGER PRIMARY KEY AUTOINCREMENT, name text not NULL);'));
    
    // add: 
    Log(DBExec("INSERT INTO users(name) values('A')"));
    Log(DBExec("INSERT INTO users(name) values('B')"));
    
    // delete: 
    Log(DBExec("DELETE FROM users WHERE id=1;"));
    
    // modify:
    Log(DBExec("UPDATE users SET name='C' WHERE id=2"));
    
    // query:
    Log(DBExec('select 2, ?, ?, ?, ?', 'ok', true,9.8,null));
    Log(DBExec('select * from kvdb'));
    Log(DBExec('select * from cfg'));
    Log(DBExec('select * from log'));
    Log(DBExec('select * from profit'));
    Log(DBExec('select * from chart'));
    Log(DBExec("selEct * from users"));
}

একটি ডাটাবেস সাধারণত এক বা একাধিক টেবিল ধারণ করে, প্রতিটি টেবিলের একটি নাম সনাক্তকরণ রয়েছে, এটি লক্ষ করা উচিত যে সিস্টেম সংরক্ষিত টেবিলগুলি হলঃ kvdb, cfg, লগ, মুনাফা, চার্ট। অর্থাৎ, টেবিল তৈরি করার সময় আপনাকে সিস্টেম সংরক্ষিত নামগুলি এড়ানো উচিত। আসুন উপরের কোডটি চালান, যা নিম্নলিখিতগুলি রফতানি করেঃimg

কৌশল উদাহরণ

এসকিউএলাইটের মৌলিক বাক্য গঠন জানার পরে, লোহা গরম থাকাকালীন স্ট্রাইক করা যাক; টিক ডেটা সংগ্রহ এবং ব্যবহারের একটি উদাহরণ তৈরি করতে এফএমজেড ক্যুইন্টাম্যান্ট পরিমাণগত অন্তর্নির্মিত ডাটাবেস ব্যবহার করুন।

ধাপ ১ঃ ডকার আপডেট করুনপ্রথমত, নিশ্চিত করুন যে আপনি একটি ডকারের সর্বশেষ সংস্করণ ব্যবহার করছেন। যদি আপনি আগে একটি ডকার ডাউনলোড এবং ব্যবহার করেছেন, আপনাকে প্রথমে এটি মুছে ফেলতে হবে, এবং এটি ডাউনলোড এবং পৃষ্ঠায় আবার স্থাপন করতে হবে (https://www.fmz.com/m/add-node).

পদক্ষেপ ২ঃ কৌশল তৈরি করুন

function main() {
    // set contract 
    _C(exchange.SetContractType, 'swap');
    
    // create the data table 
    DBExec('CREATE TABLE IF NOT EXISTS "tick" (id INTEGER PRIMARY KEY AUTOINCREMENT,'.concat(
        'High FLOAT not NULL,', 
        'Low FLOAT not NULL,', 
        'Sell FLOAT not NULL,', 
        'Buy FLOAT not NULL,', 
        'Last FLOAT not NULL,', 
        'Volume INTEGER not NULL,', 
        'Time INTEGER not NULL);'
    ));
    
    // obtain 10 tick data 
    while (true) {
        let tick = exchange.GetTicker();
        // add data in the tick table 
        DBExec(`INSERT INTO tick(High, Low, Sell, Buy, Last, Volume, Time) values(${tick.High}, ${tick.Low}, ${tick.Sell}, ${tick.Buy}, ${tick.Last}, ${tick.Volume}, ${tick.Time})`);
        // query all data
        let allDate = DBExec('select * from tick');
        if (allDate.values.length > 10) {
            break;
        }
        Sleep(1000);
    }
    
    // query all data 
    Log(DBExec('select * from tick'));
    
    // query the first data 
    Log(DBExec('select * from tick limit 1'));
    
    // query the first two data 
    Log(DBExec('select * from tick limit 0,2'));
    
    // delete the first data 
    Log(DBExec('DELETE FROM tick WHERE id=1;'));
    
    // modify the second data 
    Log(DBExec('UPDATE tick SET High=10000 WHERE id=2'));
    
    // query all data 
    let allDate = DBExec('select * from tick')
    Log(allDate);
}

ধাপ ৩ঃ কৌশল কার্যকর করুনউদাহরণস্বরূপ উইন্ডোজ নিন। কৌশলটি চালানোর পরে, ডকার ডিরেক্টরির অভিধান \ লগস\ স্টোরেজ এ বট আইডি সহ একটি ফোল্ডার তৈরি করা হবে; ফোল্ডারটি খুলুন, এবং উপসর্গ হিসাবে .db3 সহ একটি ফাইল থাকবে; এই ফাইলটি এফএমজেড কোয়ান্টের অন্তর্নির্মিত ডাটাবেসের ফাইল। নিম্নলিখিত চিত্রটিতে দেখানো হয়েছেঃimg

উপরের কোডটি প্রথমে tick নামে একটি ডেটা টেবিল তৈরি করে, তারপরে টেবিলে টিক ডেটা ক্ষেত্র যুক্ত করে, তারপরে লুপের প্ল্যাটফর্ম থেকে টিক ডেটা পায় এবং এই ডেটা tick ডেটা টেবিলে সন্নিবেশ করে এবং একই সাথে যদি এটি বিচার করা হয় যে ডেটা টেবিলের ডেটা পরিমাণ 10 এর বেশি, এটি লুপ থেকে লাফিয়ে উঠবে। অবশেষে, ডেটা টেবিলে ডেটা অনুসন্ধান, মুছে ফেলা এবং সংশোধন করতে পাঁচটি এসকিউএলাইট কমান্ড ব্যবহার করুন। এবং এটি লগে মুদ্রণ করুন, যেমন নিম্নলিখিত চিত্রটিতে দেখানো হয়েছেঃimg

ধাপ ৪ঃ স্ট্যাটাস বার তৈরি করুনঅবশেষে, আমরা তথ্য আরো স্বজ্ঞাতভাবে প্রদর্শন করার জন্য FMZ Quant ডাটাবেস থেকে তথ্য সংগ্রহ করে কৌশল জন্য একটি অবস্থা বার তৈরি করার জন্য কোড কিছু টুকরা যোগ করুন। নতুন কোড নিম্নরূপঃ

    // create a status bar 
    let table = {
        type: 'table',
        title: 'Binance Tick data',
        cols: allDate.columns,
        rows: allDate.values
    }
    LogStatus('`' + JSON.stringify(table) + '`');

উপরের কোডটি ডাটাবেসের ডেটা থেকে একটি Binance Tick Data টেবিল তৈরি করে। ডাটাবেসের columns ক্ষেত্রটি স্ট্যাটাস বারে অনুভূমিক সারি এবং value ক্ষেত্রটি স্ট্যাটাস বারে উল্লম্ব সারি উপস্থাপন করে। নীচে দেখানো হয়েছেঃimg

সম্পূর্ণ কৌশল উৎস কোড

/*backtest
start: 2020-07-19 00:00:00
end: 2020-08-17 23:59:00
period: 15m
basePeriod: 15m
exchanges: [{"eid":"Binance","currency":"LTC_USDT"}]
*/

function main() {
    Log(DBExec('DROP TABLE tick;'));
    // set contract 
    _C(exchange.SetContractType, 'swap');

    // establish the data table 
    DBExec('CREATE TABLE IF NOT EXISTS "tick" (id INTEGER PRIMARY KEY AUTOINCREMENT,'.concat(
        'High FLOAT not NULL,',
        'Low FLOAT not NULL,',
        'Sell FLOAT not NULL,',
        'Buy FLOAT not NULL,',
        'Last FLOAT not NULL,',
        'Volume INTEGER not NULL,',
        'Time INTEGER not NULL);'
    ));

    // obtain 10 tick data 
    while (true) {
        let tick = exchange.GetTicker();
        // add data in the tick table
        DBExec(`INSERT INTO tick(High, Low, Sell, Buy, Last, Volume, Time) values(${tick.High}, ${tick.Low}, ${tick.Sell}, ${tick.Buy}, ${tick.Last}, ${tick.Volume}, ${tick.Time})`);
        // query all data 
        let allDate = DBExec('select * from tick');
        if (allDate.values.length > 10) {
            break;
        }
        Sleep(1000);
    }

    // query all data 
    Log(DBExec('select * from tick'));

    // query the first data 
    Log(DBExec('select * from tick limit 1'));

    // query the first two data 
    Log(DBExec('select * from tick limit 0,2'));

    // delet the first data 
    Log(DBExec('DELETE FROM tick WHERE id=1;'));

    // modify the second data
    Log(DBExec('UPDATE tick SET High=10000 WHERE id=2'));

    // query all data 
    let allDate = DBExec('select * from tick')
    Log(allDate);

    // create the status bar 
    let table = {
        type: 'table',
        title: 'Binance Tick data',
        cols: allDate.columns,
        rows: allDate.values
    }
    LogStatus('`' + JSON.stringify(table) + '`');
}

লিঙ্কটি ক্লিক করুনঃhttps://www.fmz.com/strategy/265906, এবং আপনি সম্পূর্ণ সোর্স কোড কপি করতে পারেন.

ইন-মেমোরি ডাটাবেস

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

DBExec(":select 1,2,3");

সিদ্ধান্ত

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


আরো