En la carga de los recursos... Cargando...

La estrategia de escape del MACD

El autor:Programación, Fecha: 2022-04-09 21:23:14
Las etiquetas:

La historia es muy interesante.Venta de monedas de tenencia cuando el precio del MACD se desvíaEl principio es:Para comenzar con el valor actual de macd, busque un precio de cierre de la línea k correspondiente al índice que sea mayor que el valor actual de macd, bloquee el precio de la línea k correspondiente hasta el valor máximo dentro del rango de la línea k de cierre actual, y si el precio actual es mayor que el precio más alto en la zona, se dispara la venta. Para avanzar a través de los datos de macd, cuando la longitud máxima de retención sea mayor a 15, seleccione el máximo de macd cerca.img Los datos de las pruebas: img

¿Qué es esto?La estrategia solo es compatible con el mercado de divisas, puede funcionar en varias monedas al mismo tiempo, el código fuente es solo para referencia, por favor, sea cauteloso con las operaciones en disco real.


'''backtest
start: 2023-01-01 00:00:00
end: 2023-05-12 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Bitfinex","currency":"BTC_USD","stocks":10}]
'''


# from matplotlib import pyplot as plt
# plt.figure()

class ExitTop(object):
    def __init__(self,index):
        self.index = index 
        self.totestlist = [] # MACD数据
        self.klist = [] # k线数据
        self.toplus = []
        self.tocpn = []
        self.Sell = False
    
    # 获取k线及MACD数据
    def GetRecord(self) -> bool:
        self.totestlist = []
        self.klist = []
        self.toplus = []
        self.tocpn = []
        records = exchanges[self.index].GetRecords()
        macd = TA.MACD(records, 12, 26, 9)
        # 判断DIF是否大于DEA
        if not macd[0][-2] > macd[1][-2] and macd[0][-3] < macd[1][-3] or not macd[0][-2] > macd[1][-2] and macd[0][-4] < macd[1][-4]:
            return False
        self.totestlist = macd[0][len(macd[0])-80:]
        # 封装k线数据
        for get in range(len(records)):
            self.klist.append(records[get]["Close"])
        self.klist = self.klist[len(self.klist)-80:]
        return True
    
    def mepath(self):
        if not self.GetRecord():
            return False
        # 向前遍历发现最大值
        maxsign = -1000000000000
        for i in range(len(self.totestlist)-1,-1,-1):
            if self.totestlist[i] > maxsign:
                maxsign = self.totestlist[i]
                self.tocpn.append([1,i])
            else:
                if len(self.tocpn) > 0:
                    self.tocpn[-1][0] = self.tocpn[-1][0]+1
            self.toplus.insert(0,maxsign)
        sign = False
        shorttime = [0,0] # 步长 , 索引
        for i in range(len(self.tocpn)):
            if self.tocpn[i][0] > 15 and sign == False:
                shorttime = [self.tocpn[i][0],self.tocpn[i][1]]
                sign = True
        # 如果最大索引不是自己
        if shorttime[1] < len(self.klist)-4:
            # 锁定区域内最高价格
            are = max(self.klist[shorttime[1]:-4])
            # 判断是否存在大于当前macd值,如果当前价格大于区域内最高价格
            if self.totestlist[-2]+300 < self.totestlist[shorttime[1]] and self.klist[-2] >= are:
                return True
            return False
        return False
    
    def main(self):
        result = self.mepath()
        if result == True and self.Sell == False:
            exchanges[self.index].Sell(-1, num)
            self.Sell = True
        elif result == False:
            if self.Sell == True:
                self.Sell = False
        # plt.plot(self.totestlist)
        # plt.plot(self.toplus)
        # LogStatus(plt)


def main():
    transaction = []
    for index in range(len(exchanges)):
        transaction.append(ExitTop(index))
    while True:
        for tran in range(len(transaction)):
            transaction[tran].main()
            Sleep(1000*60)

Más.