【问题标题】:Oanda API - Issue Price - InstrumentsOanda API - 发行价格 - 工具
【发布时间】:2021-10-29 19:39:23
【问题描述】:

我正在使用 Oanda API 来自动化交易策略,我有一个“价格”错误,仅在选择 XAG(银)等工具时出现,我的猜测是存在分类差异,但 Oanda 尚未回答关于此事。

选择外汇对时不会出现该错误。

如果过去有人遇到过此类问题并设法解决了,我会很高兴听到他们的意见。

PS:我在英国,可以使用包括差价合约在内的大多数产品

class SMABollTrader(tpqoa.tpqoa):
def __init__(self, conf_file, instrument, bar_length, SMA, dev, SMA_S, SMA_L, units):
    super().__init__(conf_file)
    self.instrument = instrument
    self.bar_length = pd.to_timedelta(bar_length)
    self.tick_data = pd.DataFrame()
    self.raw_data = None
    self.data = None 
    self.last_bar = None
    self.units = units
    self.position = 0
    self.profits = []
    self.price = []
    
    #*****************add strategy-specific attributes here******************
    self.SMA = SMA
    self.dev = dev
    self.SMA_S = SMA_S
    self.SMA_L = SMA_L
    #************************************************************************
 
def get_most_recent(self, days = 5):
    while True:
        time.sleep(2)
        now = datetime.utcnow()
        now = now - timedelta(microseconds = now.microsecond)
        past = now - timedelta(days = days)
        df = self.get_history(instrument = self.instrument, start = past, end = now,
                               granularity = "S5", price = "M", localize = False).c.dropna().to_frame()
        df.rename(columns = {"c":self.instrument}, inplace = True)
        df = df.resample(self                                                 .bar_length, label = "right").last().dropna().iloc[:-1]
        self.raw_data = df.copy()
        self.last_bar = self.raw_data.index[-1]
        if pd.to_datetime(datetime.utcnow()).tz_localize("UTC") - self.last_bar < self.bar_length:
            break
            
            
def on_success(self, time, bid, ask):
    print(self.ticks, end = " ")
    
    recent_tick = pd.to_datetime(time)
    df = pd.DataFrame({self.instrument:(ask + bid)/2}, 
                      index = [recent_tick])
    self.tick_data = self.tick_data.append(df)
    
    if recent_tick - self.last_bar > self.bar_length:
        self.resample_and_join()
        self.define_strategy()
        self.execute_trades()

def resample_and_join(self):
    self.raw_data = self.raw_data.append(self.tick_data.resample(self.bar_length, 
                                                              label="right").last().ffill().iloc[:-1])
    self.tick_data = self.tick_data.iloc[-1:]
    self.last_bar = self.raw_data.index[-1]

def define_strategy(self): # "strategy-specific"
    df = self.raw_data.copy()
  
    #******************** define your strategy here ************************

    df["SMA"] = df[self.instrument].rolling(self.SMA).mean()
    df["Lower"] = df["SMA"] - df[self.instrument].rolling(self.SMA).std() * self.dev
    df["Upper"] = df["SMA"] + df[self.instrument].rolling(self.SMA).std() * self.dev
    df["distance"] = df[self.instrument] - df.SMA
    df["SMA_S"] = df[self.instrument].rolling(self.SMA_S).mean()
    df["SMA_L"] = df[self.instrument].rolling(self.SMA_L).mean()
    
  
    df["position"] = np.where(df[self.instrument] < df.Lower) and np.where(df["SMA_S"] > df["SMA_L"] ,1,np.nan)
    df["position"] = np.where(df[self.instrument] > df.Upper) and np.where(df["SMA_S"] < df["SMA_L"], -1, df["position"])
    df["position"] = np.where(df.distance * df.distance.shift(1) < 0, 0, df["position"])
    df["position"] = df.position.ffill().fillna(0)
    
   
    self.data = df.copy()   
 
    #***********************************************************************

                              
    
def execute_trades(self):

    if self.data["position"].iloc[-1] == 1:
        if self.position == 0 or None:
            order = self.create_order(self.instrument, self.units, suppress = True, ret = True)
            self.report_trade(order, "GOING LONG")
        elif self.position == -1:
            order = self.create_order(self.instrument, self.units * 2, suppress = True, ret = True) 
            self.report_trade(order, "GOING LONG")
        self.position = 1
    elif self.data["position"].iloc[-1] == -1: 
        if self.position == 0:
            order = self.create_order(self.instrument, -self.units, suppress = True, ret = True)
            self.report_trade(order, "GOING SHORT")
        elif self.position == 1:
            order = self.create_order(self.instrument, -self.units * 2, suppress = True, ret = True)
            self.report_trade(order, "GOING SHORT")
        self.position = -1
    elif self.data["position"].iloc[-1] == 0: 
        if self.position == -1:
            order = self.create_order(self.instrument, self.units, suppress = True, ret = True)
            self.report_trade(order, "GOING NEUTRAL")
        elif self.position == 1:
            order = self.create_order(self.instrument, -self.units, suppress = True, ret = True) 
            self.report_trade(order, "GOING NEUTRAL")
        self.position = 0

def report_trade(self, order, going):
    time = order["time"]
    units = order["units"]
    price = order["price"]
    pl = float(order["pl"])
    self.profits.append(pl)
    cumpl = sum(self.profits)
    print("\n" + 100* "-")
    print("{} | {}".format(time, going))
    print("{} | units = {} | price = {} | P&L = {} | Cum P&L = {}".format(time, units, price, pl, cumpl))
    print(100 * "-" + "\n")  

trader = SMABollTrader("oanda.cfg", "EUR_GBP", "15m", SMA = 82, dev = 4, SMA_S = 38, SMA_L = 135, units = 100000)

trader.get_most_recent()

trader.stream_data(trader.instrument, stop = None ) if trader.position != 0: # 如果我们有一个最终的未平仓头寸 close_order = trader.create_order(trader.instrument, 单位 = -trader.position * trader.units, 抑制=真,ret =真) trader.report_trade(close_order, "走向中立") 交易者.信号 = 0

【问题讨论】:

  • 请提供足够的代码,以便其他人更好地理解或重现问题。

标签: api broker oanda


【解决方案1】:

我也上过 Hagmann 课程,我立即认出了你的代码。

首先,您定义职位的方式并不是最好的。查看结合两种策略的部分。有两种方法。

现在关于您的价格问题,我与 BTC 有类似的情况。您可以下载它的历史数据,但是当我将它绘制到策略代码并开始流式传输时,我遇到了完全相同的错误,表明从未传输过分时数据。

我猜测并非所有工具都可以通过 api 进行交易,或者在您的情况下,您可能试图在交易时间以外进行流式传输?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-08-15
    • 1970-01-01
    • 2020-05-26
    • 1970-01-01
    • 2019-07-25
    • 1970-01-01
    • 1970-01-01
    • 2012-05-15
    相关资源
    最近更新 更多