その他2015
2003年度 2004年度 2005年度 2006年度 2007年度 2008年度 2009年度 2010年度 2011年度 2012年度 2014年度 
自動カネ稼ぎマシン(FIX版) 自動カネ稼ぎマシン(REST版) マシン(値動き検知版) OANDAのAPIラッパー
 
 自動カネ稼ぎマシン(OANDAのAPIラッパーを使う) 2015/11/17
 OANDAのサンプルプログラムを使ってみた。
 サンプルと言うよりもREST用のAPIラッパー群だ。言語はC#。
 RESTだから余計なDLLやstunnelが要らないかも?
 ちょっと動かしてみたけど、デモアカウントでRESTサーバにアクセスしたら返事が返ってきたみたい。
 OANDAからDLしたコードを自分のVisualStudioに入れる時の方法を忘れないうちにメモ。
  1. Gitクローンを実行してOANDAから自分のローカルディスクにコードを持ってくる。
    Gitでバージョン管理をする気は無いんで、Githubにアカウントを作る必要は無いし、クローンが終わったからGitはアンインストールしちゃった。
  2. VisualStudio(自分は2013を使用中)を起動したら、一番簡単なWindowsFormアプリを作る。
  3. プロジェクトにまじめな名前(あとあと管理しやすいように)を付けて一旦保存。
  4. ソリューションエクスプローラのソリューション名の上で右クリックして「追加 - 新しいフォルダ」を実行し、下図の二つのフォルダを作る。

  5. GitでクローンしたファイルをそれぞれのフォルダにC&Pする。
    この手順を踏まないでエクスプローラなどで直接ファイルをコピーすると、VisualStudioのプロジェクトとして認識されないと思った。
  6. 同じようにGitでクローンしたRest.csをC&Pする(これもエクスプローラなどで直接ファイルコピーしちゃダメ)。
  7. 「参照設定」で「System.Web.Extensions」を追加する。
    以上で前準備は完了なのでコードを書き始める。
  8. Form1.csの先頭辺りに「using RestApi;」を追加する(別のnamespaceにアクセスするんで必要)。
  9. 適当にButtonを配置してOnClickに「var s0 = Rest.GetAccountDetails(自分のアカウント番号);」を書く。
  10. Rest.csの変数「s_apiServer」にRESTサーバのURLを入れる。
    デモ用のRESTサーバなら「static string s_apiServer = "https://api-fxpractice.oanda.com/"; 」
    本番用のRESTサーバなら「static string s_apiServer = "https://api-fxtrade.oanda.com/";」
  11. 同じようにRest.cs内の「accessToken」に自分のTokenをセットして、上下のコメントを外す。
  12. ビルドして成功したら、Buttonをクリックして変数 s0 をインスペクトする・・・あらスゴイ。
 なんとこんな簡単にRESTサーバにアクセス出来ちゃった。
 まだ 全部の関数を試してないけど良いんじゃない。

    Rest._MyAccount に自分のアカウントをセットしてあるとして・・・
    var s0 = Rest.GetAccountDetails(Rest._MyAccount);
    var s1 = Rest.GetTradeList(Rest._MyAccount);
    var s2 = Rest.GetOrderList(Rest._MyAccount);
    var s3 = Rest.GetPositions(Rest._MyAccount);

 最初からこれを使ってればREST部分のプログラムは3日で終わったような気がする(^^;


 自動カネ稼ぎマシン(値動き検知版) 2015/04/26
 未だやってます(^^;
 今回はFIXとRESTとOANDAの売買ツールを組み合わせてみた。
  FIXの長所:早い。とにかくレートの取得が早い。
  RESTの長所:扱いが簡単。
  OANDAの売買ツール:C#でプログラムからクリックしてやれば良いんでチョー簡単。

 今回の作戦のキモは「FIXでレートを取得してEntry判断を高速にする」ってこと。
 判断が速ければその後の発注や決済処理は、FIXでもRESTでもOANDAツールでも大差無いだろうってことで作戦を立ててみた。


2015/5/12
 
FIXサーバでレートを取得し、プログラムからOANDAのJavaツールの売買ボタンをクリックしてやるのが簡単だけど、これだと仕事中にマウスがいきなりすっとんじゃって困るんでRESTサーバで発注することにした。
 RESTサーバからだとStopとLimitの付いた成行売買を一発で出せるし、未決済のチケットを一括で手仕舞いすることも出来る。
 と言う事で
  レートの取得(FIX)
  発注(REST)
  手仕舞い(REST)
 この組み合わせで自動売買の準備は整った。
 さて、どうやろう?(^^;


2015/11/11
 「指標発表時の自動売買」をするプログラムを作ってみた。
 自分でも何がどうなってるのか忘れちゃうんでメモ。
 要するに「指標発表の直前にASKとBIDの逆指値を自動的に入れる」ってだけなんだけど(^^;
  ・1時間毎に時刻サーバにアクセスしてパソコンの時計を補正
  ・指定時刻の5秒前に成行および逆指値でオーダーを出す
 なおこのプログラムではどのような売買でもSTOPとLIMITが必ず自動でセットされる。
 またリーブオーダーでは上(下)限価格が現レートの100PIP指定PIP数以内に自動でセットされる(スリッページなどで現レートから100PIP指定PIP数以上離れた価格で約定しそうになると、サーバがキャンセルするんで安心)。


  1. 選択中の通貨のレートとスプを表示する。
  2. OANDAのサーバからレートがちゃんと来てるかどうかを表示してる(レートが届く度に「赤 → 青」と変化する)。
  3. エントリー中かどうか(建玉が有るか無いか)を示す。
    水色ならエントリー中で、エントリー中ならSTOPかLIMITに達するのを監視する。
    ただし手動での成行エントリー時のみ有効(これ、あまり意味が無いからいずれ外すかも)。
  4. 売買LOT。OANDAでは1$から売買できる(10,000$じゃなくて本当に1$なのだ)。
  5. ここをチェックすると朝の AM5:30~AM9:05はエントリーできなくなる。
    この時間帯ってスプが結構開くんで、間違ってエントリーしないため。
  6. ここをチェックするとスプが標準より開いてるときはエントリーできなくなる。
    ついスプが開いてるときにエントリーしちゃうのを防ぐ用。
  7. ホットキーの有効・無効の指示。
    ホットキーはCTRLとの組み合わせで使う。
     1:EUR/USDの買い   Q:売り
     2:USD/JPYの買い   W:売り
     3:AUD/JPYの買い   E:売り
     4:EUR/JPYの買い   R:売り
    なおホットキーでの売買でもLIMITとSTOPは常にセットされる。
  8. 指定通貨の成行売買をする。ホットキーと同じ動作。
  9. 自動処理の中止と決済だ。決済は全ての建玉をワンクリックで全部決済する。
  10. LIMITとSTOPをPIPS単位で指定する。
    手動でも自動でもどんな方法でも発注時にはSTOPとLIMITは常にセットされる。
  11. 押し目になったらエントリーする。
    「指定レジサポを越え、戻ってきたらエントリーする」と言うつもりで作り始めたけど、押し目の判断ってプログラムでは難しい。
    で、現時点ではただのアラームになってる。
  12. 日時を指定してオーダーを出す。
    指定の日時の5秒前に自動でオーダーを出す(発注する)。
    上側は成行、下側は逆指値だ。
    どちらも時刻制限やスプ制限を無視する(自動エントリーが優先)。
    なお指定日時が既に過去の場合は背景が灰色になる(未来の場合=正常なら背景が水色になる)。
  13. OANDAは両建てが出来ないんで成行の方はASKかBIDどちらかだけ。
    日時を指定して開始にチェックを入れると時間が来るのを待ち、5秒前に成行でオーダーする。
  14. 逆指値でリーブオーダーを出す場合はこっちを使う。
    ASKかBIDの片方でも良いし、両方をチェックすれば同時に両方にリーブオーダーを出す。
    OCOのようにどっちかが約定したら反対側はキャンセルしても良いけど、今のところはそうなってない。
    安全のため上(下)限価格を設定してるので、スリッページにより現レートから100PIP指定PIP数を越えて約定しそうになるとサーバは発注自体をキャンセルする。
  15. 逆指値でリーブオーダーを出すときのレート(指値)をPIPS数で指定する。
    オーダー直前のレートからのPIPS数だ。
    例えばASKにチェックをして「10」と入力しておくと、レートが10PIP上がるとASKが約定する。

<使用例1>
 22:30:00に雇用統計の発表があるとする。
 良い統計か悪い統計か分からない場合、「時刻Entry(リーブオーダー)」を使う。

 1:時刻指定を22:30:00とし、ASKとBIDの両方にチェックを入れる。
 2:指値を現レートからのPIPS数で入力する。多分20~30PIP位?要実験。
 3:開始をチェックする。
 4:パソコンの電源を入れたまま、さっさと寝る。
 5:22:30:00の5秒前になると、現レートから指定PIPS数離れた指値の両建てのリーブオーダーが自動的に出る。


<使用例2>
 22:30:00に雇用統計の発表があるとする。
 チャートの形からして跳ね上がる(上)と予想できる場合、「時刻Entry(成行)」を使う。

 1:時刻指定を22:30:00とし、ASK側のRadioButtonをチェックする。
 2:開始をチェックする。
 3:パソコンの電源を入れたまま、さっさと寝る
 4:22:30:00の5秒前になると、ASKの成行オーダーが自動的に出る。

 で、目が覚めたらガッポリの含み益を確認する(^^;
 まずは小ロットで半年ばかり動かしてみようかなと。

 自動カネ稼ぎマシン(REST版) 2015/03/19

2015/3/21 全体を書き換えた
 
FIXサーバだと出来ない事が有るんで、RESTサーバにアクセスしてみた。
 C#でアクセス成功。
 暫くこのRESTサーバで遊んでみる。
 デモ口座での実験なんで、事前にデモ口座を作り、REST用のトークンを取得しておく。XXXXX-YYYYYにはそのトークンを指定する。
 FIXサーバも同じなんだけど、RESTサーバとやりとりすると結果がOANDA純正のJavaツールにも反映されるんだ。
 だからログインしてJavaツールを見ながら自分のプログラムを動かせば結果が見えてやりやすいぞ。

 ・RESTサーバとのやりとりではJSONフォーマットを使う(XMLを簡単にしたような感じのフォーマット)。
 ・DateTimeのフォーマットはRFC3339(日付と時刻を"T"で結ぶ方式)。UNIX方式にしたいならここを参照

 リンク
  OANDAのAPIの開発ガイド
  RESTの動作確認用ページ
  RESTとは
  JSONとは
  Chromeのデベロッパーツールの使い方


 REST用のトークンの取得方法。
 ログインしたら・・・



 トークンを取得したらプログラムする前に練習用のページで色々遊ぶ。
 で、生成されたコードをC#に横取りする。
  1:RESTサーバにアクセスする前にPractice口座にログインしておく ← 忘れずに!
  2:RESTの動作確認用ページ へ行く



 試しにレートを取得してみる。




 プログラミングではこちらを参照させて頂きました(WEBプログラミングは未経験なんでしょっちゅう書き換える予定)。

 <サーバとの通信>
 これからはHttpClientを使うんだと  3 
  昔のやり方が良ければ WebRequestの使い方1  WebClientの使い方 POSTの使い方1   

 <サーバから受信するJSON文字列の処理>
 超軽量なDyanamicJsonのソースそのもの DLと使い方はここ  作者の解説記事
  DLLを使うなら DynamicJson.DLLを使う1 DLはここ
  昔のやり方でJSON.NETでやるなら C#でJSONを使う1  

 <その他>
 Chromeのデベロッパーツールの使い方
 C#のAPIラッパーソース

 HttpClientと言う便利なものが有るって知らなかったんで昔の書き方なり。
 EUR/USDとUSD/JPYのレートをRESTサーバから取得してる。
 参照設定の追加分 "System.Web" "System.Runtime.Serialization"。
 なおVisualStudioはデバッグ中に変数をJSONフォーマットで表示できるから、送受信の確認だけならJSON処理は不要だ。
private void button1_Click(object sender, EventArgs e)
{
    var req = WebRequest.Create("https://api-fxpractice.oanda.com/v1/prices?instruments=EUR_USD%2CUSD_JPY");
    req.Headers.Add("Authorization:Bearer XXXXXXXXXX-YYYYYYYYYY");  // XXX-YYYにトークンをセットする
    req.Method = "GET";
    var res = req.GetResponse();

    Encoding enc = Encoding.GetEncoding("Shift_JIS");
    Stream st = res.GetResponseStream();
    StreamReader sr = new StreamReader(st, enc);
    string html = sr.ReadToEnd();
    sr.Close();
    st.Close();
    listBox1.Items.Add(html);  // 本当はJSONフォーマットに変換してから表示する
}


 HttpClientを調べてたらここに・・・
 『それだけではなく、HttpClientクラスはRESTにも対応している。』
 『PutAsync/GetAsync/PostAsync/DeleteAsyncという四つのメソッドが用意されているのだ。』
 だってさ!ひょえ~~
 しかも非同期でサーバとアクセス可能とか書いてあるから、受信用のタスクを作ればOK?
 こりゃ調べる価値あるよね~



2015/3/23
 HttpClientでレートの取得とローソク足の取得が出来た(レート取得はRESTサーバは0.7秒ほどかかる。FIXサーバが速くて良い)。
 まじめに非同期で、まじめにエラー処理も入ってて、これじゃプロの仕事みたいじゃん(^^;
 ちゅうてもここを丸写ししてConsoleアプリをFormアプリにしただけ・・・有り難うございます。
 asyncやawaitを使うとタスクを意識しなくても非同期に出来ちゃうってんだから.NETは凄いよ。

 ローソク足の取得では、時間を9時間減らしてNewYorkタイムにするのに3行、それをRFC3339に変換するのに1行、URLエンコードも1行書くだけで終わり。
 組み込みのソフト作りと違ってWindows上のプログラミングは至れり尽くせりで、これでまたつらい組み込みの仕事に戻れるか心配だよ。
 そろそろ本気で売買をするつもりなんで本番口座へもアクセスしてる。売買の様子はこちらです。
        const string OandaRestUri = "https://api-fxtrade.oanda.com/v1/";   // 本番口座だぞ!
        const string TOKEN = "Bearer XXXXX-YYYYY";
        //-------------------------------------------------------------
        // Get
        //-------------------------------------------------------------
        private async void Rest_Get(string uris)
        {
            Uri uri = new Uri(uris);
            using (HttpClient client = new HttpClient()) {
                client.DefaultRequestHeaders.Add("Authorization", TOKEN);   // Header
                client.DefaultRequestHeaders.Host = uri.Host;   // 無くても動く

                client.Timeout = TimeSpan.FromSeconds(5.0); // タイムアウトをセット(無くても動く)
                string result = null;
                try {
                    result = await client.GetStringAsync(uri);
                } catch (HttpRequestException e1) {
                    WriteLines("\n例外発生!");  // 404エラーや、名前解決失敗など
                    // InnerExceptionも含めて、再帰的に例外メッセージを表示する
                    Exception ex = e1;
                    while (ex != null) {
                        WriteLines("例外メッセージ: {0} ", ex.Message);
                        ex = ex.InnerException;
                    }
                } catch (TaskCanceledException e1) {
                    // タスクがキャンセルされたとき(一般的にタイムアウト)
                    WriteLines("\nタイムアウト!");
                    WriteLines("例外メッセージ: {0} ", e1.Message);
                }

                // 取得結果を使った処理
                if (result != null) {
                    // サンプルとして、取得したHTMLデータの<h1>タグ以降を一定長だけ表示
                    WriteLines("========");
                    int h1pos = result.IndexOf("<h1", StringComparison.OrdinalIgnoreCase);
                    if (h1pos < 0) h1pos = 0;
                    const int MaxLength = 720;
                    int len = result.Length - h1pos;
                    if (len > MaxLength) len = MaxLength;
                    WriteLines(result.Substring(h1pos, len));
                    WriteLines("========");
                }
                _RestResult = result;
            }
        }



2015/3/28
 なんとPOST/GETの最高のコードを発見。
 毎度のことだけど心より有り難うございます m(__)m
 と言うわけでRESTサーバのプログラム作りはこれにて完了。

 で、こちょこちょと自動売買をしてみたけど、アカンです。全然アカンです。
 自分が手動で売買してるようにはプログラミングできない。
 オラは手動売買では単純移動平均SMAだけを見てるんだけど、これで儲かってるのは『勘で補ってる部分がかなりあるから』なんだって事を今更発見。
 今まで気がつかなかったけど、SMAだけじゃなくてローソク足の細かい上下動の速さや時間帯による動きのクセ、注文の溜まり具合なんかも感じるみたい。
 この『勘をプログラミングする』ことはオラには無理だ。
 恐らく自動売買には自動売買用の別のアプローチがあるんだろうと思う。

 今回作ったツールは手動売買の補助ツールとして使うことにした。
 例えば標準スプレッド以上の場合はボタンを押してもエントリーしないようにしてある。
 買Bや売Bボタンは超短期のブレークエントリー専用で、成行でエントリーした後の決済は自動化してる。
 ホットキーにはまだ対応してないけど、これは簡単だからそのうち作る。


 ちゅうことでこれにて一旦終わり。
 次はインジケータを使った自動売買って事になるのかな?
 だとするとやっぱりMT4のプログラミングって事になっちゃうのかなぁ・・・

 自動カネ稼ぎマシン(FIX版) 2015/02/24
 数年前からFX(為替売買)に手を出してるんだけど、この頃やっとプラスになってきた。
 プラスになってきたら欲が出てきた(爆)
 FXで売買してるといつも同じパターンでエントリー(建玉)し、同じパターンでエグジット(手仕舞い)してる。
 それなら自動化できるんじゃない?
 ってことでここはFIXってのを使って「自動カネ稼ぎ」に挑戦中であります。

 OANDA(為替を売買させる会社のこと)では、FX取り引き用のサーバーに直接アクセス出来るんだ。
 アクセスするための通信規格はFIXと言う名前で、これは銀行やら為替やらの金融がらみの世界では標準的な通信規格なんだそうだ。
 オラは初めてだけどOANDAのFIXの仕様書を読んでみたらそれほど難しくない。これならやれそうだ。
 それとOANDAはスプレッド(売りと買いの差額)が0.3PIPと日本の会社と比べても十分に狭い。おそらく最狭スプレッドに近いはず(でも朝方は広がるのでスプレッドが広いときにはエントリーしないようにプログラムする)。
 で、ぽつぽつと簡単なところからプログラムしてみた。

 言語はC#=VisualStudio2013にした。
 C#はあまり慣れてないけどTurboCやDelphiを作ったチームの作品だから、もう数十年のお付き合いがある。
 DLLはQuickFIX/n、通信の暗号化にはstunnelを使った。
 これ全部タダなんだよ。無料。誰でも始められるし誰でも作れちゃう。凄い時代だよね。

 ってことで、とりあえず練習用にクリック証券の「はっちゅう君FX」のまねっこで「はっちゅう君OANDA」を作ってみた。
 為替レートの取得、成行/指値/逆指値の発注、ステータス取得とかキャンセル処理とかを入れてるんでボタンだらけだけど、大体のFIXAPIの動作確認ができた。
 ここまで来ればあとはケチケチと自動処理をプログラムするだけ・・・はたして自動金稼ぎマシンは完成するのでありましょうか (^^;

<言葉遣い>
 FXは株とは言葉遣いがちょっと違うんで面倒くさい。
 ・オーダー:売買注文を出すこと。
 ・マーケットオーダー:成行での発注。
 ・リーブオーダー:指定価格での発注(指値はLimitオーダー、逆指値はStopオーダーと言う)。

 OANDAのFIXの仕様書での言葉(自分のPC=クライアント側からの場合)。
 ・アウトバウンド:OANDAサーバーへメッセージを送信すること。
 ・インバウンド:OANDAサーバーから返ってくる返事のこと。


FIX仕様書のアウトバウンド(送信)の項目
 ・Logon:OANDAサーバーへのログオン。
 ・Logout:OANDAサーバーからのログアウト。
 ・HeartBeat:お互いが接続中であることを確認するための処理で、300秒以内にお互いに送信する(DLLが勝手にやる)。
 ・NewOrderSingle:オーダー=注文を出すこと=発注すること。発注番号※1を生成する。
 ・OrderCancelRequest:オーダーのキャンセル。
   マーケット・オーダー(成行で発注)した場合は直ぐに約定しちゃうから、キャンセル出来るのはリーブオーダーだけだよね。
   キャンセルに成功するとインバウンドで"CANCELED"が返るが、既に約定済みのときは"FILLED"が返ってくる。
 ・OrderCancelReplaceRequest:オーダー条件の変更(現時点では使いこなせず)。
 ・OrderStatusRequest:オーダーした結果を調べるのに使う。インバウンドで以下の返事が文字列で返ってくる。
   "FILLED"=約定済み
   "NEW"=Stop/Limitオーダーの約定待ち中
   "REJECTED"=ステータス取得不可(既にキャンセルされてるか発注番号※1が間違ってる)
   "EXPIRED"=リーブオーダー((逆)指値注文)の有効期限を過ぎている
   "REPLACED"=ユーザーがリーブオーダー((逆)指値注文)のレートや数量を変更した
 ・MarketDataRequest:為替レートを取得するために使ってる。
   レートが欲しくなったらその度にアウトバウンドすることも出来るけど、そうするとOANDAサーバーに負荷がかかると思うんで自動取得を使ってる。
   自動取得ではレートが変化すると勝手にレートを送ってくるんだけど、一度にまとめて送ってこない。
   先にBID(売)レート、続いてASK(買)レートを送ってくるので、ASKレートを受信してからスプレッドを計算する。

 ※1 発注番号:一意な番号を作ってオーダー時に載せる。これをステータス取得やキャンセルのときに使う。オラは日時データを使ってる。

FIX仕様書のインバウンド(受信)の項目
 ・Logon:?
 ・Logout:?
 ・HeartBeat:これも良く分かってないけどDLLが適当にやってるんでしょ?動いてるから良いや(^^;
 ・ExecutionReport:オーダーやキャンセルの結果が返る。
   失敗したときはインバウンドで"REJECTED"が返るんで、これを拾ってエラー処理をする。
 ・OrderCancelReject:キャンセル注文が失敗したときに使われる。
   例えば既に約定してるオーダーをキャンセルしようとするとか、既にキャンセル済みのオーダーを再度キャンセルしたとかさ。
 ・MarketDataSnapshot:為替レートの手動での取得結果が返る。
 ・MarketDataIncrementalRefresh:為替レートの自動での取得結果が返る。

<処理の流れ>
 OANDAサーバーにメッセージを送信(アウトバウンド)すると結果が返ってくるんで、それを見て成功失敗を判断するってのが基本。
 注文が成功した場合には下表の1~7とサーバーから届く8~13をLISTに保存しておく(キャンセルやステータス取得はLISTに入れない)。
 送受信するメッセージはヘッダ+コマンド形式で最後にチェックサムが有り、区切り文字はSOHだ(詳細はFIX仕様書)。
 サーバーから届いた結果(インバウンド)は文字列に変換してから判断してる。
 通信結果はログとしてファイルに出力しておき、調査には log4fix-1.6.jar と言うツールを使ってる。
 このツールを使うとヘッダやコマンドが綺麗に表示されて見やすいんだ。

2015/2/28 追記
 発注するときにセットするもの(NewOrderSingleを使う)
 1:ClorID 一意な文字列。
 オーダーしたあとで約定したか調べたりキャンセルするのに使う。オラは今の年月日+時分秒を使ってる。
 2:Symbol 通貨の種類を指定する。文字列。
 "USD/JPY"とか"EUR/USD"とか売買したい通貨を指定する
 3:Side 売りか買いかの指定。1文字。
 売り='2'、買い='1'。
 4:Ordtype 成行や指値の指定。1文字。
 指値(LIMIT)='2',  成行(MARKET)='1',  逆指値(STOP)='3'。
 5:OrdQty オーダー数量。Decimal。
 OANDAでは1通貨単位でオーダー可能だ。
 6:Limit 指値の価格。Decimal。
 現レートが\100として「買」なら\99、「売」なら\101とかで発注する。

 間違って「\101で買い」とか発注すると即座に約定しちゃうよ(「Limit買」は指定価格以下なら買うという意味)。
 7:Stop 逆指値の価格。Decimal。
 現レートが\100として「買」なら\101、「売」なら\99とかで発注する。

 間違って「\99で買い」とか発注すると即座に約定しちゃうよ(「Stop買」は指定価格以上なら買うという意味)。
 オラは順張りのブレーク狙いなんで、専らこの逆指値ばっかり使ってる。

 OANDAサーバーからの返事
 メッセージを送信するとOANDAサーバーから返事の文字列が来る(OSV_Res)
 8:REJECTED 受け付けなかった。メッセージがまともじゃない。そんな注文は聞いてない。
 ・ClorIDが間違ってる。オーダーしたときのClorIDしか受け付けない
 ・キャンセル済みの注文を再度キャンセルしようとした
 ・キャンセル済みの注文を調べようとした
 とかをするとこれが来る。
 9:NEW リーブオーダー(指値か逆指値)の注文を受け付けた。
 間違って変な価格でオーダーすると約定してしまいFILLEDが返ってくる。
 10:FILLED 約定した。
 既に約定しているオーダーをキャンセルしようとした場合もこれが返る。
 また約定すると約定番号も返ってくる(OSV_Oid)。
 11:CANCELED オーダーを取り消した。
 12:EXPIRED 有効期限切れ。
 13:REPLACED 変更済み。

 オーダーをキャンセルするときにセットするもの(OrderCancelRequestを使う)
 上の表の1~7とサーバーから届いた約定番号(OSV_Oid)をメッセージにして送信する。
 約定番号はClorIDが重複してる場合にオーダーを区別するのに使うものなので、ここではClorIDは常に一意なので実は不要なのだ。

 為替レートの取得にはMarketDataRequestを使ってる。
 リーブオーダー((逆)指値注文)が約定したかどうかを調べるために、OrderStatusRequestを使ってる。

 と言う事で、今は「一発で全部決済する」ってのを製造中。
 リーブオーダー((逆)指値注文)を動的に変更できると便利なんで、これも作らないとだな。
 自動化はそのあとで。



2015/3/6 追記
 全決済が完成。
 全決済の動作だけど「リーブオーダーはキャンセルし、約定したオーダーには逆の売買」をしてみた。

 STOPやLIMITを動的に上下に変化させるボタンもできた。
 ただOrderCancelReplaceRequestが上手く使えないので、現時点では「キャンセルして再発注」ということでごまかしてます。
 大体の動作はできてきたので、検証のために暫く使ってみる。




2015/3/14 追記
 デモ口座で自動売買の実験をしてみた。
 それなりに動き、それなりに損した(爆)
 やっぱり自分で真剣に売買してるようには行かないね~
 どこでエントリーしてどこでエグシットしたかを見ると要領が悪くていやんなっちゃう(笑)

 ところであちこち調べてたらFXDDでJForexってのを発見。
 Javaでプログラムする必要があるけどJForexで作り直そうかな?
 FXDDには大分前にMT4の口座を作ってあるんで、試しにJForexの口座も追加申請してみた(ここの真ん中辺から申請した)。

 今はOANDAのFIXをC#でプログラムしてるんだけどFIXで出来ない事が結構ある。
 一番不便なのが「一括決済」が出来ないこと。
 RESTを使えば良いんだけどどうしよう?

 OANDAの長所短所
  スプレッド0.3pipで倍率は25倍。
  ツールが使いやすい。
  なんとなく「良い感じ」・・・これ大事。

 FXDDの長所短所
  スプレッド0.2pip+手数料0.35pip=0.55pipとちょい高いけど、倍率は200/400倍。
  例のスイスフラン騒ぎのような事があっても平気なはず(預けてる金以上の損失はFXDDが被る事になってる)。
  なんちゅうか日本語化がしっかりされてなくて雑な感じがして取っつきにくい・・・これ厳しい(^^;

 今度はJForexで遊んでみようかな~
 せっかくFIXに慣れたのにJavaのお勉強がだるいな~微妙。



2015/3/17 追記
 デモ口座での自動売買の続き。
 一晩中動かしておいたら安定して損するようになった(爆)
 でもこれってつまり動作を逆にすればいつも得するってことだよね?
 で、逆にしてみた。
 なんか良い感じ。
 これで数日動かしてみよっと・・・ま、こつこつやってればそのうち何とかなるっしょ。




2015/3/21 追記
 RESTサーバを使ってみた。
 はるかに使いやすい。
 DLLを入れなくて良いし、コードもずっと簡単。それにリクエストの種類もかなり多い。
 FIXサーバはレートをPushで勝手に送ってきてくれるんだけど、他に特にメリットを感じないんだよね。
 RESTサーバではレートが欲しくなる度にリクエストを出す方式で、1秒間に15回までと言う制限がある。
 でも15回もリクエストできるなら十分なりよ。
 FIXサーバの部分はもういじらないつもりなので、この項はこれにて終わり。