Documentazione

Applicazioni

Ultimo aggiornamento il 21. 1. 2022 da Mark Fric

Visualizzazione e modifica dei parametri della strategia - versione 2

Questa è una versione migliorata dell'esempio: https://strategyquant.com/doc/programming-for-sq/changing-strategy-parameters-programmatically/

L'originale StrategiaParametriHelper La classe aveva un solo metodo per modificare i valori dei parametri, ma non era facile ottenere l'elenco dei parametri effettivi della strategia.

Abbiamo quindi creato una nuova versione - StrategyParametersHelperV2 che ha anche metodi per ottenere l'elenco dei parametri e i loro valori.

Entrambe le classi sono disponibili per il download come allegati a questo articolo.

Nota! A causa di un piccolo problema in SQ, è necessario importare e compilare prima il file StrategyParametersHelperV2 e solo dopo importare e compilare la classe Parametri della strategia classe.
Questo problema sarà risolto nella prossima build 136 di SQ.

 

StrategyParametersHelperV2 ha questi metodi:

  • setParameters() - imposta (modifica) i parametri
  • getParameterNames() - restituisce un elenco di nomi di parametri
  • getParameterValues() - restituisce un elenco di nomi e valori dei parametri
  • toString() - converte l'elenco dei parametri del metodo precedente in una stringa leggibile.

Possiamo vedere come può essere utilizzato nell'esempio dello snippet della banca dati:

pacchetto SQ.Columns.Databanks;

importare SQ.Utils.StrategyParametersHelperV2;
import com.strategyquant.lib.L;
import com.strategyquant.tradinglib.*;
import com.strategyquant.tradinglib.optimization.WalkForwardMatrixResult;
import com.strategyquant.lib.ValuesMap;

public class StrategyParameters extends DatabankColumn {

    public StrategyParameters() {
        super(L.tsq("Parametri della strategia"), DatabankColumn.Text, ValueTypes.Maximize, 0, 0, 1);

        setWidth(200);
    }
    
    //------------------------------------------------------------------------

    @Override
    public double getNumericValue(ResultsGroup results, String resultKey, byte direction, byte plType, byte sampleType) throws Exception {
        return 0;
    }

    //------------------------------------------------------------------------
    
    @Override
    public String getValue(ResultsGroup results, String resultKey, byte direction, byte plType, byte sampleType) throws Exception {
        try {
            ValuesMap parameterTypes = new ValuesMap();
            parameterTypes.set(ParametrizationTypes.ParamTypePeriod, true);
            parameterTypes.set(ParametrizationTypes.ParamTypeShift, false);
            parameterTypes.set(ParametrizationTypes.ParamTypeConstant, false);
            parameterTypes.set(ParametrizationTypes.ParamTypeOtherParam, false);
            parameterTypes.set(ParametrizationTypes.ParamTypeEntryLevel, true);
            parameterTypes.set(ParametrizationTypes.ParamTypeEntryLogic, false);
            parameterTypes.set(ParametrizationTypes.ParamTypeExitUsed, true);
            parameterTypes.set(ParametrizationTypes.ParamTypeExitUnused, false);
            parameterTypes.set(ParametrizationTypes.ParamTypeBoolean, false);
            parameterTypes.set(ParametrizationTypes.ParamTypeTradingOptions, false);

            booleano sameVariablesForLongShort = true;

            return StrategyParametersHelperV2.toString(StrategyParametersHelperV2.getParameterValues(results, parameterTypes, sameVariablesForLongShort));
        } catch(Exception e) {
            restituisce "Errore: " + e.getMessage();
        }
    }
}

 

Si può notare che usiamo il metodo helper per ottenere i parametri e poi per convertirli in stringa.

Il risultato (nuova colonna della banca dati) avrà il seguente aspetto: elencherà i parametri specificati della strategia data:

Esempio di Snippet dei parametri della strategia

 

Si noti che è possibile definire quali tipi di parametri si desidera visualizzare e anche se si desidera utilizzare la stessa variabile per il lato lungo e per quello corto, come si può fare in Optimizer o in altre impostazioni dei parametri.

 

Il codice completo di StrategyParametersHelperV2 classe è:

pacchetto SQ.Utils;

importare com.strategyquant.datalib.TradingException;
importare com.strategyquant.lib.SQTime;
importare com.strategyquant.lib.ValuesMap;
importare com.strategyquant.lib.XMLUtil;
importare com.strategyquant.tradinglib.*;
importare com.strategyquant.tradinglib.options.TradingOptionsList;
importare com.strategyquant.tradinglib.propertygrid.IPGParameter;
importare com.strategyquant.tradinglib.propertygrid.ParametersTableItemProperties;
importare org.jdom2.Element;
importare org.slf4j.Logger;
import org.slf4j.LoggerFactory;

importare java.util.ArrayList;
importare java.util.HashMap;
importare java.util.List;
importare java.util.Map;

public class StrategyParametersHelperV2 {

    public static final Logger Log = LoggerFactory.getLogger(StrategyParametersHelper.class);

    public static final String ValueDelimiter = "=";
    public static final String ParamDelimiter = ",";

    /**
     * Applica i valori dei parametri nella strategia
     * @param rg
     * @param parameters - elenco delimitato dai due punti dei parametri e dei loro valori - ad esempio param1=123,param2=25.4
     * @param variabili simmetriche
     * @param modifyLastSettings
     * @Trova un'eccezione
     */
    public static void setParameters(ResultsGroup rg, String parameters, boolean symmetricVariables, boolean modifyLastSettings) throws Exception {

        //Carica l'XML e aggiorna le variabili
        StrategyBase strategyBase = getStrategyBase(rg, symmetricVariables);
        Variabili variabili = strategyBase.variables();

        String[] params = parameters.split(ParamDelimiter);
        HashMap paramMap = new HashMap();

        for(int i=0; i<params.length; i++) {
            String[] values = params[i].split(ValueDelimiter);
            paramMap.put(valori[0], valori[1]);
        }

        for(int a=0; a<variables.size(); a++) {
            Variabile variabile = variabili.get(a);
            if(paramMap.containsKey(variable.getName()) {
                variable.setFromString(paramMap.get(variable.getName());
            }
        }

        strategyBase.transformToNumbers();

        rg.portfolio().addStrategyXml(strategyBase.getStrategyXml());
        rg.specialValues().setString(StatsKey.OPTIMIZATION_PARAMETERS, parameters);

        se(modifyLastSettings){
            try {
                Element lastSettings = XMLUtil.stringToElement(rg.getLastSettings());
                Element elParams = lastSettings.getChild("Options").getChild("BuildTradingOptions").getChild("Params");
                List paramElems = elParams.getChildren("Param");

                List tradingOptions = TradingOptionsList.getInstance().getAvailableClasses();

                for(String paramName : paramMap.keySet()) {
                    booleano elaborato = false;

                    //dobbiamo trovare l'opzione di trading giusta
                    for(int i=0; i<tradingOptions.size(); i++) {
                        if(processed) break;

                        TradingOption option = tradingOptions.get(i);
                        String optionClass = option.getClass().getSimpleName();
                        ArrayList optionParams = option.getParams();

                        //scorrere i suoi parametri e trovare quello con il nome corrispondente
                        for(int z=0; z<optionParams.size(); z++) {
                            if(elaborato) break;

                            IPGParameter optionParam = optionParams.get(z);
                            String paramKey = optionParam.getKey();

                            if(!optionParam.getName().equals(paramName)) continua;

                            //ora troviamo l'elemento Param giusto nell'XML delle impostazioni e aggiorniamo il suo valore
                            for(int s=0; s<paramElems.size(); s++) {
                                Element elParam = paramElems.get(s);
                                String elParamClass = elParam.getAttributeValue("className");
                                String elParamKey = elParam.getAttributeValue("key");

                                if(elParamClass.null && elParamKey.null && elParamClass.equals(optionClass) && elParamKey.equals(paramKey)) {
                                    String value = paramMap.get(paramName);

                                    if(optionParam.getType() == ParametersTableItemProperties.TYPE_TIME) {
                                        value = "" + SQTime.HHMMToMinutes(Integer.parseInt(value)) * 60;
                                    }

                                    elParam.setText(valore);

                                    elaborato = vero;
                                    break;
                                }
                            }
                        }
                    }
                }

                rg.setLastSettings(XMLUtil.elementToString(lastSettings));
            }
            catch(Exception e){
                Log.error("Impossibile applicare i parametri delle opzioni di trading alle ultime impostazioni", e);
            }
        }
    }

    /**
     * Restituisce un ArrayList di nomi di parametri di strategia.
     * @param rg
     * @param parameterTypes
     * @param variabili simmetriche
     * @Ritorno
     * @Trova un'eccezione
     */
    public static ArrayList getParameterNames(ResultsGroup rg, ValuesMap parameterTypes, boolean symmetricVariables) throws Exception {
        HashMap paramsMap = getParameterValues(rg, parameterTypes, symmetricVariables);

        ArrayList list = new ArrayList();
        list.addAll(paramsMap.keySet());

        restituire l'elenco;
    }

    /**
     * Restituisce una mappa contenente i nomi e i valori dei parametri della strategia.
     * @param rg
     * @param parameterTypes - ValuesMap che specifica i ParametrizationTypes da controllare. Se nullo, vengono utilizzati i tipi di parametri consigliati.
     * @param symmetricVariables
     * @Ritorno
     * @Trova un'eccezione
     */
    public static HashMap getParameterValues(ResultsGroup rg, ValuesMap parameterTypes, boolean symmetricVariables) throws Exception {
        StrategyBase strategyBase = getStrategyBase(rg, symmetricVariables);
        Variabili variabili = strategyBase.variables();

        HashMap paramsList = new HashMap();

        booleano useRecommended = parameterTypes == null || parameterTypes.getBoolean(ParametrizationTypes.ParamTypeRecommended, false);

        if(useRecommended){
            parameterTypes = new ValuesMap();
            parameterTypes.set(ParametrizationTypes.ParamTypePeriod, true);
            parameterTypes.set(ParametrizationTypes.ParamTypeEntryLevel, true);
            parameterTypes.set(ParametrizationTypes.ParamTypeExitUsed, true);
        }

        for(int a=0; a<variables.size(); a++) {
            Variabile variabile = variabili.get(a);
            String variableType = variable.getParamType();

            String varName = variable.getName();
            if(varName.equals("LongEntrySignal") || varName.equals("ShortEntrySignal") || varName.equals("LongExitSignal") || varName.equals("ShortExitSignal") || varName.equals("MagicNumber")) {
                // salta i parametri che non devono essere impostati qui
                continua;
            }

            if(variableType == null || parameterTypes.getBoolean(variableType, false)){
                paramsList.put(variable.getName(), variable.getValue());
            }
        }

        return paramsList;
    }

    /**
     * Restituisce il valore del parametro selezionato
     * @param rg
     * @param symmetricVariables
     * @param parameterName
     * @Ritorno
     * @Trova un'eccezione
     */
    public static String getParameterValue(ResultsGroup rg, boolean symmetricVariables, String parameterName) throws Exception {
        StrategyBase strategyBase = getStrategyBase(rg, symmetricVariables);
        Variabili variabili = strategyBase.variables();
        Variabile variabile = variables.get(parameterName);

        if(variabile == null) return null;

        return variabile.getValue();
    }

    /**
     * Converte la mappa dei parametri in stringa
     * @param parametersMap
     * @Ritorno
     */
    public static String toString(HashMap parametersMap){
        if(parametersMap == null) return null;

        StringBuilder sb = new StringBuilder();

        for(String name : parametersMap.keySet()){
            sb.append(ParamDelimiter);
            sb.append(nome);
            sb.append(ValueDelimiter);
            sb.append(parametersMap.get(name));
        }

        return sb.length() > ParamDelimiter.length() ? sb.substring(ParamDelimiter.length()) : sb.toString();
    }

    private static StrategyBase getStrategyBase(ResultsGroup rg, boolean symmetricVariables) throws Exception {
        StrategyBase xmlS = StrategyBase.createXmlStrategy(rg.getStrategyXml());
        xmlS.transformToVariables(symmetricVariables);
        return xmlS;
    }

}

 

 

 

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

Abbonarsi
Notificami
2 Commenti
Il più vecchio
Più recente I più votati
Feedback in linea
Visualizza tutti i commenti
Emmanuel
9. 2. 2022 12:10 pm

Era esattamente quello che stavo cercando !!!!!! Questo è molto utile

Grazie mille !!!!!!

innggo
8. 7. 2023 12:30

Molto interessante. Grazie Mark!

Messaggi correlati