Protraを使ってシステムトレード完全自動化をするには、
- 「Protra.exe」・・・株価更新
- 「PtSim.exe」・・・・バックテスト実施
2つのアプリケーションの動作を自動化しなければならない。
一度、ProtraをCUI化できないか検討したが、私には敷居が高かった。
Protraはオープンソースのアプリです。
であれば、CUIコマンドで必要な処理をできるようにソースコード書き換えすれば良いじゃん?
と試みました。
が・・・断念。GUI依存度が高すぎました。
そのため「PyAutoGui」を使った自動化を試みたが、エラーも多い。
disられたしね。
RPA(Robotic Process Automation)的ツールは使いたくない。
年末に「アプリケーションの起動時に処理実行」する方法を教えてもらった。
今回は、この方法でProtraの起動・実行・終了の自動化を試みる。
C#ソースコード改変によるProtra完全自動化
期待は「Protra.exe」「PtSim.exe」が勝手に起動して、処理が終われば勝手に終了すること。次々と処理を自動的に進めて欲しい。
要するにコマンド起動のEXEファイル名を「Protra.cli.exe」「PtSim.cli.exe」とすると、次のようにコマンド連結して実行するだけにしたい。
1 |
$ Protra.cli.exe; PtSim.cli.exe; python sbictrl.py |
そして明日買う銘柄をファイルに保存し、そのファイルを読み込んで実際にSBI証券で発注を行う。
バックテスト結果をファイルに保存する方法は以前記載した。
また、SBI証券での発注方法はFeasibility Study(実現可能性)まで完了している。
- Feasibility Study(実現可能性調査)・・・・この結果次第ではプロジェクトのゴーサインがでない
- PoC(Proof of Concept:概念実証)・・・・実現可能性調査が成功すれば、ほとんど成約となるのに対し、こちらは無償でベンダーがやらされる場合も多い(PoC貧乏)
今回はProtraの処理自動化にフォーカスする。
Protra.exeの自動株価更新とアプリケーション終了
「エディタで開発してビルド環境にVC++を使う」という方法しか経験が無いので Visual Studio上からソースコードを追いかけて改変した経験が無かった。
教えてもらって やってみらメチャクチャ楽。
Windowsフォームの表示直後に初期化処理を行うには?
アプリケーションの起動後はまずLoadイベントとActivatedイベントが発生するが、その直後にShownイベントが発生する。
そしてそれ以降はShownイベントが発生することはない。順番にすると次のようになる。
- ①コンストラクタ
- ②Loadイベント:フォーム表示前
- ③Shownイベント:フォーム表示後
このShownイベントに処理を追加する場合、次のようにGUIクリックからコードを見つけて記載が可能とのこと。
1 2 3 |
private void MainForm_Shown(object sender, EventArgs e) { } |
で、起動時処理に追記したいのは「更新処理」だ。
同じくGUIをクリックすると、コードに飛ぶ。
1 2 3 4 |
private void priceUpdateToolStripButton_Click(object sender, EventArgs e) { priceUpdateToolStripMenuItem.PerformClick(); } |
ここの処理をそのまま「shown」に追加する。要するに次のようになる。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
--- protra-protra_trunk/trunk/Protra/MainForm.cs 2020-12-31 08:20:50.288199600 +0900 +++ protra-protra_trunk/trunk/Protra/MainForm.cs 2014-02-10 15:10:07.000000000 +0900 @@ -409,5 +409,10 @@ listBoxBrandList.SelectedIndex = brandIndex == listBoxBrandList.Items.Count ? brandIndex - 1 : brandIndex; GlobalEnv.BrandListConfig.Save(); } + + private void MainForm_Shown(object sender, EventArgs e) + { + priceUpdateToolStripMenuItem.PerformClick(); + } } } \ No newline at end of file |
1 2 3 4 5 6 7 8 9 10 |
--- ./Protra/MainForm.designer.cs 2014-01-20 14:30:57.000000000 +0900 +++ ./Protra/MainForm.designer.cs 2021-04-26 19:44:55.689645700 +0900 @@ -605,6 +605,7 @@ this.Text = "Protra"; this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.MainForm_FormClosing); this.Load += new System.EventHandler(this.MainForm_Load); + this.Shown += new System.EventHandler(this.MainForm_Shown); this.mainMenuStrip.ResumeLayout(false); this.mainMenuStrip.PerformLayout(); this.mainToolStrip.ResumeLayout(false); |
たったこれだけで起動時に自動的に株価の更新が行われる。
たったこれだけだけど知ると知らないでは雲泥の差だ。
アプリケーション(自分自身)を終了させる
今度は「更新が完了しました。」が表示されたら、アプリケーションを終了させる。
- ①メインフォームを閉じる(this.Close())
- ②Application.Exitメソッドを使用する
1 2 3 4 5 6 7 8 9 10 11 |
--- protra-protra_trunk/trunk/Protra/Dialogs/PriceUpdateDialog.cs 2020-12-30 08:29:37.756109200 +0900 +++ protra-protra_trunk/trunk/Protra/Dialogs/PriceUpdateDialog.cs 2016-09-06 21:21:04.000000000 +0900 @@ -107,6 +107,8 @@ else { labelInfo.Text = "更新が完了しました。"; + this.Close(); + Application.Exit(); } Cursor = Cursors.Arrow; buttonCancel.Enabled = true; |
合ってるのかな・・・冗長な気がするけど。
これでビルドして出来た実行ファイル(EXE)は、株価更新後に自動終了するので別名にして利用すること。
PtSim.exeの自動バックテスト開始とアプリケーション終了
同じようにして PtSim.exe も更新してみた。
・・・なんか冗長だし合ってるのかな・・・・。
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 |
--- protra-protra_trunk/trunk/PtSim/MainForm.cs 2014-02-10 15:10:07.000000000 +0900 +++ protra-protra_trunk/trunk/PtSim/MainForm.cs 2020-12-31 11:48:25.017611200 +0900 @@ -290,6 +302,7 @@ SetEnabled(EnableFlags.All); else SetEnabled(EnableFlags.DeleteLogAll | EnableFlags.EditBrandList); + Application.Exit(); } private void buttonPerformance_Click(object sender, EventArgs e) @@ -396,5 +410,29 @@ return; Clipboard.SetDataObject(string.Concat(rows)); } + + private void MainForm_Shown(object sender, EventArgs e) + { + if (backgroundWorkerExecute.IsBusy) + { + backgroundWorkerExecute.CancelAsync(); + Cursor = Cursors.WaitCursor; + buttonExecute.Enabled = false; + return; + } + var system = ptFileTreeView.SelectedFile; + var brandList = comboBoxBrandList.SelectedItem; + if (system == null || brandList == null) + return; + buttonExecute.Text = "中断"; + SetEnabled(EnableFlags.Execute); + textBoxExecute.Clear(); + backgroundWorkerExecute.RunWorkerAsync(new[] { system, brandList, TimeFrame }); + } + + private void ExitToolStripMenuItem_Click(object sender, EventArgs e) + { + + } } -} \ No newline at end of file |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
--- ./PtSim/MainForm.Designer.cs 2014-01-20 14:30:57.000000000 +0900 +++ ./PtSim/MainForm.Designer.cs 2021-04-27 11:22:00.712502800 +0900 @@ -168,6 +168,7 @@ this.ExitToolStripMenuItem.Name = "ExitToolStripMenuItem"; this.ExitToolStripMenuItem.Size = new System.Drawing.Size(254, 22); this.ExitToolStripMenuItem.Text = "終了(&X)"; + this.ExitToolStripMenuItem.Click += new System.EventHandler(this.ExitToolStripMenuItem_Click); // // brandListToolStripMenuItem // @@ -624,6 +625,7 @@ this.Text = "PtSim"; this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.MainForm_FormClosing); this.Load += new System.EventHandler(this.MainForm_Load); + this.Shown += new System.EventHandler(this.MainForm_Shown); this.menuStripMain.ResumeLayout(false); this.menuStripMain.PerformLayout(); this.contextMenuStripHistory.ResumeLayout(false); |
これでビルドして出来た実行ファイル(EXE)は、バックテスト後に自動終了するので別名にして利用すること。
まとめ
実際に実行してみると期待通りに動いているように見える。
これが本当に正しいのであれば、SBI証券での自動取引スクリプト作成しながら、
- 自動株価更新
- バックテスト
- 購入銘柄が存在→メール等でスマホに通知
を作ってみよう。
確実に一歩ずつ進んでいる感はある、自動化に対しては・・・。