संसाधन लोड हो रहा है... लोड करना...

SQLite के साथ FMZ का एक मात्रात्मक डेटाबेस बनाना

लेखक:FMZ~Lydia, बनाया गयाः 2022-11-09 11:40:34, अद्यतन किया गयाः 2023-09-20 10:55:14

img

सार

डेटा मात्रात्मक व्यापार का स्रोत है, बड़ी मात्रा में डेटा का कुशलता से प्रबंधन कैसे करें यह एक बहुत ही महत्वपूर्ण कड़ी है, डेटाबेस सबसे अच्छे समाधानों में से एक है, आजकल डेटाबेस का अनुप्रयोग सभी प्रकार के दैनिक व्यापार, उच्च आवृत्ति व्यापार और अन्य रणनीतियों के लिए मात्रात्मक मानक है। इस लेख में हम एफएमजेड क्वांट के अंतर्निहित डेटाबेस का अध्ययन करेंगे (https://www.fmz.com), जिसमें डेटा तालिकाओं को बनाने, डेटा स्टोर करने, डेटा को संशोधित करने, डेटा को हटाने, संदर्भ डेटा और इसे व्यवहार में लागू करने का तरीका शामिल है।

डेटाबेस कैसे चुनें

जो लोग एफएमजेड क्वांट प्लेटफॉर्म से परिचित हैं, उन्हें पता होना चाहिए कि स्थानीय पुनः उपयोग के लिए डेटा सहेजने से पहले, आप केवल _G() फ़ंक्शन का उपयोग कर सकते हैं, जो रणनीति को रोकने के हर बार स्वचालित रूप से आवश्यक जानकारी को सहेजता है। लेकिन यदि आप अधिक और अधिक जटिल स्वरूपित डेटा सहेजना चाहते हैं, तो _G() फ़ंक्शन स्पष्ट रूप से बहुत लागू नहीं है, इसलिए, कई लोगों ने इस समस्या को हल करने के लिए अपना स्वयं का डेटाबेस बनाने का मन बनाया।

जब स्व-निर्मित डेटाबेस की बात आती है, तो आपको ओरेकल, MySQL, KDB, OneTick, NoSQL के बारे में सोचना चाहिए... ये कार्य और प्रदर्शन दोनों में बहुत उत्कृष्ट उद्यम-स्तरीय अनुप्रयोग हैं। हालांकि, कई समस्याएं भी हैंः शुरू करना मुश्किल है, और कॉन्फ़िगरेशन बोझिल है और रखरखाव मुश्किल है। खुदरा मात्रात्मक व्यापारियों के लिए, यह तोप के साथ मक्खियों को गोली मारने जैसा है। भले ही वे शुरू करें, वे केवल कार्यों के एक छोटे से हिस्से का उपयोग करते हैं।

एफएमजेड क्वांट का अंतर्निहित डेटाबेस

इसके बाद, आइए FMZ Quant द्वारा निर्मित लाइट डेटाबेस पर एक नज़र डालें। DBExec FMZ Quant का एक अंतर्निहित रिलेशनल डेटा प्रबंधन प्रणाली इंटरफ़ेस है। यह SQLite के आधार पर विकसित किया गया है और C में लिखा गया है। यह न केवल आकार में छोटा है, संसाधन की खपत में कम है, बल्कि प्रसंस्करण में भी तेज़ है। यह वित्तीय मात्रात्मक विश्लेषण के उत्साही लोगों के लिए स्थानीय रूप से डेटा प्रबंधन को लागू करने के लिए बहुत उपयुक्त है, क्योंकि विभिन्न object (जैसे एक्सचेंजों, डेटा स्रोतों और कीमतों) को विभिन्न तालिकाओं में विभाजित किया जा सकता है, और तालिकाओं के बीच संबंधों को परिभाषित किया जा सकता है। इसके अलावा, उपयोगकर्ताओं को उन्हें अलग से स्थापित करने और कॉन्फ़िगर करने की आवश्यकता नहीं है। वे DBExec) फ़ंक्शन को कॉल करके सीधे उनका उपयोग कर सकते हैं!

इसके अतिरिक्त, यह SQLite भाषा सीखना बहुत आसान है, और डेटाबेस पर किया जाने वाला अधिकांश काम SQLite कथन द्वारा पूरा किया जाता है। यदि आप बुनियादी व्याकरण से परिचित हैं, तो आप अधिकांश आवश्यकताओं को पूरा कर सकते हैं। निम्नलिखित SQLite का बुनियादी व्याकरण है।

मूल व्याकरण

SQLite का व्याकरण केस-असंवेदनशील है, हालांकि कुछ कमांड हैं जो केस-संवेदनशील हैं, जैसे कि GLOB और glob, जो अलग-अलग अर्थों का प्रतिनिधित्व करते हैं। 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

रणनीति के उदाहरण

SQLite के बुनियादी व्याकरण को सीखने के बाद, हम FMZ क्वांट के अंतर्निहित डेटाबेस का उपयोग करके टिक डेटा एकत्र करने और उपयोग करने का एक उदाहरण बनाने के लिए लोहे को गर्म करते हुए मारते हैं।

चरण 1: डॉकर अद्यतन करें

सबसे पहले, सुनिश्चित करें कि आप डॉकर के नवीनतम संस्करण का उपयोग कर रहे हैं. यदि आपने पहले डॉकर डाउनलोड किया है और इसका उपयोग किया है, तो आपको पहले इसे हटाने की आवश्यकता है, और फिर इसे फिर से डाउनलोड करें और इसे फिर से तैनात करेंhttps://www.fmz.com/m/add-node page.

चरण 2: रणनीति बनाएं

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);
}

चरण 3: रणनीति को लागू करें

उदाहरण के लिए विंडोज को लें, रणनीति चलाने के बाद, डॉकर निर्देशिका की \logs\storage निर्देशिका में रोबोट संख्या के नाम पर एक फ़ोल्डर बनाया जाएगा। फ़ोल्डर खोलें, और प्रत्यय . db3 के साथ एक फ़ाइल है, जो एफएमजेड क्वांट अंतर्निहित डेटाबेस की फ़ाइल है। जैसा कि निम्न चित्र में दिखाया गया हैः

img

उपरोक्त कोड पहले tick नाम की एक डेटा तालिका बनाता है, फिर तालिका में टिक डेटा फ़ील्ड जोड़ता है, फिर लूप में एक्सचेंज से टिक डेटा प्राप्त करता है, और डेटा को tick डेटा तालिका में सम्मिलित करता है। उसी समय, हम आंकड़ों की मात्रा का न्याय करते हैं कि डेटा तालिका में डेटा की मात्रा 10 से अधिक है, तो हम लूप से बाहर कूदते हैं। अंत में हम क्रमशः डेटा तालिका में डेटा को खोजने, हटाने और संशोधित करने के लिए 5 SQLite कमांड का उपयोग करते हैं। और उन्हें लॉग में प्रिंट करते हैं, जैसा कि निम्न चित्र में दिखाया गया हैः

img

चरण 4: स्थिति पट्टी बनाएँ

अंत में, हम कुछ कोड जोड़ते हैं ताकि डेटा को अधिक दृश्य रूप से प्रदर्शित करने के लिए एफएमजेड क्वांट डेटाबेस में डेटा प्राप्त करके रणनीति के लिए एक स्थिति पट्टी बनाई जा सके, जोड़ने वाला कोड निम्नानुसार दिखाता हैः

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

उपरोक्त कोड डेटाबेस में डेटा के माध्यम से Binance Tick data तालिका बनाता है। डेटाबेस में स्तंभ क्षेत्र स्थिति पट्टी में पंक्तियों का प्रतिनिधित्व करता है, और मान क्षेत्र स्थिति पट्टी में स्तंभों का प्रतिनिधित्व करता है। जैसा कि नीचे दिए गए चित्र में दिखाया गया हैः

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");

सारांश

डेटाबेस न केवल बड़े पैमाने पर डेटा ले जा सकता है, बल्कि कई मात्रात्मक व्यापार उत्साही लोगों का सपना भी ले जा सकता है। डेटाबेस का उपयोग इस लेख में उदाहरणों तक सीमित नहीं है। अधिक उपयोग विधियों के लिए, कृपया SQLite ट्यूटोरियल और एफएमजेड क्वांट के अनुवर्ती लेखों का संदर्भ लें।


संबंधित

अधिक