study(title='[RS]Triangular Arbitrage V0', overlay=false) src = input(title='Source series to compare:', type=source, defval=close) instrument01 = security(input(title='Source of the 1st Instrument:', defval='EURUSD', type=symbol), period, src) instrument02 = security(input(title='Source of the 1st Instrument:', defval='GBPUSD', type=symbol), period, src) instrument03 = security(input(title='Source of the 1st Instrument:', defval='EURGBP', type=symbol), period, src) _A = instrument03 * instrument02 _B = (1/instrument03) * instrument01 _C = instrument01 * (1/instrument02) TriArb = _A-(_C*_B) plot(title='Arbitrage', series=TriArb, style=columns, color=black, transp=75, trackprice=true) plot(title='Real Change', series=offset(src-src,1), style=histogram, color=black, trackprice=false, offset=-1) hline(0, color=black)
I think the key here is that usually you are getting a quote on lets say EURUSD at 1.00 and then USDGBP at lets say 1.25. So when you multiple EUR/USD and USD/GBP they should cancel and leave you with EUR/GBP at a price of 1*1.25. AT this point, if the dealer is quoting you say 1.2, you have an arbitrage opportunity whereby you sell whats expensive (the pairs) and buy whats cheap (the dealer quote).
So when you say you messed it up, I think the only mess up is that you need to check to see if theres an arbitrage opp first. You can use (going from memory here) covered parity formula to do this.
(this article explains the whole concept I think the formula is at the bottom)