Documentação
Aplicações
Última atualização em 22. 12. 2021 por Mark Fric
Reconhecendo resultados na Matriz WF em torno do campo personalizado
O pedido original:
existe uma maneira de escolher uma célula específica no WFM que um certo número de células de substituição tem que ter Pass?
ou seja, quero ter um WFM aprovado, se 4 células que se sobrepuserem às 10 corridas e a célula 20%OOS tiverem um resultado aprovado. Não quero que o SQX escolha a melhor célula de acordo com os resultados ao redor, mas quero definir qual célula eu preciso para ter células passadas ao redor.
Sim, é possível, a maneira mais fácil de fazê-lo é usando o snippet de Análise Personalizada que pode ser iniciado logo após a otimização.
Código de snippet comentado da CustomAnalysis:
pacote SQ.CustomAnalysis;
importação org.slf4j.Logger;
importação org.slf4j.LoggerFactory;
import com.strategyquant.tradinglib.*;
import com.strategyquant.tradinglib.optimization.WalkForwardMatrixResult;
classe pública CAWFMCheck estende o método CustomAnalysisMethod {
logger final estático público = LoggerFactory.getLogger("CAWFMCheck");
//------------------------------------------------------------------------
//------------------------------------------------------------------------
//------------------------------------------------------------------------
público CAWFMCheck() {
super("CA WFM check", TYPE_FILTER_STRATEGY);
}
//------------------------------------------------------------------------
@Override
filtro booleano públicoEstratégia(projeto String, tarefa String, banco de dados StringName, ResultsGroup rg) lança Exceção {
// quantos vizinhos devem passar para que a WF Matrix passe?
int neighboursToPass = 3;
// encontrar o resultado WF desejado na estratégia ResultsGroup - em nosso caso 10 Runs e 20% OOS
WalkForwardResult wfResult;
tente {
wfResult = findWFResult(rg, 20, 10); // 10 Runs e 20%OOS
catch(Exceção e) } catch(Exceção e) {
Log.info("WFResultado não encontrado: "+ e.getMessage());
retornar verdadeiro;
}
// criar a matriz WFM como matriz bidimensional
WalkForwardMatrixResult wfm = (WalkForwardMatrixResult) rg.mainResult().get(SettingsKeys.WalkForwardResult);
WalkForwardResult[][] wfMatrix = createMatrix(wfm);
int matrixRows = wfMatrix.length;
int matrixColumns = wfMatrix[0].length;
// agora passe por esta matriz bidimensional e procure por vizinhos de nosso resultado WF escolhido
for(int rowIndex=0; rowIndex<matrixRows; rowIndex++) {
for(int colIndex=0; colIndex<matrixColumns; colIndex++) {
if(wfMatrix[rowIndex][colIndex].param1 == wfResult.param1 && wfMatrix[rowIndex][colIndex].param2 == wfResult.param2) {
//WF posição do resultado encontrado na matriz, verificar vizinhos
int neighboursPassed = 0;
int neighboursChecked = 0;
for(int neighbourRowIndex=rowIndex-1; neighbourRowIndex<=rowIndex+1; neighbourRowIndex++) {
if(neighbourRowIndex=matrixRows) {
continuar;
}
for(int neighbourColIndex=colIndex-1; neighbourColIndex<=colIndex+1; neighbourColIndex++) {
if(neighborColIndex=matrixColumns) {
continuar;
}
if(neighbourRowIndex==rowIndex && neighbourColIndex==colIndex) {
continuar;
}
WalkForwardResultado wfResultadoNeighbour = wfMatrix[neighborRowIndex][neighborColIndex];
if(wfResultNeighbour.pass) {
vizinhosPassed+++;
}
vizinhosChecked+++;
}
}
Log.info(String.format("Neighbours checked %d / passed %d", neighboursChecked, neighboursPassed));
// encontrou o resultado da WF, passou por vizinhos verificados. Comparar com o valor limiar
return neighboursPassed >= neighboursToPass;
}
}
}
retornar falso;
}
//------------------------------------------------------------------------
private WalkForwardResult FindWFResult(ResultsGroup rg, int param1, int param2) lança Exceção {
WalkForwardMatrixResult wfm = (WalkForwardMatrixResult) rg.mainResult().get(SettingsKeys.WalkForwardResult);
if(wfm==nulo) {
lançar nova Exceção ("WFMatrixResultado não encontrado");
}
return wfm.getWFResult(param1, param2);
}
//------------------------------------------------------------------------
private WalkForwardResult[][] createMatrix(WalkForwardMatrixResult wfm) throws Exception {
int filas = 0;
colunas int = 0;
for(int j=wfm.start2; j<=wfm.stop2; j+=wfm.increment2) filas+++;
for(int i=wfm.start1; i<=wfm.stop1; i+=wfm.increment1) colunas+++;
WalkForwardResult[][] wfMatrix = novo WalkForwardResult[filas][colunas];
int param1Index = 0;
int param2Index = 0;
for(int j=wfm.start2; j<=wfm.stop2; j+=wfm.increment2) {
for(int i=wfm.start1; i<=wfm.stop1; i+=wfm.increment1) {
WalkForwardResult wfResult = wfm.getWFResult(i, j);
wfMatrix[param2Index][param1Index] = wfResultado;
param1Index++;
}
param2Index++;
param1Index=0;
}
retornar wfMatrix;
}
}
Este artigo foi útil? O artigo foi útil O artigo não foi útil
excelente! obrigado