Documentazione

Applicazioni

Ultimo aggiornamento il 20. 11. 2021 da clonex / Ivan Hudec

Simulazione della media mobile azionaria

In questa esercitazione vi mostreremo come creare e simulare il controllo della curva di equità in What If Crosscheck .

Gli scenari What-If di StrategyQuantx sono lo strumento che consente di testare varie ipotesi di trading della strategia.

La funzione di simulazione del controllo azionario consente di simulare l'attivazione e la disattivazione di una strategia in base alla curva azionaria. Il presupposto si basa sull'ipotesi che è meglio negoziare la strategia se la sua performance è superiore alla sua media. È possibile leggere un buon articolo dedicato a questo argomento qui.

Lo snippet finito può essere scaricato qui.

Passo 1 - Creare un nuovo snippet What if

Aprite CodeEditor, fate clic su Crea nuovo e scegliete l'opzione Elenco delle colonne di compravendita. EquityMATrading.

Questo creerà un nuovo snippet EquityMATrading.java in cartella Utente/Snippet/SQ/Whatif

 

Passo 2 - Definire i parametri dello snippet

Dal momento che vogliamo calcolare la media delle azioni, dobbiamo includere un parametro - Periodo di tempo  che ci permette di specificare un periodo della media mobile.

La creazione di un parametro significa che sarà regolabile nella scheda Whatif di EquityMATrading nei controlli incrociati.

 

@ClassConfig(name="() Equity MA Trading", display="Equity MA(#MAPeriod#) Trading ")
@Help("Testo di aiuto")
public class EquityMATrading extends WhatIf {
    public static final Logger Log = LoggerFactory.getLogger(EquityMATrading.class);
    

    @Parametro(name="MAPeriod", defaultValue="10", minValue=2, maxValue=100000, step=1)
    public int MAPeriod;

Passo 3 - Implementare il metodo filter(OrdersList orders)

 

Il filtro(Elenco ordini ordini) viene utilizzato per filtrare l'elenco originale degli ordini della strategia. Elenco ordini  è una classe che memorizza l'elenco delle operazioni di una strategia e fornisce metodi per manipolare l'elenco delle operazioni. È possibile eseguire il loop dell'intero Elenco ordini  e ottenere i dati per Ordine  utilizzando il metodo ottenere(indice int).

In questo caso è necessario prestare attenzione al modo in cui si esegue il ciclo dell'elenco degli ordini. Nel nostro esempio, stiamo utilizzando il classico ciclo for, quindi non possiamo manipolare l'elenco degli ordini durante il ciclo.

Invece, si crea un file temporaneo Elenco ordini o dove memorizziamo le operazioni che hanno soddisfatto le nostre condizioni. Copiamo questo elenco di ordini alla fine dello snippet nell'elenco di ordini principale

 

Passo 4 - Utilizzo dello snippet Whatif di EquityMATrading

 

Per aggiungere uno snippet in Crosscheck, è possibile utilizzare questo snippet per simulare cosa accadrebbe se si negoziasse la strategia se la sua curva azionaria è al di sopra della sua media mobile.

Codice commentato completo dello snippet

pacchetto SQ.WhatIf;

importare org.slf4j.Logger;
importare org.slf4j.LoggerFactory;

importare com.strategyquant.lib.SQTime;
import com.strategyquant.tradinglib.ClassConfig;
import com.strategyquant.tradinglib.Help;
import com.strategyquant.tradinglib.Order;
importare com.strategyquant.tradinglib.OrdersList;
importare com.strategyquant.tradinglib.Parameter;
importare com.strategyquant.tradinglib.WhatIf;
import com.strategyquant.tradinglib.results.stats.comparator.OrderComparatorByOpenTime;

import it.unimi.dsi.fastutil.objects.ObjectListIterator;

@ClassConfig(name="() Equity MA Trading", display="Equity MA Trading (#MAPeriod#)")
@Help("Testo di aiuto")
public class EquityMATrading extends WhatIf {
    public static final Logger Log = LoggerFactory.getLogger(EquityMATrading.class);
    
    
    @Parametro(name="MAPeriod", defaultValue="10", minValue=2, maxValue=100000, step=1)
    public int MAPeriod;

    @Override
    public void filter(OrdersList orders) throws Exception {

        // Nuova istanza di OrdersList in cui memorizzare gli scambi che sono al di sopra della media mobile
        OrdersList newOL = new OrdersList("AboveMovingAverage");
        
        // Eseguiamo un ciclo su tutta la lista di ordini per calcolare la media mobile.
        for(int i = MAPeriod;i < orders.size();i++){

            // L'ultimo ordine in corso ci permette di decidere se passare a newOL o meno.
            Ordine = orders.get(i);
    
            // ottenere il saldo dell'ordine
            double balance = order.AccountBalance;
            
            // filtrare gli ordini bilanciati
            if(order.isBalanceOrder()) continua;

                double sum = 0;
                // calcolo della media mobile dei titoli azionari
                for(int k =1;kavg) {
                    // aggiungiamo order.get(i) a newOL
                    newOL.add(ordine);
                }
                avg =0; // azzeramento della variabile media
                sum =0; // azzera la variabile somma
            }
            // ordinamento di newOL in base all'orario di apertura delle posizioni
            newOL.sort(new OrderComparatorByOpenTime()); //// ordinamento degli ordini in base all'orario aperto
            // Sostituiamo gli ordini della lista OrdersList con la lista OrdersList newOL e riceviamo solo gli scambi al di sopra della media mobile
            orders.replaceWithList(newOL);
        }

}

 

Questo articolo è stato utile? L'articolo è stato utile L'articolo non è stato utile

Abbonarsi
Notificami
1 Commento
Il più vecchio
Più recente I più votati
Feedback in linea
Visualizza tutti i commenti
Emmanuel
20. 12. 2021 20:11 pm

molto bene 🙂