0

I am quite new to programming and I face a strange issue with the below while-loop in Python. When I manually run the code below the loop (i.e. starting with "time now..." to "t += 1"), I get the output I want:

The time is now: 13:31:01
Your current position is -1
This is iteration: 1
The time is now: 13:32:01
Your current position is -1
This is iteration: 2

However, when I run the full loop, I get double, triple or multiple prints of the same minute (see output below the while-loop code). Do you see the issue with this loop? Its as if the "t += 1" increment is running several times per loop (i.e. for each minute several prints). I dont get it.

Thanks for your help!

Blockquote

t=1
while t < 2000:

  time_now = (time.strftime('%H:%M:%S', time.localtime(int(time.time()))))              
  if time_now[6:8] == str('00'):
    sleep(1)
  elif time_now[6:8] == str('01'):
    sleep(0)
  else:    
    x = 61 - int(time_now[6:8])
    sleep(x)
  time_now = (time.strftime('%H:%M:%S', time.localtime(int(time.time()))))
  print("The time is now: " + time_now)

  #+1 is the middle bar
  totalBars = leftBars + rightBars + 1
  swing_candles = client.Trade.Trade_getBucketed(symbol=symbol, binSize="1m", count=totalBars, reverse=True).result()[0]

  last_highs = []
  last_lows = []

  i=0
  while i <= (len(swing_candles)-1):
    last_highs.append(swing_candles[i]["high"])
    last_lows.append(swing_candles[i]["low"])
    i += 1

  #get the highest high and the lowest low
  highest_high = max(last_highs)
  lowest_low = min(last_lows)

  #check if there are existing positions & orders
  positions_quantity = client.Position.Position_get().result()[0][0]["currentQty"]

  #check existing orders
  buy_orders_quantity = []
  sell_orders_quantity = []
  orders_quantity = client.Order.Order_getOrders(filter=json.dumps({"open": True})).result()[0]   

  h=0
  while h <= len(orders_quantity)-1:
    if orders_quantity[h]["side"] == "Sell":
        sell_orders_quantity.append(orders_quantity[h])
    elif orders_quantity[h]["side"] == "Buy":
        buy_orders_quantity.append(orders_quantity[h])            
    h += 1 



  if highest_high == last_highs[rightBars] and positions_quantity == 0:
    if buy_orders_quantity == []:
        client.Order.Order_new(symbol = symbol, orderQty = orderQty*1, side = "Buy", ordType = 'Stop', stopPx = highest_high, execInst ='LastPrice' ).result()

    elif buy_orders_quantity != []:
        orderID = buy_orders_quantity[0]["orderID"]
        client.Order.Order_amend(orderID=orderID, orderQty=orderQty*1, stopPx = highest_high).result()
    else:
        pass


  elif highest_high == last_highs[rightBars] and positions_quantity > 0:
        #dont place any additional long
        pass


  elif highest_high == last_highs[rightBars] and positions_quantity < 0:
    if buy_orders_quantity != []:
        orderID = buy_orders_quantity[0]["orderID"]
        client.Order.Order_amend(orderID=orderID, orderQty=orderQty*2, stopPx = highest_high).result()    
    else:
        client.Order.Order_new(symbol = symbol, orderQty = (orderQty)*2, side = "Buy", ordType = 'Stop', stopPx = highest_high, execInst ='LastPrice' ).result()


  elif lowest_low == last_lows[rightBars] and positions_quantity == 0:
    if sell_orders_quantity == []:
        client.Order.Order_new(symbol = symbol, orderQty = (orderQty)*-1, side = "Sell", ordType = 'Stop', stopPx = lowest_low, execInst ='LastPrice' ).result()
    elif sell_orders_quantity != []:
        orderID = sell_orders_quantity[0]["orderID"]
        client.Order.Order_amend(orderID=orderID, orderQty=orderQty*-1, stopPx = lowest_low ).result()
    else:
        pass        

  elif lowest_low == last_lows[rightBars] and positions_quantity < 0:
        #dont place any additional shorts
        pass       

  elif lowest_low == last_lows[rightBars] and positions_quantity > 0:
    if sell_orders_quantity != []:
        orderID = sell_orders_quantity[0]["orderID"]
        client.Order.Order_amend(orderID=orderID, orderQty=orderQty*-2, stopPx = lowest_low).result()    
    else:
        #if there is no order, place new order with double amount   
        client.Order.Order_new(symbol = symbol, orderQty = (orderQty)*-2, side = "Sell", ordType = 'Stop', stopPx = lowest_low, execInst ='LastPrice' ).result()

  positions_quantity = client.Position.Position_get().result()[0][0]["currentQty"]
  print("Your current position is " + str(positions_quantity))
  print("This is iteration: " + str(t))
  t += 1

This is the output when I run the while-loop above (however each minute there should be just one print, but starting with iteration two there are several prints for the same minute (loop)):

The time is now: 13:39:01
Your current position is -1
This is iteration: 1
The time is now: 13:39:01
Your current position is -1
This is iteration: 2
The time is now: 13:40:01
Your current position is -1
This is iteration: 3
The time is now: 13:40:01
Your current position is -1
This is iteration: 4
The time is now: 13:40:01
Your current position is -1
This is iteration: 5
The time is now: 13:40:01
Your current position is -1
This is iteration: 6
The time is now: 13:40:01
Your current position is -1
This is iteration: 7
The time is now: 13:41:01
Your current position is -1
This is iteration: 8
The time is now: 13:41:01
Your current position is -1
This is iteration: 9
The time is now: 13:41:01
Your current position is -1
This is iteration: 10
The time is now: 13:41:01
Your current position is -1
This is iteration: 11
The time is now: 13:41:01
Your current position is -1
This is iteration: 12
6
  • What sleep are you using? Commented May 22, 2020 at 12:58
  • Hi, from time import sleep. Should correspond to seconds..? Commented May 22, 2020 at 13:10
  • What do you think elif time_now[6:8] == str('01'): sleep(0) accomplishes? Commented May 22, 2020 at 13:56
  • I could have put "pass" instead. Its just to make sure that the analysis starts 1 second after each full minute (to make sure the 1min candlestick data is available and can be retrieved from the exchange). The "01" case is not covered by "x = 61 - int(time_now[6:8])", i.e. I dont want it to sleep for 60 seconds for this case, as I would miss one minute of data. Commented May 22, 2020 at 16:01
  • It's maybe bad programming...(( But what could be causing the multiple prints...? Commented May 22, 2020 at 16:13

1 Answer 1

1

Assuming that "running the full loop" (scenario A) is faster than when you "manually runtime code" (scenario B), what appears to be happening is that, when the # of seconds in time_now is "01", the scenario A is fast enough to complete a few iterations with the # of seconds in time_now staying at "01", while scenario B is not.

If you slept for at least 1 second when the # of seconds in time_now was "01", that should prevent this, as it would change the # of seconds in time_now.

Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.