SSブログ

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) 
共通テーマ:マネー

nice! 0

コメント 0

コメントを書く

お名前:
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。

※ブログオーナーが承認したコメントのみ表示されます。

トラックバック 0

トラックバックの受付は締め切りました

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