我想测试一个algo机器人。我有它,它将读取数据和下订单,但我有麻烦,试图让它检查,看看是否有一个未结订单的第一,然后再下订单。目前,它只是堆积订单,直到我取消算法。
这是我试过的。
# Imports
import ibapi
from ibapi.client import EClient
from ibapi.wrapper import EWrapper
from ibapi.contract import Contract
from ibapi.order import *
# import ta
import numpy as np
import pandas as pd
import pytz
import math
from datetime import datetime, timedelta
import threading
import time
import collections
from calcs_helper import calculate_ema, atr_num, rsi
from scipy.stats import norm
# Vars
orderId = 1
SLOW_PERIOD = 30
FAST_PERIOD = 6
# Class for Interactive Brokers Connection
class IBApi(EWrapper,EClient):
def __init__(self):
EClient.__init__(self, self)
# Historical Backtest Data
def historicalData(self, reqId, bar):
try:
bot.on_bar_update(reqId,bar,False)
except Exception as e:
print(e)
# On Realtime Bar after historical data finishes
def historicalDataUpdate(self, reqId, bar):
try:
bot.on_bar_update(reqId,bar,True)
except Exception as e:
print(e)
# On Historical Data End
def historicalDataEnd(self, reqId, start, end):
print(reqId)
# Get next order id we can use
def nextValidId(self, nextorderId):
global orderId
orderId = nextorderId
# # Listen for realtime bars
# def realtimeBar(self, reqId, time, open_, high, low, close,volume, wap, count):
# super().realtimeBar(reqId, time, open_, high, low, close, volume, wap, count)
# try:
# bot.on_bar_update(reqId, time, open_, high, low, close, volume, wap, count)
# except Exception as e:
# print(e)
def error(self, id, errorCode, errorMsg):
print(errorCode)
print(errorMsg)
# Bot Logic
class Bot:
ib = None
reqId = 1
SLOW_PERIOD = 30
FAST_PERIOD = 6
global orderId
initialbartime = datetime.now().astimezone(pytz.timezone("America/New_York"))
def __init__(self):
#Connect to IB on init
self.ib = IBApi()
self.ib.connect("127.0.0.1", 7497,1)
ib_thread = threading.Thread(target=self.run_loop, daemon=True)
ib_thread.start()
time.sleep(1)
self.long_ema = collections.deque(maxlen=SLOW_PERIOD)
self.short_ema = collections.deque(maxlen=FAST_PERIOD)
self.nmc = 0
self.account_value = 0
#Create our IB Contract Object
contract = Contract()
contract.symbol = "ES"
contract.secType = "FUT"
contract.exchange = "GLOBEX"
contract.currency = "USD"
contract.lastTradeDateOrContractMonth = "202109"
self.ib.reqIds(-1)
self.ib.reqHistoricalData(self.reqId,contract,"","2 D","5 mins","TRADES",1,1,True,[])
self.ib.reqPositions(self)
#Listen to socket in seperate thread
def run_loop(self):
self.ib.run()
#Bracet Order Setup
def bracketOrder(self, parentOrderId, action, quantity, profitTarget, stopLoss):
#Initial Entry
#Create our IB Contract Object
contract = Contract()
contract.symbol = "ES"
contract.secType = "FUT"
contract.exchange = "GLOBEX"
contract.currency = "USD"
contract.lastTradeDateOrContractMonth = "202109"
# Create Parent Order / Initial Entry
parent = Order()
parent.orderId = parentOrderId
parent.orderType = "MKT"
parent.action = action
parent.totalQuantity = quantity
parent.transmit = False
# Profit Target
profitTargetOrder = Order()
profitTargetOrder.orderId = parent.orderId+1
profitTargetOrder.orderType = "MKT"
profitTargetOrder.action = "SELL"
profitTargetOrder.totalQuantity = quantity
profitTargetOrder.lmtPrice = round(profitTarget,2)
profitTargetOrder.parentId = parentOrderId
profitTargetOrder.transmit = False
# Stop Loss
stopLossOrder = Order()
stopLossOrder.orderId = parent.orderId+2
stopLossOrder.orderType = "STP"
stopLossOrder.action = "SELL"
stopLossOrder.totalQuantity = quantity
stopLossOrder.parentId = parentOrderId
stopLossOrder.auxPrice = round(stopLoss,2)
stopLossOrder.transmit = True
bracketOrders = [parent, profitTargetOrder, stopLossOrder]
return bracketOrders
#Pass realtime bar data back to our bot object
def on_bar_update(self, reqId, bar,realtime):
global orderId
if self.ib.reqPositions() > 0:
print("{} Position/s on in {}.".format(pos, contract.symbol))
else:
self.long_ema.append(bar.close)
self.short_ema.append(bar.close)
if len(self.long_ema) == SLOW_PERIOD:
ema_15 = np.array(self.long_ema)
ema_6 = np.array(self.short_ema)
fast_avg = calculate_ema(ema_6,SLOW_PERIOD)[-1]
slow_avg = calculate_ema(ema_15[-SLOW_PERIOD:], 15)[-1]
num = fast_avg-slow_avg
If num > 1 and pos == 0:
#Bracket Order 2% Profit Target 1% Stop Loss
profitTarget = bar.close*1.02
stopLoss = bar.close*0.99
quantity = 1
bracket = self.bracketOrder(orderId,"BUY",quantity, profitTarget, stopLoss)
contract = Contract()
contract.symbol = "ES"
contract.secType = "FUT"
contract.exchange = "GLOBEX"
contract.currency = "USD"
contract.lastTradeDateOrContractMonth = "202109"
#Place Bracket Order
for o in bracket:
o.ocaGroup = "OCA_"+str(orderId)
self.ib.placeOrder(o.orderId,contract,o)
orderId += 3
# Start Bot
bot = Bot()
这并没有把位置还给我。我不知道如何把它们作为一个数字拉进来,在上面运行条件语句。
暂无答案!
目前还没有任何答案,快来回答吧!