[TOC]
Dữ liệu là nguồn gốc của giao dịch định lượng, cách quản lý một lượng lớn dữ liệu hiệu quả là một liên kết rất quan trọng, cơ sở dữ liệu là một trong những giải pháp tốt nhất, hiện nay, ứng dụng cơ sở dữ liệu đã được cấu hình tiêu chuẩn định lượng cho các chiến lược như giao dịch trong ngày, giao dịch tần số cao.FMZ.COM) Cơ sở dữ liệu tích hợp, bao gồm: cách tạo bảng dữ liệu, lưu trữ dữ liệu, sửa đổi dữ liệu, xóa dữ liệu, tham khảo dữ liệu và cách áp dụng cho chiến đấu thực tế.
Những người quen thuộc với các nền tảng định lượng nên biết rằng trước đây, chỉ cần lưu dữ liệu để lặp lại cục bộ, bạn chỉ có thể sử dụng hàm _G(), mỗi khi ngừng chính sách, hàm _G() sẽ tự động lưu thông tin cần thiết. Nhưng nếu bạn muốn lưu trữ nhiều dữ liệu định dạng phức tạp hơn, hàm _G() rõ ràng không phù hợp, vì vậy nhiều người đã nghĩ đến việc tự xây dựng cơ sở dữ liệu để giải quyết vấn đề này.
Nói đến việc xây dựng cơ sở dữ liệu của riêng bạn, chắc chắn bạn sẽ nghĩ đến Oracle, MySQL, KDB, OneTick, NoSQL... đây là những ứng dụng cấp doanh nghiệp rất tốt, cả tính năng và hiệu suất đều rất mạnh mẽ. Nhưng cũng phải đối mặt với một số vấn đề: khó khăn trong việc sử dụng, cấu hình phức tạp và bảo trì rắc rối, điều này có một chút cảm giác pháo binh cho các nhà bán lẻ giao dịch định lượng, ngay cả khi người sử dụng chỉ sử dụng một phần nhỏ của các chức năng.
Tiếp theo, chúng ta hãy giới thiệu cơ sở dữ liệu hạng nhẹ được xây dựng theo định lượng của người phát minh, DBExec là một giao diện hệ thống quản lý dữ liệu tương quan được xây dựng theo định lượng của người phát minh, dựa trên SQLite, bản thân nó được viết bằng tiếng C, không chỉ có kích thước nhỏ, sử dụng ít tài nguyên, mà còn nhanh chóng xử lý, rất phù hợp với những người yêu thích phân tích định lượng tài chính để thực hiện quản lý dữ liệu tại địa phương, vì có thể phân chia các đối tượng khác nhau (ví dụ: sàn giao dịch, nguồn dữ liệu, giá cả) thành các bảng khác nhau và xác định mối quan hệ giữa các bảng. Ngoài ra, người dùng không cần cài đặt và cấu hình riêng biệt, chỉ cần gọi hàm DBExec ().
Ngoài ra, chi phí học của ngôn ngữ SQLite là rất thấp, và hầu hết các công việc được thực hiện trên cơ sở dữ liệu được thực hiện bằng các câu lệnh SQLite.
Định nghĩa của SQLite không phân biệt kích thước, nhưng có một số lệnh nhạy cảm với kích thước, chẳng hạn như GLOB và glob đại diện cho ý nghĩa khác nhau. Các câu lệnh SQLite có thể bắt đầu bằng bất kỳ từ khóa nào, chẳng hạn như SELECT, INSERT, UPDATE, DELETE, ALTER, DROP, v.v. Chúng nói: trích xuất dữ liệu, chèn dữ liệu, cập nhật dữ liệu, xóa dữ liệu, sửa đổi cơ sở dữ liệu, xóa bảng dữ liệu.
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"));
}
Một cơ sở dữ liệu thường chứa một hoặc nhiều bảng, mỗi bảng có một biểu tượng tên, cần lưu ý là hệ thống lưu giữ bảng riêng biệt: kvdb, cfg, log, profit, chart;; nghĩa là khi tạo bảng, bạn nên tránh tên lưu trữ hệ thống.
Với kiến thức về ngữ pháp cơ bản của SQLite, chúng tôi đã sử dụng công cụ nóng để tạo ra một ví dụ về việc thu thập và sử dụng dữ liệu Tick.
Bước 1: Cập nhật Trình quản trịTrước tiên, hãy đảm bảo rằng bạn đang sử dụng phiên bản mới nhất của trình quản lý, nếu bạn đã tải về một trình quản lý trước đây, bạn cần phải xóa trước và bạn sẽ phải sử dụng nó sau khi tải về.https://www.fmz.com/m/add-nodeTrang được tải về và triển khai lại.
Bước 2: Xây dựng chiến lược
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);
}
Bước 3: Thực hiện chiến lượcVí dụ như trong Windows, sau khi chạy chính sách, sẽ tạo ra một thư mục được đặt tên bằng số robot trong thư mục
// 创建状态栏
let table = {
type: 'table',
title: '币安Tick数据',
cols: allDate.columns,
rows: allDate.values
}
LogStatus('`' + JSON.stringify(table) + '`');
Mã trên sử dụng dữ liệu trong cơ sở dữ liệu để tạo ra một bảng phím dữ liệu Tick. Trong đó các trường phím columns trong cơ sở dữ liệu đại diện cho các thanh phím trong thanh trạng thái, và các trường phímvalues đại diện cho các thanh phím trong thanh trạng thái.
/*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) + '`');
}
Nhấp vào liên kếthttps://www.fmz.com/strategy/388963Có thể sao chép toàn bộ mã chính sách.
Nếu bạn không muốn lưu dữ liệu hoạt động vĩnh viễn vào đĩa, bạn có thể thêm trước câu lệnh SQL:
Biểu tượng có thể được vận hành trong bộ nhớ cơ sở dữ liệu, và dữ liệu được đặt lại sau khi robot khởi động lại
DBExec(":select 1,2,3");
Các cơ sở dữ liệu không chỉ có thể chứa một lượng lớn dữ liệu mà còn là giấc mơ rộng rãi của nhiều người yêu thích giao dịch định lượng. Các ví dụ trong bài viết này không giới hạn việc sử dụng cơ sở dữ liệu.
Dianwan99Tuyệt vời. Nhược điểm duy nhất là dữ liệu không thể được ghi lại trong ổ đĩa thực và địa phương.
williamfuCó phải cơ sở dữ liệu không hỗ trợ lặp lại không?
Chúa ơi.Thật tuyệt vời.
Hỗ trợ, bạn có thể thử cơ sở dữ liệu địa phương
Cảm ơn.