from jesse.strategies import Strategy
import jesse.indicators as ta
from jesse import utils


class SmaCrossTutorial(Strategy):
    """
    튜토리얼용 SMA 교차 전략. 어떤 매매 의견도 아니며,
    몬테카를로에 태울 '매매 목록'을 만들기 위한 예제일 뿐이다.
    """

    @property
    def fast(self):
        return ta.sma(self.candles, 20, sequential=True)

    @property
    def slow(self):
        return ta.sma(self.candles, 50, sequential=True)

    def should_long(self) -> bool:
        return utils.crossed(self.fast, self.slow, direction='above')

    def should_short(self) -> bool:
        return False

    def should_cancel_entry(self) -> bool:
        return True

    def go_long(self):
        entry = self.price
        self.stop_price = entry - ta.atr(self.candles) * 2
        qty = utils.risk_to_qty(self.available_margin, 3, entry, self.stop_price,
                                fee_rate=self.fee_rate)
        self.buy = qty, entry

    def on_open_position(self, order):
        # 스팟에서는 손절을 go_long() 이 아니라 여기서 걸어야 한다.
        self.stop_loss = self.position.qty, self.stop_price

    def update_position(self):
        if utils.crossed(self.fast, self.slow, direction='below'):
            self.liquidate()
