
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 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'])



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


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

# 取引ペア
get_setting_url=keys["get_setting_url"]

# 実行クラス
ticker = EXEC_TICKER()
logic  = EXEC_LOGIC()
position_flg = 0
exit_position_flg = 0

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:    
        # 終値の取得
        close_price = ticker.get_ticker()

        # ロジッククラスの判定
        info = logic.exec_rsi(close_price)
        position_flg = info[0]
        rsi = info[1]
        memo = info[2]

    except Exception as e:

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


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



    # ノーポジションからエントリー
    # 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"])
            # 注文id
            position=order['id']
            print('ポジションを取りました：'+ str(order['id']))
            print(order)
        except Exception as e:
            # APIエラー
            print(common.failure(e))
            print('3.ポジションの取得に失敗しました。APIエラーのため再実行します')
            print(str(keys["crawling_time"])+"秒待機")
            time.sleep(keys["crawling_time"])
            position=None



    print('#30.価格、RSIの取得')
    try:
        #取引所の現在の価格
        tic = exchange.fetch_ticker(keys["symbol"])
        tic['rsi'] = rsi
        tic['memo'] = memo
        if(order != None):
            tic['order_id'] = order['id']

        # print(tic)
        r = requests.post(get_setting_url,tic)
        json_data = r.json()
        # print(json_data)

        publish_flg = json_data['publish_flg']
        # print(json_data['publish_flg'])

        if(publish_flg == 1):
            print("処理続行")
        else:
            print("公開フラグが0のため処理を行いません")
            # time.sleep(keys["crawling_time"])
            # continue


        print(str(keys["crawling_time"])+"秒待機")
        time.sleep(keys["crawling_time"])
    except Exception as e:
        print('=== エラー内容 ===')
        print(common.failure(e))


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











    #40.ポジション持ちの場合
    while position:
        print('#40.ポジション持ちの場合')
        print(str(keys["crawling_time"])+"秒待機")
        time.sleep(keys["crawling_time"])

        try:
            # 終値の取得
            close_price = ticker.get_ticker()
            # ロジッククラスの判定
            # exit_position_flg=logic.exec_exit_rsi(close_price,position_flg)
            # print(exit_position_flg)

            # ロジッククラスの判定
            info = logic.exec_exit_rsi(close_price,position_flg)
            exit_position_flg = info[0]
            rsi = info[1]
            memo = info[2]

            # print(exit_position_flg)
            
        except Exception as e:
            print('=== エラー内容 ===')
            print(common.failure(e))
            print('２．価格の取得に失敗しました。APIエラーのため再実行します')
            time.sleep(keys["crawling_time"])

        if exit_position_flg + position_flg == 0:

            try:
                # 注文指定
                if   exit_position_flg ==  1: position='buy'
                elif exit_position_flg == -1: position='sell'
                # 発注
                order = exchange.create_order(symbol, type='market', side=position, amount=keys["lot"])
                print('ポジションをクローズします')
                print(order)
                position=None
                position_flg=0
                exit_position_flg=0
            except Exception as e:
                # APIエラー
                print('=== エラー内容 ===')
                print(common.failure(e))                
                print('ポジションのクローズに失敗しました。APIエラーのため再実行します')
        else :
            exit_position_flg=0



        #取引所の現在の価格
        print('#50.価格、RSIの取得')
        tic = exchange.fetch_ticker(keys["symbol"])
        tic['rsi'] = rsi
        tic['memo'] = memo
        tic['order_id'] = order['id']

        r = requests.post(get_setting_url,tic)
        json_data = r.json()
        print(json_data)

        publish_flg = json_data['publish_flg']
        # print(json_data['publish_flg'])

        if(publish_flg == 1):
            print("処理続行")
        else:
            print("公開フラグが0のため処理を行いません")
            # time.sleep(keys["crawling_time"])
            # continue
