WindowsでBitMEXプログラミング(GUI#2)
こんばんわ(*'ω'*) #2いきますよ ~
前提
みなさん、pythonスクリプトで自動売買BOTを運用していると思いますが、Windowsでは.pyを実行するpython.exeをOSのレジストリや環境変数でパスを通して.pyファイルをダブルクリックで実行、もしくは、バッチファイルでpython.exeをフルパス指定して実行のどちらかだと思います。
VisualStudioで「python開発」をインストールした場合、python.exeは以下の場所に配置されています。
C:\Program Files (x86)\Microsoft Visual Studio\Shared\Python36_64\python.exe
なので、sabachan.pyを実行するバッチファイルは以下になります。
"C:\Program Files (x86)\Microsoft Visual Studio\Shared\Python36_64\python.exe" sabachan.py
pause
例としてsabachan.pyの内容を以下としておきましょう。
import ccxt
import time
#BitMEXにアクセスする「物体」
bitmex = ccxt.bitmex({
'apiKey': 'BitMEX-APIの「ID」',
'secret': 'BitMEX-APIの「秘密」',
})
#テストネットを使います
bitmex.urls['api'] = bitmex.urls['test']
print('###プログラムを開始します###')
while True:
usd = bitmex.fetch_ticker('BTC/USD')['last']
jpy = bitmex.fetch_ticker('BTC/JPY')['last']
print('BTC最終価格は[{0}]ドル、[{1}]円。'.format(usd, jpy))
time.sleep(5)
以下の状態でバッチファイルをダブルクリックするとsabachan.pyが実行されます。(レジストリ・環境変数を汚さずに済みます。)
するとこのように、黒い画面に5秒間隔で永遠に動き続けます。
今回のGUIプログラミングでは、このバッチファイルの替わりとなるsabachan.exeを作ります。最終的に、この黒い画面とはおさらばします。
GUIプログラミング
それではまずプログラムの名前をsabachanに変更しましょう。以下の赤線部分をそれぞれ右クリックして[名前の変更]で変更できます。
下の.csの名前を変更するとき、メッセージが表示されますが[はい]です。
変更したら上の赤線部分を再度右クリック、[プロパティ]をクリックします。
出てきた画面の赤線部をsabachanに変更します。
そうそう、GUI画面のタイトルもsabachanに変えちゃいましょう。
さっき名前を変更したsabachan.csで右クリック、[デザイナーの表示]をクリックします。するとフォーム画面が出ると同時に、右下のプロパティ画面が以下のようになります。ここで赤線部をsabachanに変更します。
実行して以下の画面が出てくればOKです。
pythonの開始と停止
GUI画面に[開始]ボタンと[停止]ボタンを付け、それぞれクリックするとpythonの開始・停止ができるようにします。
とりあえず画面が無駄にでかいのでサイズを調節します。デザイナー画面で右下隅をマウスでつかんで調整できます。以下のように、プロパティで縦横の長さを数値で調整することもできます。
[button1]は端っこによけて、開始と停止にする2つのボタンを並べます。
「button2」を選択して、プロパティ画面で(Name)を[buttonStart]に変更します。
そのままプロパティ画面の下のほうで「Text」を[開始]に変更します。
同じ要領で、button3も[buttonEnd]、[停止]に変更します。
デザイナー画面で変更した[開始]ボタンをダブルクリックしてソースコードに移ります。([停止]ボタンもダブルクリックしちゃいましょう。)
「buttonStart_Click」と「buttonEnd_Click」ができてますね。
実装の前に、先ほどのsabachan.pyファイルをGUIアプリのいるところに配置します。下図のようにsabachanのところで右クリック、下のほうの[エクスプローラーでフォルダーを開く]をクリックします。
開いたフォルダーのさらに下、[bin]→[Debug]が目的の場所です。ここにこのようにsabachan.pyをコピーします。
それでは「buttonStart_Click」の実装です。(pythonではコメントは「#」でしたが、C#では「//」になります。)
private void buttonStart_Click(object sender, EventArgs e)
{
// 動かすプログラムはpython.exe、引数にsabachan.pyを指定します。
Process proc = new Process();
proc.StartInfo.FileName = "C:\\Program Files (x86)\\Microsoft Visual Studio\\Shared\\Python36_64\\python.exe";
proc.StartInfo.Arguments = "sabachan.py";
// pythonを実行します。
proc.Start();
// pythonの終了を待ちます。
proc.WaitForExit();
}
ソースコードの上のほう(10行目)に、以下を1行追加してください。
using System.Diagnostics;
Ctrl+F5で実行し、[開始]をクリックします。
動いたけど、こうじゃないよね。。ということでこれから最低限、2つの問題をクリアしなくてはいけません。
その1:マルチスレッド
実は、開始と停止のプログラムをちょろっと書いて終わりではないのです。上記の実行状態で、GUIアプリを触ってみてください。pythonに主導権を握られ、「固まった」あるいは「フリーズした」状態になっています。そこで出てくるのがマルチスレッドです。自分はメインスレッドで動き続け、pythonはサブスレッドで動かすのです。
その2:標準出力
黒い窓とはおさらばしたい!窓を出さない代わりに、GUIアプリのボタンの下の無駄なエリアに「テキストボックス」を配置し、そこにsabachan.pyが5秒間隔で書いている内容を書き込みます。この書き込み、「print」を使っていますよね。これ、「標準出力」って言います。sabachan.pyの標準出力をGUIアプリが「フック」し、自分のテキストボックスに書き込みます。
・・・大変申し訳ねぇ!ノー残業デーにダッシュで帰ってきて書き始めたはいいが、思ったより時間かかる。。
この2つの実装、#3で週末に公開します!