Expand model tag support: add GLM-5.1, simplify Anthropic IDs, scan tags anywhere in message

- Flink update_bars debouncing
- update_bars subscription idempotency bugfix
- Price decimal correction bugfix of previous commit
- Add GLM-5.1 model tag alongside renamed GLM-5
- Use short Anthropic model IDs (sonnet/haiku/opus) instead of full version strings
- Allow @tags anywhere in message content, not just at start
- Return hasOtherContent flag instead of trimmed rest string
- Only trigger greeting stream when tag has no other content
- Update workspace knowledge base references to platform/workspace and platform/shapes
- Hierarchical knowledge base catalog
- 151 Trading Strategies knowledge base articles
- Shapes knowledge base article
- MutateShapes tool instead of workspace patch
This commit is contained in:
2026-04-28 15:05:15 -04:00
parent d41fcd0499
commit 47471b7700
184 changed files with 9044 additions and 170 deletions

View File

@@ -0,0 +1,52 @@
---
description: "FX triangular arbitrage that exploits momentary mispricing across three currency pairs by executing a circular chain of exchanges to lock in a riskless profit."
tags: [fx, arbitrage, triangular, market-microstructure]
---
# FX Triangular Arbitrage
**Section**: 8.5 | **Asset Class**: FX | **Type**: Arbitrage
## Overview
Triangular arbitrage involves three currencies (A, B, C) and three currency pairs. If the cross-rate implied by trading A→B→C→A differs from the direct rate, a riskless profit exists. Such mispricings are extremely short-lived and require fast market data feeds and execution systems.
## Construction / Mechanics
Given three currencies A, B, C and their bid/ask prices, there are two chains:
1. A → B → C → A
2. A → C → B → A (equivalent to swapping B and C in chain 1)
Focus on chain 1. The relevant rates are:
- Bid(A→B): rate at which A is exchanged into B
- Bid(B→C): rate at which B is exchanged into C
- Ask(C→A): rate at which C is exchanged back into A (cost = 1/Ask(C→A))
Note: Bid(B→A) = 1/Ask(B→A) and Ask(A→B) = 1/Bid(A→B).
The overall round-trip exchange rate for chain 1 is:
```
R(A→B→C→A) = Bid(A→B) × Bid(B→C) × (1 / Ask(C→A)) (453)
```
**Profit condition:** If R(A→B→C→A) > 1, the trader profits by executing all three legs simultaneously. Starting with 1 unit of A, the trader ends with R > 1 units of A.
## Return Profile
The P&L per unit of A is R - 1 when R > 1. Profits are typically very small per trade (fractions of a pip) but can be accumulated at high frequency. The strategy is notionally riskless if all three legs are executed simultaneously; execution lag introduces market risk.
## Key Parameters / Signals
| Parameter | Description |
|-----------|-------------|
| R(A→B→C→A) | Round-trip rate; > 1 signals a profitable arbitrage |
| Bid(A→B), Bid(B→C) | Bid rates for the two intermediate legs |
| Ask(C→A) | Ask rate for the closing leg |
| Execution speed | Critical: mispricings disappear in milliseconds |
## Variations
- **Multi-currency arbitrage**: extend to more than 3 currency pairs (N-currency chains); computational complexity increases but can uncover deeper mispricings.
- **Chain 2** (A→C→B→A): identical logic with B and C swapped; both chains should be monitored simultaneously.
## Notes
- Opportunities are ephemeral; the strategy is effectively a latency arbitrage and is dominated by high-frequency traders with co-located infrastructure.
- Bid-ask spreads are the primary cost; even small spreads can eliminate the theoretical profit, so only very tight markets are viable.
- Unlike statistical arbitrage, this is a near-deterministic arbitrage: no model risk, but significant execution/technology risk.
- Applicable to crypto exchanges where cross-exchange and cross-pair mispricings can be larger and more persistent than in professional FX markets.