এসকিউএলআইটি দিয়ে এফএমজেডের একটি পরিমাণগত ডাটাবেস তৈরি করা

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

img

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

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

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

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

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

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

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

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

মৌলিক ব্যাকরণ

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

function main() {
    // Create: If the "users" table does not exist, create one, "id" is an integer and is incremented automatically, "name" is in text form and is not empty
    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('Zhang San')"));
    Log(DBExec("INSERT INTO users(name) values('Li Si')"));
    
    // Delete:
    Log(DBExec("DELETE FROM users WHERE id=1;"));
    
    // Modify:
    Log(DBExec("UPDATE users SET name='Wang Wu' WHERE id=2"));
    
    // Search:
    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

কৌশলগত উদাহরণ

এসকিউএলআইটি এর মৌলিক ব্যাকরণ শিখে, আমরা FMZ Quant এর অন্তর্নির্মিত ডাটাবেস ব্যবহার করে টিক ডেটা সংগ্রহ এবং ব্যবহারের একটি উদাহরণ তৈরি করতে লোহা গরম থাকাকালীন আঘাত করি।

ধাপ ১ঃ ডকার আপডেট করুন

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

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

function main() {
    // Subscribe contracts
    _C(exchange.SetContractType, 'swap');
    
    // Create 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);'
    ));
    
    // Get 10 pieces of tick data
    while (true) {
        let tick = exchange.GetTicker();
        // Add data to 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})`);
        // Search all data
        let allDate = DBExec('select * from tick');
        if (allDate.values.length > 10) {
            break;
        }
        Sleep(1000);
    }
    
    // Search all data
    Log(DBExec('select * from tick'));
    
    // Search the first data
    Log(DBExec('select * from tick limit 1'));
    
    // Search first two pieces of 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'));
    
    // Search all data
    let allDate = DBExec('select * from tick')
    Log(allDate);
}

তৃতীয় ধাপঃ কৌশলটি বাস্তবায়ন করুন

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

img

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

img

ধাপ ৪ঃ স্থিতি বার তৈরি করুন

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

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

উপরের কোডটি ডাটাবেসের তথ্যের মাধ্যমে একটি Binance Tick data টেবিল তৈরি করে। ডাটাবেসের columns ক্ষেত্রটি স্ট্যাটাস বারের rows এবং values ক্ষেত্রটি স্ট্যাটাস বারের columns প্রতিনিধিত্ব করে। নীচের চিত্রটিতে দেখানো হয়েছেঃ

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;'));
    // Subscribe contracts
    _C(exchange.SetContractType, 'swap');

    // Create 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 pieces of tick data
    while (true) {
        let tick = exchange.GetTicker();
        // Add data to 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})`);
        // Search all data
        let allDate = DBExec('select * from tick');
        if (allDate.values.length > 10) {
            break;
        }
        Sleep(1000);
    }

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

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

    // Search first two pieces of 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'));

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

    // Create 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/388963সম্পূর্ণ কৌশল কোড কপি করতে.

মেমরি ডাটাবেস

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

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

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

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


সম্পর্কিত

আরো