[TOC]

데이터는 양적 거래의 원천입니다. 방대한 양의 데이터를 효율적으로 관리하는 방법은 중요한 연결 고리입니다. 데이터베이스는 최고의 솔루션 중 하나입니다. 오늘날 데이터베이스의 적용은 다양한 일중 거래, 고빈도 거래에 대한 양적 표준 구성이 되었습니다. 및 기타 전략. 이 글에서는 Inventor Quantitative(FMZ.COM)의 내장 데이터베이스에 대해 알아보겠습니다. 여기에는 데이터 테이블을 만드는 방법, 데이터 저장, 데이터 수정, 데이터 삭제, 데이터 참조 방법과 실제 전투에 적용하는 방법이 포함됩니다.
Inventor Quantitative Platform에 익숙한 사람이라면 이전에는 데이터를 로컬에 저장하여 재사용하려면 _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입니다. 즉, 테이블을 만들 때는 시스템에서 예약된 이름을 피해야 합니다. 위 코드를 실행해 보겠습니다. 그러면 다음과 같은 내용이 인쇄됩니다.

이제 SQLite의 기본 구문을 알았으므로 InventorQuant의 내장 데이터베이스를 사용하여 Tick 데이터를 수집하고 사용하는 예를 만들어 보겠습니다.
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단계: 전략 실행
예를 들어 Windows를 예로 들면, 정책을 실행한 후 로봇 번호의 이름을 딴 폴더가 호스트 디렉토리의 “\logs\storage” 디렉토리에 생성됩니다. 폴더를 열면 접미사 “.db3”이 있는 파일이 있습니다. “ 그 안에 있습니다. 이 파일은 발명가의 정량화된 내장 데이터베이스 파일입니다. 다음 그림과 같이:
위의 코드는 먼저 “tick”이라는 이름의 데이터 테이블을 만든 다음, 테이블에 tick 데이터 필드를 추가한 다음, 루프에서 거래소에서 tick 데이터를 가져와 “tick” 데이터 테이블에 삽입합니다. 데이터 양이 데이터 테이블의 숫자가 10을 넘으면 루프가 튀어나옵니다. 마지막으로, 5개의 SQLite 명령을 사용하여 데이터 테이블의 데이터를 쿼리하고 삭제하고 수정합니다. 다음 그림과 같이 로그에 인쇄합니다.
4단계: 상태 표시줄 만들기
마지막으로, Inventor Quantitative Database에서 데이터를 얻어 전략에 대한 상태 표시줄을 만드는 코드를 추가하여 데이터를 보다 직관적으로 표시합니다. 새로 추가된 코드는 다음과 같습니다.
// 创建状态栏
let table = {
type: 'table',
title: '币安Tick数据',
cols: allDate.columns,
rows: allDate.values
}
LogStatus('`' + JSON.stringify(table) + '`');
위 코드는 데이터베이스의 데이터를 사용하여 “바이낸스 틱 데이터” 테이블을 생성합니다. 데이터베이스의 “열” 필드는 상태 표시줄의 “행”을 나타내고, “값” 필드는 상태 표시줄의 “열”을 나타냅니다. 다음 그림과 같이:

/*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 튜토리얼과 Inventor Quantitative에서 발표한 후속 문서 시리즈를 참조하세요.