
import ccxt
import time
# from config import Apiconfig    as  api
# from config import Tradeconfig  as  tra

from ExecLogic import EXEC_LOGIC
from ExecTicker import EXEC_TICKER

import common
import OrderLogic
import json
import sys
import requests
from pprint import pprint
import slackweb
from datetime import datetime as dt


#https://cryptocurrencychudoku.hatenablog.com/entry/2018/03/21/180558

# ロード処理
keys_json = open('config.json', 'r')
keys = json.load(keys_json)

slack = slackweb.Slack(url=keys['slack_webhook_url'])

SLACK_NOTIFY_FLG=1

# APIキー
exchange = ccxt.binance({
    'apiKey': keys["api_key"],
    'secret': keys["api_secret"],
    #先物有効化
    "options": {"defaultType": "future"},
    #レバレッジ許容
    "enableRateLimit": True, 
})


# 取引ペア
# symbol = keys["symbol"]
# amount = keys["lot"]

# 取引ペア
get_bot_setting_url = keys["get_bot_setting_url"]
update_ticker_url = keys["update_ticker_url"]
# 実行クラス
ticker = EXEC_TICKER()
logic  = EXEC_LOGIC()
position_flg = 0
exit_position_flg = 0
limit_price=0
close_price=0
crawling_time=60
while 1==1:
    print('処理START' + dt.now().strftime("%Y-%m-%d %H:%M:%S"))
    # time.sleep(keys["crawling_time"])

    # 初期ポジション
    position=None
    order=None

    #10.価格、RSIの取得
    print('#10.価格、RSIの取得')
    
    try:    

        r = requests.get(get_bot_setting_url)
        json_data = r.json()



        symbol = json_data["symbol"]
        amount = json_data["lot"]
        publish_flg = json_data["publish_flg"]
        crawling_time = json_data["crawling_time"]

        print('symbol:' + symbol + ' - lot:' + str(amount) + ' - 稼働フラグ:' + str(publish_flg) + ' - 待機秒:' + str(crawling_time) + ' - ' +  dt.now().strftime("%Y-%m-%d %H:%M:%S"))

 
        #取引所の現在の価格
        tic = exchange.fetch_ticker(symbol)

        r = requests.post(update_ticker_url,tic)
        json_data = r.json()

        #注文中
        orders = exchange.fapiPrivate_get_openorders()
        for order in orders:
            # print(order)
            order_id = order['clientOrderId']
            order_side = order['side']


        if   position_flg ==  1: position='buy'
        elif position_flg == -1: position='sell'



        position_flg = -1
        limit_price = tic['last']

        if position_flg == 1:
            close_price = tic['last'] + 50
        else:
            close_price = tic['last'] - 50


    except Exception as e:

        print('=== エラー内容 ===')
        print(common.failure(e))


        print('１．価格の取得に失敗しました。APIエラーのため再実行します。')
        print(str(crawling_time)+"秒待機")
        time.sleep(crawling_time)

    if position_flg == 1:
        side_str = "BUY"
    else:
        side_str = "SELL"
    # print(symbol)
    print("last:" + str(tic['last']) + " - symbol:" + symbol + " - SIDE:" + side_str + " - 注文価格:" + str(limit_price) + " - 閉じる価格:" + str(close_price) + " - " + dt.now().strftime("%Y-%m-%d %H:%M:%S"))
    # print("symbol:" + str(symbol) + " - SIDE:" + str(side_str) )
    # print(symbol)
    



    # #取引履歴
    # data = exchange.fapiPrivate_get_usertrades()


    # pprint( data )
    # sys.exit()




    if len(orders) == 0:
        # ノーポジションからエントリー
        # 1=buy 0=sell
        if position_flg == 1 or position_flg == -1 :
            print('#20.ノーポジションからエントリー')
            try:
                # 注文指定
                if   position_flg ==  1: position='buy'
                elif position_flg == -1: position='sell'
                # 発注


                print('ポジションを取ります')
                # order = exchange.create_order(symbol, type='market',side=position, amount=keys["lot"])

                order = OrderLogic.create_ifd_order(exchange,symbol,position,amount,limit_price,close_price)
                
                
                # 注文id
                position=order['id']
                message ='ポジションを取りました：'+ str(order['id']) 
                print(message)
                print(order)


                if SLACK_NOTIFY_FLG == 1:
                    slack.notify(text=message)



            except Exception as e:
                # APIエラー
                print(common.failure(e))
                print('3.ポジションの取得に失敗しました。APIエラーのため再実行します')
                print(str(keys["crawling_time"])+"秒待機")
                time.sleep(keys["crawling_time"])
                position=None
    else:
        print("ポジションをもっているため待機のみ")


    print(str(crawling_time)+"秒待機")
    time.sleep(crawling_time)


