use std::path::PathBuf;
use nautilus_common::enums::Environment;
use nautilus_core::{Params, env::get_env_var};
use nautilus_databento::{
common::DATABENTO_CLIENT_ID,
factories::{DatabentoDataClientFactory, DatabentoLiveClientConfig},
};
use nautilus_live::node::LiveNode;
use nautilus_model::identifiers::{InstrumentId, TraderId};
use nautilus_testkit::testers::{DataTester, DataTesterConfig};
use serde_json::json;
const TRADER_ID: &str = "TESTER-001";
const NODE_NAME: &str = "DATABENTO-TESTER-001";
const INSTRUMENT_ID: &str = "ESZ6.XCME";
const PRICE_PRECISION: Option<u8> = None;
const PRICE_PRECISION_PARAM: &str = "price_precision";
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
dotenvy::dotenv().ok();
let environment = Environment::Live;
let trader_id = TraderId::from(TRADER_ID);
let node_name = NODE_NAME.to_string();
let api_key = get_env_var("DATABENTO_API_KEY")?;
let publishers_filepath = PathBuf::from(env!("CARGO_MANIFEST_DIR")).join("publishers.json");
if !publishers_filepath.exists() {
println!(
"WARNING: Publishers file not found at: {}",
publishers_filepath.display()
);
}
let databento_config = DatabentoLiveClientConfig::new(
api_key,
publishers_filepath,
true, true, );
let client_factory = DatabentoDataClientFactory::new();
let client_id = *DATABENTO_CLIENT_ID;
let instrument_ids = vec![InstrumentId::from(INSTRUMENT_ID)];
let mut node = LiveNode::builder(trader_id, environment)?
.with_name(node_name)
.with_load_state(false)
.with_save_state(false)
.with_delay_post_stop_secs(2)
.add_data_client(None, Box::new(client_factory), Box::new(databento_config))?
.build()?;
let subscribe_params = PRICE_PRECISION.map(|price_precision| {
let mut params = Params::new();
params.insert(PRICE_PRECISION_PARAM.to_string(), json!(price_precision));
params
});
let tester_config = DataTesterConfig::builder()
.client_id(client_id)
.instrument_ids(instrument_ids)
.subscribe_quotes(true)
.subscribe_trades(true)
.maybe_subscribe_params(subscribe_params)
.can_unsubscribe(false) .build()?;
let tester = DataTester::new(tester_config);
node.add_actor(tester)?;
node.run().await?;
Ok(())
}