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#で実装してみよう!!
これを実行すれば 9=91@ と出力されます。
※CheckSumメソッドは前回の記事に載せています
前回と似ていますが、タグ9、フィールド名BodyLengthがあるので
少し変更されています。
ログオンに関してはユーザーIDとパスワードを変更すれば
そのまま動作しそうですね ^^
次回は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からいったん離れて、
まずはサーバーへ接続してみよう!!です。
少し長いな・・・。ふ~っ、疲れた(。´-д-)
スポンサーリンク
コメント 0