4
ফোকাস
1271
অনুসারী

উদ্ভাবকের পরিমাণগত ডাটাবেস তৈরি করতে SQLite ব্যবহার করে

তৈরি: 2021-03-26 17:09:32, আপডেট করা হয়েছে: 2024-12-05 21:56:39
comments   5
hits   2295

[TOC]

উদ্ভাবকের পরিমাণগত ডাটাবেস তৈরি করতে SQLite ব্যবহার করে

সারাংশ

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

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

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

যখন স্ব-নির্মিত ডাটাবেসের কথা আসে, তখন সবাই সম্ভবত Oracle, MySQL, KDB, OneTick, NoSQL এর কথা ভাবতে পারে… কার্যকারিতা এবং কর্মক্ষমতা উভয় ক্ষেত্রেই এগুলি সবই চমৎকার এন্টারপ্রাইজ-স্তরের অ্যাপ্লিকেশন। যাইহোক, এটি বেশ কয়েকটি সমস্যার সম্মুখীন হয়: এটি শুরু করা কঠিন, কনফিগারেশনটি কষ্টকর এবং পরিমাণগত ব্যবসায় খুচরা বিনিয়োগকারীদের জন্য এটি একটি কামান ব্যবহার করার মতো মনে হয়, এমনকি আপনি যদি শুরু করেন, তবে মাত্র কয়েকটি৷ ফাংশন ব্যবহার করা হয়।

উদ্ভাবক বিল্ট-ইন ডাটাবেস পরিমাপ করে

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

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

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

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

function main() {
    // 创建:如果“users”表不存在就创建一个,“id”是整数且自动增加,“name”是文本形式且不为空
    Log(DBExec('CREATE TABLE IF NOT EXISTS "users" (id INTEGER PRIMARY KEY AUTOINCREMENT, name text not NULL);'));
    
    // 增加:
    Log(DBExec("INSERT INTO users(name) values('张三')"));
    Log(DBExec("INSERT INTO users(name) values('李四')"));
    
    // 删除:
    Log(DBExec("DELETE FROM users WHERE id=1;"));
    
    // 修改
    Log(DBExec("UPDATE users SET name='王五' WHERE id=2"));
    
    // 查询
    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"));
}

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

কৌশল উদাহরণ

SQLite-এর মৌলিক সিনট্যাক্স বোঝার পর, লোহা গরম থাকা অবস্থায় আমরা আঘাত করি এবং টিক ডেটা সংগ্রহ ও ব্যবহারের উদাহরণ তৈরি করতে উদ্ভাবকের অন্তর্নির্মিত ডাটাবেস ব্যবহার করি।

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

ধাপ ২: একটি কৌশল তৈরি করুন

function main() {
    // 订阅合约
    _C(exchange.SetContractType, 'swap');
    
    // 创建数据表
    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);'
    ));
    
    // 获取10个tick数据
    while (true) {
        let tick = exchange.GetTicker();
        // 在tick表中增加数据
        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})`);
        // 查询所有数据
        let allDate = DBExec('select * from tick');
        if (allDate.values.length > 10) {
            break;
        }
        Sleep(1000);
    }
    
    // 查询所有数据
    Log(DBExec('select * from tick'));
    
    // 查询第一个数据
    Log(DBExec('select * from tick limit 1'));
    
    // 查询前两个数据
    Log(DBExec('select * from tick limit 0,2'));
    
    // 删除第一个数据
    Log(DBExec('DELETE FROM tick WHERE id=1;'));
    
    // 修改第二个数据
    Log(DBExec('UPDATE tick SET High=10000 WHERE id=2'));
    
    // 查询所有数据
    let allDate = DBExec('select * from tick')
    Log(allDate);
}

ধাপ তিন: কৌশল চালান উইন্ডোজকে উদাহরণ হিসাবে নিলে, পলিসি চালানোর পরে, হোস্ট ডিরেক্টরির “\logs\storage” ডিরেক্টরিতে একটি ফোল্ডার তৈরি হবে এবং “.db3” হিসাবে একটি ফাইল থাকবে প্রত্যয় , এই ফাইলটি উদ্ভাবকের অন্তর্নির্মিত ডাটাবেসের ফাইল। নিম্নলিখিত চিত্রে দেখানো হয়েছে: উদ্ভাবকের পরিমাণগত ডাটাবেস তৈরি করতে SQLite ব্যবহার করে উপরের কোডটি প্রথমে “টিক” নামে একটি ডেটা টেবিল তৈরি করে, তারপর টেবিলে টিক ডেটা ক্ষেত্র যোগ করে, তারপর একটি লুপে এক্সচেঞ্জ থেকে টিক ডেটা প্রাপ্ত করে এবং এই ডেটাগুলিকে “টিক” ডেটা টেবিলে সন্নিবেশ করে এবং একই সময়ে ডেটা টেবিলে ডেটার পরিমাণ 10-এর বেশি হলে, লুপটি জাম্প আউট করা হবে। অবশেষে, পাঁচটি SQLite কমান্ড ডেটা টেবিলে ডেটা অনুসন্ধান, মুছে ফেলা এবং পরিবর্তন করতে ব্যবহৃত হয়। এবং নিম্নলিখিত চিত্রে দেখানো হিসাবে, লগে এটি মুদ্রণ করুন: উদ্ভাবকের পরিমাণগত ডাটাবেস তৈরি করতে SQLite ব্যবহার করে ধাপ 4: স্ট্যাটাস বার তৈরি করুন পরিশেষে, আমরা আবিস্কারকের পরিমাণগত ডাটাবেস থেকে ডেটা প্রাপ্ত করে কৌশলটির জন্য একটি স্ট্যাটাস বার তৈরি করতে কিছু কোড যোগ করি যাতে ডেটা আরও স্বজ্ঞাতভাবে প্রদর্শন করা যায়:

    // 创建状态栏
    let table = {
        type: 'table',
        title: '币安Tick数据',
        cols: allDate.columns,
        rows: allDate.values
    }
    LogStatus('`' + JSON.stringify(table) + '`');

উপরের কোডটি ডাটাবেসের ডেটা থেকে একটি “বিনান্স টিক ডেটা” টেবিল তৈরি করে। ডাটাবেসের “কলাম” ক্ষেত্রটি স্ট্যাটাস বারে “সারি” উপস্থাপন করে এবং “মান” ক্ষেত্রটি স্ট্যাটাস বারে “কলাম” উপস্থাপন করে। নীচে দেখানো হিসাবে: উদ্ভাবকের পরিমাণগত ডাটাবেস তৈরি করতে SQLite ব্যবহার করে

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

/*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;'));
    // 订阅合约
    _C(exchange.SetContractType, 'swap');

    // 创建数据表
    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);'
    ));

    // 获取10个tick数据
    while (true) {
        let tick = exchange.GetTicker();
        // 在tick表中增加数据
        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})`);
        // 查询所有数据
        let allDate = DBExec('select * from tick');
        if (allDate.values.length > 10) {
            break;
        }
        Sleep(1000);
    }

    // 查询所有数据
    Log(DBExec('select * from tick'));

    // 查询第一个数据
    Log(DBExec('select * from tick limit 1'));

    // 查询前两个数据
    Log(DBExec('select * from tick limit 0,2'));

    // 删除第一个数据
    Log(DBExec('DELETE FROM tick WHERE id=1;'));

    // 修改第二个数据
    Log(DBExec('UPDATE tick SET High=10000 WHERE id=2'));

    // 查询所有数据
    let allDate = DBExec('select * from tick')
    Log(allDate);

    // 创建状态栏
    let table = {
        type: 'table',
        title: '币安Tick数据',
        cols: allDate.columns,
        rows: allDate.values
    }
    LogStatus('`' + JSON.stringify(table) + '`');
}

সম্পূর্ণ কৌশল কোড কপি করতে https://www.fmz.com/strategy/388963 এই লিঙ্কে ক্লিক করুন।

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

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

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

সারসংক্ষেপ

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