Signal execution
This commit is contained in:
+87
-105
@@ -6,121 +6,103 @@ use pulse_sdk::prelude::*;
|
|||||||
use crate::engine::Engine;
|
use crate::engine::Engine;
|
||||||
|
|
||||||
impl Engine {
|
impl Engine {
|
||||||
pub async fn execute_signal(&self, signal: &Signal) -> tokio::io::Result<()> {
|
pub async fn execute_signal(&self, signal: &Signal) -> anyhow::Result<()> {
|
||||||
let client = hypercore::mainnet();
|
let client = hypercore::mainnet();
|
||||||
let accounts = self.accounts.lock().await;
|
let accounts = self.accounts.lock().await;
|
||||||
|
|
||||||
if let Some(acc) = accounts.get_active() {
|
let acc = accounts
|
||||||
let Some(asset_id) = self
|
.get_active()
|
||||||
.watch_list
|
.ok_or_else(|| anyhow::anyhow!("Unable to get active account"))?;
|
||||||
.lock()
|
|
||||||
.await
|
|
||||||
.name_to_index
|
|
||||||
.get(&signal.symbol)
|
|
||||||
.cloned()
|
|
||||||
else {
|
|
||||||
self.terminal_server
|
|
||||||
.error(
|
|
||||||
"self::order",
|
|
||||||
&format!(
|
|
||||||
"Invalid Symbol: {:?}, Unable to get asset id",
|
|
||||||
signal.symbol
|
|
||||||
),
|
|
||||||
)
|
|
||||||
.await?;
|
|
||||||
|
|
||||||
return Ok(());
|
let Some(asset_id) = self
|
||||||
};
|
.watch_list
|
||||||
|
.lock()
|
||||||
|
.await
|
||||||
|
.name_to_index
|
||||||
|
.get(&signal.symbol)
|
||||||
|
.cloned()
|
||||||
|
else {
|
||||||
|
return Err(anyhow::anyhow!(
|
||||||
|
"Invalid Symbol: {:?}, Unable to get asset id",
|
||||||
|
signal.symbol
|
||||||
|
));
|
||||||
|
};
|
||||||
|
|
||||||
let order_ids = self.risk_engine.create_order(signal).await?;
|
let engine_order = self.risk_engine.create_order(signal).await?;
|
||||||
|
|
||||||
println!("{order_ids:?}");
|
let order = BatchOrder {
|
||||||
|
orders: vec![
|
||||||
|
OrderRequest {
|
||||||
|
asset: asset_id,
|
||||||
|
is_buy: matches!(signal.side, Side::Bid),
|
||||||
|
limit_px: signal.entry_price,
|
||||||
|
sz: engine_order.size,
|
||||||
|
reduce_only: false,
|
||||||
|
order_type: OrderTypePlacement::Limit {
|
||||||
|
tif: TimeInForce::Gtc,
|
||||||
|
},
|
||||||
|
cloid: engine_order.entry,
|
||||||
|
},
|
||||||
|
OrderRequest {
|
||||||
|
asset: asset_id,
|
||||||
|
is_buy: matches!(signal.side, Side::Bid),
|
||||||
|
limit_px: signal.entry_price,
|
||||||
|
sz: engine_order.size,
|
||||||
|
reduce_only: true,
|
||||||
|
order_type: OrderTypePlacement::Trigger {
|
||||||
|
is_market: true,
|
||||||
|
trigger_px: signal.take_profit,
|
||||||
|
tpsl: hypercore::TpSl::Tp,
|
||||||
|
},
|
||||||
|
cloid: engine_order.take_profit,
|
||||||
|
},
|
||||||
|
OrderRequest {
|
||||||
|
asset: asset_id,
|
||||||
|
is_buy: matches!(signal.side, Side::Bid),
|
||||||
|
limit_px: signal.entry_price,
|
||||||
|
sz: engine_order.size,
|
||||||
|
reduce_only: true,
|
||||||
|
order_type: OrderTypePlacement::Trigger {
|
||||||
|
is_market: true,
|
||||||
|
trigger_px: signal.stop_loss,
|
||||||
|
tpsl: hypercore::TpSl::Sl,
|
||||||
|
},
|
||||||
|
cloid: engine_order.stop_loss,
|
||||||
|
},
|
||||||
|
],
|
||||||
|
grouping: hypercore::OrderGrouping::Na,
|
||||||
|
builder: None,
|
||||||
|
};
|
||||||
|
|
||||||
// let order = BatchOrder {
|
let nonce = chrono::Utc::now().timestamp_millis() as u64;
|
||||||
// orders: vec![
|
|
||||||
// OrderRequest {
|
|
||||||
// asset: asset_id,
|
|
||||||
// is_buy: matches!(signal.side, Side::Bid),
|
|
||||||
// limit_px: signal.entry_price,
|
|
||||||
// sz: 0.into(),
|
|
||||||
// reduce_only: false,
|
|
||||||
// order_type: OrderTypePlacement::Limit {
|
|
||||||
// tif: TimeInForce::Gtc,
|
|
||||||
// },
|
|
||||||
// cloid: order_ids.entry,
|
|
||||||
// },
|
|
||||||
// OrderRequest {
|
|
||||||
// asset: asset_id,
|
|
||||||
// is_buy: matches!(signal.side, Side::Bid),
|
|
||||||
// limit_px: signal.entry_price,
|
|
||||||
// sz: 0.into(),
|
|
||||||
// reduce_only: true,
|
|
||||||
// order_type: OrderTypePlacement::Trigger {
|
|
||||||
// is_market: true,
|
|
||||||
// trigger_px: signal.take_profit,
|
|
||||||
// tpsl: hypercore::TpSl::Tp,
|
|
||||||
// },
|
|
||||||
// cloid: order_ids.take_profit,
|
|
||||||
// },
|
|
||||||
// OrderRequest {
|
|
||||||
// asset: asset_id,
|
|
||||||
// is_buy: matches!(signal.side, Side::Bid),
|
|
||||||
// limit_px: signal.entry_price,
|
|
||||||
// sz: 0.into(),
|
|
||||||
// reduce_only: true,
|
|
||||||
// order_type: OrderTypePlacement::Trigger {
|
|
||||||
// is_market: true,
|
|
||||||
// trigger_px: signal.stop_loss,
|
|
||||||
// tpsl: hypercore::TpSl::Sl,
|
|
||||||
// },
|
|
||||||
// cloid: order_ids.stop_loss,
|
|
||||||
// },
|
|
||||||
// ],
|
|
||||||
// grouping: hypercore::OrderGrouping::Na,
|
|
||||||
// builder: None,
|
|
||||||
// };
|
|
||||||
|
|
||||||
// let nonce = chrono::Utc::now().timestamp_millis() as u64;
|
match client
|
||||||
|
.place(&acc.private_key.0, order, nonce, None, None)
|
||||||
|
.await
|
||||||
|
{
|
||||||
|
Ok(o) if o.iter().any(|o| matches!(o, OrderResponseStatus::Error(_))) => {
|
||||||
|
self.risk_engine.order_placed(engine_order).await;
|
||||||
|
}
|
||||||
|
|
||||||
// match client
|
Ok(e) => {
|
||||||
// .place(&acc.private_key.0, order, nonce, None, None)
|
return Err(anyhow::anyhow!(
|
||||||
// .await
|
"order rejected: {}",
|
||||||
// {
|
e.into_iter()
|
||||||
// Ok(o) if o.iter().any(|o| matches!(o, OrderResponseStatus::Error(_))) => {
|
.filter_map(|res| {
|
||||||
// self.risk_engine.order_placed(order_ids).await;
|
if let OrderResponseStatus::Error(e) = res {
|
||||||
// }
|
Some(e)
|
||||||
|
} else {
|
||||||
|
None
|
||||||
|
}
|
||||||
|
})
|
||||||
|
.collect::<Vec<_>>()
|
||||||
|
.join(", ")
|
||||||
|
));
|
||||||
|
}
|
||||||
|
|
||||||
// Ok(e) => {
|
e => {
|
||||||
// self.terminal_server
|
e?;
|
||||||
// .error(
|
}
|
||||||
// "self::order",
|
|
||||||
// &format!(
|
|
||||||
// "order rejected: {}",
|
|
||||||
// e.into_iter()
|
|
||||||
// .filter_map(|res| {
|
|
||||||
// if let OrderResponseStatus::Error(e) = res {
|
|
||||||
// Some(e)
|
|
||||||
// } else {
|
|
||||||
// None
|
|
||||||
// }
|
|
||||||
// })
|
|
||||||
// .collect::<Vec<_>>()
|
|
||||||
// .join(", ")
|
|
||||||
// ),
|
|
||||||
// )
|
|
||||||
// .await?;
|
|
||||||
// }
|
|
||||||
|
|
||||||
// Err(e) => {
|
|
||||||
// self.terminal_server
|
|
||||||
// .error("self::order", &e.to_string())
|
|
||||||
// .await?;
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
} else {
|
|
||||||
self.terminal_server
|
|
||||||
.error("Engine::order", "Unable to get active account")
|
|
||||||
.await?;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Ok(())
|
Ok(())
|
||||||
|
|||||||
@@ -169,10 +169,7 @@ impl StrategyEngine {
|
|||||||
|
|
||||||
engine
|
engine
|
||||||
.terminal_server
|
.terminal_server
|
||||||
.error(
|
.error("engine::order", &format!("Failed to execute signal: {e}"))
|
||||||
"engine::strategy",
|
|
||||||
&format!("Failed to execute signal: {e}"),
|
|
||||||
)
|
|
||||||
.await?
|
.await?
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user