FMZ क्वांट डेटाबेस बनाने के लिए SQLite का उपयोग करें

लेखक:निनाबादास, बनाया गयाः 2022-04-24 11:32:35, अद्यतनः 2022-04-24 16:21:38

FMZ क्वांट डेटाबेस बनाने के लिए SQLite का उपयोग करें [TOC]

सार

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

डेटाबेस का चयन कैसे करें

जो लोग एफएमजेड क्वांट ट्रेडिंग प्लेटफॉर्म से परिचित हैं, उन्हें पता होना चाहिए कि इससे पहले, यदि आप पुनः उपयोग के लिए स्थानीय में डेटा सहेजना चाहते हैं, तो आप केवल _G() फ़ंक्शन का उपयोग कर सकते हैं। हर बार जब आप रणनीति को रोकते हैं, तो _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 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

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

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

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

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

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

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

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

चरण 4: स्थिति पट्टी बनाएँअंत में, हम डेटा को अधिक सहज रूप से प्रदर्शित करने के लिए FMZ क्वांट डेटाबेस में डेटा प्राप्त करके रणनीति के लिए एक स्थिति पट्टी बनाने के लिए कोड के कुछ टुकड़े जोड़ते हैं। नया कोड निम्नानुसार हैः

    // 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 तालिका बनाता है। डेटाबेस में स्तंभ फ़ील्ड स्थिति पट्टी में क्षैतिज पंक्ति का प्रतिनिधित्व करता है, और मूल्यों फ़ील्ड स्थिति पट्टी में ऊर्ध्वाधर पंक्ति का प्रतिनिधित्व करता है। जैसा कि नीचे दिखाया गया हैः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");

निष्कर्ष

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


अधिक