예제 #1
0
파일: minervini.py 프로젝트: ajmal017/pybot
def check_trend(stock):

    #get stock data
    stock_data = get_stock_data_wotd(stock)

    if (stock_data["open"][0] <= 0) and (stock_data["close"][0] <= 0):
        return

    #get indicator values
    sma_200 = get_sma(stock_data, 200)
    sma_150 = get_sma(stock_data, 150)
    sma_50 = get_sma(stock_data, 50)

    # Alle Listen so lange machen, wie die kürzeste, damit von hinten durchiteriert werden kann
    sma_150 = sma_150[:len(sma_200)]
    sma_50 = sma_50[:len(sma_200)]

    stock_data["open"] = stock_data["open"][:len(sma_200)]
    stock_data["high"] = stock_data["high"][:len(sma_200)]
    stock_data["low"] = stock_data["low"][:len(sma_200)]
    stock_data["close"] = stock_data["close"][:len(sma_200)]
    stock_data["volume"] = stock_data["volume"][:len(sma_200)]
    stock_data["date"] = stock_data["date"][:len(sma_200)]

    sma_200_steigt = True
    for i in range(min(30, len(sma_200) - 1)):
        if (sma_200[i] < sma_200[i + 1]):
            sma_200_steigt = False

    if (stock_data["close"][0] > sma_50[0]) and (sma_50[0] > sma_150[0]) and (
            sma_150[0] > sma_200[0]) and sma_200_steigt:

        print(stock + ' - Stage 2 Trend')

        avg_span = 0
        for i in range(30):
            avg_span += stock_data["high"][i] - stock_data["low"][i]
        avg_span = avg_span / 30

        if (stock_data["high"][0] - stock_data["low"][0] < avg_span) and (
                stock_data["high"][1] - stock_data["low"][1] < avg_span):
            print('!!! niedrige Vola !!!')
예제 #2
0
def check_signal(stock):

    #get stock data
    stock_data = get_stock_data_wotd(stock)

    if (stock_data["open"][0] <= 0) and (stock_data["close"][0] <= 0):
        return

    #get indicator values
    sma_100 = get_sma(stock_data, 100)
    ema_38 = get_ema(stock_data, 38)

    # Alle Listen so lange machen, wie die kürzeste, damit von hinten durchiteriert werden kann
    ema_38 = ema_38[:len(sma_100)]


    stock_data["open"] = stock_data["open"][:len(sma_100)]
    stock_data["high"] = stock_data["high"][:len(sma_100)]
    stock_data["low"] = stock_data["low"][:len(sma_100)]
    stock_data["close"] = stock_data["close"][:len(sma_100)]
    stock_data["volume"] = stock_data["volume"][:len(sma_100)]
    stock_data["date"] = stock_data["date"][:len(sma_100)]

    #Kommt CCI aus Short-Trend und ist jetzt neutral/long?
    if (stock_data["close"][0] > ema_38[0]) and (ema_38[0] > sma_100[0]):

        for i in range(3):
            if (cci[i] > -100) and (cci[i+1] < -100):
            cci_reversal = True
            break

        ema_momentum = ((ema_38[0] - ema_38[1]) > 0) and ((ema_38[0] - ema_38[1]) > (ema_38[1] - ema_38[2])) and ((ema_38[1] - ema_38[2]) > (ema_38[2] - ema_38[3]))
        sma_momentum = ((sma_100[0] - sma_100[1]) > 0.0015) and ((sma_100[0] - sma_100[1]) > (sma_100[1] - sma_100[2])) and ((sma_100[1] - sma_100[2]) > (sma_100[2] - sma_100[3]))

        rel_abstand_ema_sma = ((ema_38[0] - sma_100[0])/sma_100[0] > 0.05) and ((ema_38[0] - sma_100[0]) > (ema_38[1] - sma_100[1]))

        #wenn CCI im Longtrend oder Reversal aus -100 und ema steigt
        if ((cci[0] > 0) or (cci_reversal)) and (cci[0] > cci[1]) and (ema_momentum) and (sma_momentum) and (rel_abstand_ema_sma):

            print(stock + ' - Kaufsignal')
예제 #3
0
def check_signal(stock):

    stock_data = {}
    output = []

    #get stock data
    stock_data = get_stock_data_wotd(stock)

    if (stock_data[0]["open"] <= 0) and (stock_data[0]["close"] <= 0):
        output.append(stock + ' ZERO VALUES!')
        return output

    #set indicators

    sma_length = 50

    atr_1_length = 14

    rsi_length = 14

    #get indicator values
    sma = get_sma(stock_data, sma_length)
    atr_1 = get_atr(stock_data, atr_1_length)
    rsi = get_rsi(stock_data, rsi_length)

    # Alle Listen so lange machen, wie die kürzeste, damit von hinten durchiteriert werden kann
    min_length = min(len(sma), len(atr_1), len(rsi))

    sma = sma[:min_length]
    atr_1 = atr_1[:min_length]
    rsi = rsi[:min_length]

    stock_data = stock_data[:min_length]

    if ((stock_data[0]["close"] - stock_data[1]["close"]) >=
            1.5 * atr_1[1]) and rsi[0] > 50:
        if ((sma[0] - sma[1]) > 0) and ((sma[0] - sma[15]) > 0):

            vol_avg = 0
            for k in range(14):
                vol_avg += stock_data[k]["volume"]

            vol_avg = vol_avg / 14

            if (rsi[0] < 75 and stock_data[0]["volume"] > 2 * vol_avg
                ) or stock_data[0]["volume"] > 3.5 * vol_avg:

                stops_15 = []
                for i in range(15):
                    stops_15.append(stock_data[i]["high"] - 5 * atr_1[i])

                trade = {"EK": 0, "Anzahl": 0, "SL": 0}
                trade["EK"] = stock_data[0]["close"]
                trade["SL"] = max(stops_15)
                trade["Anzahl"] = round(300 / (trade["EK"] - trade["SL"]))

                output.append(stock + " - " + str(trade["Anzahl"]) +
                              " Stück für " + str(trade["EK"]) + "SL = " +
                              str(trade["SL"]))

    return output
예제 #4
0
def get_sl(symbol, date, ek):

    output = []

    #get stock data
    stock_data = get_stock_data_wotd(symbol)

    if (stock_data[0]["open"] <= 0) and (stock_data[0]["close"] <= 0):
        output.append("NO DATA")
        return output

    #indikators
    atr = get_atr(stock_data, 14)
    sma = get_sma(stock_data, 50)

    #get pos of buy date
    date_index = 0

    last_high = 0
    trade = {"EK": ek, "SL": 0, "TP": 0, "Anzahl": 0}

    for i in range(len(stock_data)):
        if (stock_data[i]["date"] == date):
            date_index = i
            trade["SL"] = ek - 2.5 * atr[i]
            #output.append("initialer SL: " + str(trade["SL"]))
            trade["TP"] = ek + 2.5 * atr[i]
            #output.append("initialer TP: " + str(trade["TP"]))
            break

    output.append("---------" + symbol + "----------")

    #output.append(date_index)

    for i in range(date_index, -1, -1):

        if last_high < stock_data[i]["high"]:
            last_high = stock_data[i]["high"]

            if (trade["TP"] != 0) and (trade["TP"] < last_high - 3 * atr[i]):
                trade["TP"] = last_high - 3 * atr[i]

        if (stock_data[i]["low"] < trade["SL"]):

            output.append(stock_data[i]["date"] + " - SL hit - Sold at " +
                          str(trade["SL"]))
            trade["SL"] = 0
            trade["TP"] = 0
            break

        #output.append(stock_data[i]["date"] + ' ' + str(stock_data[i]["high"]) + str(i))

        if (stock_data[i]["high"] > trade["TP"]) and trade["SL"] < trade["EK"]:

            trade["SL"] = trade["EK"]
            trade["TP"] = last_high - 3 * atr[i]
            output.append(
                str(stock_data[i]["date"]) +
                " - TP überschritten -> Anpassung SL auf EK: " +
                str(trade["SL"]))
            output.append(
                str(stock_data[i]["date"]) +
                " - TP überschritten -> Anpassung TP - 3ATR: " +
                str(trade["TP"]))

        if (stock_data[i]["low"] < trade["TP"]) and trade["SL"] > trade[
                "EK"]:  #SL > EK damit Gewinnmitnahme erst im Profit

            output.append(stock_data[i]["date"] +
                          " - Gewinnmitnahme 50% verkauft (3ATR)")
            #output.append("TP = 0")
            trade["TP"] = 0

        if ((sma[i] - 1.5 * atr[i]) > trade["SL"]
            ) and stock_data[i]["high"] > (sma[i] - 1.5 * atr[i]):

            trade["SL"] = (sma[i] - 1.5 * atr[i])
            #output.append(stock_data[i]["date"] + " - Anpassung SL auf SMA50: " + str(trade["SL"]))

    output.append("aktueller SL: " + str(trade["SL"]))
    output.append("aktueller TP: " + str(trade["TP"]))
    output.append("aktueller Kurs: " + str(stock_data[0]["close"]))

    return output
예제 #5
0
def backtest(stock):

    #set indicators
    ema_co_long = 50
    ema_co_short = 25

    cci_length = 20

    ppo_length_short = 12
    ppo_length_long = 26

    atr_length = 14

    min_ppo_change = 0.2
    min_cci_change = 0

    #get stock data
    stock_data = get_stock_data_wotd(stock)

    if (stock_data["open"][0] <= 0) and (stock_data["close"][0] <= 0):
        return

    #get indicator values
    cci = get_cci(stock_data, cci_length)

    ema_short = get_ema(stock_data, ema_co_short)
    ema_long = get_sma(stock_data, ema_co_long)

    ppo = get_ppo(stock_data, ppo_length_short, ppo_length_long)

    atr = get_atr(stock_data, atr_length)

    # Alle Listen so lange machen, wie die kürzeste, damit von hinten durchiteriert werden kann
    min_length = min(len(cci),len(ema_short),len(ema_long),len(ppo),len(atr))
    cci = cci[:min_length]
    ema_short = ema_short[:min_length]
    ppo = ppo[:min_length]
    atr = atr[:min_length]

    stock_data["open"] = stock_data["open"][:min_length]
    stock_data["high"] = stock_data["high"][:min_length]
    stock_data["low"] = stock_data["low"][:min_length]
    stock_data["close"] = stock_data["close"][:min_length]
    stock_data["volume"] = stock_data["volume"][:min_length]
    stock_data["date"] = stock_data["date"][:min_length]


    trade = {"position" : "$", "EK" : 0, "SL" : 0}
    sum = 10000
                                                        #ema_co_long größte Zahl
    for i in range(-1, (-1)*(len(stock_data["open"]) - ema_co_long),-1):

        cci_reversal = False

        if trade["position"] == "L":
            if (cci[i]<=-100) or ((cci[i] < 100) and ((ppo[i+1]-ppo[i]) >= min_ppo_change) and ((ppo[i+1]-ppo[i]) > (ppo[i+2]-ppo[i+1])) and ((cci[i+1]-cci[i]) >= min_cci_change)):
                print("CCI < -100 - Sold at " + str(stock_data["open"][i]) + " - Profit: " + str((stock_data["open"][i] - trade["EK"]) / trade["EK"]*100) + "%")
                sum += sum * ((stock_data["open"][i+1] - trade["EK"]) / trade["EK"])
                trade = {"position" : "$", "EK" : 0, "SL" : 0}

        elif trade["position"] == "S":
            if (cci[i]>=100) or ((cci[i]>=-100) and ((ppo[i]-ppo[i+1]) >= min_ppo_change) and ((ppo[i]-ppo[i+1]) > (ppo[i+1]-ppo[i+2])) and ((cci[i]-cci[i+1]) >= min_cci_change) and ((cci[i]-cci[i+1]) > 0)):
                print("CCI < -100 - Sold at " + str(stock_data["open"][i]) + " - Profit: " + str((trade["EK"]-stock_data["open"][i]) / trade["EK"]*100) + "%")
                sum +=  sum * ((trade["EK"]-stock_data["open"][i+1]) / trade["EK"])
                trade = {"position" : "$", "EK" : 0, "SL" : 0}

        #check trend with ema crossover
        if ema_short[i] > ema_long[i]:

            if trade["position"] == "S":
                print("EMA Cross against Trade - Sold at " + str(stock_data["open"][i]) + " - Profit: " + str((trade["EK"] - stock_data["open"][i]) / trade["EK"]*100) + "%")
                trade = {"position" : "$", "EK" : 0, "SL" : 0}
            #Kommt CCI aus Short-Trend und ist jetzt neutral/long?
            for k in range(1,3):
                if i+k > len(cci)-1:
                    cci_reversal = False

                elif (cci[i] > -100) and (cci[i+k] < -100):
                    cci_reversal = True
                    break

            #wenn CCI im Longtrend oder Reversal aus -100
            if (trade["position"] == "$") and ((cci[i] >= 100) or (cci_reversal)):

                #Wenn PPO und CCI steigen (mindestens um X) + PPO/CCI-Momentum -> PPO/CCI steigt stärker als am Vortag
                if ((ppo[i]-ppo[i+1]) >= min_ppo_change) and (ppo[i]-ppo[i+1] > ppo[i+1]-ppo[i+2]) and ((cci[i]-cci[i+1]) >= min_cci_change):

                    print("--------------------!!!--------------------")
                    print("GO LONG " + stock + " am " + str(stock_data["date"][i]) + " at " + str(stock_data["close"][i]))
                    print("Stop Loss 2D Low - 1 ATR: "+str(min(stock_data["low"][i], stock_data["low"][i+1], stock_data["low"][i+2])-atr[i]))
                    print("Stop Loss 2 ATR: "+str(stock_data["low"][i]-(2*atr[i])))
                    print("--------------------!!!--------------------")

                    trade["position"] = "L"
                    trade["EK"] = stock_data["close"][i]
                    trade["SL"] = min(stock_data["low"][i], stock_data["low"][i+1], stock_data["low"][i+2])-atr[i]

                elif ((ppo[i]-ppo[i+1]) >= min_ppo_change*0.7) and (ppo[i]-ppo[i+1] > ppo[i+1]-ppo[i+2]) and ((cci[i]-cci[i+1]) >= min_cci_change*0.7) and (cci[i]-cci[i+1] > cci[i+1]-cci[i+2]):
                    print("--------------------!!!--------------------")
                    print(stock+": about to show LONG signal")
                    print("--------------------!!!--------------------")



        elif ema_short[i] < ema_long[i]:

            if trade["position"] == "L":
                print("EMA Cross against Trade - Sold at " + str(stock_data["open"][i]) + " - Profit: " + str((stock_data["open"][i] - trade["EK"]) / trade["EK"]*100) + "%")
                trade = {"position" : "$", "EK" : 0, "SL" : 0}

            #Kommt CCI aus Long-Trend und ist jetzt neutral/short?
            for k in range(1,3):
                if (cci[i] < 100) and (cci[i+k] > 100):
                    cci_reversal = True
                    break

            #wenn CCI im Shorttrend oder Reversal aus 100
            if (trade["position"] == "$") and ((cci[i] <= -100) or (cci_reversal)):

                #Wenn PPO und CCI fallen (mindestens um X) + PPO-Momentum -> PPO fällt stärker als am Vortag
                if ((ppo[i+1]-ppo[i]) >= min_ppo_change) and (ppo[i+1]-ppo[i] > ppo[i+2]-ppo[i+1]) and ((cci[i+1]-cci[i]) >= min_cci_change):

                    print("--------------------!!!--------------------")
                    print("GO SHORT " + stock + " am " + str(stock_data["date"][i]) + " at " + str(stock_data["close"][i]))
                    print("Stop Loss 2D High - 1 ATR: "+str(max(stock_data["high"][i], stock_data["high"][i+1], stock_data["high"][i+2])+atr[i]))
                    print("Stop Loss 2 ATR: "+str(stock_data["high"][i]+(2*atr[i])))
                    print("--------------------!!!--------------------")

                    trade["position"] = "S"
                    trade["EK"] = stock_data["close"][i]
                    trade["SL"] = min(stock_data["high"][i], stock_data["high"][i+1], stock_data["high"][i+2])-atr[i]


                elif ((ppo[i+1]-ppo[i]) >= min_ppo_change*0.7) and (ppo[i+1]-ppo[i] > ppo[i+2]-ppo[i+1]) and ((cci[i+1]-cci[i]) >= min_cci_change*0.7) and (cci[i+1]-cci[i] > cci[i+2]-cci[i+1]):
                    print("--------------------!!!--------------------")
                    print(stock+": about to show SHORT signal")
                    print("--------------------!!!--------------------")

    print(sum)
예제 #6
0
파일: vcci.py 프로젝트: ajmal017/pybot
def check_signal(stock):

    stock_data = {}
    output = []

    #get stock data
    sma_length = 50

    atr_1_length = 14
    vcci_length = 20

    #get stock data
    stock_data = get_stock_data_wotd(stock)

    if (stock_data[0]["open"] <= 0) and (stock_data[0]["close"] <= 0):
        return

    #get indicator values
    sma = get_sma(stock_data, sma_length)

    atr_1 = get_atr(stock_data, atr_1_length)

    vcci = get_vcci(stock_data, vcci_length)

    # Alle Listen so lange machen, wie die kürzeste, damit von hinten durchiteriert werden kann
    min_length = min(len(sma), len(atr_1), len(vcci))

    sma = sma[:min_length]
    atr_1 = atr_1[:min_length]
    vcci = vcci[:min_length]

    stock_data = stock_data[:min_length]

    if (vcci[0] > 200
            and (stock_data[0]["close"] - stock_data[1]["close"]) >= atr_1[1]):
        l_high = 0
        vol_avg = 0

        for i in range(20):
            vol_avg += stock_data[i]["volume"]

        vol_avg = vol_avg / 20

        if stock_data[0]["volume"] > vol_avg:

            for i in range(1, 100):
                if l_high < stock_data[i]["close"]:
                    l_high = stock_data[i]["close"]

            if (stock_data[0]["close"] > l_high):

                stops_15 = []
                for i in range(15):
                    stops_15.append(stock_data[i]["high"] - 5 * atr_1[i])

                trade = {"EK": 0, "Anzahl": 0, "SL": 0}
                trade["EK"] = stock_data[0]["close"]
                trade["SL"] = max(stops_15)
                trade["Anzahl"] = round(300 / (trade["EK"] - trade["SL"]))

                output.append(stock + " - " + str(trade["Anzahl"]) +
                              " Stück für " + str(trade["EK"]) + "SL = " +
                              str(trade["SL"]))

    return output
예제 #7
0
def backtest(stock):

    #set indicators

    sma_length = 50

    cci_length = 100

    hma_1_length = 12
    hma_2_length = 25
    hma_3_length = 100

    atr_1_length = 14
    atr_2_length = 1

    #get stock data
    stock_data = get_stock_data_wotd(stock)

    if (stock_data[0]["open"] <= 0) and (stock_data[0]["close"] <= 0):
        return

    #get indicator values
    sma = get_sma(stock_data, sma_length)

    atr_1 = get_atr(stock_data, atr_1_length)
    atr_2 = get_atr(stock_data, atr_2_length)

    hma_1 = get_hma(stock_data, hma_1_length)
    hma_2 = get_hma(stock_data, hma_2_length)
    hma_3 = get_hma(stock_data, hma_3_length)

    cci = get_cci(stock_data, cci_length)

    # Alle Listen so lange machen, wie die kürzeste, damit von hinten durchiteriert werden kann
    min_length = min(len(hma_3), len(hma_2), len(hma_1), len(sma), len(atr_1),
                     len(atr_2), len(cci))

    sma = sma[:min_length]
    atr_1 = atr_1[:min_length]
    atr_2 = atr_2[:min_length]
    hma_1 = hma_1[:min_length]
    hma_2 = hma_2[:min_length]
    hma_3 = hma_3[:min_length]
    cci = cci[:min_length]

    stock_data = stock_data[:min_length]

    trade = {"position": "$", "EK": 0, "Anzahl": 0, "SL": 0, "TP": 0}
    sum = 50000

    l_count1 = 0
    l_count2 = 0
    last_high = 0
    last_low = 0

    print("Close: " + str(stock_data[0]))
    print("SMA50: " + str(sma[0]))
    print("ATR1: " + str(atr_1[0]))
    print("ATR2: " + str(atr_2[0]))
    print("HMA1: " + str(hma_1[0]))
    print("HMA2: " + str(hma_2[0]))
    print("HMA3: " + str(hma_3[0]))
    print("CCI: " + str(cci[0]))

    for i in range(-1, (-1) * (len(stock_data)), -1):
        '''
        if stock_data[i]["date"] == '2015-09-17':

                print("Close: " + str(stock_data[i]))
                print("SMA50: " +  str(sma[i]))
                print("ATR1: " +  str(atr_1[i]))
                print("ATR2: " +  str(atr_2[i]))
                print("HMA1: " +  str(hma_1[i]))
                print("HMA2: " +  str(hma_2[i]))
                print("HMA3: " +  str(hma_3[i]))
                print("CCI: " +  str(cci[i]))
                vol_avg = 0
                for k in range(14):
                    vol_avg += stock_data[i+k]["volume"]
                vol_avg = vol_avg/14
                print("Vol " +  str(stock_data[i]["volume"]))
                print("Volavg " +  str(vol_avg))
        '''

        l_count1 += 1

        if last_high < stock_data[i]["high"]:
            last_high = stock_data[i]["high"]

        if last_low > stock_data[i]["low"]:
            last_low = stock_data[i]["low"]

###################################WENN LONG###########################################
        if trade["position"] == "L":

            l_count2 += 1

            if (trade["TP"] != 0) and (trade["TP"] < last_high - 4 * atr_1[i]):
                trade["TP"] = last_high - 4 * atr_1[i]

            if (stock_data[i]["low"] < trade["SL"]):
                print("SL hit - Sold at " + str(trade["SL"]) + " am " +
                      str(stock_data[i]["date"]))
                last_high = 0
                last_low = 0
                if (trade["TP"] > 0):
                    print("Verkauf - Profit: " +
                          str((trade["SL"] - trade["EK"]) * trade["Anzahl"]) +
                          "€ " + str((trade["SL"] - trade["EK"]) /
                                     trade["EK"] * 100) + "%")
                    sum += (trade["SL"] - trade["EK"]) * trade["Anzahl"]
                    print("sum = " + str(sum))
                else:
                    print("Verkauf zweite Hälfte - Profit: " +
                          str((trade["SL"] - trade["EK"]) * trade["Anzahl"]) +
                          "€ " + str((trade["SL"] - trade["EK"]) /
                                     trade["EK"] * 100) + "%")
                    sum += (trade["SL"] - trade["EK"]) * trade["Anzahl"]
                    print("sum = " + str(sum))
                trade = {
                    "position": "$",
                    "EK": 0,
                    "SL": 0,
                    "TP": 0,
                    "Anzahl": 0
                }

            if (trade["SL"] < trade["EK"]) and (stock_data[i]["high"] >
                                                trade["TP"]):
                '''
                print("Gewinnmitnahme (2.5 ATR) - Profit: " + str((trade["TP"] - trade["EK"])*trade["Anzahl"]) +"€ "+ str((trade["TP"] - trade["EK"]) / trade["EK"]*100) + "%")
                sum += (trade["TP"] - trade["EK"])*trade["Anzahl"]

                trade["TP"] = 0
                trade["Anzahl"] = trade["Anzahl"]/2
                '''
                trade["SL"] = trade["EK"]

            if (trade["TP"] > 0) and (
                    stock_data[i]["low"] <
                    trade["TP"]) and trade["SL"] > trade[
                        "EK"]:  #SL > EK damit Gewinnmitnahme erst im Profit

                print("Gewinnmitnahme (ATR) - Profit: " +
                      str((trade["TP"] - trade["EK"]) * trade["Anzahl"]) +
                      "€ " +
                      str((trade["TP"] - trade["EK"]) / trade["EK"] * 100) +
                      "%")
                sum += (trade["TP"] - trade["EK"]) * trade["Anzahl"]
                print("sum = " + str(sum))
                #trade["TP"] = 0
                #trade["Anzahl"] = trade["Anzahl"]/2
                trade = {
                    "position": "$",
                    "EK": 0,
                    "SL": 0,
                    "TP": 0,
                    "Anzahl": 0
                }

            if ((sma[i] - 1.5 * atr_1[i]) > trade["SL"]
                ) and stock_data[i]["high"] > (sma[i] - 1.5 * atr_1[i]):

                trade["SL"] = (sma[i] - 1.5 * atr_1[i])

#####################################WENN SHORT#########################################
        '''
        elif trade["position"] == "S":
            l_count2 += 1

            if (trade["TP"] != 0) and (trade["TP"] > last_low + 3*atr_1[i]):
                trade["TP"] = last_low + 3*atr_1[i]

            if (stock_data[i]["high"] > trade["SL"]):
                print("SL hit - Sold at " + str(trade["SL"]) + " am " + str(stock_data[i]["date"]))
                last_high = 0
                last_low = 0
                if (trade["TP"] > 0):
                    print("Verkauf - Profit: " + str((trade["EK"] - trade["SL"])*trade["Anzahl"]) +"€ "+ str((trade["EK"] - trade["SL"]) / trade["EK"]*100) + "%")
                    sum += (trade["EK"] - trade["SL"])*trade["Anzahl"]
                    print("sum = " + str(sum))
                else:
                    print("Verkauf zweite Hälfte - Profit: " + str((trade["EK"] - trade["SL"])*trade["Anzahl"]) +"€ "+ str((trade["EK"] - trade["SL"]) / trade["EK"]*100) + "%")
                    sum += (trade["EK"] - trade["SL"])*trade["Anzahl"]
                    print("sum = " + str(sum))
                trade = {"position" : "$", "EK" : 0, "SL" : 0, "TP": 0, "Anzahl" : 0}

            if (trade["SL"] < trade["EK"]) and (stock_data[i]["high"] > trade["TP"]):

                trade["SL"] = trade["EK"]

            if (stock_data[i]["high"] > trade["TP"]) and trade["SL"] < trade["EK"]: #SL < EK damit Gewinnmitnahme erst im Profit

                print("Gewinnmitnahme (2.5 ATR) - Profit: " + str((trade["EK"] - trade["TP"])*trade["Anzahl"]/2) +"€ "+ str((trade["EK"] - trade["TP"]) / trade["EK"]*100) + "%")
                sum += (trade["EK"] - trade["TP"])*trade["Anzahl"]/2
                print("sum = " + str(sum))
                trade["TP"] = 0
                trade["Anzahl"] = trade["Anzahl"]/2


            if ((sma[i] + 1.5 * atr_1[i]) < trade["SL"]) and stock_data[i]["low"] < (sma[i] + 1.5 * atr_1[i]):

                trade["SL"] = (sma[i] + 1.5 * atr_1[i])
        '''
        #####################################GO LONG##################################################
        if (cci[i] > 100) and (atr_2[i] > atr_1[i]):

            #if (hma_1[i] > hma_2[i]) and (hma_1[i] > hma_3[i]):

            if (((hma_1[i] - hma_1[i + 1]) > 0)
                    and ((hma_2[i] - hma_2[i + 1]) > 0)
                    and ((hma_3[i] - hma_3[i + 1]) > 0)
                    and ((sma[i] - sma[i + 1]) > 0)
                    and ((hma_1[i] - hma_1[i + 1]) >
                         (hma_1[i + 1] - hma_1[i + 2]))):

                vol_avg = 0

                for k in range(14):
                    vol_avg += stock_data[i + k]["volume"]

                vol_avg = vol_avg / 14

                if ((stock_data[i]["volume"] * atr_2[i] > vol_avg * atr_1[i])
                        and (stock_data[i]["close"] > stock_data[i]["open"])
                        and
                    (stock_data[i]["close"] > stock_data[i + 1]["close"])):

                    if (trade["position"] != "L"):

                        trade["position"] = "L"
                        trade["EK"] = stock_data[i]["close"]
                        trade["Anzahl"] = round(
                            (0.005 * sum) / (2.5 * atr_1[i]))
                        trade["SL"] = stock_data[i]["close"] - (2.5 * atr_1[i])
                        trade["TP"] = stock_data[i]["close"] + (2.5 * atr_1[i])

                        print("--------------------!!!--------------------")
                        print("Buy " + str(trade["Anzahl"]) + " Stück für " +
                              str(trade["EK"]) + " am " +
                              str(stock_data[i]["date"]))
                        print("Stop Loss 2.5 ATR: " + str(trade["SL"]))

                        break_even = trade["TP"]
                    '''
                    if (trade["SL"] > break_even) and (stock_data[i]["close"] > break_even):

                        l_anzahl = 0
                        l_anzahl = round((0.02*sum)/(stock_data[i]["close"] - trade["SL"])) # 1% Risiko (Risiko = Abstand zum SL)

                        trade ["EK"] = ((trade["EK"] * trade["Anzahl"]) + (stock_data[i]["close"] * l_anzahl)) / (trade["Anzahl"] + l_anzahl)
                        trade["Anzahl"] += l_anzahl
                        trade["TP"] = stock_data[i]["close"] + (2.5*atr_1[i])

                        print("NACHKAUF " + str(l_anzahl) + " Stück für " + str(stock_data[i]["close"]) + " am " + str(stock_data[i]["date"]))
                        print("TP: " + str(trade["TP"]))

                        break_even = trade["TP"]
                    '''

########################GO SHORT##################################
        '''
        elif (cci[i] < -100) and (atr_2[i] > atr_1[i]):

            #if (hma_1[i] > hma_2[i]) and (hma_1[i] > hma_3[i]):

            if (((hma_1[i] - hma_1[i+1]) < 0) and ((hma_2[i] - hma_2[i+1]) < 0) and ((hma_3[i] - hma_3[i+1]) < 0) and ((sma[i] - sma[i+1]) < 0) and ((hma_1[i] - hma_1[i+1]) < (hma_1[i+1] - hma_1[i+2]))):

                vol_avg = 0

                for k in range(14):
                    vol_avg += stock_data[i+k]["volume"]

                vol_avg = vol_avg/14

                if ((stock_data[i]["volume"]*atr_2[i] > vol_avg*atr_1[i]) and (stock_data[i]["close"] < stock_data[i]["open"]) and (stock_data[i]["close"] < stock_data[i+1]["close"])):

                    if (trade["position"] != "S"):

                        trade["position"] = "S"
                        trade["EK"] = stock_data[i]["close"]
                        trade["Anzahl"] = round((0.02*sum)/(2.5*atr_1[i]))
                        trade["SL"] = stock_data[i]["close"] + (2.5*atr_1[i])
                        trade["TP"] = stock_data[i]["close"] - (2.5*atr_1[i])


                        print("--------------------!!!--------------------")
                        print("SHORT " + str(trade["Anzahl"]) + " Stück für " + str(trade["EK"]) + " am " + str(stock_data[i]["date"]))
                        print("Stop Loss 2.5 ATR: "+str(trade["SL"]))

                        break_even = trade["TP"]

                    if (trade["SL"] < break_even) and (stock_data[i]["close"] < break_even):

                        l_anzahl = 0
                        l_anzahl = round((0.02*sum)/(trade["SL"] - stock_data[i]["close"])) # 1% Risiko (Risiko = Abstand zum SL)

                        trade ["EK"] = ((trade["EK"] * trade["Anzahl"]) + (stock_data[i]["close"] * l_anzahl)) / (trade["Anzahl"] + l_anzahl)
                        trade["Anzahl"] += l_anzahl
                        trade["TP"] = stock_data[i]["close"] - (2.5*atr_1[i])

                        print("NACHKAUF " + str(l_anzahl) + " Stück für " + str(stock_data[i]["close"]) + " am " + str(stock_data[i]["date"]))
                        print("TP: " + str(trade["TP"]))

                        break_even = trade["TP"]
        '''

    print(str(sum) + " " + str(l_count2) + "/" + str(l_count1))
예제 #8
0
파일: backtest2.py 프로젝트: ajmal017/pybot
def backtest(stock):

    #set indicators
    sma_long_len = 100
    ema_short_len = 38

    cci_length = 20

    atr_length = 14

    #get stock data
    stock_data = get_stock_data_wotd(stock)

    if (stock_data["open"][0] <= 0) and (stock_data["close"][0] <= 0):
        return

    #get indicator values
    cci = get_cci(stock_data, cci_length)

    ema_short = get_ema(stock_data, ema_short_len)
    sma_long = get_sma(stock_data, sma_long_len)

    atr = get_atr(stock_data, atr_length)

    # Alle Listen so lange machen, wie die kürzeste, damit von hinten durchiteriert werden kann
    min_length = min(len(cci), len(ema_short), len(sma_long), len(atr))
    cci = cci[:min_length]
    ema_short = ema_short[:min_length]
    atr = atr[:min_length]

    stock_data["open"] = stock_data["open"][:min_length]
    stock_data["high"] = stock_data["high"][:min_length]
    stock_data["low"] = stock_data["low"][:min_length]
    stock_data["close"] = stock_data["close"][:min_length]
    stock_data["volume"] = stock_data["volume"][:min_length]
    stock_data["date"] = stock_data["date"][:min_length]

    trade = {"position": "$", "EK": 0, "SL": 0}
    sum = 10000
    cci_reversal = False
    #sma_long_len größte Zahl
    for i in range(-1, (-1) * (len(stock_data["open"])), -1):

        if (trade["position"] == "$"):
            cci_reversal = False
        elif (trade["position"] == "L") and (cci[i] > 0):
            cci_reversal = False
        elif (trade["position"] == "S") and (cci[i] < 0):
            cci_reversal = False

        if trade["position"] == "L":
            if ((cci[i] < 0) and (cci[i + 1] < 0) and
                (cci[i] < cci[i + 1]) and not cci_reversal) or (cci[i] < -100):
                print("CCI = " + str(cci[i]) + " - Sold at " +
                      str(stock_data["open"][i - 1]) + " am " +
                      str(stock_data["date"][i]) + " - Profit: " +
                      str((stock_data["open"][i - 1] - trade["EK"]) /
                          trade["EK"] * 100) + "%")
                sum += sum * (
                    (stock_data["open"][i - 1] - trade["EK"]) / trade["EK"])
                trade = {"position": "$", "EK": 0, "SL": 0}
                cci_reversal = False

        elif trade["position"] == "S":
            if ((cci[i] > 0) and
                (cci[i + 1] > 0) and not cci_reversal) or (cci[i] > 100):
                print("CCI = " + str(cci[i]) + " - Sold at " +
                      str(stock_data["open"][i - 1]) + " - Profit: " +
                      str((trade["EK"] - stock_data["open"][i - 1]) /
                          trade["EK"] * 100) + "%")
                sum += sum * (
                    (trade["EK"] - stock_data["open"][i - 1]) / trade["EK"])
                trade = {"position": "$", "EK": 0, "SL": 0}
                cci_reversal = False

        #check trend with ema crossover
        if ema_short[i] > sma_long[i]:

            if trade["position"] == "S":
                print("EMA Cross against Trade - Sold at " +
                      str(stock_data["open"][i - 1]) + " - Profit: " +
                      str((stock_data["open"][i - 1] - trade["EK"]) /
                          trade["EK"] * 100) + "%")
                trade = {"position": "$", "EK": 0, "SL": 0}

            #Kommt CCI aus Short-Trend und ist jetzt neutral/long?
            for k in range(1, 3):
                if i + k > len(cci) - 1:
                    cci_reversal = False

                elif (cci[i] > -100) and (cci[i + k] < -100):
                    cci_reversal = True
                    break
            '''
            print("LONG")
            print("DATE " + str(stock_data["date"][i]))
            print("POS " + trade["position"])
            print("CCI " + str(cci[i]))
            print("CCI Rev " + str(cci_reversal))
            print("EMA heute " + str(ema_short[i]))
            print("EMA gestern " + str(ema_short[i+1]))
            print("SMA heute " + str(sma_long[i]))
            '''

            ema_momentum = ((ema_short[i] - ema_short[i + 1]) > 0) and (
                (ema_short[i] - ema_short[i + 1]) >
                (ema_short[i + 1] - ema_short[i + 2])) and (
                    (ema_short[i + 1] - ema_short[i + 2]) >
                    (ema_short[i + 2] - ema_short[i + 3]))
            sma_momentum = ((sma_long[i] - sma_long[i + 1]) > 0.0015) and (
                (sma_long[i] - sma_long[i + 1]) >
                (sma_long[i + 1] - sma_long[i + 2])) and (
                    (sma_long[i + 1] - sma_long[i + 2]) >
                    (sma_long[i + 2] - sma_long[i + 3]))

            rel_abstand_ema_sma = (
                (ema_short[i] - sma_long[i]) / sma_long[i] > 0.05) and (
                    (ema_short[i] - sma_long[i]) >
                    (ema_short[i + 1] - sma_long[i + 1]))

            #wenn CCI im Longtrend oder Reversal aus -100 und ema steigt
            if (trade["position"] == "$") and (
                (cci[i] > 0) or (cci_reversal)) and (cci[i] > cci[i + 1]) and (
                    ema_momentum) and (sma_momentum) and (rel_abstand_ema_sma):

                print("--------------------!!!--------------------")
                print("GO LONG am " + str(stock_data["date"][i]) + " at " +
                      str(stock_data["close"][i]))
                print("Stop Loss 2D Low - 1 ATR: " + str(
                    min(stock_data["low"][i], stock_data["low"][i + 1],
                        stock_data["low"][i + 2]) - atr[i]))
                print("Stop Loss 2 ATR: " + str(stock_data["low"][i] -
                                                (2 * atr[i])))
                print("--------------------!!!--------------------")

                trade["position"] = "L"
                trade["EK"] = stock_data["close"][i]
                trade["SL"] = min(stock_data["low"][i],
                                  stock_data["low"][i + 1],
                                  stock_data["low"][i + 2]) - atr[i]