from vnpy_ctastrategy import (
    CtaTemplate,
    StopOrder,
    TickData,
    BarData,
    TradeData,
    OrderData,
    BarGenerator,
    ArrayManager,
)
import talib
class MacdStrategy(CtaTemplate):
    """"""
author = "alxbj"
macd = 0
signal = 0
hist = 0
roc = 0
fast_period = 12
slow_period = 26
signal_period = 9
#参数
parameters = [
    "fast_period",
    "slow_period",
    "signal_period",
]
#变量
variables = [
    "macd",
    "signal",
    "hist"
]
def __init__(self, cta_engine, strategy_name, vt_symbol, setting):
    """"""
    super().__init__(cta_engine, strategy_name, vt_symbol, setting)
    self.bg = BarGenerator(self.on_bar)
    self.am = ArrayManager()
def on_init(self):
    """
    Callback when strategy is inited.
    """
    self.write_log("策略初始化")
    self.load_bar(10)
def on_start(self):
    """
    Callback when strategy is started.
    """
    self.write_log("策略启动")
def on_stop(self):
    """
    Callback when strategy is stopped.
    """
    self.write_log("策略停止")
def on_tick(self, tick: TickData):
    """
    Callback of new tick data update.
    """
    self.bg.update_tick(tick)
def on_bar(self, bar: BarData):
    """
    Callback of new bar data update.
    """
    self.cancel_all()
    am = self.am
    am.update_bar(bar)
    if not am.inited:
        return
    # 用arraymanager内置的macd获取函数生成指标数据
    self.macd,self.signal,self.hist = am.macd(
                                            self.fast_period, 
                                            self.slow_period, 
                                            self.signal_period,
                                            array=False)
    self.roc = am.roc(14,array=False)                    
    print('date:',bar.datetime.strftime( '%Y-%m-%d' ),
    'close:',bar.close_price)
    print('am.talib',self.roc,self.macd,self.signal,self.hist)
    # 直接用talib获取macd指标数据
    close = self.am.close_array
    macd,signal,hist = talib.MACD(close, 12, 26, 9)
    roc = talib.ROC(close,14)
    print('talib   ',roc[-1],macd[-1], signal[-1], hist[-1])
    print('-------------------------------------------------------------------')
    self.put_event()
def on_order(self, order: OrderData):
    """
    Callback of new order data update.
    """
    pass
def on_trade(self, trade: TradeData):
    """
    Callback of new trade data update.
    """
    self.put_event()
def on_stop_order(self, stop_order: StopOrder):
    """
    Callback of stop order update.
    """
    pass