import multiprocessing
import os
import signal
import time

import bitbank


def main():
  procs = [*bitbank.init()]
  while True:
    for i in range(len(procs)):
      procs[i].tick()
    time.sleep(1)

def on_exit(sig):
  print(f"received {sig}")

proc = multiprocessing.Process(target = main)
proc.start()
signal.signal(signal.SIGTERM, on_exit)
signal.pause()
proc.join()


# while True:
#   print("start tick")
# 
# # ---- get assets
#   assets = pri.get_asset()["assets"]
#   onhand = {}
#   locked = {}
#   for i in range(len(assets)):
#     coin = assets[i]["asset"]
#     onhand[coin] = float(assets[i]["onhand_amount"])
#     locked[coin] = float(assets[i]["locked_amount"])
# 
# # ---- get current price
#   candles       = pub.get_candlestick("btc_jpy", "1min", now.strftime("%Y%m%d"))["candlestick"][0]["ohlcv"];
#   latest_candle = candles[len(candles)-1]
#   begin = int(latest_candle[0])
#   high  = int(latest_candle[1])
#   low   = int(latest_candle[2])
#   end   = int(latest_candle[3])
# 
# # ---- cancel existing orderes
#   prev_orders   = pri.get_active_orders("btc_jpy")["orders"]
#   cancel_orders = []
#   for i in range(len(prev_orders)):
#     id     = prev_orders[i]["order_id"]
#     status = prev_orders[i]["status"]
#     side   = prev_orders[i]["side"]
#     price  = int(prev_orders[i]["price"])
# 
#     if status == "UNFILLED":
#       diff = abs(end-price)/end
#       if side == "buy":
#         if diff < -0.0005:
#           cancel_orders.append(str(id))
#       elif side == "sell":
#         if diff > 0.003:
#           cancel_orders.append(str(id))
# 
#   if len(cancel_orders) > 0:
#     pri.cancel_orders("btc_jpy", cancel_orders)
#     print("cancelled", len(cancel_orders), "orders")
#   if len(prev_orders)-len(cancel_orders) > 8:
#     print("skip making an order because there are too many orderes")
#     time.sleep(30)
#     continue
# 
# # ---- get transactions
#   trans    = pub.get_transactions("btc_jpy")["transactions"]
#   buy_min  = low
#   sell_max = high
#   for i in range(len(trans)):
#     exec_at = datetime.datetime.fromtimestamp(trans[i]["executed_at"]/1000)
#     side    = trans[i]["side"]
#     price   = int(trans[i]["price"])
#     if now-exec_at < datetime.timedelta(minutes=1):
#         if side == "buy":
#           buy_min = min(buy_min, price)
#         elif side == "sell":
#           sell_max = max(sell_max, price)
# 
# # ---- make an order
#   buy_coe = 0.5
#   ben_coe = 0.8
# 
#   diff = (end-begin)/end
#   if diff > 0.002:
#     buy_coe -= clamp(100*diff/end, 0, 1)*0.2
#   elif diff < -0.002:
#     buy_coe += clamp(100*diff, 0, 1)*0.2
# 
#   print("buy-min:", buy_min, "| sell-max:", sell_max, "| diff:", sell_max-buy_min)
#   diff = sell_max-buy_min
#   avg  = (sell_max+buy_min)/2
# 
#   buy_price  = avg - diff*buy_coe*ben_coe
#   sell_price = avg + diff*(1-buy_coe)*ben_coe
# 
#   buy_jpy  = max((onhand["jpy"]-locked["jpy"])*0.1, (onhand["btc"]-locked["btc"])*end*0.1)
#   buy_btc  = buy_jpy/buy_price
#   sell_jpy = buy_btc*sell_price
#   sell_btc = buy_btc
# 
#   try:
#     pri.order("btc_jpy", str(buy_price), str(buy_btc), "buy", "limit", True)
#     print("[buy] btc:", buy_btc, "| jpy:", -buy_jpy, "| price:", buy_price)
#   except Exception as e:
#     print(e)
# 
#   try:
#     pri.order("btc_jpy", str(sell_price), str(sell_btc), "sell", "limit", True)
#     print("[sel] btc:", -sell_btc, "| jpy:", sell_jpy, "| price:", sell_price)
#   except Exception as e:
#     print(e)
# 
#   time.sleep(10)