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:
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

Era esattamente quello che stavo cercando !!!!!! Questo è molto utile
Grazie mille !!!!!!
Molto interessante. Grazie Mark!
non è più compatibile con la 143, spero che si possa ottenere un aggiornamento per questa estensione.
corrompe i dati di stoploss nella strategia. È possibile aggiornarla per renderla compatibile con la versione 143+?
grazie per il feedback, lo controlleremo