#ifndef FUSED_TRIANGLE_H #define FUSED_TRIANGLE_H #include #include #include #include "book.h" #include "hash.h" #include "config.h" #define MAX_TRIANGLES 16384 #define MAX_CURRENCIES 512 /* Describes one triangular arbitrage path of three trading pairs */ typedef struct { uint16_t symbol_idx[3]; /* indices into the symbol table for each leg */ uint8_t use_bid[3]; /* 1=use bid price, 0=use ask price for this leg */ double fee_factor[3]; /* fee multiplier (1 - fee_rate) for each leg */ double base_increment[3]; /* base asset lot step for each leg */ double quote_increment[3]; /* quote asset lot step for each leg */ double funds_increment[3]; /* funds lot step for market buys for each leg */ double base_min_size[3]; /* min base order size for each leg */ double quote_min_size[3]; /* min quote order size for each leg */ uint16_t id; /* unique triangle ID */ char symbol_names[3][SYMBOL_NAME_LEN]; /* trading pair names for each leg */ char fee_currency[3][CURRENCY_NAME_LEN]; /* fee currency per leg */ char base[CURRENCY_NAME_LEN]; /* base currency of the triangle */ char mid[CURRENCY_NAME_LEN]; /* intermediate currency */ char quote[CURRENCY_NAME_LEN]; /* quote currency of the triangle */ } triangle_t; /* Index entry into the per-currency triangle lookup table */ typedef struct { uint32_t offset; /* start index in the flat triangle array */ uint32_t count; /* number of triangles for this currency */ } tri_index_entry_t; /* Complete set of enumerated triangles with fast per-currency indexing */ typedef struct { triangle_t *triangles; /* contiguous array of all triangles */ uint32_t triangle_count; /* total number of triangles */ tri_index_entry_t *tri_index; /* per-currency index into tri_flat */ uint32_t *tri_flat; /* flat array mapping currency->triangle indices */ } triangle_set_t; /* Fee rate entry for a specific currency (from fee table) */ typedef struct { char currency[CURRENCY_NAME_LEN]; /* currency name */ double taker_fee; /* taker fee rate for this currency */ double maker_fee; /* maker fee rate for this currency */ } fee_entry_t; /* Signal types — moved here from queue.h */ /* Single price+size level in an order book snapshot */ typedef struct { double price; double size; } book_level_t; /* Snapshot of one leg's order book included in a signal */ typedef struct { char symbol[SYMBOL_NAME_LEN]; int64_t ts_ms; book_level_t bids[MAX_BOOK_LEVELS]; book_level_t asks[MAX_BOOK_LEVELS]; uint8_t bid_count; uint8_t ask_count; } signal_book_t; /* One leg of a triangular arbitrage signal */ typedef struct { char symbol[SYMBOL_NAME_LEN]; char input_currency[CURRENCY_NAME_LEN]; char output_currency[CURRENCY_NAME_LEN]; char fee_currency[CURRENCY_NAME_LEN]; double fee_rate; double exchange_rate; char side[5]; char order_param[32]; double quote_volume; double base_increment; double quote_increment; double funds_increment; double base_min_size; } signal_leg_t; /* Collection of up to 3 legs comprising a triangular signal */ typedef struct { uint8_t leg_count; signal_leg_t legs[3]; } signal_legs_t; /* Entry describing one triangular arbitrage opportunity */ typedef struct { char triangle_key[CURRENCY_NAME_LEN * 3 + 4]; char primary_quote[CURRENCY_NAME_LEN]; double predicted_bps; char max_volume[32]; double starting_volume; bool live; int64_t ts_ms; int64_t book_ts_ms; int64_t t_sock_arrive_ms; int64_t t_arrive_ms; int64_t t_eval_ms; uint8_t book_count; signal_book_t books[3]; signal_legs_t legs; } signal_entry_t; /* Initialise triangle set: enumerate all triangles from the symbol table */ int triangle_set_init(triangle_set_t *set, const symbol_table_t *symbols, const config_t *cfg); /* Free all memory owned by a triangle set */ void triangle_set_free(triangle_set_t *set); #endif