Strategy to PositionStrategy refactoring

This commit is contained in:
Giulio De Pasquale 2021-01-13 08:59:13 +00:00
parent 7e8a5cc580
commit 4801d93bfe
3 changed files with 15 additions and 11 deletions

View File

@ -10,7 +10,7 @@ use crate::connectors::Connector;
use crate::currency::{Symbol, SymbolPair}; use crate::currency::{Symbol, SymbolPair};
use crate::events::EventKind; use crate::events::EventKind;
use crate::pairs::PairStatus; use crate::pairs::PairStatus;
use crate::strategy::Strategy; use crate::strategy::PositionStrategy;
use crate::ticker::Ticker; use crate::ticker::Ticker;
use crate::BoxError; use crate::BoxError;
@ -44,7 +44,7 @@ impl<'a> BfxBot<'a> {
} }
} }
pub fn with_strategy(mut self, strategy: Box<dyn Strategy>) -> Self { pub fn with_strategy(mut self, strategy: Box<dyn PositionStrategy>) -> Self {
self.pair_statuses self.pair_statuses
.iter_mut() .iter_mut()
.for_each(|x| x.set_strategy(dyn_clone::clone_box(&*strategy))); .for_each(|x| x.set_strategy(dyn_clone::clone_box(&*strategy)));

View File

@ -3,7 +3,7 @@ use std::collections::HashMap;
use crate::currency::SymbolPair; use crate::currency::SymbolPair;
use crate::events::{Event, EventDispatcher, SignalKind}; use crate::events::{Event, EventDispatcher, SignalKind};
use crate::models::{Order, Position}; use crate::models::{Order, Position};
use crate::strategy::Strategy; use crate::strategy::PositionStrategy;
pub struct PairStatus<'a> { pub struct PairStatus<'a> {
pair: SymbolPair, pair: SymbolPair,
@ -13,12 +13,16 @@ pub struct PairStatus<'a> {
orders: HashMap<u64, Vec<Order>>, orders: HashMap<u64, Vec<Order>>,
positions: HashMap<u64, Vec<Position>>, positions: HashMap<u64, Vec<Position>>,
current_tick: u64, current_tick: u64,
strategy: Option<Box<dyn Strategy + 'a>>, strategy: Option<Box<dyn PositionStrategy + 'a>>,
signals: HashMap<u64, SignalKind>, signals: HashMap<u64, SignalKind>,
} }
impl<'a> PairStatus<'a> { impl<'a> PairStatus<'a> {
pub fn new(pair: SymbolPair, current_tick: u64, strategy: Option<Box<dyn Strategy>>) -> Self { pub fn new(
pair: SymbolPair,
current_tick: u64,
strategy: Option<Box<dyn PositionStrategy>>,
) -> Self {
PairStatus { PairStatus {
pair, pair,
dispatcher: EventDispatcher::new(), dispatcher: EventDispatcher::new(),
@ -42,7 +46,7 @@ impl<'a> PairStatus<'a> {
pub fn add_position(&mut self, position: Position) { pub fn add_position(&mut self, position: Position) {
let (new_position, events, signals) = { let (new_position, events, signals) = {
match &self.strategy { match &self.strategy {
Some(strategy) => strategy.position_on_new_tick(&position, &self), Some(strategy) => strategy.on_new_tick(&position, &self),
None => (position, vec![], vec![]), None => (position, vec![], vec![]),
} }
}; };
@ -86,7 +90,7 @@ impl<'a> PairStatus<'a> {
self.current_tick self.current_tick
} }
pub fn set_strategy(&mut self, strategy: Box<dyn Strategy + 'a>) { pub fn set_strategy(&mut self, strategy: Box<dyn PositionStrategy + 'a>) {
self.strategy = Some(strategy); self.strategy = Some(strategy);
} }

View File

@ -5,8 +5,8 @@ use crate::models::{Position, PositionProfitState};
use crate::pairs::PairStatus; use crate::pairs::PairStatus;
use dyn_clone::DynClone; use dyn_clone::DynClone;
pub trait Strategy: DynClone { pub trait PositionStrategy: DynClone {
fn position_on_new_tick( fn on_new_tick(
&self, &self,
position: &Position, position: &Position,
status: &PairStatus, status: &PairStatus,
@ -37,8 +37,8 @@ impl TrailingStop {
} }
} }
impl Strategy for TrailingStop { impl PositionStrategy for TrailingStop {
fn position_on_new_tick( fn on_new_tick(
&self, &self,
position: &Position, position: &Position,
status: &PairStatus, status: &PairStatus,