callmekohei's blog

callmekoheiのひとりごと

OANDA API を使ってトレード回数表を作ってみたった

f:id:callmekohei00:20170813140152p:plain

Summary

月度毎のトレード回数表を作成する

作成方法その1

ログイン > 口座管理 > 各種帳票ダウンロード > 取引履歴

で一ヶ月毎の帳票を出力して作成する

(よろしくないところ)
すごく手間がかかる

作成方法その2

REST APIを使用する

必要なもの

wget

jq

OANDAfs

wget, jqbrew install wget, brew install jqでもってこれます。

OANDAfsこちらから

トランザクションのデーターをもってくる

こんな感じ

#load "./oandafs.fsx"
open callmekohei
open callmekohei.Oandafs
let env   = Environment.Live
let id    = "xxxxx"
let token = "xxxxx"
let info  = API().Init( env, id, token )

Transaction(info).Get_all_transactions()
|> printfn "%A"

結果

Server: openresty/1.9.15.1
Date: Sun, 13 Aug 2017 05:06:54 GMT
Content-Type: application/json
Content-Length: 0
Connection: keep-alive
Location: https://fxtrade.oanda.com/transactionhistory/xxxxx.json.zip
Access-Control-Allow-Origin: *

ここでLocationに示されたアドレスからzipフィアルをげっつ

$ wget https://fxtrade.oanda.com/transactionhistory/xxxxx.json.zip

$ unzip xxxxx.json.zip
月度のトランザクションの総数を求める

こんなかんじ

$ cat abc.json \
> | jq 'map(select(.["time"] >= "2017-06-01T00:00:00Z")) | map(select(.["time"] <="2017-06-31T00:00:00Z"))' \
> | jq '.[] | .accountId' \
> | wc -w
     198
月度のトランザクションのタイプ別個数を求める

こんなかんじ

ここで先程のトランザクションの総数とタイプ別の個数の総数が一致しているか一応確認しておく

$ cat abc.json | jq 'map(select(.["time"] >= "2017-06-01T00:00:00Z")) | map(select(.["time"] <="2017-06-31T00:00:00Z"))' \
> | jq '.[] | .type' | sort | uniq -c | sort -r
 129 "MARKET_ORDER_CREATE"
  22 "MARGIN_CLOSEOUT"
  14 "DAILY_INTEREST"
   9 "ORDER_UPDATE"
   7 "TRANSFER_FUNDS"
   6 "ORDER_CANCEL"
   5 "BuyLimit"
   2 "ChangeOrder"
   1 "SellLimit"
   1 "ORDER_FILLED"
   1 "CloseOrder"
   1 "BuyStop"
月度の新規注文数を求める

こんなかんじ

$ cat abc.json | jq 'map(select(.["time"] >= "2017-06-01T00:00:00Z")) | map(select(.["time"] <="2017-06-31T00:00:00Z"))' \
> | jq '.[] | .tradeOpened.id' | sort | uniq | wc -w | awk '{print $1}'
73
月度の決済数を求める

こんなかんじ

CloseTradeB
MARGIN_CLOSEOUT
MARKET_ORDER_CREATE
ORDER_FILLED

上記の合計が総注文数となるので、そこから新規注文数をひけば決済数がでます。

ここでは総注文数が152、新規注文数が73なので決済数は

152 - 73 = 79

 年間のトレード回数表を作成する

こんなかんじ

foo.bash

jsonFile=$1
Year=$2

orderTotal() {
    file=$1; start=$2; end=$3
    cat $file \
    | jq 'map(select(.["time"] >= "'$start'")) | map(select(.["time"] <= "'$end'"))' \
    | jq '.[] | .type' | sort | grep -E "CloseTradeB|MARGIN_CLOSEOUT|MARKET_ORDER_CREATE|ORDER_FILLED" \
    | wc -w | awk '{print $1}'
}

openTotal() {
    file=$1; start=$2; end=$3
    cat $file \
    | jq 'map(select(.["time"] >= "'$start'")) | map(select(.["time"] <= "'$end'"))' \
    | jq '.[] | .tradeOpened.id' | sort | uniq | wc -w | awk '{print $1}'
}

echo 'M,Total,Open,Close'

for i in $(seq -w 1 12) ; do
    fst=$Year'-'$i'-01T00:00:00Z'
    lst=$Year'-'$i'-31T00:00:00Z'

    OrderTotal=`orderTotal $jsonFile $fst $lst`
    OpenTotal=`openTotal  $jsonFile $fst $lst`

    echo $i,$OrderTotal,$OpenTotal,$(( $OrderTotal - $OpenTotal ))
done

こんな感じで使う

csvlookはsudo pip3 install csvkitでゲッツ

$ echo ./abc.json 2017 | xargs bash foo.bash | csvlook
|  M | Total | Open | Close |
| -- | ----- | ---- | ----- |
|  1 |   142 |   68 |    74 |
|  2 |    77 |   39 |    38 |
|  3 |   105 |   51 |    54 |
|  4 |   116 |   52 |    64 |
|  5 |   150 |   68 |    82 |
|  6 |   152 |   73 |    79 |
|  7 |     0 |    0 |     0 |
|  8 |     2 |    3 |    -1 |
|  9 |     0 |    0 |     0 |
| 10 |     0 |    0 |     0 |
| 11 |     0 |    0 |     0 |
| 12 |     0 |    0 |     0 |