FMZ 양자 데이터베이스를 구성하기 위해 SQLite를 사용

저자:니나바다스, 창작: 2022-04-24 11:32:35, 업데이트: 2022-04-24 16:21:38

FMZ 양자 데이터베이스를 구성하기 위해 SQLite를 사용 [TOC]

요약

데이터는 양적 거래의 원천입니다. 많은 양의 데이터를 효율적으로 관리하는 것이 매우 중요합니다. 데이터베이스는 최고의 솔루션 중 하나입니다. 요즘 데이터베이스의 응용은 다양한 일 거래, 고 주파수 거래 및 기타 전략의 표준 양적 구성이되었습니다. 이 기사에서는 FMZ Quant의 내장 데이터베이스를 연구 할 것입니다 (FMZ.COM), 데이터 테이블을 만드는 방법, 데이터를 저장하는 방법, 데이터를 수정하는 방법, 데이터를 삭제하는 방법, 참고 데이터를 사용하는 방법, 그리고 실제로 사용하는 방법.

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

FMZ 양자 거래 플랫폼에 익숙한 사람들은 이전에 데이터를 재사용하기 위해 로컬로 저장하고 싶다면 _G() 함수를 사용할 수 있다는 것을 알고 있어야합니다. 전략을 중지 할 때마다 _G() 함수가 자동으로 필요한 정보를 저장합니다. 그러나 점점 더 복잡한 포맷 된 데이터를 저장하고 싶다면 _G() 함수가 분명히 적합하지 않으므로 많은 사람들이 문제를 해결하기 위해 자신의 데이터베이스를 구축하는 것을 생각합니다.

자체 구축 데이터베이스에 관해서는 누구나 오라클, MySQL, KDB, OneTick, NoSQL을 생각할 수 있습니다. 기능과 성능 측면에서 모두 우수한 엔터프라이즈 수준의 응용 프로그램입니다. 그러나 몇 가지 문제도 있습니다. 시작하기가 어렵고 구성 및 유지 관리가 어렵습니다. 양적 거래의 소매 투자자에게는 바퀴에 파리를 깨는 것과 같습니다. 이미 그러한 응용 프로그램으로 시작하더라도 그 중 몇 가지 기능만 사용됩니다.

FMZ 퀀트 내장 데이터베이스

다음으로, FMZ Quant의 내장된 가벼운 데이터베이스 DBExec를 알아보자. DBExec는 FMZ Quant에 내장된 관계형 데이터 관리 시스템 인터페이스이다. SQLite를 기반으로 개발되어 C어로 작성되었습니다. 크기가 작고 자원이 적게 사용되면서도 매우 빠른 처리 속도를 가지고 있습니다. 금융 양적 분석 애호가들이 데이터 관리를 로컬로 구현하는 데 매우 적합합니다. 다른 객체 (플랫폼, 데이터 소스, 가격과 같은) 를 다른 테이블로 나누고 테이블 사이의 관계를 정의 할 수 있기 때문입니다. 또한 사용자가 별도로 설치하고 구성 할 필요가 없습니다. DBExec () 함수를 호출하는 한 직접 사용할 수 있습니다!

또한, SQLite 언어를 배우는 비용은 매우 낮으며, 데이터베이스에서 수행되는 대부분의 작업은 SQLite 명령어에 의해 수행됩니다. 대부분의 요구 사항은 기본 문법에 익숙해 질 수 있습니다. 다음은 SQLite의 기본 문법입니다.

기본 문법

SQLite의 문법은 대문자 민감하지 않지만, GLOB와 glob와 같은 몇몇 명령어들은 대문자 민감합니다. 이 명령어들은 다른 의미를 가지고 있습니다. SQLite 명령어는 SELECT, INSERT, UPDATE, DELETE, ALTER, DROP 등과 같은 어떤 키워드로도 시작될 수 있습니다. 이는 각각 데이터 추출, 데이터 삽입, 데이터 업데이트, 데이터 삭제, 데이터베이스 수정 및 데이터 테이블 삭제 등을 의미합니다. 모든 명령어는 반점으로 끝납니다. 다음은 간단한 데이터베이스의 생성, 추가, 삭제, 수정 및 질의와 같은 작업입니다.

function main() {
    // create: if the table of "users" do not exist, create one; "id" is integer and increases automatically; "name" is in form of text and not null 
    Log(DBExec('CREATE TABLE IF NOT EXISTS "users" (id INTEGER PRIMARY KEY AUTOINCREMENT, name text not NULL);'));
    
    // add: 
    Log(DBExec("INSERT INTO users(name) values('A')"));
    Log(DBExec("INSERT INTO users(name) values('B')"));
    
    // delete: 
    Log(DBExec("DELETE FROM users WHERE id=1;"));
    
    // modify:
    Log(DBExec("UPDATE users SET name='C' WHERE id=2"));
    
    // query:
    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의 기본 문법을 알고 나면, 철이 뜨거울 때 타격을 가하자. FMZ Quant 양적 내장 데이터베이스를 사용하여 Tick 데이터를 수집하고 사용하는 인스턴스를 만들 수 있습니다.

단계 1: 도커 업데이트먼저, 당신이 docker의 최신 버전을 사용하고 있는지 확인합니다. 당신이 다운로드 하 고 전에 docker를 사용 한 경우, 당신은 먼저 삭제 하 고 다운로드 하 고 페이지에 다시 배포 해야 합니다 (https://www.fmz.com/m/add-node).

2단계: 전략을 수립하라

function main() {
    // set contract 
    _C(exchange.SetContractType, 'swap');
    
    // create the data table 
    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);'
    ));
    
    // obtain 10 tick data 
    while (true) {
        let tick = exchange.GetTicker();
        // add data in the tick table 
        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})`);
        // query all data
        let allDate = DBExec('select * from tick');
        if (allDate.values.length > 10) {
            break;
        }
        Sleep(1000);
    }
    
    // query all data 
    Log(DBExec('select * from tick'));
    
    // query the first data 
    Log(DBExec('select * from tick limit 1'));
    
    // query the first two data 
    Log(DBExec('select * from tick limit 0,2'));
    
    // delete the first data 
    Log(DBExec('DELETE FROM tick WHERE id=1;'));
    
    // modify the second data 
    Log(DBExec('UPDATE tick SET High=10000 WHERE id=2'));
    
    // query all data 
    let allDate = DBExec('select * from tick')
    Log(allDate);
}

단계 3: 전략 실행예를 들어 윈도우 를 들 수 있다. 전략을 실행 한 후, 닷커 디렉토리의 사전 \logs\storage에서 봇 ID가 있는 폴더가 생성 될 것이다. 폴더를 열면 후자로 .db3가 있는 파일이 나타난다. 이 파일은 FMZ Quant 내장 데이터베이스의 파일이다. 다음 그림에서 보이는 것처럼:img

위 코드는 먼저 tick이라는 데이터 테이블을 생성하고, 그 다음 테이블에 틱 데이터 필드를 추가하고, 그 다음 루프에 있는 플랫폼에서 틱 데이터를 받아, 이 데이터를 tick 데이터 테이블에 삽입하고, 동시에 데이터 테이블의 데이터 양이 10을 초과한다고 판단되면 루프에서 뛰어나갈 것입니다. 마지막으로, SQLite 명령어 5개를 사용하여 데이터 테이블의 데이터를 쿼리하고 삭제하고 수정합니다. 그리고 다음 그림에서 보이는 것처럼 로그에 출력합니다:img

단계 4: 상태 표시줄을 생성합니다마지막으로, 우리는 더 직관적으로 데이터를 표시하기 위해 FMZ 퀀트 데이터베이스에서 데이터를 획득하여 전략의 상태 표시줄을 만들기 위해 몇 가지 코드를 추가합니다. 새로운 코드는 다음과 같습니다:

    // create a status bar 
    let table = {
        type: 'table',
        title: 'Binance Tick data',
        cols: allDate.columns,
        rows: allDate.values
    }
    LogStatus('`' + JSON.stringify(table) + '`');

위의 코드는 데이터베이스의 데이터에서 Binance Tick Data 테이블을 생성합니다. 데이터베이스의 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;'));
    // set contract 
    _C(exchange.SetContractType, 'swap');

    // establish the data table 
    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);'
    ));

    // obtain 10 tick data 
    while (true) {
        let tick = exchange.GetTicker();
        // add data in the tick table
        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})`);
        // query all data 
        let allDate = DBExec('select * from tick');
        if (allDate.values.length > 10) {
            break;
        }
        Sleep(1000);
    }

    // query all data 
    Log(DBExec('select * from tick'));

    // query the first data 
    Log(DBExec('select * from tick limit 1'));

    // query the first two data 
    Log(DBExec('select * from tick limit 0,2'));

    // delet the first data 
    Log(DBExec('DELETE FROM tick WHERE id=1;'));

    // modify the second data
    Log(DBExec('UPDATE tick SET High=10000 WHERE id=2'));

    // query all data 
    let allDate = DBExec('select * from tick')
    Log(allDate);

    // create the status bar 
    let table = {
        type: 'table',
        title: 'Binance Tick data',
        cols: allDate.columns,
        rows: allDate.values
    }
    LogStatus('`' + JSON.stringify(table) + '`');
}

링크를 클릭하세요:https://www.fmz.com/strategy/265906, 그리고 당신은 전체 소스 코드를 복사할 수 있습니다.

메모리 데이터베이스

조작된 데이터가 영구적으로 디스크에 저장되지 않으려면, 당신은 추가 할 수 있습니다:SQL 명령어 앞에 있는 기호가 메모리 내 데이터베이스에서 동작하도록 하고, 보트가 다시 시작되면 데이터가 재설정됩니다.

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

결론

데이터베이스는 대용량 데이터를 수송 할뿐만 아니라 많은 양적 거래 애호가들의 꿈을 수송 할 수 있습니다. 데이터베이스의 사용은 기사에서 언급 된 예제에만 한정되어 있지 않습니다. 더 많은 사용 방법을 위해 SQLite 튜토리얼과 나중에 FMZ Quant에 게시 될 일련의 기사를 참조 할 수 있습니다.


더 많은