Skip to content

Commit

Permalink
upd
Browse files Browse the repository at this point in the history
  • Loading branch information
m5l14i11 committed Apr 11, 2024
1 parent 5e12a31 commit a8d196f
Show file tree
Hide file tree
Showing 35 changed files with 216 additions and 103 deletions.
1 change: 1 addition & 0 deletions core/models/side.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ class PositionSide(Enum):
def __str__(self):
return self.value


class SignalSide(Enum):
BUY = "buy"
SELL = "sell"
Expand Down
4 changes: 2 additions & 2 deletions quant.py
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@
from optimization import StrategyOptimizerFactory
from portfolio import Portfolio
from position import PositionActorFactory, PositionFactory
from position.risk.volatility import PositionRiskVolatilityStrategy
from position.risk.break_even import PositionRiskBreakEvenStrategy
from position.size.optimal_f import PositionOptimalFSizeStrategy
from position.take_profit.risk_reward import PositionRiskRewardTakeProfitStrategy
from risk import RiskActorFactory
Expand Down Expand Up @@ -69,7 +69,7 @@ async def main():

position_factory = PositionFactory(
PositionOptimalFSizeStrategy(),
PositionRiskVolatilityStrategy(config_service),
PositionRiskBreakEvenStrategy(config_service),
PositionRiskRewardTakeProfitStrategy(config_service),
)

Expand Down
4 changes: 4 additions & 0 deletions strategy/generator/bootstrap/_trend_follow.py
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,8 @@
from strategy.generator.signal.dch_two_ma import Dch2MaSignal
from strategy.generator.signal.di_cross import DiCrossSignal
from strategy.generator.signal.dmi_cross import DmiCrossSignal
from strategy.generator.signal.dso_cross import DsoCrossSignal
from strategy.generator.signal.dso_flip import DsoFlipSignal
from strategy.generator.signal.hl import HighLowSignal
from strategy.generator.signal.kst_cross import KstCrossSignal
from strategy.generator.signal.ma_three_cross import Ma3CrossSignal
Expand Down Expand Up @@ -305,6 +307,7 @@ def _generate_signal(self, signal: TrendSignalType):
return np.random.choice(
[
AoFlipSignal(),
DsoFlipSignal(),
MacdFlipSignal(),
SupertrendFlipSignal(),
RocFlipSignal(),
Expand Down Expand Up @@ -356,6 +359,7 @@ def _generate_signal(self, signal: TrendSignalType):
QstickCrossSignal(),
VwapCrossSignal(),
DmiCrossSignal(),
DsoCrossSignal(),
StochCrossSignal(),
KstCrossSignal(),
TrixCrossSignal(),
Expand Down
2 changes: 2 additions & 0 deletions strategy/generator/signal/base.py
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,8 @@ class SignalType(Enum):
DiFlip = "DiFlip"
DiCross = "DiCross"
DmiCross = "DmiCross"
DsoFlip = "DsoFlip"
DsoCross = "DsoCross"
HighLow = "HighLow"
Ma3Cross = "Ma3Cross"
MaTestingGround = "MaTestingGround"
Expand Down
15 changes: 15 additions & 0 deletions strategy/generator/signal/dso_cross.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
from dataclasses import dataclass

from core.models.parameter import Parameter, StaticParameter
from core.models.smooth import Smooth

from .base import Signal, SignalType


@dataclass(frozen=True)
class DsoCrossSignal(Signal):
type: Signal = SignalType.DsoCross
smooth_type: Parameter = StaticParameter(Smooth.EMA)
smooth_period: Parameter = StaticParameter(13.0)
k_period: Parameter = StaticParameter(8.0)
d_period: Parameter = StaticParameter(9.0)
15 changes: 15 additions & 0 deletions strategy/generator/signal/dso_flip.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
from dataclasses import dataclass

from core.models.parameter import Parameter, StaticParameter
from core.models.smooth import Smooth

from .base import Signal, SignalType


@dataclass(frozen=True)
class DsoFlipSignal(Signal):
type: Signal = SignalType.DsoFlip
smooth_type: Parameter = StaticParameter(Smooth.EMA)
smooth_period: Parameter = StaticParameter(13.0)
k_period: Parameter = StaticParameter(8.0)
d_period: Parameter = StaticParameter(9.0)
2 changes: 2 additions & 0 deletions ta_lib/strategies/base/src/constants.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
pub const ZERO_LINE: f32 = 0.;
pub const NEUTRALITY_LINE: f32 = 50.;
2 changes: 2 additions & 0 deletions ta_lib/strategies/base/src/lib.rs
Original file line number Diff line number Diff line change
@@ -1,12 +1,14 @@
extern crate alloc;

mod constants;
mod ffi;
mod model;
mod price;
mod strategy;
mod traits;

pub mod prelude {
pub use crate::constants::*;
pub use crate::ffi::*;
pub use crate::model::{OHLCVSeries, OHLCV};
pub use crate::price::*;
Expand Down
4 changes: 1 addition & 3 deletions ta_lib/strategies/confirm/src/dpo.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,6 @@ use base::prelude::*;
use core::prelude::*;
use trend::dpo;

const DPO_FILTER: f32 = 0.;

pub struct DPOConfirm {
smooth_type: Smooth,
period: usize,
Expand All @@ -26,6 +24,6 @@ impl Confirm for DPOConfirm {
fn validate(&self, data: &OHLCVSeries) -> (Series<bool>, Series<bool>) {
let dpo = dpo(&data.close, self.smooth_type, self.period);

(dpo.sgt(&DPO_FILTER), dpo.slt(&DPO_FILTER))
(dpo.sgt(&ZERO_LINE), dpo.slt(&ZERO_LINE))
}
}
4 changes: 1 addition & 3 deletions ta_lib/strategies/confirm/src/eom.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,6 @@ use base::prelude::*;
use core::prelude::*;
use volume::eom;

const EOM_FILTER: f32 = 0.;

pub struct EOMConfirm {
smooth_type: Smooth,
period: usize,
Expand Down Expand Up @@ -36,6 +34,6 @@ impl Confirm for EOMConfirm {
self.divisor,
);

(eom.sgt(&EOM_FILTER), eom.slt(&EOM_FILTER))
(eom.sgt(&ZERO_LINE), eom.slt(&ZERO_LINE))
}
}
4 changes: 1 addition & 3 deletions ta_lib/strategies/confirm/src/roc.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,6 @@ use base::prelude::*;
use core::prelude::*;
use momentum::roc;

const ROC_FILTER: f32 = 0.;

pub struct ROCConfirm {
period: usize,
}
Expand All @@ -24,6 +22,6 @@ impl Confirm for ROCConfirm {
fn validate(&self, data: &OHLCVSeries) -> (Series<bool>, Series<bool>) {
let roc = roc(&data.close, self.period);

(roc.sgt(&ROC_FILTER), roc.slt(&ROC_FILTER))
(roc.sgt(&ZERO_LINE), roc.slt(&ZERO_LINE))
}
}
4 changes: 1 addition & 3 deletions ta_lib/strategies/pulse/src/vo.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,6 @@ use base::prelude::*;
use core::prelude::*;
use volume::vo;

const VO_ZERO_LINE: f32 = 0.0;

pub struct VoPulse {
smooth_type: Smooth,
fast_period: usize,
Expand Down Expand Up @@ -33,6 +31,6 @@ impl Pulse for VoPulse {
self.slow_period,
);

(vo.sgt(&VO_ZERO_LINE), vo.sgt(&VO_ZERO_LINE))
(vo.sgt(&ZERO_LINE), vo.sgt(&ZERO_LINE))
}
}
6 changes: 2 additions & 4 deletions ta_lib/strategies/signal/src/ao_flip.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,6 @@ use base::prelude::*;
use core::prelude::*;
use momentum::ao;

const AO_ZERO: f32 = 0.0;

pub struct AOFlipSignal {
fast_period: usize,
slow_period: usize,
Expand All @@ -28,8 +26,8 @@ impl Signal for AOFlipSignal {
let prev_ao = ao.shift(2);

(
ao.cross_over(&AO_ZERO) & prev_ao.slt(&AO_ZERO),
ao.cross_under(&AO_ZERO) & prev_ao.sgt(&AO_ZERO),
ao.cross_over(&ZERO_LINE) & prev_ao.slt(&ZERO_LINE),
ao.cross_under(&ZERO_LINE) & prev_ao.sgt(&ZERO_LINE),
)
}
}
18 changes: 8 additions & 10 deletions ta_lib/strategies/signal/src/ao_saucer.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,6 @@ use base::prelude::*;
use core::prelude::*;
use momentum::ao;

const AO_ZERO: f32 = 0.0;

pub struct AOSaucerSignal {
fast_period: usize,
slow_period: usize,
Expand Down Expand Up @@ -31,17 +29,17 @@ impl Signal for AOSaucerSignal {
let back_2_diff = diff.shift(2);

(
ao.sgt(&AO_ZERO)
& diff.sgt(&AO_ZERO)
ao.sgt(&ZERO_LINE)
& diff.sgt(&ZERO_LINE)
& diff.sgt(&prev_diff)
& prev_diff.slt(&AO_ZERO)
& back_2_diff.slt(&AO_ZERO)
& prev_diff.slt(&ZERO_LINE)
& back_2_diff.slt(&ZERO_LINE)
& prev_diff.slt(&back_2_diff),
ao.slt(&AO_ZERO)
& diff.slt(&AO_ZERO)
ao.slt(&ZERO_LINE)
& diff.slt(&ZERO_LINE)
& diff.slt(&prev_diff)
& prev_diff.sgt(&AO_ZERO)
& back_2_diff.sgt(&AO_ZERO)
& prev_diff.sgt(&ZERO_LINE)
& back_2_diff.sgt(&ZERO_LINE)
& prev_diff.slt(&back_2_diff),
)
}
Expand Down
4 changes: 1 addition & 3 deletions ta_lib/strategies/signal/src/apo_flip.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,6 @@ use base::prelude::*;
use core::prelude::*;
use momentum::apo;

const APO_ZERO: f32 = 0.0;

pub struct APOFlipSignal {
fast_period: usize,
slow_period: usize,
Expand All @@ -26,6 +24,6 @@ impl Signal for APOFlipSignal {
fn generate(&self, data: &OHLCVSeries) -> (Series<bool>, Series<bool>) {
let apo = apo(&data.close, self.fast_period, self.slow_period);

(apo.cross_over(&APO_ZERO), apo.cross_under(&APO_ZERO))
(apo.cross_over(&ZERO_LINE), apo.cross_under(&ZERO_LINE))
}
}
4 changes: 1 addition & 3 deletions ta_lib/strategies/signal/src/bop_flip.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,6 @@ use base::prelude::*;
use core::prelude::*;
use momentum::bop;

const BOP_ZERO: f32 = 0.0;

pub struct BOPFlipSignal {
smooth_type: Smooth,
smooth_period: usize,
Expand Down Expand Up @@ -33,6 +31,6 @@ impl Signal for BOPFlipSignal {
self.smooth_period,
);

(bop.cross_over(&BOP_ZERO), bop.cross_under(&BOP_ZERO))
(bop.cross_over(&ZERO_LINE), bop.cross_under(&ZERO_LINE))
}
}
2 changes: 0 additions & 2 deletions ta_lib/strategies/signal/src/cc_flip.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,6 @@ use base::prelude::*;
use core::prelude::*;
use momentum::cc;

const ZERO_LINE: f32 = 0.0;

pub struct CCFlipSignal {
fast_period: usize,
slow_period: usize,
Expand Down
3 changes: 0 additions & 3 deletions ta_lib/strategies/signal/src/ce_flip.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,6 @@ use base::prelude::*;
use core::prelude::*;
use trend::ce;

const ONE: f32 = 1.0;
const MINUS_ONE: f32 = -1.0;

pub struct CEFlipSignal {
period: usize,
atr_period: usize,
Expand Down
4 changes: 1 addition & 3 deletions ta_lib/strategies/signal/src/cfo_flip.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,6 @@ use base::prelude::*;
use core::prelude::*;
use momentum::cfo;

const CFO_ZERO: f32 = 0.0;

pub struct CFOFlipSignal {
period: usize,
}
Expand All @@ -24,6 +22,6 @@ impl Signal for CFOFlipSignal {
fn generate(&self, data: &OHLCVSeries) -> (Series<bool>, Series<bool>) {
let cfo = cfo(&data.close, self.period);

(cfo.cross_over(&CFO_ZERO), cfo.cross_under(&CFO_ZERO))
(cfo.cross_over(&ZERO_LINE), cfo.cross_under(&ZERO_LINE))
}
}
2 changes: 0 additions & 2 deletions ta_lib/strategies/signal/src/di_flip.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,6 @@ use base::prelude::*;
use core::prelude::*;
use momentum::di;

const ZERO_LINE: f32 = 0.0;

pub struct DIFlipSignal {
smooth_type: Smooth,
period: usize,
Expand Down
40 changes: 40 additions & 0 deletions ta_lib/strategies/signal/src/dso_cross.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
use base::prelude::*;
use core::prelude::*;
use momentum::dso;

pub struct DSOCrossSignal {
smooth_type: Smooth,
smooth_period: usize,
k_period: usize,
d_period: usize,
}

impl DSOCrossSignal {
pub fn new(smooth_type: Smooth, smooth_period: f32, k_period: f32, d_period: f32) -> Self {
Self {
smooth_type,
smooth_period: smooth_period as usize,
k_period: k_period as usize,
d_period: d_period as usize,
}
}
}

impl Signal for DSOCrossSignal {
fn lookback(&self) -> usize {
let period = std::cmp::max(self.smooth_period, self.k_period);
std::cmp::max(period, self.d_period)
}

fn generate(&self, data: &OHLCVSeries) -> (Series<bool>, Series<bool>) {
let (k, d) = dso(
&data.close,
self.smooth_type,
self.smooth_period,
self.k_period,
self.d_period,
);

(k.cross_over(&d), k.cross_under(&d))
}
}
43 changes: 43 additions & 0 deletions ta_lib/strategies/signal/src/dso_flip.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
use base::prelude::*;
use core::prelude::*;
use momentum::dso;

pub struct DSOFlipSignal {
smooth_type: Smooth,
smooth_period: usize,
k_period: usize,
d_period: usize,
}

impl DSOFlipSignal {
pub fn new(smooth_type: Smooth, smooth_period: f32, k_period: f32, d_period: f32) -> Self {
Self {
smooth_type,
smooth_period: smooth_period as usize,
k_period: k_period as usize,
d_period: d_period as usize,
}
}
}

impl Signal for DSOFlipSignal {
fn lookback(&self) -> usize {
let period = std::cmp::max(self.smooth_period, self.k_period);
std::cmp::max(period, self.d_period)
}

fn generate(&self, data: &OHLCVSeries) -> (Series<bool>, Series<bool>) {
let (k, _) = dso(
&data.close,
self.smooth_type,
self.smooth_period,
self.k_period,
self.d_period,
);

(
k.cross_over(&NEUTRALITY_LINE),
k.cross_under(&NEUTRALITY_LINE),
)
}
}
Loading

0 comments on commit a8d196f

Please sign in to comment.