separate folder for simulation, standardized REST and WS settings

This commit is contained in:
Cryptoval Trading Technologies 2025-05-13 15:55:49 +00:00
parent bc8c470a1a
commit ee9d93b5ad
3 changed files with 625 additions and 202 deletions

View File

@ -1,128 +0,0 @@
@var COORDINATOR_REST_PORT=23456
@var COORDINATOR_WS_PORT=12345
@var GLOBAL_CHANNEL_PREFIX=CVTT_MU
{
"refdata": @inc=http://@env{CONFIG_SERVICE}/refdata/refdata
, "comm": @inc=http://@env{CONFIG_SERVICE}/apps/common/comm
, "algos": @inc=http://@env{CONFIG_SERVICE}/apps/common/algos
, "strategies": @inc=http://@env{CONFIG_SERVICE}/apps/common/strategies
, "risk_strategies": @inc=http://@env{CONFIG_SERVICE}/apps/common/risk_strategies
, "comm_settings": @env{CONFIG_COMM_SETTINGS}
, "global_channel_prefix": ${GLOBAL_CHANNEL_PREFIX}
, "coordinator": {
"api": {
"REST": {
"port": ${COORDINATOR_REST_PORT},
"base_url": ["POST", "http://localhost:${COORDINATOR_REST_PORT}"]
}
, "WS": {
"url": "ws://localhost:${COORDINATOR_WS_PORT}/ws"
}
}
}
, "market_data_gateway": {
"exchanges_settings": {
"*": {
"mkt_data": {
"enabled": true
, "streaming": true
},
"order_entry": {
"enabled": false
, "streaming": false
},
"accounting": {
"enabled": false
, "streaming": false
},
},
}
, "channel_prefix": "${GLOBAL_CHANNEL_PREFIX}.MD_GW"
, "app_status_channel": "${GLOBAL_CHANNEL_PREFIX}.MD_GW_APP_STATUS"
, "exchanges": [
"COINBASE_SIM"
]
}
, "order_entry_gateway": {
"exchanges_settings": {
"COINBASE_SIM": {
"mkt_data": {
"enabled": false
, "streaming": false
},
"order_entry": {
"enabled": true
, "streaming": true
},
"accounting": {
"enabled": false
, "streaming": false
}
# , "credentials_key": {
# "read_only": "ALPACA_SANDBOX"
# , "trade": "ALPACA_SANDBOX"
# }
}
}
, "channel_prefix": "${GLOBAL_CHANNEL_PREFIX}.OE_GW"
, "app_status_channel": "${GLOBAL_CHANNEL_PREFIX}.OE_GW_APP_STATUS"
, "exchanges": [
"ALPACA_SNDBX"
]
}
, "accounting_gateway": {
"exchanges_settings": {
"COINBASE_SIM": {
"mkt_data": {
"enabled": false
, "streaming": false
},
"order_entry": {
"enabled": false
, "streaming": false
},
"accounting": {
"enabled": true
, "streaming": false
}
# , "credentials_key": {
# "read_only": "COINBASE_ADV_RO"
# }
},
}
, "channel_prefix": "${GLOBAL_CHANNEL_PREFIX}.ACCT_GW"
, "app_status_channel": "${GLOBAL_CHANNEL_PREFIX}.ACCT_GW_APP_STATUS"
, "exchanges": [
"COINBASE_SIM"
]
}
, "quant": {
"channel_prefix": "${GLOBAL_CHANNEL_PREFIX}.QUANT"
, "app_status_channel": "${GLOBAL_CHANNEL_PREFIX}.QUANT_MUSVC_STATUS"
}
, "trader": {
"channel_prefix": "${GLOBAL_CHANNEL_PREFIX}.TRADER"
, "app_status_channel": "${GLOBAL_CHANNEL_PREFIX}.TRADER_MUSVC_STATUS"
}
, "bookkeeper": {
"channel_prefix": "${GLOBAL_CHANNEL_PREFIX}.BKPR"
, "app_status_channel": "${GLOBAL_CHANNEL_PREFIX}.BKPR_MUSVC_STATUS"
, "db": {
"server_type": "timescale",
"cred_key": "TSDB_TRADING_CVTT_TESTDB"
}
}
, "risk_manager": {
"channel_prefix": "${GLOBAL_CHANNEL_PREFIX}.RMGR"
, "app_status_channel": "${GLOBAL_CHANNEL_PREFIX}.RMGR_MUSVC_STATUS"
, "revalue_interval_sec": 10.5
}
, "pricer": {
"channel_prefix": "${GLOBAL_CHANNEL_PREFIX}.PXER"
, "app_status_channel": "${GLOBAL_CHANNEL_PREFIX}.PXER_MUSVC_STATUS"
}
}

View File

@ -0,0 +1,349 @@
@var COORDINATOR_HOST=localhost
@var COORDINATOR_REST_PORT=28001
@var COORDINATOR_WS_PORT=28002
@var GLOBAL_CHANNEL_PREFIX=CVTT_MU_SIM
@var SIM_HOST=localhost
@var SIM_DATA_DIR=/home/oleg/develop/simulation/data
@var SIM_MD_WS_PORT=28080
@var SIM_OE_WS_PORT=28081
@var SIM_OE_REST_PORT=28082
@var SIM_AC_REST_PORT=28083
{
# ---------------------------------------
"__dummy__": null
# ---------------------------------------
# Overwriting "exchanges" part in "refdata"
# "refdata": @inc=http://@env{CONFIG_SERVICE}/refdata/refdata
"refdata": {
"assets": @inc=http://@env{CONFIG_SERVICE}/refdata/assets ,
"instruments": @inc=http://@env{CONFIG_SERVICE}/refdata/instruments ,
"exchange_instruments": @inc=http://@env{CONFIG_SERVICE}/refdata/exchange_instruments ,
"dynamic_instrument_exchanges": ["ALPACA"],
"exchanges": {
"SIM_COINBASE": {
"exchange_id": "COINBASE",
"name": "Coinbase Advanced Trade (Simulation)",
"type": "SPOT",
"mktdata" : {
"class": "cvttpy.exchanges.mkt_simulator.md_client.MktSimMdClientFeed"
"api": @pathptr=simulation/market_simulator/market_data/api
},
"order_entry": {
"class": "cvttpy.exchanges.mkt_simulator.oe_client.MarketSimulatorOEClient"
"api": @ptrpath=simulation/market_simulator/order_entry/api
},
"accounting": {
"class": "cvttpy.exchanges.mkt_simulator.acct_client.MktSimAccounting"
"api": @ptrpath=simulation/market_simulator/accounting/api
},
},
"SIM_ALPACA": {
"exchange_id": "ALPACA",
"name": "Alpaca Trading",
"type": "EQUITY",
"mktdata" : {
"class": "cvttpy.exchanges.mkt_simulator.md_client.MktSimMdClientFeed"
"config_key": "simulation/market_simulator/market_data/api"
},
"order_entry": {
"class": "cvttpy.exchanges.mkt_simulator.oe_client.MarketSimulatorOEClient"
"config_key": "simulation/market_simulator/order_entry/api"
},
"accounting": {
"class": "cvttpy.exchanges.mkt_simulator.acct_client.MktSimAccounting"
"config_key": "simulation/market_simulator/accounting/api"
}
},
}
},
"comm": @inc=http://@env{CONFIG_SERVICE}/apps/common/comm ,
"algos": @inc=http://@env{CONFIG_SERVICE}/apps/common/algos ,
"strategies": @inc=http://@env{CONFIG_SERVICE}/apps/common/strategies ,
"risk_strategies": @inc=http://@env{CONFIG_SERVICE}/apps/common/risk_strategies ,
"comm_settings": "@env{CONFIG_COMM_SETTINGS}",
"global_channel_prefix": "${GLOBAL_CHANNEL_PREFIX}",
"simulation": {
# "speed_factor": 1.0,
"speed_factor": 0.0
, "time_events_interval_ms": 0
, "simtime_file": "${SIM_DATA_DIR}/simtime.bin"
, "expected_consumers": [
"md_gateway",
"mkt_gateway_tester"
"coordinator",
# "oe_gateway",
# "acct_gateway",
# "quant",
# "trader",
# "bookkeeper",
# "risk_manager",
# "pricer"
]
, "consumer_timeout_sec": 30.0
, "market_simulator" : {
"initial_positions": {
"exchange": "COINBASE",
"assets": {
"BTC": 0.5
, "ETH": 0.0
, "USD": 10_000.0
}
}
, "market_data": {
"sources": [
{
"loader_class": "cvttpy.trading.mkt_data.time_series.loaders.sqlite_loader.SqliteMdLoader"
, "file_name": "${SIM_DATA_DIR}/20250422.CNBS.BTC_USD.db"
, "table_name": "md_trades"
, "columns": [
"tstamp"
, "tstamp_ns as tm" # must have tm for DataFrame
, "tstamp_ns as local_time_ns" # must have for simrunner
, "exchange_id"
, "instrument_id"
, "px as price"
, "qty as quantity"
, "trade_id"
, "condition as aggressor_side"
, "condition as taker_side"
]
, "time_column": "tstamp"
, "exchange_id": "COINBASE"
, "instruments": ["PAIR-BTC-USD"]
, "md_type": "TRADES"
}
# , {
# "loader_class": "cvttpy.trading.mkt_data.time_series.loaders.tsdb_loader.TimescaleTSLoader"
# , "credentials_key": "TSDB_MD_CVTTDATA_RO"
# , "interval": ${INTERVAL}
# , "from_time": ${FROM_TIME} #"2024-10-03 09:00:00"
# , "exchange_id": "COINBASE"
# , "instruments": ["PAIR-BTC-USD"]
# , "md_type": "BOOK_TOP"
# , "table_name": "coinbase.md_booktops"
# , "columns": [
# "time",
# "local_time_ns",
# "exchange_id",
# "instrument_id",
# "bid_price",
# "bid_quantity",
# "ask_price",
# "ask_quantity",
# "'BT' as type",
# ]
# , "time_column": "time"
# }
]
, "api": {
"web_socket": {
"url": "ws://${SIM_HOST}:${SIM_MD_WS_PORT}/ws"
}
}
}
, "order_entry": {
"execution": {
"execute_on": ["BOOK_TOP", "TRADES"]
"top_only": true
,"min_order_age_sec": 0.1
, "pricing_method": "BY_MKT_TRD_PRICE_BY_TRADE"
, "short_sale_allowed": false
, "fee_schedule": {
"taker_fee_rate": 0.006
"maker_fee_rate": 0.004
}
# , "presubscribe_md_types": ["BOOK_TOP", "TRADES"]
}
, "api": {
"web_socket": {
"url": "ws://${SIM_HOST}:${SIM_OE_WS_PORT}/ws"
}
, "REST": {
"port": ${SIM_OE_REST_PORT},
"base_url": "http://${SIM_HOST}:${SIM_OE_REST_PORT}",
"endpoints": {
"new_order": ["POST", "/order"],
"cancel_order": ["POST", "/cancel"],
"cancel_all": ["POST", "/cancel_all"],
"open_orders": ["GET", "/open_orders"],
"order_status": ["GET", "/order_status"]
}
}
}
}
, "accounting": {
"api": {
"REST": {
"port": ${SIM_AC_REST_PORT},
"base_url": "http://${SIM_HOST}:${SIM_AC_REST_PORT}",
"endpoints": {
"positions": ["GET", "/positions"]
"trades": ["GET", "/trades"]
}
}
}
}
}
, "external_participants": [
{
"class": "cvttpy.apps.trading_simulator.participants.external_strategy.ExternalStrategySim"
"params": {
"reader": {
"source": "file://${SIM_DATA_DIR}/trading_instructions.json"
}
"listener": {
"book_id": "TESTBK_COINBS_01",
"strategy_id": "DUMMY_STRATEGY"
}
}
}
]
}
, "coordinator": {
"api": {
"REST": {
"port": ${COORDINATOR_REST_PORT},
"base_url": ["POST", "http://${COORDINATOR_HOST}:${COORDINATOR_REST_PORT}"],
}
, "WS": {
"url": "ws://${COORDINATOR_HOST}:${COORDINATOR_WS_PORT}/ws"
}
}
}
, "market_data_gateway": {
"exchanges_settings": {
"*": {
"mkt_data": {
"enabled": true
, "streaming": true
},
"order_entry": {
"enabled": false
, "streaming": false
},
"accounting": {
"enabled": false
, "streaming": false
},
},
}
, "channel_prefix": "${GLOBAL_CHANNEL_PREFIX}.MD_GW"
, "app_status_channel": "${GLOBAL_CHANNEL_PREFIX}.MD_GW_APP_STATUS"
, "exchanges": [
"SIM_COINBASE"
],
"presubscribe": [
"COINBASE:PAIR-BTC-USD"
]
}
, "order_entry_gateway": {
"exchanges_settings": {
"ALPACA_SNDBX": {
"mkt_data": {
"enabled": false
, "streaming": false
},
"order_entry": {
"enabled": true
, "streaming": true
},
"accounting": {
"enabled": false
, "streaming": false
}
, "credentials_key": {
"read_only": "ALPACA_SANDBOX"
, "trade": "ALPACA_SANDBOX"
}
}
}
, "channel_prefix": "${GLOBAL_CHANNEL_PREFIX}.OE_GW"
, "app_status_channel": "${GLOBAL_CHANNEL_PREFIX}.OE_GW_APP_STATUS"
, "exchanges": [
"SIM_COINBASE"
]
}
, "accounting_gateway": {
"exchanges_settings": {
"ALPACA_SNDBX": {
"mkt_data": {
"enabled": false
, "streaming": false
},
"order_entry": {
"enabled": false
, "streaming": false
},
"accounting": {
"enabled": true
, "streaming": false
}
, "credentials_key": {
"read_only": "ALPACA_SANDBOX"
, "trade": "ALPACA_SANDBOX"
}
},
"COINBASE_AT": {
"mkt_data": {
"enabled": false
, "streaming": false
},
"order_entry": {
"enabled": false
, "streaming": false
},
"accounting": {
"enabled": true
, "streaming": false
}
, "credentials_key": {
"read_only": "COINBASE_ADV_RO"
}
}
}
, "channel_prefix": "${GLOBAL_CHANNEL_PREFIX}.ACCT_GW"
, "app_status_channel": "${GLOBAL_CHANNEL_PREFIX}.ACCT_GW_APP_STATUS"
, "exchanges": [
"SIM_COINBASE"
]
}
, "quant": {
"channel_prefix": "${GLOBAL_CHANNEL_PREFIX}.QUANT"
, "app_status_channel": "${GLOBAL_CHANNEL_PREFIX}.QUANT_MUSVC_STATUS"
}
, "trader": {
"channel_prefix": "${GLOBAL_CHANNEL_PREFIX}.TRADER"
, "app_status_channel": "${GLOBAL_CHANNEL_PREFIX}.TRADER_MUSVC_STATUS"
}
, "bookkeeper": {
"channel_prefix": "${GLOBAL_CHANNEL_PREFIX}.BKPR"
, "app_status_channel": "${GLOBAL_CHANNEL_PREFIX}.BKPR_MUSVC_STATUS"
, "db": {
"server_type": "timescale",
"cred_key": "TSDB_TRADING_CVTT_TESTDB"
}
}
, "risk_manager": {
"channel_prefix": "${GLOBAL_CHANNEL_PREFIX}.RMGR"
, "app_status_channel": "${GLOBAL_CHANNEL_PREFIX}.RMGR_MUSVC_STATUS"
, "revalue_interval_sec": 10.5
}
, "pricer": {
"channel_prefix": "${GLOBAL_CHANNEL_PREFIX}.PXER"
, "app_status_channel": "${GLOBAL_CHANNEL_PREFIX}.PXER_MUSVC_STATUS"
}
}

View File

@ -14,6 +14,7 @@
, "order_entry": { , "order_entry": {
"class": "cvttpy.exchanges.alpaca.oe_client.AlpacaOrderEntryClient" "class": "cvttpy.exchanges.alpaca.oe_client.AlpacaOrderEntryClient"
# D E P R E C A T E D
, "REST": { , "REST": {
"submit_order_url": ["POST", "https://api.alpaca.markets/v2/orders"] "submit_order_url": ["POST", "https://api.alpaca.markets/v2/orders"]
, "orders_url": ["GET", "https://api.alpaca.markets/v2/orders"] , "orders_url": ["GET", "https://api.alpaca.markets/v2/orders"]
@ -22,12 +23,26 @@
, "cancel_all_url": ["DELETE", "https://api.alpaca.markets/v2/orders"] , "cancel_all_url": ["DELETE", "https://api.alpaca.markets/v2/orders"]
} }
, "ws_url": ["WSS", "wss://api.alpaca.markets/stream"] , "ws_url": ["WSS", "wss://api.alpaca.markets/stream"]
# D E P R E C A T E D
, "api": {
"web_socket": {
"url": "wss://api.alpaca.markets/stream"
}
, "REST": {
"submit_order_url": ["POST", "https://api.alpaca.markets/v2/orders"]
, "orders_url": ["GET", "https://api.alpaca.markets/v2/orders"]
, "order_status": ["GET", "https://api.alpaca.markets/v2/orders/{order_id}"]
, "cancel_order_url": ["DELETE", "https://api.alpaca.markets/v2/orders/{order_id}"]
, "cancel_all_url": ["DELETE", "https://api.alpaca.markets/v2/orders"]
}
}
} }
, "mktdata" : { , "mktdata" : {
"class": "cvttpy.exchanges.alpaca.mkt_data.AlpacaStockFeed" "class": "cvttpy.exchanges.alpaca.mkt_data.AlpacaStockFeed"
, "reconnect_secs": 2.0 , "reconnect_secs": 2.0
# , "ws_url": ["WSS", "wss://stream.data.alpaca.markets/v2/sip"] # D E P R E C A T E D
, "ws_url": ["WSS", "wss://stream.data.alpaca.markets/v2/iex"] , "ws_url": ["WSS", "wss://stream.data.alpaca.markets/v2/iex"]
, "REST": { , "REST": {
"hist_md_bars": ["GET", "https://data.alpaca.markets/v2/stocks/bars"] "hist_md_bars": ["GET", "https://data.alpaca.markets/v2/stocks/bars"]
@ -37,46 +52,40 @@
, "assets": ["GET", "https://api.alpaca.markets/v2/assets"] , "assets": ["GET", "https://api.alpaca.markets/v2/assets"]
# , "assets": ["GET", "https://data.alpaca.markets/v2/assets"] # , "assets": ["GET", "https://data.alpaca.markets/v2/assets"]
} }
# D E P R E C A T E D
, "api": {
"web_socket": {
# "wss://stream.data.alpaca.markets/v2/sip"
"url": "wss://stream.data.alpaca.markets/v2/iex"
}
, "REST": {
"hist_md_bars": ["GET", "https://data.alpaca.markets/v2/stocks/bars"]
, "hist_md_quotes": ["GET", "https://data.alpaca.markets/v2/stocks/quotes"]
, "hist_md_trades": ["GET", "https://data.alpaca.markets/v2/stocks/trades"]
, "latest_trade": ["GET", "https://data.alpaca.markets/v2/stocks/{symbol}/trades/latest"]
, "assets": ["GET", "https://api.alpaca.markets/v2/assets"]
# , "assets": ["GET", "https://data.alpaca.markets/v2/assets"]
}
}
} }
, "accounting": { , "accounting": {
"class": "cvttpy.exchanges.alpaca.acct_client.AlpacaAccounting" "class": "cvttpy.exchanges.alpaca.acct_client.AlpacaAccounting"
# D E P R E C A T E D
, "REST": { , "REST": {
"balances_url": ["GET", "https://api.alpaca.markets/v2/positions"] "balances_url": ["GET", "https://api.alpaca.markets/v2/positions"]
, "account_info_url": ["GET", "https://api.alpaca.markets/v2/account"] , "account_info_url": ["GET", "https://api.alpaca.markets/v2/account"]
, "trades_url": ["GET", "https://api.alpaca.markets/v2/account/activities/FILL"] , "trades_url": ["GET", "https://api.alpaca.markets/v2/account/activities/FILL"]
} }
} # D E P R E C A T E D
}
, "ALPACA_SIM": {
# https://docs.alpaca.markets/reference/
"exchange_id": "ALPACA"
, "name": "Alpaca Trading"
, "type": "EQUITY"
, "api": {
, "mktdata" : { "REST": {
"class": "cvttpy.exchanges.mkt_simulator.md_client.MktSimMdClientFeed" "balances_url": ["GET", "https://api.alpaca.markets/v2/positions"]
"ws_url": ["WS", "ws://localhost:10180/ws"] , "account_info_url": ["GET", "https://api.alpaca.markets/v2/account"]
, "trades_url": ["GET", "https://api.alpaca.markets/v2/account/activities/FILL"]
} }
, "order_entry": {
"class": "cvttpy.exchanges.mkt_simulator.oe_client.MarketSimulatorOEClient"
, "REST": {
"new_order_url": ["POST", "http://localhost:10182/order"]
, "cancel_order_url": ["POST", "http://localhost:10182/cancel"]
, "cancel_all_url": ["POST", "http://localhost:10182/cancel_all"]
, "open_orders_url": ["GET", "http://localhost:10182/open_orders"]
, "order_status_url": ["GET", "http://localhost:10182/order_status"]
},
"ws_url": ["WSS", "ws://localhost:10181/ws"]
}
, "accounting": {
"class": "cvttpy.exchanges.mkt_simulator.acct_client.MktSimAccounting"
, "REST": {
"positions_url": ["GET", "http://localhost:10083/positions"]
, "trades_url": ["GET", "http://localhost:10083/trades"]
} }
} }
} }
@ -91,6 +100,7 @@
, "order_entry": { , "order_entry": {
"class": "cvttpy.exchanges.alpaca.oe_client.AlpacaOrderEntryClient" "class": "cvttpy.exchanges.alpaca.oe_client.AlpacaOrderEntryClient"
# D E P R E C A T E D
, "REST": { , "REST": {
"submit_order_url": ["POST", "https://paper-api.alpaca.markets/v2/orders"] "submit_order_url": ["POST", "https://paper-api.alpaca.markets/v2/orders"]
, "orders_url": ["GET", "https://paper-api.alpaca.markets/v2/orders"] , "orders_url": ["GET", "https://paper-api.alpaca.markets/v2/orders"]
@ -99,11 +109,26 @@
, "cancel_all_url": ["DELETE", "https://paper-api.alpaca.markets/v2/orders"] , "cancel_all_url": ["DELETE", "https://paper-api.alpaca.markets/v2/orders"]
} }
, "ws_url": ["WSS", "wss://paper-api.alpaca.markets/stream"] , "ws_url": ["WSS", "wss://paper-api.alpaca.markets/stream"]
# D E P R E C A T E D
, "api": {
"web_socket": {
"url": "wss://paper-api.alpaca.markets/stream"
}
, "REST": {
"submit_order_url": ["POST", "https://paper-api.alpaca.markets/v2/orders"]
, "orders_url": ["GET", "https://paper-api.alpaca.markets/v2/orders"]
, "order_status": ["GET", "https://paper-api.alpaca.markets/v2/orders/{order_id}"]
, "cancel_order_url": ["DELETE", "https://paper-api.alpaca.markets/v2/orders/{order_id}"]
, "cancel_all_url": ["DELETE", "https://paper-api.alpaca.markets/v2/orders"]
}
}
} }
, "mktdata" : { , "mktdata" : {
"class": "cvttpy.exchanges.alpaca.mkt_data.AlpacaMdFeed" "class": "cvttpy.exchanges.alpaca.mkt_data.AlpacaMdFeed"
, "reconnect_secs": 2.0 , "reconnect_secs": 2.0
# D E P R E C A T E D
# , "ws_url": ["WSS", "wss://stream.data.alpaca.markets/v2/sip"] # , "ws_url": ["WSS", "wss://stream.data.alpaca.markets/v2/sip"]
, "ws_url": ["WSS", "wss://stream.data.alpaca.markets/v2/iex"] , "ws_url": ["WSS", "wss://stream.data.alpaca.markets/v2/iex"]
, "REST": { , "REST": {
@ -114,15 +139,39 @@
, "assets": ["GET", "https://paper-api.alpaca.markets/v2/assets"] , "assets": ["GET", "https://paper-api.alpaca.markets/v2/assets"]
# , "assets": ["GET", "https://data.alpaca.markets/v2/assets"] # , "assets": ["GET", "https://data.alpaca.markets/v2/assets"]
} }
# D E P R E C A T E D
, "api": {
"web_socket": {
"url": "wss://stream.data.alpaca.markets/v2/iex"
}
, "REST": {
"hist_md_bars": ["GET", "https://data.alpaca.markets/v2/stocks/bars"]
, "hist_md_quotes": ["GET", "https://data.alpaca.markets/v2/stocks/quotes"]
, "hist_md_trades": ["GET", "https://data.alpaca.markets/v2/stocks/trades"]
, "latest_trade": ["GET", "https://data.alpaca.markets/v2/stocks/{symbol}/trades/latest"]
, "assets": ["GET", "https://paper-api.alpaca.markets/v2/assets"]
}
}
} }
, "accounting": { , "accounting": {
"class": "cvttpy.exchanges.alpaca.acct_client.AlpacaAccounting" "class": "cvttpy.exchanges.alpaca.acct_client.AlpacaAccounting"
# D E P R E C A T E D
, "REST": { , "REST": {
"balances_url": ["GET", "https://paper-api.alpaca.markets/v2/positions"] "balances_url": ["GET", "https://paper-api.alpaca.markets/v2/positions"]
, "account_info_url": ["GET", "https://paper-api.alpaca.markets/v2/account"] , "account_info_url": ["GET", "https://paper-api.alpaca.markets/v2/account"]
, "trades_url": ["GET", "https://paper-api.alpaca.markets/v2/account/activities/FILL"] , "trades_url": ["GET", "https://paper-api.alpaca.markets/v2/account/activities/FILL"]
} }
# D E P R E C A T E D
, "api": {
"REST": {
"balances_url": ["GET", "https://paper-api.alpaca.markets/v2/positions"]
, "account_info_url": ["GET", "https://paper-api.alpaca.markets/v2/account"]
, "trades_url": ["GET", "https://paper-api.alpaca.markets/v2/account/activities/FILL"]
}
}
} }
} }
# ---------------------------- B # ---------------------------- B
@ -138,7 +187,15 @@
"class": "cvttpy.exchanges.bitstamp.mkt_data.BitstampMdFeed" "class": "cvttpy.exchanges.bitstamp.mkt_data.BitstampMdFeed"
, "reconnect_secs": 2 , "reconnect_secs": 2
# D E P R E C A T E D
, "ws_url": ["WSS", "wss://ws.bitstamp.net"] , "ws_url": ["WSS", "wss://ws.bitstamp.net"]
# D E P R E C A T E D
, "api": {
"web_socket": {
"url": "wss://ws.bitstamp.net"
}
}
} }
} }
, "BNBFUT": { , "BNBFUT": {
@ -151,12 +208,23 @@
, "max_connections": 10 , "max_connections": 10
, "reconnect_secs": 2.0 , "reconnect_secs": 2.0
# D E P R E C A T E D
, "ws_url": ["WSS", "wss://fstream.binance.com/ws"] , "ws_url": ["WSS", "wss://fstream.binance.com/ws"]
, "REST": { , "REST": {
# https://fapi.binance.com/fapi/v1/depth?symbol=BNBBTC&limit=1000 # https://fapi.binance.com/fapi/v1/depth?symbol=BNBBTC&limit=1000
"depth_snapshot_url": ["GET", "https://fapi.binance.com/fapi/v1/depth"], "depth_snapshot_url": ["GET", "https://fapi.binance.com/fapi/v1/depth"],
} }
# D E P R E C A T E D
, "api": {
"web_socket": {
"url": "wss://fstream.binance.com/ws"
}
, "REST": {
# https://fapi.binance.com/fapi/v1/depth?symbol=BNBBTC&limit=1000
"depth_snapshot_url": ["GET", "https://fapi.binance.com/fapi/v1/depth"],
}
}
} }
} }
@ -171,11 +239,24 @@
, "reconnect_secs": 2.0 , "reconnect_secs": 2.0
# D E P R E C A T E D
, "ws_url": ["WSS", "wss://stream.binance.com/ws"] , "ws_url": ["WSS", "wss://stream.binance.com/ws"]
, "REST": { , "REST": {
# https://api.binance.com/api/v3/depth?symbol=BNBBTC&limit=1000 # https://api.binance.com/api/v3/depth?symbol=BNBBTC&limit=1000
"depth_snapshot_url": ["GET", "https://api.binance.com/api/v3/depth"], "depth_snapshot_url": ["GET", "https://api.binance.com/api/v3/depth"],
} }
# D E P R E C A T E D
, "api": {
"web_socket": {
"url": "wss://stream.binance.com/ws"
}
, "REST": {
# https://api.binance.com/api/v3/depth?symbol=BNBBTC&limit=1000
"depth_snapshot_url": ["GET", "https://api.binance.com/api/v3/depth"],
}
}
} }
} }
, "BNBSPOT_US": { , "BNBSPOT_US": {
@ -187,12 +268,23 @@
"class": "cvttpy.exchanges.binance.spot.mkt_data.BnbSpotMktDataFeed" "class": "cvttpy.exchanges.binance.spot.mkt_data.BnbSpotMktDataFeed"
, "reconnect_secs": 10 , "reconnect_secs": 10
# D E P R E C A T E D
, "ws_url": ["WSS", "wss://stream.binance.us:9443/ws"] , "ws_url": ["WSS", "wss://stream.binance.us:9443/ws"]
, "REST": { , "REST": {
# https://api.binance.com/api/v3/depth?symbol=BNBBTC&limit=1000 # https://api.binance.com/api/v3/depth?symbol=BNBBTC&limit=1000
"depth_snapshot_url": ["GET", "https://api.binance.com/api/v3/depth"], "depth_snapshot_url": ["GET", "https://api.binance.com/api/v3/depth"],
} }
# D E P R E C A T E D
, "api": {
"web_socket": {
"url": "wss://stream.binance.us:9443/ws"
}
, "REST": {
# https://api.binance.com/api/v3/depth?symbol=BNBBTC&limit=1000
"depth_snapshot_url": ["GET", "https://api.binance.com/api/v3/depth"],
}
}
} }
} }
, "COINBASE_AT": { , "COINBASE_AT": {
@ -203,22 +295,45 @@
, "order_entry": { , "order_entry": {
"class": "cvttpy.exchanges.coinbase.spot.oe_client.CoinbaseSpotOEClient" "class": "cvttpy.exchanges.coinbase.spot.oe_client.CoinbaseSpotOEClient"
# D E P R E C A T E D
, "ws_url": ["WSS", "wss://advanced-trade-ws.coinbase.com"]
, "REST": { , "REST": {
"open_orders_url": ["GET", "https://api.coinbase.com/api/v3/brokerage/orders/historical/batch"] "open_orders_url": ["GET", "https://api.coinbase.com/api/v3/brokerage/orders/historical/batch"]
, "submit_order_url": ["POST", "https://api.coinbase.com/api/v3/brokerage/orders"] , "submit_order_url": ["POST", "https://api.coinbase.com/api/v3/brokerage/orders"]
, "cancel_order_url": ["POST", "https://api.coinbase.com/api/v3/brokerage/orders/batch_cancel"] , "cancel_order_url": ["POST", "https://api.coinbase.com/api/v3/brokerage/orders/batch_cancel"]
} }
, "ws_url": ["WSS", "wss://advanced-trade-ws.coinbase.com"] # D E P R E C A T E D
, "api": {
"web_socket": {
"url": "wss://advanced-trade-ws.coinbase.com"
}
, "REST": {
"open_orders_url": ["GET", "https://api.coinbase.com/api/v3/brokerage/orders/historical/batch"]
, "submit_order_url": ["POST", "https://api.coinbase.com/api/v3/brokerage/orders"]
, "cancel_order_url": ["POST", "https://api.coinbase.com/api/v3/brokerage/orders/batch_cancel"]
}
}
} }
, "accounting": { , "accounting": {
"class": "cvttpy.exchanges.coinbase.spot.account.CoinbaseSpotAccounting" "class": "cvttpy.exchanges.coinbase.spot.account.CoinbaseSpotAccounting"
# D E P R E C A T E D
, "REST": { , "REST": {
"balances_url": ["GET", "https://api.coinbase.com/api/v3/brokerage/accounts"] "balances_url": ["GET", "https://api.coinbase.com/api/v3/brokerage/accounts"]
, "get_trades_url": ["GET", "https://api.coinbase.com/api/v3/brokerage/orders/historical/fills"] , "get_trades_url": ["GET", "https://api.coinbase.com/api/v3/brokerage/orders/historical/fills"]
, "get_transactions_url": ["GET", "https://api.coinbase.com/api/v3/brokerage/transaction_summary"] , "get_transactions_url": ["GET", "https://api.coinbase.com/api/v3/brokerage/transaction_summary"]
} }
# D E P R E C A T E D
, "api": {
"REST": {
"balances_url": ["GET", "https://api.coinbase.com/api/v3/brokerage/accounts"]
, "get_trades_url": ["GET", "https://api.coinbase.com/api/v3/brokerage/orders/historical/fills"]
, "get_transactions_url": ["GET", "https://api.coinbase.com/api/v3/brokerage/transaction_summary"]
}
}
} }
, "mktdata" : { , "mktdata" : {
@ -228,37 +343,14 @@
, "max_connections": 10 , "max_connections": 10
, "price_throttle": true , "price_throttle": true
# D E P R E C A T E D
, "ws_url": ["WSS", "wss://ws-feed.exchange.coinbase.com"] , "ws_url": ["WSS", "wss://ws-feed.exchange.coinbase.com"]
} # D E P R E C A T E D
}
, "COINBASE_SIM": {
"exchange_id": "COINBASE"
, "name": "Coinbase Advanced Trade (Simulation)"
, "type": "SPOT"
, "api": {
, "mktdata" : { "web_socket": {
"class": "cvttpy.exchanges.mkt_simulator.md_client.MktSimMdClientFeed" "url": "wss://ws-feed.exchange.coinbase.com"
"ws_url": ["WS", "ws://localhost:8080/ws"]
} }
, "order_entry": {
"class": "cvttpy.exchanges.mkt_simulator.oe_client.MarketSimulatorOEClient"
, "REST": {
"new_order_url": ["POST", "http://localhost:8181/order"]
, "cancel_order_url": ["POST", "http://localhost:8181/cancel"]
, "cancel_all_url": ["POST", "http://localhost:8181/cancel_all"]
, "open_orders_url": ["GET", "http://localhost:8181/open_orders"]
, "order_status_url": ["GET", "http://localhost:8181/order_status"]
},
"ws_url": ["WSS", "ws://localhost:8180/ws"]
}
, "accounting": {
"class": "cvttpy.exchanges.mkt_simulator.acct_client.MktSimAccounting"
, "REST": {
"positions_url": ["GET", "http://localhost:8182/positions"]
, "trades_url": ["GET", "http://localhost:8182/trades"]
} }
} }
} }
@ -276,18 +368,16 @@
"class": "cvttpy.exchanges.gemini.mkt_data.GeminiMdFeed" "class": "cvttpy.exchanges.gemini.mkt_data.GeminiMdFeed"
, "reconnect_secs": 1 , "reconnect_secs": 1
# D E P R E C A T E D
, "ws_url": ["WSS" , "wss://api.gemini.com/v2/marketdata"] , "ws_url": ["WSS" , "wss://api.gemini.com/v2/marketdata"]
# D E P R E C A T E D
, "api": {
"web_socket": {
"url": "wss://api.gemini.com/v2/marketdata"
}
}
} }
# , "REST": {
# "open_orders_url": ["POST", "https://api.gemini.com/v1/orders"]
# , "order_status_url": ["POST", "https://api.gemini.com/v1/order/status"]
# , "cancel_all_url": ["POST", "https://api.gemini.com/v1/order/cancel/all"]
# , "balances_url": ["POST", "https://api.gemini.com/v1/balances"]
# , "positions_url": ["POST", "https://api.gemini.com/v1/positions"]
# , "trades_url": ["POST", "https://api.gemini.com/v1/mytrades"]
# , "symbol_url": ["GET", "https://api.gemini.com/v1/symbols/details"]
# , "margin_url": ["POST", "https://api.gemini.com/v1/margin"]
# }
} }
, "GEMINI-SNDBX": { , "GEMINI-SNDBX": {
@ -303,18 +393,34 @@
"class": "cvttpy.exchanges.gemini.mkt_data.GeminiMdFeed" "class": "cvttpy.exchanges.gemini.mkt_data.GeminiMdFeed"
, "reconnect_secs": 1 , "reconnect_secs": 1
# D E P R E C A T E D
, "ws_url": ["WSS" , "wss://api.sandbox.gemini.com/v2/marketdata"] , "ws_url": ["WSS" , "wss://api.sandbox.gemini.com/v2/marketdata"]
# D E P R E C A T E D
, "api": {
"web_socket": {
"url": "wss://api.sandbox.gemini.com/v2/marketdata"
}
}
} }
, "order_entry": { , "order_entry": {
# D E P R E C A T E D
"REST": { "REST": {
"order_status_url": ["POST", "https://api.sandbox.gemini.com/v1/order/status"] "order_status_url": ["POST", "https://api.sandbox.gemini.com/v1/order/status"]
, "cancel_all_url": ["POST", "https://api.sandbox.gemini.com/v1/order/cancel/all"] , "cancel_all_url": ["POST", "https://api.sandbox.gemini.com/v1/order/cancel/all"]
} }
# D E P R E C A T E D
, "api": {
"REST": {
"order_status_url": ["POST", "https://api.sandbox.gemini.com/v1/order/status"]
, "cancel_all_url": ["POST", "https://api.sandbox.gemini.com/v1/order/cancel/all"]
}
}
} }
, "accounting": { , "accounting": {
"class": "cvttpy.exchanges.gemini.account.GeminiExchAccounting" "class": "cvttpy.exchanges.gemini.account.GeminiExchAccounting"
# D E P R E C A T E D
, "REST": { , "REST": {
"open_orders_url": ["POST", "https://api.sandbox.gemini.com/v1/orders"] "open_orders_url": ["POST", "https://api.sandbox.gemini.com/v1/orders"]
, "order_status_url": ["POST", "https://api.sandbox.gemini.com/v1/order/status"] , "order_status_url": ["POST", "https://api.sandbox.gemini.com/v1/order/status"]
@ -324,6 +430,19 @@
, "symbol_url": ["GET", "https://api.sandbox.gemini.com/v1/symbols/details"] , "symbol_url": ["GET", "https://api.sandbox.gemini.com/v1/symbols/details"]
, "margin_url": ["POST", "https://api.sandbox.gemini.com/v1/margin"] , "margin_url": ["POST", "https://api.sandbox.gemini.com/v1/margin"]
} }
# D E P R E C A T E D
, "api": {
"REST": {
"open_orders_url": ["POST", "https://api.sandbox.gemini.com/v1/orders"]
, "order_status_url": ["POST", "https://api.sandbox.gemini.com/v1/order/status"]
, "balances_url": ["POST", "https://api.sandbox.gemini.com/v1/balances"]
, "positions_url": ["POST", "https://api.sandbox.gemini.com/v1/positions"]
, "trades_url": ["POST", "https://api.sandbox.gemini.com/v1/mytrades"]
, "symbol_url": ["GET", "https://api.sandbox.gemini.com/v1/symbols/details"]
, "margin_url": ["POST", "https://api.sandbox.gemini.com/v1/margin"]
}
}
} }
} }
# ---------------------------- K # ---------------------------- K
@ -338,8 +457,17 @@
, "reconnect_secs": 2.0 , "reconnect_secs": 2.0
# D E P R E C A T E D
, "ws_url": ["WSS", "wss://ws.kraken.com/v2"] , "ws_url": ["WSS", "wss://ws.kraken.com/v2"]
, "REST": {} , "REST": {}
# D E P R E C A T E D
, "api": {
"web_socket": {
"url": "wss://ws.kraken.com/v2"
}
, "REST": {}
}
} }
} }
# ---------------------------- O # ---------------------------- O
@ -354,8 +482,82 @@
, "reconnect_secs": 2.0 , "reconnect_secs": 2.0
# D E P R E C A T E D
, "ws_url": ["WSS", "wss://ws.okx.com:8443/ws/v5/public"] , "ws_url": ["WSS", "wss://ws.okx.com:8443/ws/v5/public"]
, "REST": {} , "REST": {}
# D E P R E C A T E D
, "api": {
"web_socket": {
"url": "wss://ws.okx.com:8443/ws/v5/public"
}
, "REST": {}
} }
} }
} }
}
# , "ALPACA_SIM": {
# # https://docs.alpaca.markets/reference/
# "exchange_id": "ALPACA"
# , "name": "Alpaca Trading"
# , "type": "EQUITY"
# , "mktdata" : {
# "class": "cvttpy.exchanges.mkt_simulator.md_client.MktSimMdClientFeed"
# "ws_url": ["WS", "ws://localhost:10180/ws"]
# }
# , "order_entry": {
# "class": "cvttpy.exchanges.mkt_simulator.oe_client.MarketSimulatorOEClient"
# , "REST": {
# "new_order_url": ["POST", "http://localhost:10182/order"]
# , "cancel_order_url": ["POST", "http://localhost:10182/cancel"]
# , "cancel_all_url": ["POST", "http://localhost:10182/cancel_all"]
# , "open_orders_url": ["GET", "http://localhost:10182/open_orders"]
# , "order_status_url": ["GET", "http://localhost:10182/order_status"]
# },
# "ws_url": ["WSS", "ws://localhost:10181/ws"]
# }
# , "accounting": {
# "class": "cvttpy.exchanges.mkt_simulator.acct_client.MktSimAccounting"
# , "REST": {
# "positions_url": ["GET", "http://localhost:10083/positions"]
# , "trades_url": ["GET", "http://localhost:10083/trades"]
# }
# }
# }
# , "COINBASE_SIM": {
# "exchange_id": "COINBASE"
# , "name": "Coinbase Advanced Trade (Simulation)"
# , "type": "SPOT"
# , "mktdata" : {
# "class": "cvttpy.exchanges.mkt_simulator.md_client.MktSimMdClientFeed"
# "ws_url": ["WS", "ws://localhost:8080/ws"]
# }
# , "order_entry": {
# "class": "cvttpy.exchanges.mkt_simulator.oe_client.MarketSimulatorOEClient"
# , "REST": {
# "new_order_url": ["POST", "http://localhost:8181/order"]
# , "cancel_order_url": ["POST", "http://localhost:8181/cancel"]
# , "cancel_all_url": ["POST", "http://localhost:8181/cancel_all"]
# , "open_orders_url": ["GET", "http://localhost:8181/open_orders"]
# , "order_status_url": ["GET", "http://localhost:8181/order_status"]
# },
# "ws_url": ["WSS", "ws://localhost:8180/ws"]
# }
# , "accounting": {
# "class": "cvttpy.exchanges.mkt_simulator.acct_client.MktSimAccounting"
# , "REST": {
# "positions_url": ["GET", "http://localhost:8182/positions"]
# , "trades_url": ["GET", "http://localhost:8182/trades"]
# }
# }
# }