My use case:
I trade one strategy on minute bars throughout a day. My dataset varies, it usually holds between 40 and 100 stocks.
I set single position to 14 percent, so I do hold 7 positions max without leverage.
Stop loss for a single stock ist set to 3%. Target rules are present.
My question:
Is it possible to implement a combined stop loss for the strategy?
I would like to: exit all trades at market, and terminate the strategy for this day, if overall combined loss is 2 percent.
I assume, that I can't do that with building blocks.
Can it be done (even better: is it documented anywhere)?
I have the (weak) confidence to program this myself, but I am not very experienced with WL7 and C#, so every hint to point me in the right direction is welcome.
I trade one strategy on minute bars throughout a day. My dataset varies, it usually holds between 40 and 100 stocks.
I set single position to 14 percent, so I do hold 7 positions max without leverage.
Stop loss for a single stock ist set to 3%. Target rules are present.
My question:
Is it possible to implement a combined stop loss for the strategy?
I would like to: exit all trades at market, and terminate the strategy for this day, if overall combined loss is 2 percent.
I assume, that I can't do that with building blocks.
Can it be done (even better: is it documented anywhere)?
I have the (weak) confidence to program this myself, but I am not very experienced with WL7 and C#, so every hint to point me in the right direction is welcome.
Rename
QUOTE:
I would like to: exit all trades at market, and terminate the strategy for this day, if overall combined loss is 2 percent.
In live trading you can accomplish this (though on account basis) with Trading Preferences > Trading Thresholds by setting "Account BP/Cash below..." a Dollar value and adjust it every day (week etc.)
@Glitch, does "Overall loss < N%" sound like a potential criteria for inclusion in Trading Preferences > Trading Thresholds?
QUOTE:
I assume, that I can't do that with building blocks.
Hmm I don't see how what's known as "crash stop loss" or "portfolio stop loss" can be implemented with Blocks.
Hi Eugene,
thank you for your reply.
Your suggestion could act as a workaround, but I hold other positions (mid-term and long-term) in my account, and they should not interfere with the calculations for the crash stop loss.
And when trading multiple strategies at the same time, I do not want to cancel all strategies.
Are there perhaps some more tips on which approaches or classes could ideally serve as a starting point? Is there access to the equity curve within a strategy or should I build that myself with custom variables?
To my understanding, the Class UserStrategyBase is the place to look at. I found the method AverageEntryPrice(), should I start here (with my own calculations to sum above all entries)?
Can the property CurrentEquity be used in live mode? The documentation says: The property 'Returns the current equity level in the simulation.'
Are there other classes that could help?
thank you for your reply.
Your suggestion could act as a workaround, but I hold other positions (mid-term and long-term) in my account, and they should not interfere with the calculations for the crash stop loss.
And when trading multiple strategies at the same time, I do not want to cancel all strategies.
Are there perhaps some more tips on which approaches or classes could ideally serve as a starting point? Is there access to the equity curve within a strategy or should I build that myself with custom variables?
To my understanding, the Class UserStrategyBase is the place to look at. I found the method AverageEntryPrice(), should I start here (with my own calculations to sum above all entries)?
Can the property CurrentEquity be used in live mode? The documentation says: The property 'Returns the current equity level in the simulation.'
Are there other classes that could help?
Hi,
We do not have any sample code for a portfolio-based crash stop loss in live mode. Sounds like a possible candidate for a future Wealth-Lab blog post.
You can get its value on the complete bar (i.e. idx = bars.Count-1) which lets you backtest the idea. Here's some sample code to help you in your own coding:
https://www.wealth-lab.com/Discussion/7208
https://www.wealth-lab.com/Discussion/7217
https://www.wealth-lab.com/Discussion/6268
QUOTE:
Can the property CurrentEquity be used in live mode?
We do not have any sample code for a portfolio-based crash stop loss in live mode. Sounds like a possible candidate for a future Wealth-Lab blog post.
You can get its value on the complete bar (i.e. idx = bars.Count-1) which lets you backtest the idea. Here's some sample code to help you in your own coding:
https://www.wealth-lab.com/Discussion/7208
https://www.wealth-lab.com/Discussion/7217
https://www.wealth-lab.com/Discussion/6268
CODE:
using WealthLab.Backtest; using System; using WealthLab.Core; using WealthLab.Indicators; using System.Drawing; using System.Collections.Generic; namespace WealthScript1 { public class MyStrategy : UserStrategyBase { TimeSeries equity; TimeSeries equitySMA; //Configure your usual position size as % of equity (say 5% per position): double percentEquity = 5; public override void Initialize(BarHistory bars) { equity = new TimeSeries(bars.DateTimes); equitySMA = new TimeSeries(bars.DateTimes); PlotTimeSeries(equity, "Equity", "Equity", Color.Green, PlotStyles.ThickHistogram); PlotTimeSeries(equitySMA, "SMA(Equity)", "Equity", Color.Black, PlotStyles.Line); } public override void Execute(BarHistory bars, int idx) { equity[idx] = CurrentEquity; equitySMA[idx] = SMA.Value(idx, equity, 10); //Calculate the usual size in shares based on the close price double c = bars.Close[idx]; var usualSize = (int)(CurrentEquity / c) / 100 * percentEquity; //Trade twice the size if equity is above its moving average var pctEquity = (equity[idx] > equitySMA[idx]) ? usualSize * 2 : usualSize; if (!HasOpenPosition(bars, PositionType.Long)) { var stop = Highest.Series(bars.High, 20)[idx]; PlaceTrade(bars, TransactionType.Buy, OrderType.Stop, stop).Quantity = pctEquity; //As alternative... //var t = PlaceTrade(bars, TransactionType.Buy, OrderType.Stop, stop); //t.Quantity = pctEquity; } else { var stop = Lowest.Series(bars.Low, 20)[idx]; PlaceTrade(bars, TransactionType.Sell, OrderType.Stop, stop); } } //declare private variables below } }
Hi,
thank you very much for the precise answer.
Looks like I can use it as a base for my usecase very well.
thank you very much for the precise answer.
Looks like I can use it as a base for my usecase very well.
Your Response
Post
Edit Post
Login is required