FXボーグ | テクニカル実験室

テクニカル分析を使った自動売買プログラムの開発に挑戦!

スポンサーリンク

NinjaTrader8の開発環境にSQLiteを導入するには、

NinjaTrader8のバックテストを高速化する為にインジケーターの計算値をDBにキャッシュする構造にしてみました。

高負荷なインジケーターで且つパラメーターに変化がない場合は計算結果をキャッシュすることでバックテスト時の負荷を軽減できます。

データーベースはC#と相性の良いSQLiteを選んだのですが、結局、NinjaTrader8向けのインストーラーが分らず嵌ってしまいました。

【使用環境】

  • OS:Windows7 Professional 64bit
  • NinjaTrader8.0.7.1 64-bit(Standard)
  • NinjaTrader8の.Net Frameworkのバージョンは4.5

【SQLiteの入手先】

SQLiteのダウンロードページへ行くとインストーラの数に圧倒されますが、最終的にこちらの環境でうまくいったのは 「sqlite-netFx45-setup-bundle-x64-2012-1.0.105.2.exe」でした。

ダウンロードページ(https://system.data.sqlite.org/index.html/doc/trunk/www/downloads.wiki )

SQLiteのインストール

こちらのサイト(System.Data.SQLite でどれをインストールするべきか )を参考にしたのですが、以下にある「そうでなければbundle版を使用するべきでない。」というところだけで判断して、最初は非バンドル版をインストールしました。

GAC の登録前提とするのは推奨されない。GAC の登録がどうしても必要なら bundle版 にする必要があるが、そうでなければ bundle版 を使用するべきでない。

  • よくわからなければ、 アプリケーションのリンクに bundle版を選ぶな。 bundle版を選ぶべきなのはデザイナーを使うために開発機PCにセットアップ版をインストールするときだけ。

 こちらは駄目でビルド時に以下のエラーが発生しました。

System.BadImageFormatException はハンドルされませんでした。Message="間違ったフォーマットのプログラムを読み込もうとしました。(HRESULT からの例外: 0x8007000B)

結局、bundle版の方でうまく行き。もう一度、サイトを見なおしてみると・・・

【コメント】

バンドル版でGAC登録を行わないと、ADO.NET Entity Frameworkを使って、VS上でエンティティのビジュアル編集が出来ないです。配布方法は上記でOKですが、開発時は素直にバンドル版を(x86/x64両方とも)インストールした方が、面倒がありません。

【返信】

ちなみにそれが 「design-time components」が必要な場合 に当たると思います。
セットアップ版をいんすとーるすれば、GAC 登録されますよね。

 としっかり書かれてました。

DLLの配置

 ダウンロードした 「sqlite-netFx45-setup-bundle-x64-2012-1.0.105.2.exe」を実行するとデフォルトで「C:\Program Files\System.Data.SQLite\2012\bin」というフォルダにDLL群がインストールされます。

このなかの「System.Data.SQLite.Dll」をNinjaTrader8の標準的なDLLの配置先である「C:\Users\ユーザー名\Documents\NinjaTrader 8\bin\Custom」にコピーしたら配置は完了です。

参照の追加

NinjaTrader8を起動しスクリプトエディターを立ち上げて、エディター内から右クリック・メニューの「References...」を選択するとDLLの参照を追加するダイアログが表示されます。

f:id:fxborg:20170907005623p:plain

「add」ボタンから以下の2つのDLLを選択し追加します。

・C:\Users\ユーザー名\Documents\NinjaTrader 8\bin\Custom\System.Data.SQLite.dll
・C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.5\System.Data.dll

 プログラム内で以下の記述を行えば普通に使用できます。

using System.Data;
using System.Data.SQLite;

 カスタムクラスの追加

NinjaTraderでカスタムクラスを追加する際は適当なファイルを作成し、使用したいインジケーター等とネームスペースを合わせるだけで勝手にロードされます。

HFDCacheDB.cs というファイルに以下のコードを記述すると全てのインジケーターでこのクラスが使用できます。

#region Using declarations
using System;
using System.Data;
using System.Data.SQLite;
using System.Collections.Generic;
using System.Linq;
using System.Text;
#endregion

//This namespace holds Indicators in this folder and is required. Do not change it. 
namespace NinjaTrader.NinjaScript.Indicators
{
	public class HFDResult
	{
		public long id		{ get; set; }
		public long time	{ get; set; }
		public double close	{ get; set; }
		public double fd1	{ get; set; }
		public double fd2	{ get; set; }			
		public double corr1	{ get; set; }
		public double corr2	{ get; set; }
		//---
		public HFDResult()
		{
			id=0; time=0; close=0; fd1=0; corr1=0; fd2=0; corr2=0;
		}
		//---
		public HFDResult(long i,long t,double cl,double d1,double c1,double d2,double c2)
		{
			id=i; time=t; close=cl; fd1=d1; corr1=c1; fd2=d2; corr2=c2;
		}
	}

	public static class HFDCacheDB 
	{
		/**
		 * void connect()
		 */
		public static SQLiteConnection Connect(string fpath)
		{			
			return new SQLiteConnection(string.Format("Data Source={0};Version=3;", fpath));
		}

		/**
		 * void CreateTable()
		 */
		public static string CreateSQLString()
		{
			return	@"create table IF NOT EXISTS HfdResults
		              (
		                 id	   integer not null primary key,  
		                 time      integer not null,
		                 close     real not null,
		                 fd1       real not null,
		                 corr1     real not null,
		                 fd2       real not null,
		                 corr2     real not null,
		                 unique (time, close)
		              );";
		}		
	}
}

最後に

今回はNinjaTrader8へSQLiteの導入する方法について書きました。NinjaTrader8でバックテストする人限定の内容なのですが、備忘録として残しておこうと思います。

最近は特異スペクトル解析(SSA)などに関心があるのですが、これらもバックテスト時に計算負荷が掛かることが予想されるので今回のキャッシュが使えそうです。