aboutsummaryrefslogtreecommitdiff
path: root/ema.py
blob: 9b4a6048b096844d408c9d69e31045eaf8037bbf (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
def compute_buy_sell_signals_ema(period1, period2, prices): 
    ema_5 = calc_emas(5, prices)
    ema_13 = calc_emas(13, prices)


def calc_first_sma(period, prices):
    prices_sum = 0
    for i in range(0, period):
        prices_sum += prices[i] # 0, 1, 2, 3 ("popping" order)
    # print('prices_sum:\t', prices_sum)

    return prices_sum / period

def calc_emas(period, prices):
    weighted_multiplier = 2.0 / (period + 1.0)

    # calculate the first ema
    first_ema = calc_first_sma(period, prices)

    # calculate the rest ema's using that first
    emas = [first_ema] * period
    for i in range(period + 1, len(prices)): # 4, 5, 6, ... , last
        last_ema = emas[-1]
        if prices[i] == None or prices[i] == 0:
            print(i)
        next_ema = prices[i] * weighted_multiplier + last_ema * (1 - weighted_multiplier)
        emas.append(next_ema)
    return emas

def calculate_profit(buy_line, sell_line, prices, timestamps, offset=0, starting_money=10000):
    if len(buy_line) != len(sell_line):
        print("ERROR IN find_intersections: len of arrs not the same")
        return []
    is_bought = False
    curr_money = 10000
    shares_owned = 0
    buy_info = [] # coming in, (time, cash, # current shares, # shares to buy)
    sell_info = [] # (time, cash, # current shares, # shares to sell,)
    for i in range(offset, len(buy_line)):
        current_b1 = buy_line[i]
        current_sl = sell_line[i]
        # if the sign is positive, we want to hold, if it's negative, we want to sell
        sign_signal = current_b1 - current_sl

        if sign_signal > 0:
            if not is_bought:
                # buy the stock
                shares_owned = curr_money / prices[i]
                curr_money = 0
                buy_info.append((timestamps[i], prices[i], i))
            is_bought = True
        if sign_signal < 0:
            if is_bought:
                # selling the stock
                curr_money = prices[i] * shares_owned
                shares_owned = 0
                sell_info.append((timestamps[i], prices[i], i))
            is_bought = False

    # TODO: consider end interval
    total_assets = prices[-1] * shares_owned + curr_money
    percent_gain = (total_assets - starting_money) / starting_money
    return (percent_gain, total_assets, starting_money, buy_info, sell_info)