diff --git a/src/executor.c b/src/executor.c index c17f061..3fb9b16 100644 --- a/src/executor.c +++ b/src/executor.c @@ -10,7 +10,6 @@ #include #include -#define _D1 1.0 #define FILL_TIMEOUT_MS 5000 struct executor_thread_s { @@ -34,21 +33,21 @@ void executor_write_report(const char *fmt, ...) { /* ── Timestamp helpers ── */ -static int64_t now_mono_ms(void) { +static double now_mono_ms(void) { struct timespec ts; clock_gettime(CLOCK_MONOTONIC, &ts); - return (int64_t)ts.tv_sec * 1000 + (int64_t)ts.tv_nsec / 1000000; + return (double)ts.tv_sec * 1000.0 + (double)ts.tv_nsec / 1000000.0; } -static int64_t now_realtime_ms(void) { +static double now_realtime_ms(void) { struct timespec ts; clock_gettime(CLOCK_REALTIME, &ts); - return (int64_t)ts.tv_sec * 1000 + (int64_t)ts.tv_nsec / 1000000; + return (double)ts.tv_sec * 1000.0 + (double)ts.tv_nsec / 1000000.0; } static void format_ts(char *buf, size_t sz) { time_t s = time(NULL); - int ms = (int)(now_realtime_ms() % 1000); + int ms = (int)fmod(now_realtime_ms(), 1000.0); struct tm gm; gmtime_r(&s, &gm); strftime(buf, sz, "%Y-%m-%dT%H:%M:%S.", &gm); @@ -175,8 +174,8 @@ void executor_execute_triangle(executor_thread_t *et, char ts_buf[32]; char corr_id[64]; - int64_t exec_start_rt = now_realtime_ms(); - int64_t exec_start_mono = now_mono_ms(); + double exec_start_rt = now_realtime_ms(); + double exec_start_mono = now_mono_ms(); double leg_timings[6] = {0}; /* leg0_order, leg0_fill, leg1_order, leg1_fill, leg2_order, leg2_fill */ snprintf(corr_id, sizeof(corr_id), "%08x%08x%08x%08x", (unsigned)(uintptr_t)&sig->legs.legs[0] ^ (unsigned)sig->ts_ms, @@ -208,20 +207,20 @@ void executor_execute_triangle(executor_thread_t *et, /* Build a client OID */ char client_oid[64]; snprintf(client_oid, sizeof(client_oid), "c%08x%04x", - (unsigned)(now_realtime_ms() & 0xFFFFFFFF), + (unsigned)((uint64_t)now_realtime_ms() & 0xFFFFFFFF), (unsigned)leg); fills[leg][4] = input_vol; /* ── Capture order fire timing BEFORE sending (realtime) ── */ - int64_t t0 = now_mono_ms(); + double t0 = now_mono_ms(); if (leg < 6) leg_timings[leg * 2] = (double)(now_realtime_ms() - exec_start_rt); /* ── Place order ── */ char order_id[32] = {0}; char err_msg[128] = {0}; bool ok = false; - int64_t order_fire_ms_tracking = t0; + double order_fire_ms_tracking = t0; if (sig->live) { ok = rest_order_place(et->rest, sl->symbol, sl->side, @@ -248,7 +247,7 @@ void executor_execute_triangle(executor_thread_t *et, format_ts(ts_buf, sizeof(ts_buf)); executor_write_report( "%s ORDER | corr=%s | leg%d | %s | %s | vol=%.10g | " - "order_id=%s | lat=%.1fms\n", + "order_id=%s | lat=%.3fms\n", ts_buf, corr_id, leg, sl->symbol, sl->side, input_vol, ok ? order_id : "NONE", fills[leg][5]); } @@ -258,7 +257,7 @@ void executor_execute_triangle(executor_thread_t *et, format_ts(ts_buf, sizeof(ts_buf)); executor_write_report( "%s REJECTED | corr=%s | leg%d | %s | %s | vol=%.10g | " - "error=%s | lat=%.1fms\n", + "error=%s | lat=%.3fms\n", ts_buf, corr_id, leg, sl->symbol, sl->side, input_vol, err_msg, fills[leg][5]); success = false; @@ -330,7 +329,7 @@ void executor_execute_triangle(executor_thread_t *et, format_ts(ts_buf, sizeof(ts_buf)); executor_write_report( "%s FILL | corr=%s | leg%d | %s | %s | " - "out=%.10g@%.6g | fee=%.6g %s | lat=%.1fms\n", + "out=%.10g@%.6g | fee=%.6g %s | lat=%.3fms\n", ts_buf, corr_id, leg, sl->symbol, sl->side, is_buy ? total_size : total_funds, avg_price, total_fee, sl->fee_currency, @@ -406,7 +405,7 @@ void executor_execute_triangle(executor_thread_t *et, effective_bps = (profit / leg0_in) * 10000.0; } - int64_t total_ms = now_mono_ms() - exec_start_mono; + double total_ms = now_mono_ms() - exec_start_mono; /* ── Build timing string (t0 = book_update_arrived = 0.0ms) ── */ char timings_str[512] = ""; @@ -416,7 +415,7 @@ void executor_execute_triangle(executor_thread_t *et, if (book_base > 0) { if (sig->book_ts_ms > 0) tp += snprintf(timings_str + tp, sizeof(timings_str) - tp, - "t-1_snapshot=%.1fms ", + "t-1_snapshot=%.3fms ", (double)((int64_t)sig->book_ts_ms - book_base)); tp += snprintf(timings_str + tp, sizeof(timings_str) - tp, @@ -424,7 +423,7 @@ void executor_execute_triangle(executor_thread_t *et, if (sig->ts_ms > 0) tp += snprintf(timings_str + tp, sizeof(timings_str) - tp, - "t1_signal=%.1fms ", + "t1_signal=%.3fms ", (double)((int64_t)sig->ts_ms - book_base)); double sig_recv = (double)(exec_start_rt - book_base); @@ -433,9 +432,9 @@ void executor_execute_triangle(executor_thread_t *et, double f = leg_timings[l * 2 + 1]; if (fills[l][0] > 0) { tp += snprintf(timings_str + tp, sizeof(timings_str) - tp, - "t%d_leg%d_order=%.1fms ", 2 + l * 2, l, sig_recv + o); + "t%d_leg%d_order=%.3fms ", 2 + l * 2, l, sig_recv + o); tp += snprintf(timings_str + tp, sizeof(timings_str) - tp, - "t%d_leg%d_fill=%.1fms ", 3 + l * 2, l, sig_recv + f); + "t%d_leg%d_fill=%.3fms ", 3 + l * 2, l, sig_recv + f); } } } @@ -462,7 +461,7 @@ void executor_execute_triangle(executor_thread_t *et, } } int n = snprintf(fills_str + fills_pos, sizeof(fills_str) - fills_pos, - "%sL%d:%s %s %s->%s %.10g@%.6g(fee=%.6g %s lat=%.1fms)", + "%sL%d:%s %s %s->%s %.10g@%.6g(fee=%.6g %s lat=%.3fms)", leg > 0 ? ", " : "", leg, side, pair, in_ccy, out_ccy, fills[leg][0], fills[leg][1], fills[leg][2], diff --git a/src/triangle.h b/src/triangle.h index ce94e51..abc3571 100644 --- a/src/triangle.h +++ b/src/triangle.h @@ -9,7 +9,6 @@ #include "config.h" #define MAX_TRIANGLES 16384 -#define MAX_CURRENCIES 512 /* Describes one triangular arbitrage path of three trading pairs */ typedef struct {