Documentazione
Applicazioni
Ultimo aggiornamento il 20. 11. 2021 da clonex / Ivan Hudec
Simulazione della media mobile azionaria
Contenuto della pagina
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.
@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
molto bene 🙂