見出し画像

自動売買システム日経225ミニ専用をC#で作る。Webhookサーバーを作成するの続き 

クライエントを作成する

クライアントを作成してサーバーのテストを行います。
chatGTPでC#プログラムを作成してみる」で作成した
TCPClientのソースを使って作成します。
Visual Studio 2022を使って実装します。

プロジェクトを作成します

1.ソリューション名 GTPClient
2.Windows Formのプロジェクト名 GTP.WinForm
3.TcpClientプロジェクト名 GTP.TCPClient
2つのプロジェクトを作成します。

Visual Studio 2022を開きプロジェクトを作成する


1.新しいプロジェクトの作成(N)選択⏎
2.Windows フォームアプリケーション(.NET Framewoek)を選択し次へ(N) ⏎
3.プロジェクト名に「GTP.WinForm」と入力
4.場所(L)にプロジェクト作成ディレクトリを指定
5.ソリュション名に「GTPClient」と入力
  プロジェクト名とソリュション名は違います。
4.フレームワークを選択し作成(C) ⏎
以上でプロジェクトは作成され1つのプロジェクトが作成されました。

クライアント用のプロジェクトを作成する

次に2つ目のプロジェクトの作成です。ソリュションエクスプローラーを選択し右クリックしサブウインドウの「追加」
新しいプロジェクトを選択する。「新しいプロジェクトを追加」でクラスライブラリー(.NET Framwork)を選択し「次へ」
プロジェクト名に「GTP.TCPClient」と入力し作成する。
これで2つのプロジェクトができました。

スタートアッププロジェクトと依存関係の設定

1.GTP.WinFormプロジェクト選択右クリック 「スタート 
  アッププロジェクト設定」
2・GTP.WinFormプロジェクト選択右クリック「追加」ー>「参照(R)」サブウインドウで「GTP.TCPClient」チェックボックスにチェックを入れる。以上

プログラムの作成

1.GTP.TCPClientプロジェクトのclass1.csの名前を 「Client.cs」に変更する。
2.「chatGTPでC#プログラムを作成してみる」で作成した
 TCPClientのソースをコピーし貼り付ける。クラス名を 
 ”Client”に変更する。
貼り付けると数か所がエラーになっています。これを修正します。
15、16行目 コメントアウトする
28行目 TcpClientModel ー> string>に変更
_logger.Info(),_logger.Error()をConsole.WriteLineに書き換え変更する
91,92行目をコメントアウトする
94行目 Invoke()の引数 Tcpdata を response 書き換え変更する。

Formの作成

Form1.csを開きツールボックスからフォーム画面にButtonとrichTextBoxを追加する。
Clientで受信した情報をrichTextBoxに表示するコードを作成するには
1.host名、port名を設定する
2.Clientのインスタンス作成
3.受信データイベントのメソッド作成
4.Clientのスタートメソッド作成
  別スレッドでClientを実行する。
5.受信した情報をrichTextBoxに表示するメソッド
 UIスレッドに切り替えてから表示する
以上の条件で作成したコードです。


public partial class Form1 : Form
    {
        Dispatcher _thisDispatcher;   //using System.Windows.Threading;を追加する

        private Client client = null;
        
        //接続先ホスト名
        private string host = "localhost";
        //接続先ポート
        private int port = 8000;

        public Form1()
        {
            //クライアントのインスタンス作成
            client = new Client();
            //データ受信イベントハンドラーに受信先メソッド設定
            client.DataReceived += Client_DataReceived;
            
            InitializeComponent();

            _thisDispatcher = Dispatcher.CurrentDispatcher;

        }

        // <summary>
        /// 別スレッドでTcpClient実行する
        /// </summary>
        private async void TcpClientStart()
        {
            //非同期でTcpClientを実行する
            await Task.Run(() => client.StartClient(host, port));
        }

        /// <summary>
        /// 受信データをテキストに表示する
        /// </summary>
        /// <param name="arg1"></param>
        /// <param name="arg2"></param>
        /// <exception cref="NotImplementedException"></exception>
        private void Client_DataReceived(object arg1, string arg2)
        {
            //非同期でUIスレッドを実行する
            _thisDispatcher.InvokeAsync(new Action(() =>
            {
                
                string message = arg2;

                //先頭行に新しい文字列を追加する
                richTextBox1.SelectionStart = 0;
                richTextBox1.SelectedText = message;       //Text文と空白行1行挿入
            }));
        }

        private void Form1_Load(object sender, EventArgs e)
        {

        }

        /// <summary>
        /// startボタンクリックでTcpClientをStartする
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void button1_Click(object sender, EventArgs e)
        {
            TcpClientStart();
        }
    }
}

Webhookサーバーのテスト


テスト概要

WebhookServerのテスト概要です。ここでは
APIの動作確認やデバッグに便利なInsomniaを使ってデバッグします。
InsomniaとはAPIサーバにHTTPリクエストを送ってそのレスポンス内容を確認できるAPIクライントです。

WebServerのテスト

WEbServerをテストするためにドキュメントルートをPCに作成します。Windows Cドライブに「www/DocRoot/」ディレクトリを作成する。ndex.html テストページlを作成しDocRootにi 追加する。
サンプル

CTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <img src="https://i.pinimg.com/originals/fd/89/49/fd8949cbb17acc5a9771ba065e6ec3c9.png"/>
    <!--img src="https://alpaca.markets/docs/images/alpacalomg.png"-->
    <h2>Alpaca Dashboard</h2>
</body>
</html>

Visual Studio 2022 WebhookSErverソリューションを起動する


1.Debugモードで実行する。
 2023/04/29 17:54:42] SERVER STARTING...
 [2023/04/29 17:54:42] SERVER STARTED!
 上記の2行が出れば正常
2.ブラウザーをオープンする。
3.url又は検索項目に「 localhost」と入力する
ブラウザーに作成したhtmlぺーじが表示されます。
表示が正しければWebServerの動作は正常です。

SocketServerのテスト

WebhookSeverを起動する
Visual Studio 2022でGTPClientソリューションを起動する
Debugモードで実行する。
WebhookSever画面に
 日付 時間 TCP Cilent 接続 と表示されれば正常

疑似データを使ったテスト

Insomniaを使ってテストします。その前にダウンロードしインストールします。https://insomnia.restからInsomniaを入手して下さい。Insomnia は、Mac、Linux、またはWindowsシステムにインストールすることができます。
1.Insomniaを起動する。右上の「✙ Create」をクリックし
 て「Request Collection」を作成する。次にnew 
 HTTPRequestを選択する。GETメソッドをPOSTに変更す
 る。「Body」クリックし「JSON」を選択して下記のコー
 ドをコピーする。

{
    "passphrase": "abcdefg",
		"alert_name": "zigzag",
    "time": "2021-11-17T10:13:06Z",
    "exchange": "OSE",
    "ticker": "NK225M1!",
    "interval": 5 ,
    "bar": {
        "time": "2021-11-17T10:10:00Z",
        "open": 29705,
        "high": 29710,
        "low": 29705,
        "close": 29710,
        "volume": 80
    },
    "strategy": {
        "postion_size": 1,
        "order_action": "buy",
        "order_contracts": 2 ,
        "order_price": 29710,
        "order_id": "VltClsLE",
        "market_position": "long",
        "market_position_size": 1,
        "prev_market_position": "short",
        "prev_market_position_size": 1
    }
} 

2.url行に「localhost/webhook/」と入力する。
3.WebhookServerとClientを起動しClient スタートボタン
 オンでWebhookServerとClientは接続状態になりました。
4.Insomniaの「Send」ボッタンをクリックすると
 Clientのtext Boxに疑似データが表示されます
以上でlocalテストは終了です。

WebhookServerをngrokで外部公開する

ngrokは「トンネリングサービス」と呼ばれ、ローカル開発環境で実行されているWebサーバーを、一時的にインターネット上でアクセス可能にするためツールです。
1.以下のngrokサイトを開いて、「Get started for free」 をクリックします。https://ngrok.com/

2.ZIPファイルを解凍し自分の好きなフォルダに保存します
3.ngrokのサイトにログイン、下図の様に左側に「Your Authtoken」という項目があるので、そこを開いて、Authtokenをコピーしておきます。

ngrok認証コード

4.次に、ngrokのコマンドプロンプトで、以下のように入力します。
ngrok authtoken xxxxxxxxxxxxxxxxxxxxxxxxx
5.WebhookServerとClentを起動する
6.コマンドプロンプトで
        ngrok http 80  ⏎

ngrok起動画面

公開ドメインをInsomniaにコピーしSENDボタンクリックしlocalテストと同じ疑似データがクライアントに表示されます。ただしこのドメインは1回のみで起動の度ドメインは違ってしまいます。有料版は独自ドメインの使用が可能ですのでお勧めです。ローカルサーバーを公開できるこのツールは素晴らしいですね。次回は売買シグナル作成するttadingViewと
strategyを作成します。


この記事が気に入ったらサポートをしてみませんか?