리소스 로딩... 로딩...

SQLite를 사용하여 발명자 양적 데이터베이스를 구축합니다

저자: , 2021-03-26 17:09:32, 업데이트: 2023-09-24 19:36:26

[TOC]

img

요약

데이터는 거래의 원천이며, 많은 데이터를 효율적으로 관리하는 것은 매우 중요한 요소입니다. 데이터베이스는 최고의 솔루션 중 하나입니다. 현재 데이터베이스의 응용은 모든 종류의 일일 거래, 고속 거래 및 기타 전략의 정량 표준 구성입니다.FMZ.COM이 데이터베이스에는 데이터 테이블을 만드는 방법, 데이터를 저장하는 방법, 데이터를 수정하는 방법, 데이터를 삭제하는 방법, 데이터를 참조하는 방법, 그리고 실제 전투에 적용하는 방법 등이 있습니다.

데이터베이스를 선택하는 방법

정량화 플랫폼에 익숙한 발명가들은 이전에 데이터를 로컬로 복제하기 위해 저장하려는 것은 _G() 함수만 사용해야 한다는 것을 알고 있어야 합니다. 정책이 중지될 때마다, _G() 함수는 자동으로 필요한 정보를 저장합니다. 그러나 더 많은 더 복잡한 포맷 데이터를 저장하려는 경우, _G() 함수는 분명히 그다지 적합하지 않습니다. 그래서 많은 사람들이 스스로 데이터베이스를 만드는 것을 생각하여 문제를 해결합니다.

데이터베이스 자체 구축에 대해 이야기하면 Oracle, MySQL, KDB, OneTick, NoSQL...이 모든 것이 매우 훌륭한 기업 수준의 응용 프로그램이며 기능과 성능 모두 매우 강력합니다. 그러나 몇 가지 문제도 있습니다.

발명가 양적 기본 데이터베이스

다음으로 우리는 발명가들의 양적 내장된 가벼운 데이터베이스 DBExec를 소개합니다. DBExec는 발명가들의 양적 내장된 관계형 데이터 관리 시스템 인터페이스입니다. 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의 기본 문법을 이해한 후, 우리는 발명의 내부 데이터베이스를 양적으로 사용해서 Tick 데이터를 수집하고 사용하는 예를 만들었습니다.

첫 번째 단계: 관리자를 업데이트합니다먼저 최신 버전의 호스트를 사용하고 있는지 확인합니다.https://www.fmz.com/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);
}

세 번째 단계: 전략 실행윈도우의 예로, 정책을 실행한 후, 호스트 디렉토리의?? \logs\storage?? 디렉토리에서 로봇 번호로 이름 붙인 폴더를 생성하고, 이 폴더를 열고, 이 폴더에는??.db3?? 으로 후자를 붙인 파일이 있으며, 이 파일이 발명가들이 내장 데이터베이스를 계량화한 파일이다. 아래 그림에서 나타납니다.img위의 코드는 먼저 티크 이라는 이름의 데이터 테이블을 생성하고, 그 테이블에 데이터 필드를 추가하고, 그 다음 루프에서 거래소로부터 데이터를 획득하고, 이 데이터를 티크 데이터 테이블에 삽입하며, 데이터 테이블의 데이터가 10개 이상인 것을 판단하면 루프를 건너갑니다. 마지막으로 5개의 SQLite 명령어를 사용하여 데이터 테이블의 데이터를 검색, 삭제, 수정합니다. 그리고 로그에 인쇄합니다. 아래 그림과 같이:img 네 번째 단계: 상태 표시를 만듭니다.그리고 마지막으로, 우리는 몇 가지 코드를 추가했습니다. 개발자의 데이터베이스에서 데이터를 양적으로 가져와서, 더 직관적인 데이터를 보여주기 위해 정책에 상태 표시를 만들 수 있습니다.

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

위 코드는 데이터베이스의 데이터를 통해 동전 틱 데이터 필터를 만듭니다. 데이터베이스의 columns 필드는 상태 필드의 을, values 필드는 상태 필드의 을 나타냅니다. 아래 그림과 같이: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이 문서는 모든 문서를 복사할 수 있습니다.

메모리 데이터베이스

작업 데이터가 디스크에 영구적으로 저장되지 않기를 원한다면 SQL 문장 전에 추가할 수 있습니다.:기호는 메모리 데이터베이스에서 동작할 수 있고, 로봇이 다시 시작되면 데이터가 다시 설정됩니다.

DBExec(":select 1,2,3");

요약

데이터베이스는 방대한 양의 데이터를 수용할 수 있을 뿐만 아니라 많은 양량 거래 애호가들의 야망도 수용할 수 있다. 데이터베이스의 사용은 이 문서의 예로만 국한되지 않는다. 더 많은 사용 방법은 SQLite 튜토리얼과 발명가들의 양량화 후속 발표 시리즈에 참조할 수 있다.


관련

더 많은

다이안완99좋은. 단 한가지 단점은 데이터가 로컬, 실제 디스크로 기록되지 않는다는 것입니다.

윌리엄푸데이터베이스가 재검토를 지원하지 않는가? 코드 붙어 과거 재검토 오류:ReferenceError: DBExec is not defined

맙소사정말 멋지네요.

로컬 데이터베이스를 시도해 볼 수 있습니다.

감사합니다.