paquete SQ.CustomAnalysis;
import com.strategyquant.tradinglib.CustomAnalysisMethod;
import com.strategyquant.tradinglib.CustomAnalysisMethod.SettingType;
import com.strategyquant.tradinglib.ResultsGroup;
import com.strategyquant.lib.app.MainApp;
import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import javax.script.ScriptContext;
import javax.script.SimpleScriptContext;
import java.io.FileReader;
import java.io.StringWriter;
/**
* CAJythonScript
*
* Ejecuta un script Python externo (a través de Jython) y almacena su stdout.
* en el ResultsGroup's specialValues bajo la clave "PythonOutput".
*/
public class CAJythonScript extends MétodoDeAnálisisPersonalizado {
public CAJythonScript() {
// TYPE_FILTER_STRATEGY significa que se ejecuta en el paso "Estrategias de filtrado
super("CAJythonScript", TYPE_FILTER_STRATEGY);
// Ejemplo de añadir una configuración para la carpeta de scripts de Python (opcional)
addSetting("PythonFolder", SettingType.String, "python",
"Ruta relativa bajo usuario/ donde viven sus archivos .py");
}
@Override
public boolean filtroEstrategia(
Proyecto de cuerdas,
Tarea de cadena,
Cadena databankName,
Grupo de resultados rg
) lanza Excepción {
// Ruta de construcción de su script Python
String pythonFolder = getSettingAsString("PythonFolder");
String basePath = MainApp.getDataPath() + pythonFolder + MainApp.getFS() ;
String scriptPath = basePath + "sqpython.py";
// Preparar el motor Jython con su propia captura stdout
ScriptEngineManager mgr = new ScriptEngineManager();
ScriptEngine engine = mgr.getEngineByName("jython");
// Si su .py importa módulos locales en user/python/, añádalo a sys.path
engine.eval("import sys; sys.path.insert(0, r\"" + basePath + "\")");
// Capturar todo lo que imprime el script Python
StringWriter writer = new StringWriter();
ScriptContext ctx = nuevo SimpleScriptContext();
ctx.setWriter(escritor);
// Ejecutar el script Python
engine.eval(new FileReader(scriptPath), ctx);
// Agarra y recorta la salida
Cadena pythonOutput = writer.toString().trim();
// Almacenarlo en el ResultsGroup para su uso posterior
rg.specialValues().set("PythonOutput", pythonOutput);
// Devuelve siempre true para que este CustomAnalysis no deje caer estrategias
devuelve true;
}
}
Obteniendo errores de bibliotecas. Esa es la segunda parte que accede a la otra clase
paquete SQ.CustomAnalysis;
import com.strategyquant.tradinglib.CustomAnalysisMethod;
import com.strategyquant.tradinglib.ResultsGroup;
import com.strategyquant.lib.app.MainApp;
import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import javax.script.ScriptContext;
import javax.script.SimpleScriptContext;
import java.io.FileReader;
import java.io.StringWriter;
public class CAJythonScript extends MétodoDeAnálisisPersonalizado {
public CAJythonScript() {
super("CAJythonScript", TYPE_FILTER_STRATEGY);
}
@Override
public boolean filtroEstrategia(
Proyecto de cuerdas,
Tarea de cadena,
Cadena databankName,
Grupo de resultados rg
) lanza Excepción {
// preparar un escritor para capturar stdout de Python
StringWriter writer = new StringWriter();
ScriptContext ctx = nuevo SimpleScriptContext();
ctx.setWriter(escritor);
// obtenga el motor Jython y ejecute su script
ScriptEngineManager mgr = new ScriptEngineManager();
ScriptEngine engine = mgr.getEngineByName("jython");
// asume que sqpython.py vive en tu carpeta de datos SQ
String script = MainApp.getDataPath() + "sqpython.py";
engine.eval(new FileReader(script), ctx);
// coger lo que imprima Python
Cadena pythonOut = writer.toString().trim();
// guardarlo en el mapa specialValues del resultado
rg.specialValues().set("PythonOutput", pythonOut);
// devuelve siempre true para que el filtrado no elimine tus estrategias
devuelve true;
}
}