Ciao oggi ti vado a parlare di una strategia di scalping (Dynamic Breakout – Scalping) che ho trovato online e che ho un po’ ridefinito secondo le mie idee.
Logica di base
La logica di base è quella di definire un range di max e min durante un determinato periodo della giornata, ad esempio dalle 2 di notte alle 7 di mattina, dopodiché se il prezzo va sopra o sotto questi range entrare a mercato.
In quest’immagine vediamo un esempio di un caso ideale della strategia.
Ma quando chiudere l’operazione?
Per questo ho messo due possibilità, una al raggiungimento di un TakeProfit e l’altra è una chiusura a tempo, ovvero in un determinato orario della giornata!
La strategia l’ho trovata in questo canale YouTube: https://www.youtube.com/c/RenéBalke/videos
Andiamo nel codice
A questo punto ho codificato la strategia e sono andato a ottimizzarla per USDJPY (quello utilizzato nel video) però non ho ottenuto dei buoni risultati. Si sempre profittevole, però troppo volatile per i miei gusti.
Sono andato a provarla in un’altra coppia, ovvero EURUSD e qui le cose si sono fatte interessanti.
Come puoi vedere dall’immagine c’è una crescita costante e un rischio minimo. Questo è stato ottenuto con 0.01 lotti e vediamo che c’è un drawdown di $42 e un guadagno di $437, tutto questo in un periodo di 11 anni.
Come dico tutte le volte, non guardare tanto il fatto che in 11 anni 400$ siano pochi, bisogna vedere se la strategia è profittevole in un tempo abbastanza lungo, dopo sei sempre in tempo ad aumentare i lotti e ad aumentare il guadagno…ma anche il drawdown possibile.
I parametri migliori che sono venuti fuori per questa strategia, in EURUSD sono i seguenti:
TimeFrame: 1m | ||
TakeProfit: 5 | ||
StopLoss: 100000 (è senza stop loss la strategia) | ||
hourEnter: 6 | ||
hourExit: 8 | ||
hourClosingOpen: 19 | ||
hourClosingExit: 19 | ||
maxOrder: 1 | ||
maxRange: 0 | ||
minRange: 999999 | ||
lots: 0.01 |
Ti ricordo di testarla anche in altre coppie e trovare i settaggi migliori prima di operare veramente.
Ed ecco il codice della strategia, se vuoi sapere come inserirlo e utilizzare la piattaforma guarda qui: https://www.investoinvestigando.it/come-usare-ctrader/
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 IIDynamicRangeBreakout : 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; }
protected override void OnTick()
{
// Handle price updates here
if(!checkTime()){
// Break Range
if(Bars.LastBar.Close > maxRange && maxRange != 0){
// Open BUY
Open(TradeType.Buy, lots);
maxRange = 0;
minRange = 999999;
}
if(Bars.LastBar.Close < minRange && minRange != 999999){
// Open SELL
Open(TradeType.Sell, lots);
maxRange = 0;
minRange = 999999;
}
}
if(checkClosingTime()){
CloseAll();
}
}
protected override void OnBar()
{
if(checkTime()){
Print("DENTRO");
// 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 && hourClosingOpen > 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)
{
ClosePosition(position);
}
}
private void Close(TradeType tradeType)
{
foreach (var position in Positions.FindAll("Order", SymbolName, tradeType))
ClosePosition(position);
}
private void Open(TradeType tradeType, double lots)
{
var position = Positions.FindAll("Order", SymbolName, tradeType);
var volumeInUnits = Symbol.QuantityToVolumeInUnits(lots);
if (position == null || position.Length < maxOrder)
ExecuteMarketOrder(tradeType, SymbolName, volumeInUnits, "Order", stopLoss, takeProfit);
}
}
}
Se vuoi vedere delle strategie da utilizzare inizia da qui: https://www.investoinvestigando.it/una-strategia-per-sempre-algotrading/
Se hai dubbi o domande fammele pure su Telegram: https://t.me/+0xQYD3WKIAA5Mjg8
Seguimi su instagram: https://www.instagram.com/investoinvestigando.it/