#!/usr/bin/env python
# -*- coding: utf-8 -*-
import talib
import cross_order as order
import time
import numpy as np

"""
鳄鱼线原理:
    鳄鱼线是根据几何学以及非线性动力学总结出来的一套技术分析方法,当鳄鱼的下巴、牙齿和上唇闭合,或者相互纠缠时,代表鳄鱼睡着啦。
    这时我们通常待在市场外面,直到碎形出现,这样我们就可以原理不确定的市场,并且只参与明显的趋势行情。
    当鳄鱼睡觉时间越长,醒来时就会越饿,所以一旦醒来,就会张大嘴巴。如果上唇在牙齿以上,牙齿在下巴以上,表明市场进入多头行情,鳄鱼要吃牛肉了。
    如果上唇在牙齿以下,牙齿在下巴以下,表明市场进入空头行情,鳄鱼要吃熊肉了。直到吃饱为止,之后它会再次闭上嘴巴(持有并获取利润)。
鳄鱼线计算公式:
    上唇 = REF(SMA(VAR1,5,1),3)
    牙齿 = REF(SMA(VAR1,8,1),5)
    下巴 = REF(SMA(VAR1,13,1)
"""


def main():
    print("任务开始时间:", time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time())))

    for symbol in order.symbol_pool:
        # 设置杠杆倍数
        order.set_leverage(symbol=symbol, leverage='25')
        # 获取标的的最新价
        data = order.get_candlesticks(symbol=symbol, interval='15m', limit=str(140))
        if len(data) < 22:  # 如果K线数量小于22根
            return
        # 计算
        np_arr = np.array(data['close'])  # 转换收盘价数组
        sma13 = talib.SMA(np_arr, 130)[-9]  # 下巴
        sma8 = talib.SMA(np_arr, 80)[-6]  # 牙齿
        sma5 = talib.SMA(np_arr, 50)[-4]  # 上唇
        current_price = data['close'].values[-1]  # 最新价格

        # 获取标的可平多仓
        long_closeable_amount = order.get_long_positions(symbol=symbol)
        print('可平多仓:' + str(long_closeable_amount))
        # 获取标的可平空仓
        short_closeable_amount = order.get_short_positions(symbol=symbol)
        print('可平空仓:' + str(short_closeable_amount))

        # 如果没有持仓
        if (short_closeable_amount == 0) and (long_closeable_amount == 0):
            if current_price > sma5:  # 如果当前价格大于上唇 开多单
                order.up_cross_order(symbol=symbol, ordtype='market', message='如果当前价格大于上唇: 开多单')
            elif current_price < sma13:  # 如果当前价格小于下巴 开空单
                order.down_cross_order(symbol=symbol, ordtype='market', message='如果当前价格小于下巴: 开空单')
        # 如果当时持有多仓,则先平仓,再开空仓;
        elif long_closeable_amount != 0:
            if current_price < sma8:  # 如果当前价格小于牙齿
                order.close_positions(symbol=symbol, side='sell', positionside='long', message='如果当前价格小于牙齿: 平多单')
        # 如果当时持有空仓,则先平仓,再开多仓;
        elif short_closeable_amount != 0:
            if current_price > sma8:  # 如果当前价格大于牙齿
                order.close_positions(symbol=symbol, side='buy', positionside='short', message='如果当前价格大于牙齿: 平空单')

        time.sleep(5)

    print("任务结束时间:", time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time())))


if __name__ == '__main__':
    print("程序运行时间:", time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time())))
    main()