Documentação
Aplicações
Última atualização em 21. 1. 2022 por Mark Fric
Visualização e mudança de parâmetros estratégicos - versão 2
Esta é uma versão melhorada deste exemplo: https://strategyquant.com/doc/programming-for-sq/changing-strategy-parameters-programmatically/
O original EstratégiaParametersHelper A classe tinha apenas um método para alterar os valores dos parâmetros, mas não foi fácil obter a lista de parâmetros reais que a estratégia tem.
Então criamos uma nova versão - EstratégiaParametersHelperV2 classe, que também tem métodos para obter a lista de parâmetros e seus valores.
Ambas as classes estão disponíveis para download como anexos a este artigo.
Nota! Por causa de um pequeno problema no SQ você tem que primeiro importar e compilar o EstratégiaParametersHelperV2 classe, e somente após a importação e compilação do StrategyParameters classe.
Esta questão será resolvida no próximo SQ Build 136.
EstratégiaParametersHelperV2 tem estes métodos:
-
setParameters() - define (modifica) os parâmetros
-
getParameterNames() - retorna uma lista de nomes de parâmetros
-
getParameterValues() - retorna uma lista de nomes e valores de parâmetros
-
toString() - converte a lista de parâmetros do método anterior para uma cadeia legível
Podemos ver como ele pode ser usado no exemplo de um trecho do banco de dados:
pacote SQ.Colunas.Bancos de dados; importação SQ.Utils.StrategyParametersHelperV2; import com.strategyquant.lib.L; import com.strategyquant.tradinglib.*; import com.strategyquant.tradinglib.optimization.WalkForwardMatrixResult; import com.strategyquant.lib.ValuesMap; classe pública StrategyParameters extends DatabankColumn { Parâmetros de estratégia pública() { super(L.tsq("Parâmetros de Estratégia"), DatabankColumn.Text, ValueTypes.Maximize, 0, 0, 1); setWidth(200); } //------------------------------------------------------------------------ @Override público duplo getNumericValue(ResultadosResultadosResultados do grupo, String resultKey, byte direction, byte plType, byte sampleType) lança Exceção { retornar 0; } //------------------------------------------------------------------------ @Override public String getValue(ResultadosResultadosResultados do grupo, resultado da StringKey, direção do byte, byte plType, byte sampleType) lança Exceção { tente { ValoresParâmetroMapaTipos = novos ValoresMapa(); parameterTypes.set(ParametrizationTypes.ParamTypePeriod, true); parâmetroTypes.set(ParametrizationTypes.ParamTypeShift, falso); parameterTypes.set(ParametrizationTypes.ParamTypeConstant, false); parameterTypes.set(ParametrizationTypes.ParametrizationTypes.ParamTypeOtherParam, false); parameterTypes.set(ParametrizationTypes.ParamTypeEntryLevel, true); parâmetroTypes.set(ParametrizationTypes.ParamTypeEntryLogic, false); parameterTypes.set(ParametrizationTypes.ParamTypeExitUsed, true); parameterTypes.set(ParametrizationTypes.ParamTypeExitUnused, false); parameterTypes.set(ParametrizationTypes.ParamTypeBoolean, false); parameterTypes.set(ParametrizationTypes.ParametrizationTypeTradingOptions, false); boolean sameVariablesForLongShort = true; return StrategyParametersHelperV2.toString(StrategyParametersHelperV2.getParameterValues(results, parameterTypes, sameVariablesForLongShort)); catch(Exceção e) } catch(Exceção e) { retornar "Erro": " + e.getMessage(); } } }
Você pode ver que usamos o método helper para obter parâmetros e depois convertê-los em string.
O resultado (nova coluna de banco de dados) terá o seguinte aspecto - listará os parâmetros especificados de determinada estratégia:
Observe que você pode definir quais tipos de parâmetros deseja ver, e também se deseja usar a mesma variável para os lados longo e curto - o mesmo que você pode fazer no Optimizer ou em outros ajustes de parâmetros.
O código completo de EstratégiaParametersHelperV2 classe é:
pacote SQ.Utils; import com.strategyquant.datalib.datalib.TradingException; import com.strategyquant.lib.SQTime; import com.strategyquant.lib.ValuesMap; importar com.strategyquant.lib.XMLUtil; importar com.strategyquant.tradinglib.*; importar com.strategyquant.tradinglib.options.TradingOptionsList; importar com.strategyquant.tradinglib.propertygrid.IPGParameter; import com.strategyquant.tradinglib.propertygrid.ParametersTableItemProperties; import org.jdom2.Element; importação org.slf4j.Logger; importação org.slf4j.LoggerFactory; importação java.util.ArrayList; importação de java.util.HashMap; importação java.util.List; importação de java.util.map; classe pública StrategyParametersHelperV2 { logger final estático público = LoggerFactory.getLogger(StrategyParametersHelper.class); valor final estático público String ValueDelimiter = "="; public static final String ParamDelimiter = ",","; /** * Aplica valores de parâmetros na estratégia * @param rg * @param parameters - lista de parâmetros delimitada por dois pontos e seus valores - por exemplo param1=123,param2=25,4 * @param symmetricVariables * @param modifyLastSettings * @throws Exceção */ conjunto de parâmetros estáticos públicosParâmetros estáticos(ResultadosParâmetros de grupo, String, boolean symmetricVariables, boolean modifyLastSettings) lança Exceção { //Load XML e atualizar variáveis StrategyBase StrategyBase = getStrategyBase(rg, symmetricVariables); Variáveis variáveis = strategyBase.variables(); String[] params = parameters.split(ParamDelimiter); HashMap paramMap = novo HashMap(); for(int i=0; i<params.length; i++) { String[] values = params[i].split(ValueDelimiter); paramMap.put(valores[0], valores[1]); } for(int a=0; a<variables.size(); a++) { Variable variable = variables.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, parâmetros); if(modificarLastSettings){ tente { Elemento LastSettings = XMLUtil.stringToElement(rg.getLastSettings())); Element elParams = lastSettings.getChild("Options").getChild("BuildTradingOptions").getChild("Params"); Lista paramElems = elParams.getChildren("Param"); ListaOpções Comerciais = TradingOptionsList.getInstance().getAvailableClasses(); for(String paramName : paramMap.keySet()) { processado booleano = falso; // devemos encontrar a opção comercial correta for(int i=0; i<tradingOptions.size(); i++) { se(processado) quebra; Opção TradingOption = tradingOptions.get(i); String optionClass = option.getClass().getSimpleName(); ArrayList optionParams = option.getParams(); // passar por seus paramédicos e encontrar aquele com o nome correspondente for(int z=0; z<optionParams.size(); z++) { se(processado) quebra; IPGParameter optionParameter = optionParams.get(z); String paramKey = optionParam.getKey(); if(!optionParam.getName().equals(paramName)) continua; //agenda encontrar o elemento de parâmetro correto nas configurações XML e atualizar seu valor for(int s=0; s<paramElems.size(); s++) { Element elParam = paramElems.get(s); String elParamClass = elParam.getAttributeValue("className"); String elParamKey = elParam.getAttributeValue("chave"); if(elParamClass != null && elParamKey != null && elParamClass.equals(optionClass) && elParamKey.equals(paramKey)) { String value = paramMap.get(paramName); if(optionParam.getType() == ParametrosTableItemProperties.TYPE_TIME) { valor = "" + SQTime.HHMMToMinutes(Integer.parseInt(valor)) * 60; } elParam.setText(valor); processado = verdadeiro; pausa; } } } } } rg.setLastSettings(XMLUtil.elementToString(lastSettings)); } catch(Exceção e){ Log.error("Não é possível aplicar parâmetros de opções comerciais às últimas configurações", e); } } } /** * Retorna uma lista de nomes de parâmetros estratégicos * @param rg * @param parameterTypes * @param symmetricVariables * @retorno * @throws Exceção */ public static ArrayList getParameterNames(ResultsGroup rg, ValuesMap parameterTypes, boolean symmetricVariables) throws Exception { HashMap paramsMap = getParameterValues(rg, parâmetroTypes, symmetricVariables); ArrayList lista = nova ArrayList(); list.addAll(paramsMap.keySet()); lista de retorno; } /** * Devolve um mapa contendo nomes e valores de parâmetros estratégicos * @param rg * @param parameterTypes - ValuesMap especificando ParametrizationTypes para verificar. Se nulos, os tipos de parâmetros recomendados são usados. * @param symmetricVariables * @retorno * @throws Exceção */ public static HashMap getParameterValues(ResultsGroup rg, ValuesMap parameterTypes, boolean symmetricVariables) throws Exception { StrategyBase StrategyBase = getStrategyBase(rg, symmetricVariables); Variáveis variáveis = strategyBase.variables(); HashMap paramsList = novo HashMap(); boolean useRecommended = parâmetroTypes == null || parameterTypes.getBoolean(ParametrizationTypes.ParamTypeRecommended, false); if(useRecomendado){ parâmetroTipos = novos valoresMapa(); parâmetroTypes.set(ParametrizaçãoTypes.ParamTypePeriod, verdadeiro); parâmetroTypes.set(ParametrizationTypes.ParamTypeEntryLevel, verdadeiro); parameterTypes.set(ParametrizationTypes.ParamTypeExitUsed, true); } for(int a=0; a<variables.size(); a++) { Variable variable = variables.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")) { // saltar parâmetros que não precisam ser definidos aqui continuar; } if(variableType == nulo || parameterTypes.getBoolean(variableType, false)){ paramsList.put(variável.getName(), variável.getValue())); } } devolver paramsList; } /** * Retorna um valor de parâmetro selecionado * @param rg * @param symmetricVariables * @param parameterName * @retorno * @throws Exceção */ public static String getParameterValue(ResultsGroup rg, boolean symmetricVariables, String parameterName) lança Exceção { StrategyBase StrategyBase = getStrategyBase(rg, symmetricVariables); Variáveis variáveis = strategyBase.variables(); Variable variable = variables.get(parâmetroNome); if(variável == nulo) retorna nulo; variável.getValue(); } /** * Converte o mapa de parâmetros em cadeia * @param parametersMap * @retorno */ public static String toString(HashMap parametersMap){ if(parametersMap == nulo) retorna nulo; StringBuilder sb = novo StringBuilder(); for(String name : parametersMap.keySet()){ sb.append(ParamDelimiter); sb.append(nome); sb.append(ValueDelimiter); sb.append(parametersMap.get(name)); } retornar sb.length() > ParamDelimiter.length() ? sb.substring(ParamDelimiter.length()) : sb.toString(); } private static StrategyBase getStrategyBase(ResultsGroup rg, boolean symmetricVariables) lança Exceção { StrategyBase xmlS = StrategyBase.createXmlStrategy(rg.getStrategyXml()); xmlS.transformToVariables(symmetricVariables); retornar xmlS; } }
Este artigo foi útil? O artigo foi útil O artigo não foi útil
Era exatamente o que eu estava procurando !!!!!! Isto é muito útil
Muito obrigado !!!!!!
Muito interessante. Obrigado, Mark!