Ciao, la strategia Dynamic Range Revert Money Management è una miglioria alla strategia Dynamic Range Revert! (Pazzesco vero?! 😀 ) Si tratta della stessa strategia dove però i lotti cambiano in percentuale.
Ciao sono Drilon e sono un programmatore con la passione per la finanza personale. In questa strategia si imposta quanto del nostro capitale si vuole rischiare ad ogni trade, ad esempio l’1%! La logica che c’è sotto poi è la stessa che trovi qui (no dovevi cliccare QUI, c’è il link, non in questo, dai te lo rimetto qui, stasera mi è presa così…non sono simpatico scusa)
Risultati
Andiamo al sodo e vediamo il risultato!
Questo grafico è l’equityline, ovvero l’andamento. Partendo da 450$ si arriva a circa 3400$.
Aspetta non è così semplice, questa vale solo per EURCAD a timeframe 1 minuto!
Niente male lo so, ma non farti ingannare dai, ovviamente questo è un backtest, in live i risultati non saranno così, per via dello spread e le commissioni che qui è sono statiche (non zero, non mi ricordo che valore di preciso).
Ok abbiamo visto il grafico, vediamo più nel dettaglio però.
Un dato molto importante per me è sempre il Drawdown poiché devo essere in grado di sostenerlo sia economicamente che mentalmente (terribile veder scendere il valore dei soldi). In questo caso si tratta di circa un 12% di drawdown.
Non è tantissimo, però non è nemmeno poco, anche se per un guadagno del genere ne potrebbe valere la pena!
Vediamo che ha aperto circa 3000 ordini, quindi i dati sono abbastanza affidabile. Se un backtest di una strategia si fa su 10 ordini i dati che ottieni puoi evidenziarli, sottolinearli, accartocciare il foglio e buttare tutto! NON SONO ABBASTANZA! NON è ATTENDIBILE!
Un altro valore importante sono gli ordini consecutivi che sono andati in stopLoss, anche questo principalmente per una questione mentale (il rischio rendimento vedrai che non è come ti aspetti).
Personalmente, preferisco fare piccoli profitti costanti e prendere una batosta raramente, rispetto a prendere tanti stopLoss e un grande takeProfit. Mentalmente mi ammazza e mi porterebbe a fare cazzate!
Vabbè basta, io il mio l’ho detto, tieni il codice!
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using cAlgo.API;
using cAlgo.API.Collections;
using cAlgo.API.Indicators;
using cAlgo.API.Internals;
namespace cAlgo.Robots
{
[Robot(AccessRights = AccessRights.None)]
public class IIDynamicRangeBreakoutREVERTMM : Robot
{
[Parameter(DefaultValue = 10)]
public double takeProfit { get; set; }
[Parameter(DefaultValue = 10)]
public double stopLoss { get; set; }
[Parameter(DefaultValue = 8)]
public int hourEnter { get; set; }
[Parameter(DefaultValue = 18)]
public int hourExit { get; set; }
[Parameter(DefaultValue = 8)]
public int hourClosingOpen{ get; set; }
[Parameter(DefaultValue = 18)]
public int hourClosingExit { get; set; }
[Parameter(DefaultValue = 1)]
public int maxOrder { get; set; }
[Parameter(DefaultValue = 0)]
public double maxRange { get; set; }
[Parameter(DefaultValue = 999999)]
public double minRange { get; set; }
[Parameter(DefaultValue = 0.01)]
public double lots { get; set; }
[Parameter(DefaultValue = 3)]
public int stopLossRiskPercent { get; set; }
protected override void OnStart()
{
Positions.Closed += OnPositionsClosed;
}
protected override void OnTick()
{
// Handle price updates here
if(!checkTime()){
// Break Range
if(Bars.LastBar.Close > maxRange && maxRange != 0){
// Open BUY
lots = DisplayPositionSizeRiskOnChart();
if(lots >= 0.00){
Open(TradeType.Sell, lots);
maxRange = 0;
minRange = 999999;
}
}
if(Bars.LastBar.Close < minRange && minRange != 999999){
// Open SELL
lots = DisplayPositionSizeRiskOnChart();
if(lots >= 0.00){
Open(TradeType.Buy, lots);
maxRange = 0;
minRange = 999999;
}
}
}
/*if(checkClosingTime()){
CloseAll();
}*/
}
protected override void OnBar()
{
if(checkTime()){
// Set Range
if(Bars.LastBar.High > maxRange ){
maxRange = Bars.LastBar.High;
}
if(Bars.LastBar.Low < minRange ){
minRange = Bars.LastBar.Low;
}
}
}
protected override void OnStop()
{
CloseAll();
}
private bool checkTime()
{
DateTime date = Server.Time;
if (date.Hour >= hourEnter && date.Hour <= hourExit && hourEnter <= hourExit)
{
return true;
}
else
{
return false;
}
}
private bool checkClosingTime()
{
DateTime date = Server.Time;
if (date.Hour >= hourClosingOpen && date.Hour <= hourClosingExit && hourClosingOpen <= hourClosingExit)
{
return true;
}
else
{
return false;
}
}
private void CloseAll()
{
foreach (var position in Positions.FindAll("DynamicRangeBreakoutREVERT", SymbolName))
{
ClosePosition(position);
}
}
private void Close(TradeType tradeType)
{
foreach (var position in Positions.FindAll("DynamicRangeBreakoutREVERT", SymbolName, tradeType))
ClosePosition(position);
}
private void Open(TradeType tradeType, double lots)
{
var position = Positions.FindAll("DynamicRangeBreakoutREVERT", SymbolName, tradeType);
var volumeInUnits = Symbol.QuantityToVolumeInUnits(lots);
if (position == null || position.Length < maxOrder)
ExecuteMarketOrder(tradeType, SymbolName, volumeInUnits, "DynamicRangeBreakoutREVERT", stopLoss, takeProfit);
}
private void OnPositionsClosed(PositionClosedEventArgs args)
{
Print("Closed positions");
var position = args.Position;
/* if (position.NetProfit > 0)
{
lots = 0.03;
}
else
{
lots *= 2;
}*/
}
private double DisplayPositionSizeRiskOnChart()
{
double costPerPip = (double)((int)(Symbol.PipValue * 10000000)) / 100;
double positionSizeForRisk = (Account.Balance * stopLossRiskPercent / 100) / (stopLoss * costPerPip);
Print(Account.Balance, " ",positionSizeForRisk, " ",(stopLoss * costPerPip));
string text = stopLossRiskPercent + "% x " + stopLoss + "pip = " + Math.Round(positionSizeForRisk, 2) + " lot";
ChartObjects.DrawText("positionRisk", text, StaticPosition.TopRight, Colors.Yellow);
return Math.Round(positionSizeForRisk, 2);
}
}
}
questi sono i parametri che devi impostare:
- takeProfit: 15
- stopLoss: 40
- hourEnter: 18
- hourExit: 19
- hourClosingEnter: 18
- hourClosingExit: 23
- maxOrder: 1
- minRange: 99999
- lots: 0.01
- stopLossRisk: 1
Mi raccomando, la strategia può funzionare anche con altre valute, ma con questi parametri specifici funziona sono in EURCAD a 1 minuto!
Da qui puoi vedere come utilizzare cTrader (piattaforma che utilizzo): LINK
Se hai dubbi o domande fammele pure su Telegram: https://t.me/+0xQYD3WKIAA5Mjg8
Seguimi su instagram: https://www.instagram.com/investoinvestigando.it/