Tag: strategia automatica

Strategia che inganna

Profitti da capogiro e equityline bellissima! Ma non è tutto oro ciò che luccica, ecco perché questa è una strategia che inganna.

Ciao, sono Drilon e sono un programmatore con la passione per la finanza personale, in questo blog condivido il mio percorso.

Questa è una strategia che all’apparenza è potentissima però bisogna sapere cosa c’è sotto per valutare al meglio.

La logica che c’è sotto è: COMPRA quando il macd incrocia dal basso verso l’alto, fine!

Molto semplice ma già da qui si può intuire che se si utilizza su un asset che non cresce sempre il profitto va a quel paese.

In questo caso è stata applicata all’SP500 che sappiamo che cresce sempre da più di 100 anni “per struttura” (è l’andamento del mercato, l’uomo crea valore sempre, se non fosse così vorrebbe dire che come specie si andrebbe a peggiorare, ma questo è tutto un altro discorso).

Quindi questa strategia è efficace? SI MA non hai bisogno di questa strategia per fare una cosa del genere, alla fine è un PAC (Piani d’accumulo).

Questo è un esempio su BITCOIN

Ma vediamo su un asset più volatile come Palantir (PLTR)

Na merda! Ma questo perchè? Perché Palantir è stata listata, è andata per un paio di mesi verso l’alto e poi è crollata, quindi le posizioni sono tutte in negativo, poi magari tra 10 anni Palantir sarà la nuova Apple, però chi lo può sapere?!

Proprio questo è il problema, quindi tanto vale fare un PAC autonomamente.

Questo era un esempio del perché è importante capire come funziona una strategia, non si può applicare a tutto ed è un attimo perdere soldi. Attenzione alla strategia che inganna!

Se hai dubbi o domande fammele pure su Telegram: https://t.me/+0xQYD3WKIAA5Mjg8

Seguimi su instagram: https://www.instagram.com/investoinvestigando.it/

Ecco il codice per TradingView:

//@version=5
strategy(title="Forex", overlay=true,  precision=3)

ema = ta.ema(close, 200)

//macd
fast_length = input(title="Fast Length", defval=12)
slow_length = input(title="Slow Length", defval=26)
src = input(title="Source", defval=close)
signal_length = input.int(title="Signal Smoothing",  minval = 1, maxval = 50, defval = 9)
sma_source = input.string(title="Oscillator MA Type",  defval="EMA", options=["SMA", "EMA"])
sma_signal = input.string(title="Signal Line MA Type", defval="EMA", options=["SMA", "EMA"])
// Plot colors
col_macd = input(#2962FF, "MACD Line  ", group="Color Settings", inline="MACD")
col_signal = input(#FF6D00, "Signal Line  ", group="Color Settings", inline="Signal")
col_grow_above = input(#26A69A, "Above   Grow", group="Histogram", inline="Above")
col_fall_above = input(#B2DFDB, "Fall", group="Histogram", inline="Above")
col_grow_below = input(#FFCDD2, "Below Grow", group="Histogram", inline="Below")
col_fall_below = input(#FF5252, "Fall", group="Histogram", inline="Below")
// Calculating
fast_ma = sma_source == "SMA" ? ta.sma(src, fast_length) : ta.ema(src, fast_length)
slow_ma = sma_source == "SMA" ? ta.sma(src, slow_length) : ta.ema(src, slow_length)
macd = fast_ma - slow_ma
signal = sma_signal == "SMA" ? ta.sma(macd, signal_length) : ta.ema(macd, signal_length)
buySignal = ta.crossover(macd, signal)
sellSignal = ta.crossunder(macd,signal)
var count = 0
if(buySignal and close > ema)
    stopLoss = 10000.0
    for i = 0 to 5
        stopLoss := low[i] < stopLoss ? low[i] : stopLoss
    
    takeProfit = close + (close-stopLoss)*2
    count := count + 1
    strategy.order("buy"+str.tostring(count), strategy.long, 1, when = true)

// Questo serve per dire quando chiudere le operazioni
if(year == 2023 and month == 06)
    strategy.close_all("Close")

EURUSD – RSI – Strategia Automatica

Ciao, in questo articolo ti parlo di una semplicissima strategia automatizzata che può portare buoni profitti, se accettiamo i compromessi.

Ciao sono Drilon e sono un programmatore con la passione per la finanza personale, questo è il mio blog dove racconto il mio percorso. Questa strategia si basa semplicemente sull’indicatore relative strength index (RSI).

Idea di base

La logica è molto semplice, quando l’rsi arriva in zona di ipervenduto, chiude tutte le posizioni in sell e ne apre una in buy. Quando l’rsi arriva in zona di ipercomprato, chiude tutte le posizioni in buy e ne apre una in sell.

Da qui possiamo anche capire quali sono i parametri della strategia. Ah una cosa importante, questa strategia è senza stoploss, quindi da fare attenzione e da valutare bene!

Processo

Partendo dall’ottimizzazione dei parametri in un periodo che va dal 2019 al 2023 trovo le migliori combinazioni in questo lasso di tempo. Dopodiché la testo in un range più ampio che va dal 2011 al 2023.

Se in entrambe le situazioni la strategia si comporta bene ed ha un andamento che reputo valido a quel punto la metto in live.

Ottimizzazione

I migliori parametri che ho ottenuto dopo l’ottimizzazione sono:

  • takeProfit: 100000 (non ottimizzato, non si utilizza)
  • stopLoss: 100000 (non ottimizzato, non si utilizza)
  • overBougth: 81
  • overSell:31
  • period: 5
  • lotti: 0.1 (non ottimizzato)
  • maxOrder: 1 (non ottimizzato, il numero di ordini aperti nello stesso momento)

Questo è il risultato invece:

Un bel 560%! Però vediamo un po’ i dati statistici che sono molto importanti per la valutazione di una strategia. Non facciamoci fregare dalle performance!

Possiamo vedere che ha avuto un discreto drawdown che, personalmente, non sono disposto a subire. Abbiamo un profit factor maggiore di 1, quindi non male e vediamo anche che la perdita maggiore è di circa -450$. Il tutto è stato fatto con un portafoglio da 1000$ di partenza.

Problemi

Come possiamo notare dal backtest ci sono dei momenti in cui la strategia ha dei drawdown notevoli. Andando ad analizzare nel dettaglio, si vede che la strategia apre una posizione nel verso sbagliato, quando siamo vicini a un’inversione di trend, ed l’indicatore non arriva mai nella zona opposta per poter chiudere.

Questo è un po’ il problema generale dell’RSI, che magari è in zona di ipervenduto, ma prima di arrivare in ipercomprato passa del tempo perché siamo in un trend fortemente ribassista.

Questa cosa si può migliorare introducendo magari una media mobile o qualche altro indicatore. Da valutare.

Conclusione

Ora che abbiamo i dati alla mano possiamo valutare al meglio e decidere se metterla in live oppure no. Le domande che mi faccio sono:

  • Sono disposto a subire un drawdown maggiore del 50%?
  • Posso gestire emotivamente una perdita di -450$?
  • Quanti loss di fila posso sopportare?

Rispondendo a queste domande ti fai già un’idea se la strategia va bene per te oppure no!

Io personalmente posso metterla in live ma riducendo i lotti, perché comunque vedo che nel lungo termine è una strategia profittevole, però non sono disposto a rischiare così tanto.

Posso gestire invece una perdita di -45$ invece di -450$, riducendo i lotti a 0.01. Di conseguenza diminuisce anche il guadagno, invece del 560% sarà circa il 56% in 11 anni, però mi va comunque bene!

Sisi ora ti do il codice, però ricorda che è importante capire come funziona una strategia, utilizzarla sapendo cosa aspettarci!

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/

Codice

using System;
using System.Linq;
using cAlgo.API;
using cAlgo.API.Indicators;
using cAlgo.API.Internals;
using cAlgo.Indicators;

namespace cAlgo.Robots
{
    [Robot(TimeZone = TimeZones.UTC, AccessRights = AccessRights.None)]
    public class IIRsi: Robot
    {

        [Parameter("Source", Group = "Data series")]
        public DataSeries Source { get; set; }

        [Parameter(DefaultValue = 100000)]
        public double takeProfit { get; set; }

        [Parameter(DefaultValue = 100000)]
        public double stopLoss { get; set; }

        [Parameter(DefaultValue = 70)]
        public int overBougth { get; set; }

        [Parameter(DefaultValue = 30)]
        public int overSell { get; set; }

        [Parameter(DefaultValue = 60)]
        public int period { get; set; }

        [Parameter(DefaultValue = 0.01)]
        public double lots { get; set; }

        [Parameter(DefaultValue = 1)]
        public int maxOrder { get; set; }

        private RelativeStrengthIndex rsi;


        protected override void OnStart()
        {
            // Put your initialization logic here

        }

        protected override void OnBar()
        {
            // Put your core logic here
            rsi = Indicators.RelativeStrengthIndex(Source, period);
            
            
            int currentBar = Bars.Count - 1;
            bool check = true; //checkTime();
            var positions = Positions.FindAll("Order");
            if (check == true)
            {
                

                if (rsi.Result.LastValue < overSell)
                {
                    Close(TradeType.Sell);
                    Open(TradeType.Buy, lots);
                }

                if (rsi.Result.LastValue > overBougth)
                {
                    Close(TradeType.Buy);
                    Open(TradeType.Sell, lots);
                }

            }
           
        }


        private void Close(TradeType tradeType)
        {
            foreach (var position in Positions.FindAll("OrderRSI", SymbolName, tradeType))
                ClosePosition(position);
        }

        private void Open(TradeType tradeType, double lots)
        {
            var position = Positions.FindAll("OrderRSI", SymbolName, tradeType);
            var volumeInUnits = Symbol.QuantityToVolumeInUnits(lots);
            if (position == null || position.Length < maxOrder)
                ExecuteMarketOrder(tradeType, SymbolName, (double)volumeInUnits, "OrderRSI", stopLoss, takeProfit);
        }
    }
}

Dynamic Breakout – Scalping

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.

Esempio di breakout dinamico

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.

USDJPY

Sono andato a provarla in un’altra coppia, ovvero EURUSD e qui le cose si sono fatte interessanti.

EURUSD - Brakout strategy
EURUSD – Brakout strategy

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/