MultiLayer Awesome Oscillator Saucer
Implements a bullish multi-layer strategy based on the Awesome Oscillator saucer pattern and fractal trend detection. The strategy counts consecutive saucer signals and places up to five layered buy stop orders above price. Positions are closed when the trend reverses.
Parameters
- EMA Length – period of the EMA filter.
- Candle Type – type of candles.
- Trade Start – start of trading period.
- Trade Stop – end of trading period.
using System;
using Ecng.Common;
using StockSharp.Algo.Indicators;
using StockSharp.Algo.Strategies;
using StockSharp.BusinessEntities;
using StockSharp.Messages;
namespace StockSharp.Samples.Strategies;
public class MultiLayerAwesomeOscillatorSaucerStrategy : Strategy
{
private readonly StrategyParam<DataType> _candleType;
public DataType CandleType { get => _candleType.Value; set => _candleType.Value = value; }
public MultiLayerAwesomeOscillatorSaucerStrategy()
{
_candleType = Param(nameof(CandleType), TimeSpan.FromMinutes(15).TimeFrame());
}
protected override void OnStarted2(DateTime time)
{
base.OnStarted2(time);
var fast = new ExponentialMovingAverage { Length = 8 };
var slow = new ExponentialMovingAverage { Length = 21 };
var rsi = new RelativeStrengthIndex { Length = 14 };
var prevF = 0m; var prevS = 0m; var init = false;
var sub = SubscribeCandles(CandleType);
sub.Bind(fast, slow, rsi, (c, f, s, r) =>
{
if (c.State != CandleStates.Finished || !fast.IsFormed || !slow.IsFormed || !rsi.IsFormed) return;
if (!init) { prevF = f; prevS = s; init = true; return; }
if (prevF <= prevS && f > s && r > 45 && Position <= 0) BuyMarket();
else if (prevF >= prevS && f < s && r < 55 && Position > 0) SellMarket();
prevF = f; prevS = s;
}).Start();
var area = CreateChartArea();
if (area != null) { DrawCandles(area, sub); DrawIndicator(area, fast); DrawIndicator(area, slow); DrawOwnTrades(area); }
}
}
import clr
clr.AddReference("StockSharp.Messages")
clr.AddReference("StockSharp.Algo")
clr.AddReference("StockSharp.Algo.Indicators")
clr.AddReference("StockSharp.Algo.Strategies")
from System import TimeSpan
from StockSharp.Messages import DataType, CandleStates
from StockSharp.Algo.Indicators import ExponentialMovingAverage, RelativeStrengthIndex
from StockSharp.Algo.Strategies import Strategy
class multi_layer_awesome_oscillator_saucer_strategy(Strategy):
"""
MultiLayer Awesome Oscillator Saucer: EMA crossover with RSI filter.
"""
def __init__(self):
super(multi_layer_awesome_oscillator_saucer_strategy, self).__init__()
self._candle_type = self.Param("CandleType", DataType.TimeFrame(TimeSpan.FromMinutes(15))).SetDisplay("Candle Type", "Candles", "General")
self._prev_fast = 0.0
self._prev_slow = 0.0
self._initialized = False
@property
def candle_type(self):
return self._candle_type.Value
def OnReseted(self):
super(multi_layer_awesome_oscillator_saucer_strategy, self).OnReseted()
self._prev_fast = 0.0
self._prev_slow = 0.0
self._initialized = False
def OnStarted2(self, time):
super(multi_layer_awesome_oscillator_saucer_strategy, self).OnStarted2(time)
fast = ExponentialMovingAverage()
fast.Length = 8
slow = ExponentialMovingAverage()
slow.Length = 21
rsi = RelativeStrengthIndex()
rsi.Length = 14
subscription = self.SubscribeCandles(self.candle_type)
subscription.Bind(fast, slow, rsi, self._process_candle).Start()
area = self.CreateChartArea()
if area is not None:
self.DrawCandles(area, subscription)
self.DrawIndicator(area, fast)
self.DrawIndicator(area, slow)
self.DrawOwnTrades(area)
def _process_candle(self, candle, fast_val, slow_val, rsi_val):
if candle.State != CandleStates.Finished:
return
fast = float(fast_val)
slow = float(slow_val)
rsi = float(rsi_val)
if not self._initialized:
self._prev_fast = fast
self._prev_slow = slow
self._initialized = True
return
if self._prev_fast <= self._prev_slow and fast > slow and rsi > 45 and self.Position <= 0:
self.BuyMarket()
elif self._prev_fast >= self._prev_slow and fast < slow and rsi < 55 and self.Position > 0:
self.SellMarket()
self._prev_fast = fast
self._prev_slow = slow
def CreateClone(self):
return multi_layer_awesome_oscillator_saucer_strategy()