Example #1
0
def algo_1(trader: shift.Trader):
    '''Moving average algorithm'''
    print(trader.get_last_price("MSFT"))
    best_price = trader.get_best_price("MSFT")
    print(f"ask price: {best_price.get_ask_price()}")
    print(f"local ask: {best_price.get_local_ask_price()}")
    print(f"global ask: {best_price.get_global_ask_price()}")
    print(f"bid price: {best_price.get_bid_price()}")
    print(f"local bid: {best_price.get_local_bid_price()}")
    print(f"global bid: {best_price.get_global_bid_price()}")
    print(trader.get_close_price("MSFT"))
def manageInventory(trader: shift.Trader, ticker, dayEnd):

    # Datetime of simulation
    rightNow = trader.get_last_trade_time()

    # While the time is before end of day...
    while (dayEnd > rightNow):

        time.sleep(5)  # Give prices time to fluctuate

        item = trader.get_portfolio_item(ticker)
        if item.get_shares() != 0:

            unrealizedPL = 0
            tradedPrice = item.get_price()
            numShares = int(
                item.get_shares() /
                100)  # Order size in 100's of shares, strictly as an int

            if numShares > 0:
                unrealizedPL = (
                    (trader.get_close_price(ticker, False, numShares) -
                     tradedPrice) / tradedPrice) * 100

            else:  # numShares < 0:
                unrealizedPL = -(
                    (trader.get_close_price(ticker, True, -numShares) -
                     tradedPrice) / tradedPrice) * 100

            print(ticker, "Unrealized P/L:", unrealizedPL, "%")
            if unrealizedPL >= 0.40:  # Target met, take profit
                #if unrealizedPL >= 3.0: # Target met, take profit
                if item.get_shares() > 0:
                    closePositions(trader, ticker)
                    """
                    closeLong = shift.Order(shift.Order.Type.MARKET_SELL, item.get_symbol(), numShares)
                    trader.submit_order(closeLong)
                    """
                    print(ticker, "take profit on long")
                    time.sleep(
                        5
                    )  # Don't act on volatile spikes and dips, only identify longer trends
                elif item.get_shares() < 0:
                    closePositions(trader, ticker)
                    """
                    coverShort = shift.Order(shift.Order.Type.MARKET_BUY, item.get_symbol(), -numShares)
                    trader.submit_order(coverShort)
                    """
                    print(ticker, "take profit on short")
                    time.sleep(
                        5
                    )  # Don't act on volatile spikes and dips, only identify longer trends

            elif unrealizedPL <= -0.30:  # Stop loss met, sell risk
                #elif unrealizedPL <= -0.50: # Stop loss met, sell risk
                if item.get_shares() > 0:
                    closePositions(trader, ticker)
                    """
                    closeLong = shift.Order(shift.Order.Type.MARKET_SELL, item.get_symbol(), numShares)
                    trader.submit_order(closeLong)
                    """
                    print(ticker, "stop loss on long")
                    time.sleep(
                        5
                    )  # Don't act on volatile spikes and dips, only identify longer trends
                elif item.get_shares() < 0:
                    closePositions(trader, ticker)
                    """
                    coverShort = shift.Order(shift.Order.Type.MARKET_BUY, item.get_symbol(), -numShares)
                    trader.submit_order(coverShort)
                    """
                    print(ticker, "stop loss on short")
                    time.sleep(
                        5
                    )  # Don't act on volatile spikes and dips, only identify longer trends

        rightNow = trader.get_last_trade_time()  # Reset datetime of right now
def technicalStrat(trader: shift.Trader, ticker, lastTradeSell, dayEnd, lag=1):

    rightNow = trader.get_last_trade_time()  # Datetime of simulation

    # While the time is before end of day...
    while (dayEnd > rightNow):
        print("P/L:",
              trader.get_portfolio_summary().get_total_realized_pl(),
              " Waiting list:", trader.get_waiting_list_size())
        """
        Make Trades Here:
        """
        priceSeries = pd.Series(trader.get_sample_prices(
            ticker, True))  # ticker, mid-prices
        time.sleep(lag)  # Give prices some time to change

        if priceSeries.size == 26:
            mShort = priceSeries.ewm(span=12,
                                     adjust=False).mean()  # 12 period EMA
            mLong = priceSeries.ewm(span=26,
                                    adjust=False).mean()  # 26 period EMA
            MACD = mShort - mLong  # Calculate convergence and divergence

            mSignal = MACD.ewm(span=9,
                               adjust=False).mean()  # 9 period EMA signal line

            mHist = MACD - mSignal  # Trade signal producer

            SMA = priceSeries[:19].mean()  # 20 second simple moving average
            if lastTradeSell == True:
                bUpper = SMA + (priceSeries[:19].std() * 3.0
                                )  # Upper Bollinger Band
                bLower = SMA - (
                    priceSeries[:19].std() * 1.5
                )  # Low Bollinger Band - more lenient, safer sell
            else:
                bUpper = SMA + (
                    priceSeries[:19].std() * 1.5
                )  # Upper Bollinger Band - more lenient, safer cover
                bLower = SMA - (priceSeries[:19].std() * 3.0
                                )  # Low Bollinger Band
            #######!!!!!!possibly have a second band outside first..for too strong movement!!!!!!!!!!!!!!!!!!!!!!!!!!!!

            # Open long position / Cover short position
            if lastTradeSell == True and mHist.iloc[
                    -1] > 0 and trader.get_close_price(
                        ticker, True, 1) > bUpper:  # ticker, Buy, Size

                for i in range(
                        1, 20
                ):  # should scale based on order book amount in competition..
                    openLong = shift.Order(shift.Order.Type.MARKET_BUY, ticker,
                                           1)
                    trader.submit_order(openLong)

                print("Tech - Buy", ticker)
                lastTradeSell = False

            # Close long positions for now / Open short position
            elif lastTradeSell == False and mHist.iloc[
                    -1] < 0 and trader.get_close_price(
                        ticker, False, 1) < bLower:  # ticker, Sell, Size

                for i in range(
                        1, 20
                ):  # should scale based on order book amount in competition..
                    closeLong = shift.Order(shift.Order.Type.MARKET_SELL,
                                            ticker, 1)
                    trader.submit_order(closeLong)

                print("Tech - Sell", ticker)
                lastTradeSell = True

        rightNow = trader.get_last_trade_time()  # Reset datetime of right now

    # 60 seconds till end of trading day
    trader.cancel_all_sample_prices_requests(
    )  # Stop sampling prices on threads
    closePositions(trader,
                   ticker)  # Close out open positions so we don't get fined

    # Done trading
    return