その他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に入れる時の方法を忘れないうちにメモ。
まだ 全部の関数を試してないけど良いんじゃない。 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日で終わったような気がする(^^; |
自動カネ稼ぎマシン(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を使うんだと 2 3 昔のやり方が良ければ WebRequestの使い方1 2 WebClientの使い方 POSTの使い方1 2 3 <サーバから受信するJSON文字列の処理> 超軽量なDyanamicJsonのソースそのもの DLと使い方はここ 2 作者の解説記事 DLLを使うなら DynamicJson.DLLを使う1 DLはここ 昔のやり方でJSON.NETでやるなら C#でJSONを使う1 2 3 <その他> Chromeのデベロッパーツールの使い方 C#のAPIラッパーソース HttpClientと言う便利なものが有るって知らなかったんで昔の書き方なり。 EUR/USDとUSD/JPYのレートをRESTサーバから取得してる。 参照設定の追加分 "System.Web" "System.Runtime.Serialization"。 なおVisualStudioはデバッグ中に変数をJSONフォーマットで表示できるから、送受信の確認だけなら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上のプログラミングは至れり尽くせりで、これでまたつらい組み込みの仕事に戻れるか心配だよ。 そろそろ本気で売買をするつもりなんで本番口座へもアクセスしてる。売買の様子はこちらです。
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を使う)
OANDAサーバーからの返事 メッセージを送信するとOANDAサーバーから返事の文字列が来る(OSV_Res)
オーダーをキャンセルするときにセットするもの(OrderCancelRequestを使う)
為替レートの取得には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サーバの部分はもういじらないつもりなので、この項はこれにて終わり。 |
||||||||||||||||||||||||||||