आविष्कारक क्वांटिफाइड डेटाबेस वास्तविक युद्ध

लेखक:छोटे सपने, दिनांकः 2022-11-04 19:12:34
टैगः

एक, सारांश

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

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

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

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

तीसरा, आविष्कारकों ने अंतर्निहित डेटाबेस को मात्रात्मक बनाया

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

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

चार, बुनियादी व्याकरण

SQLite का सिंटैक्स बड़े आकार में लिखा जाता है, लेकिन कुछ कमांड बड़े आकार के प्रति संवेदनशील होते हैं, जैसे कि 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"));
}

एक डेटाबेस में आमतौर पर एक या अधिक तालिकाएं होती हैं, प्रत्येक तालिका के लिए एक नाम चिह्न होता है, ध्यान देने योग्य है कि सिस्टम ने अलग-अलग तालिकाओं को संरक्षित किया हैः kvdb, cfg, log, profit, chart. यानी तालिका बनाने के दौरान, सिस्टम को संरक्षित नामों से बचना चाहिए। आइए ऊपर कोड चलाएं, निम्नलिखित का उत्पादन करेंःimg

5. रणनीतिक उदाहरण

SQLite के बुनियादी सिंटैक्स को समझने के बाद, हमने एक उदाहरण बनाया है जिसमें हम Tick डेटा एकत्र करने और उपयोग करने के लिए एक अंतर्निहित डेटाबेस को क्वांटिफाई करने के लिए आविष्कारक का उपयोग करते हुए गर्म लोहे का उपयोग करते हैं।

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

दूसरा कदमः रणनीति बनाना

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

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

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

उपरोक्त कोड डेटाबेस में डेटा के माध्यम से एक सिक्का और टिक डेटा तालिका का निर्माण करता है; जिसमें डेटाबेस में सिक्का columns सिक्का फ़ील्ड स्थिति तालिका में तालिका तालिका का प्रतिनिधित्व करते हैं, और तालिका मान तालिका स्थिति तालिका में तालिका तालिका का प्रतिनिधित्व करते हैं; जैसा कि चित्र में दिखाया गया हैःimg

6. पूरी रणनीति कोड

/*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इस तरह की एक नई रणनीति के लिए, आप पूरी रणनीति कोड को कॉपी कर सकते हैं।

7. सारांश

डेटाबेस न केवल बड़ी मात्रा में डेटा रख सकता है, बल्कि कई मात्रा व्यापार प्रेमियों के लिए भी एक विशाल सपना है। डेटाबेस के उपयोग के लिए उदाहरण इस लेख तक सीमित नहीं हैं, और अधिक उपयोग के लिए 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() {
    // 订阅合约
    _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) + '`');
}

अधिक

zyc1997क्या कोई पायथन संस्करण है?

छोटे सपनेPython में फ़ंक्शन को कॉल करने के समान है.