oanadapyV20의 주문/위치서 재구성 사용

7678 단어 OandaPythonFX

1. 시작


투자bot을 제작할 때 많은 사람들이 가격(+생산량)만 사용하고 싶어요.하지만 이용할 수 있는 데이터는 이뿐만이 아니다.예를 들어 주문 상황과 소지 위치의 상황 등을 고려할 수 있다.
이번에 FX거래소 odanda에서 주문서와 위치의 데이터(주문서·위치서)를 꺼내 가공도구를 제작해 공유했다.

2. 주문서·위치서는


주문서는 아직 약정하지 않은 주문이 비율에 따라 얼마나 되는지 가리킨다.
개방 위치는 현재 보유하고 있는 위치의 환율이 얼마인지를 나타낸다.
작은 곳은 링크에서oda로 날아가는 사이트에서 확인하세요.

( https://www.oanda.jp/lab-education/oanda_lab/oanda_rab/open_position/ )

3. 다다나에 관한 책


odanda에서 최근 한 달 동안 50만 달러 이상의 거래를 했고 주문서와 위치서는 5분에 한 번씩 갱신되었다.이 주파수는 인터넷에서 보거나api로 얻을 때 변화가 없다.
단순히 계좌를 개설하면 갱신 빈도가 20분에 한 번씩 낮아진다.그럼에도 불구하고 고주파 거래를 하지 않는다면 주파수를 갱신하기에 충분하다.
또 계좌 개설과 앱키 취득은 설명이 없다.

4. 본체


oda 사이트에서 볼 수 있는 오픈 주문서는 오픈 주문서의 스냅숏 제작 시간의 비율을 중심으로 일정 폭(달러라면 0.05엔당) 간격으로 펼쳐진다.
그러나api를 통해 얻은 데이터는 그렇지 않습니다.주문서에는 달러=0엔에서 1달러=200엔을 포함해 현실적으로 있을 수 없는 광범위한 환율 정보가 담겨 있다.또 개방 주문센터의 환율은 끊임없이 변동할 것이다.따라서 직접 분석한 데이터도 오픈오더를 제작할 때의 속도와 얼마나 차이가 나는지 알 수 없다.
따라서 이번에는 중심의 환율과 거리를 직관적으로 파악할 수 있도록 데이터 수집과 가공 코드를 준비했다.
accountID 및 accessToken을 자신의 물건으로 바꾸어 사용하세요.

또 2017년 1월 20일 이전의 수치는 존재하지 않는 것으로 보인다.또 시간당 책 한 권을 사는 데 약 20~30분이 걸린다.
def fetch_orderbook(instrument="USD_JPY", levels = 5, timeframe="15m"):
  '''
  instrument : 通過ペアの名前
  levels : 中心のレートからいくつまで上(下)を取得するか, >0
  timeframe : 何分毎にブックを取得するか, "m":minute, "H":hour, "D":day, >="5m"
              ex) "1H":1時間ごとに取得, "2D":1日ごとに取得
  '''
  accountID = "×××-×××-×××-×××"
  access_token ="××××××××××××"
  api = API(access_token=access_token, environment="live")

  if timeframe[-1]=="m":
    diff = 60 * int(timeframe[:-1])
  elif timeframe[-1]=="H":
    diff = 60 * 60 * int(timeframe[:-1])
  elif timeframe[-1]=="D":
    diff = 60 * 60 * 24 * int(timeframe[:-1])

  timestamp = datetime.datetime(year=2017, month=1, day=20)
  now = datetime.datetime.utcnow()
  processed_book, book_timestamps = [], []
  counter = 0
  start = datetime.datetime.utcnow()
  while True:
    try:
      #現在まで取得し終わったら終了
      if now < timestamp:
        break
      #サーバーへの過剰なアクセスの防止およびログ出力
      counter+=1
      if counter%100==0:
        print(timestamp, datetime.datetime.utcnow()-start)
        start = datetime.datetime.utcnow()
        counter=0
        time.sleep(1)

      #orderbookの取得
      r=instruments.InstrumentsOrderBook(instrument=instrument, params={"time":timestamp.strftime("%Y-%m-%dT%H:%M:00Z")})
      api.request(r)
      book_created_rate, buckets, book_created_time = float(r.response["orderBook"]["price"]), r.response["orderBook"]["buckets"], r.response["orderBook"]["time"]
      #book作成時のレートに近いindexの取得
      bucket_rate = [round(float(b["price"]), 2) for b in buckets]
      upper_idx = np.searchsorted(bucket_rate, book_created_rate)
      lower_idx = upper_idx - 1
      #現在価格からlevels分離れたのを追加
      row_book = [book_created_rate]
      for i in range(levels):
        upper, lower = buckets[upper_idx + i], buckets[lower_idx - i]
        bucket = [upper["price"], upper['longCountPercent'], upper['shortCountPercent'], 
                  lower["price"], lower['longCountPercent'], lower['shortCountPercent']]
        bucket = [float(num) for num in bucket]
        row_book.extend(bucket)
      processed_book.append(row_book)
      book_timestamps.append(book_created_time)
    except:
      #土日
      pass
    timestamp+=datetime.timedelta(seconds = diff)


  #columの名前
  column_names = ["rate"]
  for i in range(levels):
    column_names.extend(["price_+{}".format(i+1), "OrderLongPercent_+{}".format(i+1), "OrderShortPercent_+{}".format(i+1),
    "price_-{}".format(i+1), "OrderLongPercent_-{}".format(i+1), "OrderShortPercent_-{}".format(i+1)])

  #データの結合
  orderbook = pd.DataFrame(processed_book, columns=column_names, index=book_timestamps)
  return orderbook
위치책도 마찬가지고요.
def fetch_positionbook(instrument="USD_JPY", levels = 5, timeframe="15m"):
  '''
  instrument : 通過ペアの名前
  levels : 中心のレートからいくつまで上(下)を取得するか, >0
  timeframe : 何分毎にブックを取得するか, "m":minute, "H":hour, "D":day, >="5m"
              ex) "1H":1時間ごとに取得, "2D":1日ごとに取得
  '''
  accountID = "×××-×××-×××-×××"
  access_token ="××××××××××××"
  api = API(access_token=access_token, environment="live")

  if timeframe[-1]=="m":
    diff = 60 * int(timeframe[:-1])
  elif timeframe[-1]=="H":
    diff = 60 * 60 * int(timeframe[:-1])
  elif timeframe[-1]=="D":
    diff = 60 * 60 * 24 * int(timeframe[:-1])

  timestamp = datetime.datetime(year=2017, month=1, day=20)
  now = datetime.datetime.utcnow()
  processed_book, book_timestamps = [], []
  counter = 0
  start = datetime.datetime.utcnow()
  while True:
    try:
      #現在まで取得し終わったら終了
      if now < timestamp:
        break
      #サーバーへの過剰なアクセスの防止およびログ出力
      counter+=1
      if counter%100==0:
        print(timestamp, datetime.datetime.utcnow()-start)
        start = datetime.datetime.utcnow()
        counter=0
        time.sleep(1)

      #positionbookの取得
      r=instruments.InstrumentsPositionBook(instrument=instrument, params={"time":timestamp.strftime("%Y-%m-%dT%H:%M:00Z")})
      api.request(r)
      book_created_rate, buckets, book_created_time = float(r.response["positionBook"]["price"]), r.response["positionBook"]["buckets"], r.response["positionBook"]["time"]
      #book作成時のレートに近いindexの取得
      bucket_rate = [round(float(b["price"]), 2) for b in buckets]
      upper_idx = np.searchsorted(bucket_rate, book_created_rate)
      lower_idx = upper_idx - 1
      #現在価格からlevels分離れたのを追加
      row_book = [book_created_rate]
      for i in range(levels):
        upper, lower = buckets[upper_idx + i], buckets[lower_idx - i]
        bucket = [upper["price"], upper['longCountPercent'], upper['shortCountPercent'], 
                  lower["price"], lower['longCountPercent'], lower['shortCountPercent']]
        bucket = [float(num) for num in bucket]
        row_book.extend(bucket)
      processed_book.append(row_book)
      book_timestamps.append(book_created_time)
    except:
      #土日
      pass
    timestamp+=datetime.timedelta(seconds = diff)


  #columの名前
  column_names = ["rate"]
  for i in range(levels):
    column_names.extend(["price_+{}".format(i+1), "PositionLongPercent_+{}".format(i+1), "PositionShortPercent_+{}".format(i+1),
    "price_-{}".format(i+1), "PositionLongPercent_-{}".format(i+1), "PositionShortPercent_-{}".format(i+1)])

  #データの結合
  positionbook = pd.DataFrame(processed_book, columns=column_names, index=book_timestamps)
  return positionbook

5. 마지막


소개해 드렸는데 이쪽 데이터 조합만bot이 어려울 것 같아요.(수수료가 없으면) 나는 이길 수 있는 곳으로 갈 수 있지만 아무리 해도 연장금을 받지 못한다.아마 시간의 로즈마리와 함께 하면 잘 될 것 같은데...?

좋은 웹페이지 즐겨찾기