カテゴリー: ソフトウェア技術

主にソフトウェア寄りのネタ

  • MetaTrader4の受信TickデータをMySQLに逐次記録するスクリプト作った

    完全な趣味ネタですが、為替をコンピュータで分析処理させて売買する投資システムを開発して遊んでいます。
    チャートソフトウェアとして秀逸なMetaTrader4(MT4)を主に利用して、EA(自動売買ロジック)を開発するのですが、やはりその環境だけでは分析処理でできることに限界があり。

    そこで、MT4の外部でも為替相場の分析するシステムを組んで連携できるようにするために、まずはティックデータをDB化する仕組みを構築しました。
    分足・時間足や日足でも良かったのですが、Tickデータがあればそれたの足データは生成できるかなあと思ったので、原データのTickのみを記録対象としています。

    以下のソースをyanoshin_tick_export_MySQL.mq4 とファイル名を付けて、experts/indicatorフォルダにコピーします。
    その他に、MySQLにC言語から接続するためにlibmysql.dllが必要です。Googleなどでググって、最新版を入手してexperts/librariesフォルダにコピーしておいてください。

    お手元に利用できるMySQLサーバを用意してください。データベースを作成し権限のあるユーザを用意したら、以下のソース中のiniti()関数内にあるDB設定の箇所を書き換えてください。

    なお、テーブルは作成しなくても、存在しなければ自動的に作成する仕組みにしています。テーブルは通貨ペア毎に作成する仕様で、Ticks_(通貨ペア英字6桁) となります。

    コンパイルしたら、MT4の画面上のナビゲーターからindicator>yanoshin_tick_export_MySQLを選択し、チャート画面に適用すると、処理が始まりMySQLにデータをインポートします。 なお外部のlibmysql.dllからMySQLへ接続する処理があるため、インジゲーターを適用する際、「Allow DLL imports」にチェックをいれて許可してあげてください。

    *ひとまず解説はここまでですが、リクエストがあれば詳細あとで書きます。ほとんどはソースを読んでいただけると、何がやりたいかなどは読み取れると思いますが。

    #property copyright “copyright Yanoshin”
    #property link “https://yanoshin.jp”

    //indicator setting
    #property indicator_chart_window

    //MySQL setting
    #import “libmysql.dll”
    int mysql_init(int db);
    int mysql_errno(int TMYSQL);
    int mysql_real_connect( int TMYSQL,string host,string user,string password, string DB,int port,int socket,int clientflag);
    int mysql_real_query(int TMSQL,string query,int length);
    void mysql_close(int TMSQL);
    int mysql;

    //SQL Log file setting
    int handle;

    //variables setting
    datetime now_dt;
    string now_str;
    string symbol;
    string table_name;
    string chkDate;
    string chkDate2;

    //Initiation
    int init()? {
    symbol = Symbol();

    //make SQL Logfile at first
    //SQL logfile is supporsed to be used as a backup
    chkDate = TimeDay(now_dt);
    handle = makeNewFile();

    //—- MySQL setup
    mysql=mysql_init(mysql);
    if (mysql!=0) Print(“MySQL allocated”);//Log

    string host=”host.of.mysql.db”;
    string user=”_username_”;
    string password=”_password_”;
    string DB=”_dbname_”;
    int clientflag=0;
    int port=3306;
    string socket=””;
    int res=mysql_real_connect(mysql,host,user,password,DB,port,socket,clientflag);
    int err=GetLastError();
    if (res==mysql) Print(“MySQL connected”);
    else {
    Print(“error=”,mysql,” “,mysql_errno(mysql),” “);
    return(1);
    }

    //Check the existance of DB table.
    //if not, build a table named with Symbol()
    table_name = “Ticks_”+symbol;
    string query=””;
    query = query + “CREATE TABLE IF NOT EXISTS “+table_name+” (“;
    query = query + “id bigint unsigned NOT NULL auto_increment,”;
    query = query + “symbol varchar(10) NOT NULL,”;
    query = query + “datetime datetime NOT NULL,”;
    query = query + “utime int unsigned NOT NULL,”;
    query = query + “close float NOT NULL,”;
    query = query + “ask float NOT NULL,”;
    query = query + “bid float NOT NULL,”;
    query = query + “volume_in_M1 int unsigned NOT NULL,”;
    query = query + “broker char(50) NOT NULL,”;
    query = query + “src_terminal varchar(50) NOT NULL,”;
    query = query + “PRIMARY KEY? (id)”;
    query = query + “) ENGINE=MyISAM? DEFAULT CHARSET=utf8;”;
    int length=0;
    length=StringLen(query);
    mysql_real_query(mysql,query,length);
    int myerr=mysql_errno(mysql);
    if (myerr>0)Print(“error=”,myerr);

    return(0);
    }

    //Main procedure
    int start() {
    //LogFile chake
    chkDate2 = TimeDay(now_dt);
    if(chkDate != chkDate2)? {
    //if datetime changed since privious, make a new logfile
    closeFile(handle);
    handle = makeNewFile();
    chkDate = chkDate2;
    }

    //get a datetime data.
    now_dt = TimeCurrent();
    now_str = TimeToStr(now_dt, TIME_DATE|TIME_SECONDS);

    //
    int limit = Bars – IndicatorCounted();
    //Print(“Sumbol=”, symbol, “NOW = “,now_str ,”Datetime = “, now_dt, ” Close[0]=”,Close[0], ” Bid=”,Bid, ” Ask=”,Ask);//DEBUG

    if(limit == 1) {
    //—- SQL query setup
    string query=””;
    query = query + “insert into “+table_name+” (“;
    query = query + “symbol, datetime, utime, close, ask, bid, volume_in_M1, broker, src_terminal”;
    query = query + “) values(“;
    query = query + “\””+Symbol()+”\”,”;
    query = query + “\””+TimeToStr(CurTime(),TIME_DATE|TIME_SECONDS)+”\”,”;
    query = query + now_dt+”,”;
    query = query + NormalizeDouble(Close[0],6)+”,”;
    query = query + Ask+”,”;
    query = query + Bid+”,”;
    query = query + iVolume(Symbol(),PERIOD_M1,0)+”,”;
    query = query + “\”MetaTrader4\”,”;
    query = query + “\”VM-Win-Trade\””;
    query = query + “);”;
    //Print(query);

    //output SQL backup into Logfile
    FileSeek(handle, 0, SEEK_END);
    FileWrite(handle, query);

    //—- MySQL writing
    int length=0;
    length=StringLen(query);
    mysql_real_query(mysql,query,length);
    int myerr=mysql_errno(mysql);
    if (myerr>0)Print(“error=”,myerr);

    }
    return (0);

    }

    int deinit()? {
    closeFile(handle);
    }

    int makeNewFile() {
    now_dt = TimeCurrent();
    now_str = TimeToStr(now_dt, TIME_DATE|TIME_SECONDS);

    int handle;

    string dirpath = “MySQL_log\\” + “”+TimeYear(now_dt)+”-“+TimeMonth(now_dt)+”-“+TimeDay(now_dt);
    string filename = dirpath+ “\\” + symbol + “_Tick.sql”;
    handle = FileOpen(filename, FILE_CSV | FILE_READ | FILE_WRITE,? ‘,’);

    string msg = “– ——-Session opened[“+now_str+”]——-“;
    FileSeek(handle, 0, SEEK_END);
    FileWrite(handle, msg);
    return(handle);

    }

    int closeFile(int handle){
    now_dt = TimeCurrent();
    now_str = TimeToStr(now_dt, TIME_DATE|TIME_SECONDS);
    string msg = “– ——-Session closed[“+now_str+”]——-“;
    FileSeek(handle, 0, SEEK_END);
    FileWrite(handle, msg);
    FileClose(handle);
    }

  • CUDA開発環境を構築する~[Windows XP編]

    …基本的には、先に実施したMax OSX編、Linux編と同じ。と言いたいところだけど、Windows版はもっとシンプルに、ただインストールしただけで終了…

    本当はMicrosoftのVisualStudio2008(2010)もインストールする必要があるのだけど、開発作業はMacやUbuntuで行うことになると思うので割愛。

  • CUDA開発環境を構築する~[Mac OSX編]

    GPUを利用した演算処理に興味を持ったので、NVIDIAのCUDAを勉強してみた。

    CUDAとは要するに、CPUではなく、NVIDIA製のグラフィックボード(のほとんど)に搭載されているGPUチップとメモリ空間を利用して計算させるプログラムを開発・動作できる環境のことです。例えば行列計算を処理させる場合、CPUだとチクチク計算させて処理していたのを、GPUならば行列をまとめてドカッと剛腕で処理できる、そんなイメージ。(でいいのか?)
    *あくまで計算処理の種類によって処理速度が速くなるだけであって、CPUとGPUの計算速度自体を比べてGPUが圧倒という意味ではありませんので。

    ひとまず、手元の環境でCUDAを使うために必要な作業メモを記録。今回の目標は「CUDA環境と必要なソフトウェアのインストール」と「SDKに含まれるサンプルをビルド&動作させる」の二点。 動作環境としてはMac Mini(2009年春モデル)と、それに内蔵されているNVIDIA GeForce 9400Mです。

    【準備】
    NVIDIAのサイトから必要な、ドライバ、ツールキット、SDKを入手する。
    http://www.nvidia.co.jp/object/cuda_get_jp.html
    (MacOSXの欄にある以下を取得。)

    • Developer Drivers for MacOS
    • CUDA Toolkit
    • GPU Computing SDK code samples(SDK)

    【インストール】
    *必ずToolkit、Driver、SDKの順にインストールすること!(なぜか?)
    最初、適当にDriverからインストールしていたのだけど、どうやら先に進むにつれておかしい。色々調べた挙句、以下の方のエントリーを参考にインストールしたところ、ひとまずOKの結果に。
    参考サイト:Mac mini OSX 10.6 snow leopard に CUDA を入れようとして make で サンプル生成するのに苦労した
    http://d.hatena.ne.jp/masibonge/20091016/1255625869

    【メモ】

    ・ターミナル起動時に設定してくれるよう、〜/.bash_profile に以下を記述

    #CUDA
    export PATH=/usr/local/cuda/bin:$PATH
    export DYLD_LIBRARY_PATH=/usr/local/cuda/lib
    export LD_LIBRARY_PATH=/usr/local/cuda/lib:$LD_LIBRARY_PATH
    export CPLUS_INCLUDE_PATH=”/Developer/GPU Computing/C/common/inc”:$CPLUS_INCLUDE_PATH
    export C_INCLUDE_PATH=”/Developer/GPU Computing/C/common/inc”:$C_INCLUDE_PATH
    export LIBRARY_PATH=”/Developer/GPU Computing/C/common/lib”:”/Developer/GPU Computing/C/lib”:/usr/local/cuda/lib:$LIBRARY_PATH

    *上記のサイト(http://d.hatena.ne.jp/masibonge/20091016/1255625869)で紹介されているスクリプトだと、自分の環境ではビルド時にエラーが止まらず、修正

    ・最初の動作チェック。nvccを起動してバージョンを確認。

    $ nvcc -V
    nvcc: NVIDIA (R) Cuda compiler driver
    Copyright (c) 2005-2010 NVIDIA Corporation
    Built on Thu_Jun_17_16:11:55_PDT_2010
    Cuda compilation tools, release 3.1, V0.2.1221
    macminibressonlan:~ yanoshin$

    ・サンプルソースをビルドする
    $ cd /Developer/GPU\ Computing/C
    $ make

    *libファイル(*.a)が問題でビルドが止まる問題が発生。ranlibを実行して、makeを再実行すると問題解消した。
    $ ranlib ./lib/*.a
    $ ranlib ../shared/lib/*.a

    (ただし、particlesやsmokeParticlesはビルドエラーが発生してしまうため、C/error_srcフォルダを作成して移動した状態で、上記makeを実施)

    ・サンプルソースを実行してみる。
    oceanFFTを試しに実行してみた。
    $ cd /Developer/GPU Computing/C/bin/darwin/release
    $ ./oceanFFT

    CUDA FFT Ocean Simulation
    実際に動作させると、波をシミュレートした映像がユラユラ揺れているのが見えます。

  • CUDA開発環境を構築する~[Ubuntu編]

    Mac OSX(Snow Leopard)に続き、Ubuntu10.04LTSにもCUDA環境をインストールしました。その作業メモ。基本的なものはMac OSX編と同様。

    使用した機材はASUS のネットブック機 N10J、搭載GPUはNVIDIAのG105M。

    【準備】

    【インストール】

    ・SDKに含まれるサンプルソースをビルドしようとするといくつかエラー発生。10.04LTSにしたせいか…?安定した9.10とかにしておけばよかったのかなあ。

    とりあえず、なんとか自力で修正してビルド&動作確認OKになるまでに。

    (こんなエラーが発生、その1)
    make -C src/alignedTypes/
    ld: in ../../lib/libcutil_i386.a, archive has no table of contents
    collect2: ld returned 1 exit status
    make[1]: *** [../../bin/darwin/release/alignedTypes] Error 1
    make: *** [src/alignedTypes/Makefile.ph_build] Error 2
    macminibressonlan:C yanoshin$

    SDKに含まれている指定のlibファイルをrand
    $randev ./lib/libcutil_i386.a

    (こんなエラーが発生、その2)
    いくつかldコマンドにライブラリが足りないぞー、と怒られたので、apt-getで必要ライブラリ(もしくはライブラリを含むパッケージ)をインストールして、解決。

    (エラーメッセージの例)
    /usr/bin/ld: cannot find -lGLU
    (対応した作業)
    %sudo apt-get install libglu-dev
    %sudo apt-get install libXi-dev
    %sudo apt-get install libXimu-dev
    %sudo apt-get install freeglut3-dev

    *ただし、libGLについてはapt-getではなく、シンボリックリンクの変更で対応。
    なぜかlibGL.soのリンク先がmesa/libGL.soになっていたので、libGL.so.1に差し替えた。
    lrwxrwxrwx 1 root root 10 2010-09-27 18:09 libGL.so -> mesa/libGL.so
    ↓変更
    lrwxrwxrwx 1 root root 10 2010-09-27 18:09 libGL.so -> libGL.so.1