SSブログ
前の10件 | -

C# TcpClientを使用してサーバーへ接続してみよう② [C# TcpClient]

こんにちは。キキです。

お久しぶりです。本当にすごく久しぶりですね。

前回は11月30日ですか…。3か月ぶりですね

最近のFXの成績は

1月は-4.7%

2月は-0.4%

全然ダメでした(ノ△・。)

3月は今のところ+0.2%

1か月の目標は+8%としていて

これでコツコツ頑張っていこうかなと考えています

後、花粉症が始まってくしゃみがすごい!!

目もすごいかゆいし。はやく終わってくれないかなー

スポンサーリンク


さて、前回はと言うと…。どこまで進んでたっけ?

C# TcpClientクラスでサーバに接続して

データ送受信で終了しているみたいですね

前回、大切なことが抜けていて

TcpClientクラスをnewした後設定する項目がありまして

それを忘れていました

早速コードをのせておきます


private void button1_Click(object sender, EventArgs e)
{
    var client = new TcpClient("127.0.0.1", 3000);
    client.NoDelay = true;
    var ns = client.GetStream();
    var data = Encoding.ASCII.GetBytes("test");
    ns.Write(data, 0, data.Length);

    ns.Close();
    client.Close();
}


赤字の個所が前回が抜けていまして

この解説はMSDNのTcpClient.NoDelay プロパティ

確認してもらった方がわかりやすいです



すごく簡単に説明すると

一般的にはtrueに設定しておきましょう!!ってことです(笑)

次回はオアンダ サーバーへログオンしてみようを

予定しています

C# TcpClientを使用してサーバーへ接続してみよう① [C# TcpClient]

お久しぶりです。キキです。

最近はFXをずっと勉強していてFIXのことをすっかり

忘れていました。

FIXの方もプログラム作成が途中で止まっていて

最近は全然進んでいない状態なんですね…。

なぜだかあまりやる気がおこらない…。

成行注文、成行決済の動作確認ができてひとまずほっとしてます。

後はエラー処理とかイレギュラー処理とか

後は…、タイムアウト処理もありますね。

結構実装する必要があります。

むしろこっちの方が大事ですよね…。

それが終わったらOCOとかいろんな注文方法の実装とか

してみて、それが完成したらライブラリでまとめることが

できそうですね。

その次は他の人がライブラリを使用するとして、Chart Controlを

使用してGUIを構築していきたいです。

まだまだ先は長いな~と感じております。

スポンサーリンク


さて、今日はサーバーへ接続する基本となるコードを

C# TcpClientクラスを使用して説明していきます。

ここから少しずつ発展させて使えるようにしていきましょう

もう少し詳しく調べたいという方はDOBON.NETさんで

調べてください

以下はサーバーへ接続するコードになります

今回使用するサーバーのプログラムはこちらの
TcpListenerをダウンロードしてください
※実行には.NET Framework 4.5が必要です
TcpListener.exeを起動したらスタートボタンを押してください。
クライアントからメッセージがくると
テキストボックスに表示します

private void button1_Click(object sender, EventArgs e)
{
    var client = new TcpClient("127.0.0.1", 3000);
    var ns = client.GetStream();
    var data = Encoding.ASCII.GetBytes("test");
    ns.Write(data, 0, data.Length);

    ns.Close();
    client.Close();
}


簡単に説明します

TcpClientクラスを作成するときに接続先の

IPアドレスとポートを設定します

"127.0.0.1"はローカルホストへ接続します。

同じPC上で動作しているサーバーへ接続すると

思っておいて大丈夫です。

3000はポート番号になります。

ポート番号はあらかじめサーバーが決めておいた

値を指定します。今回は勝手に3000を使用すると決めました。

クライアントはポート番号がわからないと接続できないので

教えてもらう必要があります。

OANDAにAPIを申し込んだ時も接続先アドレスと

ポート番号を教えてもらっているはずです。

次にデータの受け渡しをするために

TcpClientクラスからNetworkStream(上記コードでは変数名ns)を

取得します。var ns = client.GetStream();の個所です。

まぁ、ファイルポインタと同じような感じです。

これに対してWrite,Read処理を行っていきます。

送信するデータはbyte[]にする必要があるので

stringからbyte[]へ変換しています。

var data = Encoding.ASCII.GetBytes("test");の個所になります

変換はASCIIからbyte[]へ変換していますが

UTF8からも変換できます。これはサーバー側がどの文字コード

で処理するかによって変わるのかなと思っています。

試しにカタカナ"テスト"を送信するとサーバーでは???と表示されます

ASCIIで変換しているからですね。

クライアント、サーバー共にUTF8で変換すれば正しく表示されます。

FIX ProtocolではASCIIからbyte[]へ変換して送信すれば今のところ

動作しています。まぁ、他のブローカーでも大丈夫でしょう

最後は後処理ですね。



と、かなり大雑把な説明になりました。

次回はC# TcpClientを使用してサーバーへ接続してみよう②を

予定しています

お久しぶりです

お久しぶりです。キキです

だいぶ久しぶりのブログになりますね。

最近はFXの勉強が忙しくてブログは

全然更新できなくてすいません。



時間ができれば更新しますので

少しお待ちください


FIX メッセージ ~ Header(ヘッダフィールド) ~ [FIX メッセージ]

こんばんは!!キキです。

今回は長いので前置きなしでいってみよう!!



今日はHeader(ヘッダフィールド)を説明します

いつも説明しているFIX メッセージを見ていきましょう
見やすいようにメッセージフィールド毎に分けています。
本来は1行です。@は0x01(SOH)を表しています

8=FIX.4.4@
9=91@
35=A@
34=1@
49=testusr4109@
52=20101124-20:27:25.000@
56=OANDA@
98=0@
108=300@
141=Y@
554=Passw0rd@
10=133@

上のFIXメッセージを確認するとHeader(ヘッダフィールド)は

次の7つになります

8=FIX.4.4@
9=91@
35=A@
34=1@
49=testusr4109@
52=20101124-20:27:25.000@
56=OANDA@

7つのうち順番が決まっているのは

8=FIX.4.4@
9=91@
35=A@

になります

仕様書P12にも書いてありますが簡単に説明していきます

1番目 ・・・ 8=FIX.4.4@

FIXメッセージでは最初に指定しなければなりません。

OANDAではFIX.4.2とFIX.4.4(FIXのバージョン)が指定できますが

私のブログではFIXは4.4のバージョンで実装していきますので

常にFIX.4.4指定します

2番目 ・・・ 9=91@

タグ10、フィールド名Checksumフィールドに転送されるメッセージの長さ(バイト)。

FIXメッセージでは常に2番目のフィールドになります

最初はここの設定する値がわかりませんでした。(;^_^A

最後に設定する値を説明します

3番目 ・・・ 35=A@

具体的なメッセージタイプ

FIXメッセージでは常に3番目のフィールドになります

Aはログオンを意味します。

今のところメッセージタイプごとに記事を書いていく予定です。

たくさん定義されていますがOANDAで使用できるのは割と少ないですね。

仕様書P51でOANDAがサポートしているメッセージタイプが

確認できます。

上記以外はどの順番で指定しても問題ないのかな?と思っていますが

確認はしていません。<(_ _)>

さて、残りの4つも続けて説明していきます

34=1@

整数のメッセージ・シーケンス番号

この値はクライアントからサーバーに送信するたびに

1増やした値を指定すればOKです

初めのFIXメッセージを送信するとき、

すなわちログオンするときは1を指定して、次は2、3と指定します

49=testusr4109@

メッセージの送信者を識別するために付与される値。

ここは常にログインユーザーIDです。

OANDAからもらったユーザーIDを指定してください

52=20101124-20:27:25.000@

メッセージ送信の時刻(常にUTC(協定世界時、または ‘GMT’ )で表示

と書いていますが、ちょっと前はUTCを指定したのですが

現在は日本時間を指定すればいいみたいです

56=OANDA@

メッセージの送信先を識別するために付与される値。

ここは常に"OANDA"を指定します。

さて、仕様書には

タグ57、フィールド名TargetSubIDが残っていますが

こいつもついでに説明しておこうかなと思いましたが

実際に使う時になったら説明します。

自分にとってはこのフィールドが曲者でした・・・。

わかってしまえば、「なんじゃーい。それでいいんかい!」

と簡単なんですけどね。^^

スポンサーリンク

~ 重要 ~

タグ9、フィールド名BodyLengthに設定する値について

この値は簡単に説明すると、

FIXメッセージ3番目のフィールド(タグ35、フィールド名MsgType)

からタグ10、フィールド名CheckSumの1つ前までの文字列の長さを指定すれば

OKです。(≧∇≦)b

わからなかったら下のソースを見ていただいた方が

はやいです。

Header(ヘッダフィールド)をC#で実装してみよう!!

private void button1_Click(object sender, EventArgs e)
{
    var sb = new StringBuilder();
    // 3番目のフィールドから作成するのがポイントです
    sb.Append("35=A" + Convert.ToChar(0x01));
    sb.Append("34=1" + Convert.ToChar(0x01));
    sb.Append("49=testusr4109" + Convert.ToChar(0x01));
    sb.Append("52=" + DateTime.Now.ToString("yyyyMMdd-HH:mm:ss.fff") + Convert.ToChar(0x01));
    sb.Append("56=OANDA" + Convert.ToChar(0x01));
    sb.Append("98=0" + Convert.ToChar(0x01));
    sb.Append("108=300" + Convert.ToChar(0x01));
    sb.Append("141=Y" + Convert.ToChar(0x01));
    sb.Append("554=Passw0rd" + Convert.ToChar(0x01));
    // ここまでのsbの文字列の長さをタグ9に設定します

    sb.Insert(0, "9=" + sb.Length.ToString() + Convert.ToChar(0x01));
    sb.Insert(0, "8=FIX.4.4" + Convert.ToChar(0x01));
    // 先頭に追加することで
    // 1番目 タグ8、フィールド名BeginString
    // 2番目 タグ9、フィールド名BodyLength
    // 3番目 タグ35、フィールド名MsgType
    // と順番になりました

    // チェックサムの計算は最初から最後までのフィールド
    // が対象です
    sb.Append("10=" + CheckSum(sb).ToString("000") + Convert.ToChar(0x01));
    using (var fs = new FileStream(@"result.bin", FileMode.Create))
    {
        fs.Write(Encoding.ASCII.GetBytes(sb.ToString()), 0, sb.Length);
    }
}

これを実行すれば 9=91@ と出力されます。

※CheckSumメソッドは前回の記事に載せています

前回と似ていますが、タグ9、フィールド名BodyLengthがあるので

少し変更されています。

ログオンに関してはユーザーIDとパスワードを変更すれば

そのまま動作しそうですね ^^

次回はFIXからいったん離れて、

まずはサーバーへ接続してみよう!!です。

少し長いな・・・。ふ~っ、疲れた(。´-д-)
タグ:fix OANDA header
nice!(0)  コメント(0)  トラックバック(0) 
共通テーマ:マネー

FIX メッセージ ~ Trailer(トレーラフィールド) ~ [FIX メッセージ]

こんばんわ!!キキです。

FXの取引勝ってますか?

私はダウ理論で少し勝つことができたのですが

2か月経てば負けてしまったので

ダウ理論を使うのも諦めようと思っていたのですが

1か月間は勝つことができたんだ!!

と、いうことに自信を持って

ダウ理論とインジケーターを組み合わせた手法で

やっていくことにしました!!

そして、この3日間の成績は

なんと!!



+8.7pips



-0.1pips



+14.1pips







といい感じの結果になりました!!v(≧∇≦)v イェェ~イ♪

最終目標は1日+10pipsで考えています!!

もうこれ以上は望みません。

メンタル崩壊しないように、ただただ同じことを

延々としていくだけでいいのだ!!

FXがつまらなくなった時が1人前の証だ!!

うぉー!!w( ▼o▼ )w オオォォ!!

(1人気合いが入ってます…)






え~、さて、気を取り直してと・・・。

それでは、Trailer(トレーラフィールド)について説明します

Trailer(トレーラフィールド)はFIX メッセージの終わりに

出てこなければなりません。

タグの値は10、フィールド名はCheckSumです

※いつも説明しているFIX メッセージ
見やすいようにメッセージフィールド毎に分けています。
本来は1行です。@は0x01(SOH)を表しています

8=FIX.4.4@
9=91@
35=A@
34=1@
49=testusr4109@
52=20101124-20:27:25.000@
56=OANDA@
98=0@
108=300@
141=Y@
554=Passw0rd@
10=133@

OANDAの仕様書を確認すると

「3バイトの単純チェックサムがメッセージの終りの区切り文字

として(トレーリング(SOH)とともに)機能する。

常に3文字で定義される。」

と書いてあります。

難しいことはよくわかりませんがチェックサムの値を設定すると

言うことです

ところで、チェックサムとは?

私が説明するよりもググってもらった方が詳しい説明が

載っていますので各自で調べてみてください(^ ^)



~ 重要 ~

チェックサム計算対象はFIX メッセージのうち

Trailer(トレーラフィールド)を除いたメッセージで計算します

この時点ではチェックサムの値がわからないから当たり前か。f(^_^)

CheckSum(チェックサム)をC#で計算してみよう!!

端が切れているかもしれませんがコピーはちゃんと

できるみたいです。

コピペして実行してみてください。

private int CheckSum(StringBuilder sb)
{
    var sum = 0;
    for (var i = 0; i < sb.Length; i++)
    {
        sum += Convert.ToInt32(sb[i]);
    }

    return sum % 256;
}

private void button1_Click(object sender, EventArgs e)
{
	var sb = new StringBuilder();
	sb.Append("8=FIX.4.4" + Convert.ToChar(0x01));
	sb.Append("9=91" + Convert.ToChar(0x01));
	sb.Append("35=A" + Convert.ToChar(0x01));
	sb.Append("34=1" + Convert.ToChar(0x01));
	sb.Append("49=testusr4109" + Convert.ToChar(0x01));
	sb.Append("52=20101124-20:27:25.000" + Convert.ToChar(0x01));
	sb.Append("56=OANDA" + Convert.ToChar(0x01));
	sb.Append("98=0" + Convert.ToChar(0x01));
	sb.Append("108=300" + Convert.ToChar(0x01));
	sb.Append("141=Y" + Convert.ToChar(0x01));
	sb.Append("554=Passw0rd" + Convert.ToChar(0x01));
	sb.Append("10=" + CheckSum(sb).ToString("000") + Convert.ToChar(0x01));

	using (var fs = new FileStream(@"result.bin", FileMode.Create))
	{
	    fs.Write(Encoding.ASCII.GetBytes(sb.ToString()), 0, sb.Length);
	}
}

これを実行すると 10=133@ と出力されます。

期待どおりの結果になりましたね。

よかった、よかった。ε-(^∇^;)ホッ

次回はFIX メッセージのHeader(ヘッダフィールド)について説明します
タグ:fix OANDA

FIX メッセージ② [FIX メッセージ]

おはようございます。キキです

突然ですが、最近のFXの成績はどうですか?

いろいろと試行錯誤して頑張ってるけど

一向によくならん!!

順調に負け続けてます。



最初は、インジケーターをいじくりまわして

聖杯探しの旅に出かけ、聖杯はないってことに気づき

じゃ、どうする?ってなった時にダウ理論に出会いました

ダウ理論自体は前から知っていたけれどそれをトレードに

使ったことはなかったので、

「もう、これしかない!!」ってことで最近はダウ理論

メインで取引していました。

すると日単位でだんだんと勝てるようになってきて

月単位で初めてプラスになり、「やっと、きたのか?」

と思っていたら、次の月はマイナスになってしまいました…。

ダウ理論もダメなのか~。

と、現在はまたインジケーターでの取引に戻そうかなと考えています



早く俺の時代こないかな~。(T T)


スポンサーリンク



皆さん、前回の続きは覚えていますか?

FIX メッセージは複数個のメッセージフィールドからできている

ということです

まだの人はこちらから前回の記事を読んでください



さて、ここからが前回の続きになります



FIX メッセージは

・ヘッダー(header)

・ボディ(body)

・トレーラー(trailer)

からできており

FIX メッセージ = header + body + trailerという順番で構成されています

これを前回使用したFIX メッセージで説明すると

※前回のFIX メッセージ
8=FIX.4.4@9=91@35=A@34=1@49=testusr4109@52=20101124-20:27:25.000@56=OANDA@98=0@108=300@141=Y@554=Passw0rd@10=133@

・ヘッダー(header)
8=FIX.4.4@9=91@35=A@34=1@49=testusr4109@52=20101124-20:27:25.000@56=OANDA@

・ボディ(body)
98=0@108=300@141=Y@554=Passw0rd@

・トレーラー(trailer)
10=133@

上記の3つに分かれます

詳細はオアンダのFIX仕様書P12、P14を参照してください



サーバーに送信するFIX メッセージは

FIX メッセージ = header + body + trailerとなっており

bodyの内容はheader内のタグ35(フィールド名はMsgType)の値に

よって変わります。

前回のFIX メッセージでは35=A@の部分ですね。

これはAはログオンメッセージと定義されています

タグ、メッセージ一覧はサイドバーのマイカテゴリー

から見ることができます

今後必要になるので1度確認してください



次回はtrailerについて説明する予定です。

なぜ、header、body、trailerの順に説明しないのか?と言うと

trailerはメッセージフィールドが1つだけで説明しやすいので

先にtrailerから説明して、次にheaderを説明する予定です。
nice!(0)  コメント(0)  トラックバック(0) 
共通テーマ:マネー

FIX メッセージ① [FIX メッセージ]

こんにちは!!キキです。

雨ばかり続いて、晴れたと思ったら少し寒くなってきましたね

季節の変わり目は体調を崩しやすいので皆さん気をつけましょう





まぁ、言ってる本人が少し風邪気味なんですが…





さて、FIX メッセージの説明をしていきます

OANDA FIX 仕様説明書(日本語ドキュメント 最終更新日:2015年1月8日)の

6ページ目にのっているFIX メッセージを例として説明します

※OANDAではスペースとなっているところをわかりやすくするため

@に置き換えています。

8=FIX.4.4@9=91@35=A@34=1@49=testusr4109@52=20101124-20:27:25.000@56=OANDA@98=0@108=300@141=Y@554=Passw0rd@10=133@

※もしかしたら折り返されて表示されているかもしれませんが1行表示です



1つずつ順番に説明していきます。

FIX メッセージは複数のメッセージフィールドからできています。

メッセージフィールドは、8=FIX.4.4@や9=91@のことです。

簡単に言えば@の次から、次の@までです。下で詳しく説明します。

メッセージフィールドの終わりは 0x01となっています。

例では0x01を表すのに@を使用しています。

他のサイトを見ると、|(パイプ)やスペースを指定しているものも見られます

OANDAの仕様書にはSOHと説明されている部分ですね。

SOHはstart of headerの略です。



FIX メッセージを分解すると

8=FIX.4.4@

9=91@

35=A@

34=1@

49=testusr4109@

52=20101124-20:27:25.000@

56=OANDA@

98=0@

108=300@

141=Y@

554=Passw0rd@

10=133@

と、12個のメッセージフィールドからできていることがわかります

スポンサーリンク


さらにメッセージフィールドの中身を詳しく見てみましょう

メッセージフィールドの中身は「=」で区切られていて

TAG=VALUE@となっています

例として、8=FIX.4.4@を分解すると

TAGは8

VALUEはFIX.4.4

@はSOH(メッセージフィールドの終わりを表します)

になります。





~おまけ~

メッセージフィールド9=91@をC#で表してみよう!!

var messageField = new byte[] { 0x39, 0x3D,0x39, 0x31, 0x01};

になります。

次回も続けてFIX メッセージの説明をしていきます
タグ:fix C# OANDA
nice!(0)  コメント(0)  トラックバック(0) 
共通テーマ:マネー

オアンダ FIX環境構築③ [オアンダ FIX環境構築]

こんばんわ!!キキです

雨がひどいですね。鬼怒川の川氾濫してびっくりしました!!

不明者も見つかって安心しました。

自衛隊の救助に感謝ですね



本題のFIX環境構築もこれで最後です

前回紹介したStunnelのインストールは済んでいますか?

まだの人は前回の記事を読んでインストールしてください



さて、Stunnelが無事インストールできたら次は設定しましょう

この設定が何を設定すればいいか難しいのですが

OANDAのFIX仕様書に設定内容もちゃんと書いてありますので安心してください。 ^ ^

こちらを確認してください

Connection Requirementsの項目に設定が書いてあります。^ ^

が、私が使っている設定ファイルをダウンロードしてもらうほうが

確実なのでアップしておきます

stunnel.conf 左上のダウンロードボタンを押してください

ダウンロードが完了したらStunnelを開いて、メニューのConfiguration開いてEdit Configurationを押して

ダウンロードしたstunnel.confの内容をコピペしてください

connect = の先が抜けているので

ここにはオアンダから教えてもらった接続先のIPアドレス(URL)とポート番号を入力してください。

保存して閉じてください。

続いて、メニューのConfiguration開いてReload Configurationを押して設定を反映させてください

スポンサーリンク


次にテスト用のアプリを作成したのでまたまたダウンロードしてください

※実行には.NET Framework 4.5が必要です


FIXTest1.exe 左上のダウンロードボタンを押してください

起動時画面はこんな感じです
オアンダ FIX環境構築③-1.jpg

OANDAに教えてもらったユーザーIDとパスワードを入力してLogonボタンを押してください
正常に通信できたら以下の画面が表示されると思います
オアンダ FIX環境構築③-2.jpg

ログオンが完了したらLogoutボタンを押してログアウトしましょう
オアンダ FIX環境構築③-3.jpg
正常にログアウトが完了するとメッセージが表示されます



どうでしょうか?無事ログオン、ログアウトはできましたか?

テスト用に作ってあるので何回もログオン、ログアウトを繰り返し行うと

サーバーから反応がなく、アプリが固まるので強制終了してください。

10分後に実行するとまたログオンできると思います。

お疲れ様でした。次回はFIXメッセージについて書いていきます

オアンダ FIX環境構築② [オアンダ FIX環境構築]

こんにちは!!キキです。

台風で雨が激しいです。降ったり止んだり・・・。

今週一杯はこんな天気みたいですがはやく落ち着いて欲しいですね




さて、前回の続きから

通信に必要なソフトをインストールしていきましょう。

なぜ、ソフトをインストールする必要があるかというと

「OANDA FIX サーバは、通信秘密保全のため SSL 暗号化通信のみを受け入れます。」

と仕様書に書いてあります。

このため、オアンダでFIXプロトコルで通信するためには暗号化する必要があります



暗号化をわざわざ実装しないといけないの?



そんなことはありません。暗号化してくれるソフトがフリーであるので

インストールして対応しましょう。

仕様書にもかいてあるStunnelを使用します

スポンサーリンク


こちらからダウンロードできます

stunnel-5.23-installer.exeをダウンロードしましょう(2015/09/09現在)

インストールが始まるとそのままデフォルトの設定で次へ行きましょう。

途中、コマンドプロンプトが表示され、国やら住所等を入力しろと言ってきますが

無視して全部Enterを押して先へ進みましょう。

無事インストールが終了するはずです。

後は好みの問題ですが起動するのが面倒くさい方はあらかじめ

スタートアップにショートカットを作成しておいてください



次はStunnelの設定と設定確認のためのログオン、ログアウトの予定です

タグ:fix OANDA Stunnel
前の10件 | -

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。