プログラミングでアイデアを具現化したい

あらゆるものを具現化するためにプログラミングを始めました。主にC# → 仮説アルファを妄想するのが日課。 アルファを見つけるのは感性と統計力。アルファを取りに行く手段はプログラミング。なんでもいいけどC#が好き。

MT4オフラインチャートの作り方メモ

久々のエントリーです。
今更誰にも需要がなさそうなタイトルですが、作業用メモということで。

手順①
ツール→オプション→プロキシサーバーを有効にチェック
プロキシ設定からサーバーに「offline」を入力してOK。
※通信できなければなんでもいい。
MT4再起動

手順②
以下SQLでエクスポート。(ccyPair、dateTime は都度変更)

SELECT [dateTime],[o_b],[h_b],[l_b],[c_b],10 as vol
  FROM [MarketMonitor].[dbo].[ohlc]
  where [dateTime] between '2017-01-01 07:00:00.000' and '2018-09-01 06:59:00.000'
  and [ccyPair]='USDJPY'
  order by [dateTime]

f:id:tos5511:20180915050111p:plain

※4本値を持っている前提。自分は月1で某社の1分足をSQLServerにぶっこんでます。
おまけでぶっこみコード

static void Main(string[] args) {
    try {
        logger.Info("ohlcをDBに取り込み開始します。");
        string download_folder = ConfigurationManager.AppSettings["download_folder"].ToString();
        string unzip_folder = ConfigurationManager.AppSettings["unzip_folder"].ToString();
        ClearFolder(unzip_folder);
        string[] zipFiles = Directory.GetFiles(download_folder);

        //全てzpiを解凍する
        Console.WriteLine("全てzpiを解凍します。");
        foreach (var zipFile in zipFiles) {
            Unzip(zipFile, unzip_folder);
        }

        //C:\Work以下に*.*のファイルを取得する(サブフォルダすべてが検索対象)
        Console.WriteLine("全てファイルを取得します。");
        string[] strFiles = System.IO.Directory.GetFiles(
            unzip_folder, "*.*", System.IO.SearchOption.AllDirectories);

        var text = string.Format("取得したファイル数は{0}個", strFiles.Length);
        Console.WriteLine(text);

        int count = 0;
        foreach (var file in strFiles) {
            text = string.Format("{0}/{1}", count, strFiles.Length);
            Console.WriteLine(text);

            if (file.Contains("EX")) continue;
            var ccyPair = file.Substring(file.Length - 19,6);

            if (File.Exists(file)) {
                using (var reader = new StreamReader(file, Encoding.GetEncoding("shift_jis"))) {
                    while (!reader.EndOfStream) {
                        var line = reader.ReadLine().Split(',');
                        DateTime dt;
                        if(DateTime.TryParse(line[0], out dt)){
                            OHLC ohcl = new OHLC() {
                                Datetime = dt,
                                CcyPair = ccyPair,
                                o_b = decimal.Parse(line[1]),
                                h_b = decimal.Parse(line[2]),
                                l_b = decimal.Parse(line[3]),
                                c_b = decimal.Parse(line[4]),
                                o_a = decimal.Parse(line[5]),
                                h_a = decimal.Parse(line[6]),
                                l_a = decimal.Parse(line[7]),
                                c_a = decimal.Parse(line[8]),
                            };
                            DBConnection.Provider.InsertOHLC(ohcl);
                        }
                        else {
                            continue;
                        }
                    }
                }
            }
            count++;
        }

        Console.WriteLine("DB取込完了。");
        logger.Info("DB取込完了。");

        Console.WriteLine("作業フォルダをクリアします。");
        ClearFolder(download_folder);
        ClearFolder(unzip_folder);
        Console.ReadKey();
    }
    catch(Exception ex) {
        logger.Error(ex);
    }
}

public static void ClearFolder(string clearPath) {
    DirectoryInfo target = new DirectoryInfo(clearPath);
    //ファイル消す
    foreach (FileInfo file in target.GetFiles()) {
        file.Delete();
    }
    //フォルダも消す
    foreach (DirectoryInfo dir in target.GetDirectories()) {
        dir.Delete(true);
    }
}

public static void Unzip(string file, string unzip_folder) {
    //ZIP書庫を展開する
    System.IO.Compression.ZipFile.ExtractToDirectory(file, unzip_folder, Encoding.GetEncoding("shift_jis"));
}

手順③
出力したcsvからヘッダーを削除(効率悪い?)
ツール→ヒストリーセンター→インポート
f:id:tos5511:20180915050152p:plain

ちゃんと618940レコードインポートされてます。
f:id:tos5511:20180915050210p:plain

手順④
MT4再起動
ファイル→オフラインチャート→CCYPAIR,1Mを選択して開く
f:id:tos5511:20180915050350p:plain

チャートを開いたら、後はスクリプトのPeriodConverterで5,15,30,60,240,1440と
実行すれば1分足から日足までのオフラインチャートが作成されます。
f:id:tos5511:20180915051050p:plain

完成。

中ボスになった雇用統計

最近、雇用統計時のSNSタイムラインは
昔ほど盛り上がらないようになった気がしている。

値動きがしょぼいもんね。そりゃ祭りにならない。

直近の発表は雇用がよくても平均時給が悪かったりと、
結果に矛盾があったりしてなかなか値幅がないのが続いていた。


全ての方向が一致すれば昔のNFPに戻るよね・・
f:id:tos5511:20180602150543p:plain



f:id:tos5511:20180602150616p:plain

select Economic.dateTime
      ,Economic.name
	,Economic.last
	,Economic.estimate
	,Economic.result
	,ohlc.ccyPair
	,(ohlc.o_a-ohlc.o_b)*100 SP
	,(ohlc.c_b-ohlc.o_b)*100 '値幅(c-o)'
	,(ohlc.h_b-ohlc.l_b)*100 '値幅(h-l)'
  FROM [MarketMonitor].[dbo].[Economic]
left join[MarketMonitor].[dbo].[ohlc]
on Economic.dateTime = ohlc.dateTime
where Economic.name in ('非農業部門雇用者数変化 [前月比]','失業率','平均時給 [前月比]')
and Economic.cur='USD' 
order by Economic.dateTime,Economic.name


久々に矛盾なく全てが予想を上回ったのに・・過去半年と同じレベルじゃんw

なんだか寂しいと感じるのは私だけでしょうか

前処理大全


前処理大全[データ分析のためのSQL/R/Python実践テクニック]

なにやら面白そうな本を見つけたのでポチってしまった。
そういえば、最近データを取得して貯蔵する仕組みだけ構築して
データを活かしきれていなかったな。本書で何か気付きを得られたらうれしい。