過去のイザナミ愛用者のブログを読み漁ると、2015年頃までは独自ストラテジー・開発ヒントを公開されている方が多かったように感じます。
ですが、次のようなバッシングを受けて、多くの方(hamhamseven氏など)が自粛されたという経緯が読み取れます。
- 手法の優位性が減るから止めてくれ!
- そもそも、お前の販売するストラテジー買ったけど、儲らないぞ!
- 秘密をそんなにバラすんじゃない!
要するに、最近儲かっていなくて、ルールがカーブフィッティングではないとしたら、残るのはトレーダーズ効果しかない、こういう判断プロセスが生まれてます。
うーん、個人的にはもっと知りたかったのでシステムトレードを始めるのが遅すぎたか・・・・・。
未だに、実践で使いたいストラテジーを発見していませんが、本命予定だったストラテジーが不具合だと分かる一週間は実装済の自動売買スクリプトを動作させていました。
その際に発生した問題を回避してみました。
そもそも、どうやって自動売買化しているの?
なぜ多くのシストレツールは自動売買機能をサポートしていないのか不思議で仕方ありません。
Protraで自動売買を実現するにはWindowsのGUIのコントロールが必要となります。
この間はPCは一切を触ることができません
さらに、何らかのトラブルに対するリカバリにも非常に弱いです。
そもそも、Windowsのパソコンでしか動かないので、ラズパイなどで安価な自動化・・・が難しいです。
問題は沢山ありますが、まずは、
- 「バックテストが完了したか?」の判断がリアルタイムに分かるようにして待ち時間を撲滅する
- バックテスト実施時にPCを操作できるようにする
という対応をしてみます。
バックテスト終了時間を推測してタイムアウトさせる。という方法がありますが、一般的には想定時間より長く時間を設定するので待ち時間が無駄です。
また、前回の私の実装は「あるキーワードが表示されたら、次の処理に進む」でしたが、実践で正しく動かないし、PC操作ができないのは同じです。
夢のような対応に見えますが、やっていることは簡単です。
バックテスト完了は「PtSim.exe」自身が一番知っているので、実装本体を書き換えるだけです。
・・・、まあ、それがハードルが高いのですが。調べました。
バックテスト完了後に処理結果を自動的にテキストに保存する
MainForm.csの実装を次のように書き換えました。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
--- MainForm.cs 2019-08-19 09:17:51.160984700 +0900 +++ MainForm.cs 2019-08-19 09:19:13.478610700 +0900 @@ -25,6 +25,8 @@ using System.Drawing; using System.Globalization; using System.Windows.Forms; +using System.IO; +using System.Text; using Protra.Lib; using Protra.Lib.Config; using Protra.Lib.Data; @@ -282,6 +284,8 @@ { EndInvoke(_asyncResult); // 最後のBeginInvokeの後始末をする。 _asyncResult = null; + // ファイルに書き出しをする + File.WriteAllText(@".\data\log\lasttrading.txt", textBoxExecute.Text); } Cursor = Cursors.Arrow; buttonExecute.Text = "実行"; @@ -397,4 +401,4 @@ Clipboard.SetDataObject(string.Concat(rows)); } } -} \ No newline at end of file +} |
保存場所は「(Protraフォルダ)/data/log」の下になります。
パスは自由に書き換えても良いですし、Configから変更可能にしてもらっても良いかと思います。
実装ではファイルの上書きをしていますが、タイムスタンプ付けてバックログを残しても良いかと思います。
【想定している使い方】
1 2 3 4 5 6 7 8 9 10 |
PtSim.exeを起動する() バックテストを実施する() While (true): if(バックテスト開始した時間より新しいタイムスタンプのテキストファイルが出力されている): PtSim.exeを終了させる() break wait (1分) テキストをパースして明日買う銘柄があれば売買処理() |
テキストを開くと次のようなファイルが保存されています。
1 2 3 4 5 6 7 |
...(省略) 9107 川崎汽船 19/03/15 1262円 700株 買 9107 川崎汽船 19/04/15 1446円 700株 売 9503 関西電力 19/04/26 1345円 700株 買 9984 ソフトバンクグループ 18/12/26 3473円 200株 買 9984 ソフトバンクグループ 19/01/08 3886円 200株 売 正常に終了しました。 |
あとは前述通りにテキストをパースしたり自由にやってみてください。
【2019.9.16追記】タイムスタンプ、ストラテジー名を追記する
GitHubに公開済でしたが、記事にし忘れていました。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 |
--- MainForm2.cs 2019-09-16 05:16:47.620936500 +0900 +++ MainForm.cs 2019-09-16 04:23:08.489937300 +0900 @@ -25,6 +25,8 @@ using System.Drawing; using System.Globalization; using System.Windows.Forms; +using System.IO; +using System.Text; using Protra.Lib; using Protra.Lib.Config; using Protra.Lib.Data; @@ -39,6 +41,8 @@ /// public partial class MainForm : Form { + private string _name; + /// /// アプリケーションのメインエントリポイント /// @@ -247,6 +251,7 @@ { var worker = (BackgroundWorker)sender; var args = (Object[])e.Argument; + _name = (string)args[0]; var executor = new SystemExecutor((string)args[0], (BrandList)args[1], (TimeFrame)args[2]); executor.Execute(worker, WrapInvoke(textBoxExecute.AppendText)); if (worker.CancellationPending) @@ -283,6 +288,13 @@ EndInvoke(_asyncResult); // 最後のBeginInvokeの後始末をする。 _asyncResult = null; } + { + // ファイルに書き出しをする + File.WriteAllText(@".\data\log\lasttrading.txt", textBoxExecute.Text); + DateTime dt = DateTime.Now; + String filePath = @".\data\log\trading_" + _name + "_" + dt.ToString("yyyyMMddHHmmss") + ".txt"; + File.WriteAllText(filePath, textBoxExecute.Text); + } Cursor = Cursors.Arrow; buttonExecute.Text = "実行"; progressBarExecute.Value = 0; @@ -314,6 +326,7 @@ { var worker = (BackgroundWorker)sender; var args = (Object[])e.Argument; + _name = (string)args[0]; var performance = new Performance((string)args[0], (BrandList)args[1], (TimeFrame)args[2]); var profits = performance.Calculate(worker, WrapInvoke(richTextBoxPerformance.AppendText)); if (worker.CancellationPending) @@ -397,4 +410,4 @@ Clipboard.SetDataObject(string.Concat(rows)); } } -} \ No newline at end of file +} |
一層、バックテスト終わったらアプリを落としてしまえ!
もっと乱暴な対応だと、バックテストしたらアプリを自動的に落としてしまう方法もあります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
--- MainForm.cs 2019-08-19 09:17:51.160984700 +0900 +++ MainForm.cs 2019-08-19 09:19:13.478610700 +0900 @@ -25,6 +25,8 @@ using System.Drawing; using System.Globalization; using System.Windows.Forms; +using System.IO; +using System.Text; using Protra.Lib; using Protra.Lib.Config; using Protra.Lib.Data; @@ -282,6 +284,8 @@ { EndInvoke(_asyncResult); // 最後のBeginInvokeの後始末をする。 _asyncResult = null; + // ファイルに書き出しをする + File.WriteAllText(@".\data\log\lasttrading.txt", textBoxExecute.Text); + Application.Exit(); } Cursor = Cursors.Arrow; buttonExecute.Text = "実行"; @@ -397,4 +401,4 @@ Clipboard.SetDataObject(string.Concat(rows)); } } -} \ No newline at end of file +} |
落としたくない場合もあると思うので、GUIにオプションを設けた方がよいかもしれません。
個人的には、これでも良いね。