Type/to search
8
Follow
1364
Followers
SQLite का उपयोग करके आविष्कारक मात्रात्मक डेटाबेस का निर्माण करना
Original
Created 2021-03-26 17:09:32  Updated 2024-12-05 21:56:39
 5
 2670

img

सारांश

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

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

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

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

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

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

इसके अलावा, SQLite भाषा सीखने की लागत बहुत कम है, और डेटाबेस पर किया जाने वाला अधिकांश कार्य 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")); }

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

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

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

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

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

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

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

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

उपरोक्त कोड डेटाबेस में डेटा का उपयोग करके "Binance टिक डेटा" तालिका बनाता है। डेटाबेस में "कॉलम" फ़ील्ड स्टेटस बार में "पंक्तियों" का प्रतिनिधित्व करता है, और "मूल्य" फ़ील्ड स्टेटस बार में "कॉलम" का प्रतिनिधित्व करता है। जैसा कि निम्नलिखित चित्र में दिखाया गया है:
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;')); // 订阅合约 _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 ट्यूटोरियल और इन्वेंटर क्वांटिटेटिव द्वारा जारी किए गए लेखों की बाद की श्रृंखला देखें।

Related Recommendations
Comment
All comments (5)

    很棒。唯一缺点是数据在本地,实盘的话中间数据记录不上

    4 years ago

    数据库不支持回测是吗 ? 代码粘过去回测报错:ReferenceError: DBExec is not defined

    5 years ago

    支持,你可以试试本地的数据库

    5 years ago

    非常棒

    5 years ago

    谢谢

    5 years ago
  • 1
iPhone Download
Forums
PINE Language
© 2015 - ∞ INVENTOR PTE LTD (SG)