pacchetto SQ.CustomAnalysis;
import com.strategyquant.tradinglib.CustomAnalysisMethod;
import com.strategyquant.tradinglib.CustomAnalysisMethod.SettingType;
importare com.strategyquant.tradinglib.ResultsGroup;
importare com.strategyquant.lib.app.MainApp;
importare javax.script.ScriptEngine;
importare javax.script.ScriptEngineManager;
importare javax.script.ScriptContext;
importare javax.script.SimpleScriptContext;
importare java.io.FileReader;
importare java.io.StringWriter;
/**
* CAJythonScript
*
* Esegue uno script Python esterno (tramite Jython) e ne memorizza lo stdout.
* negli specialValues del gruppo ResultsGroup sotto la chiave "PythonOutput".
*/
public class CAJythonScript extends CustomAnalysisMethod {
public CAJythonScript() {
// TYPE_FILTER_STRATEGY significa che viene eseguito nella fase "Strategie di filtraggio".
super("CAJythonScript", TYPE_FILTER_STRATEGY);
// Esempio di aggiunta di un'impostazione per la cartella degli script Python (opzionale)
addSetting("PythonFolder", SettingType.String, "python",
"Percorso relativo sotto user/ dove si trovano i file .py");
}
@Override
pubblico booleano filterStrategy(
Progetto stringa,
Compito di stringa,
Stringa databankName,
Gruppo di risultati rg
) lancia un'eccezione {
// Percorso di costruzione dello script Python
String pythonFolder = getSettingAsString("PythonFolder");
String basePath = MainApp.getDataPath() + pythonFolder + MainApp.getFS() ;
String scriptPath = basePath + "sqpython.py";
// Preparare il motore Jython con la sua cattura di stdout
ScriptEngineManager mgr = new ScriptEngineManager();
ScriptEngine engine = mgr.getEngineByName("jython");
// Se il proprio .py importa moduli locali in user/python/, aggiungerlo a sys.path
engine.eval("import sys; sys.path.insert(0, r\" + basePath + "\")");
// Cattura tutto ciò che lo script Python stampa
StringWriter writer = new StringWriter();
ScriptContext ctx = new SimpleScriptContext();
ctx.setWriter(writer);
// Eseguire lo script Python
engine.eval(new FileReader(scriptPath), ctx);
// Catturare e tagliare l'output
String pythonOutput = writer.toString().trim();
// Memorizzarlo nel gruppo dei risultati per un uso successivo
rg.specialValues().set("PythonOutput", pythonOutput);
// Restituisce sempre true, in modo che questa CustomAnalysis non cada nelle strategie.
restituire true;
}
}
Errori delle librerie. Questa è la seconda parte che accede all'altra classe
pacchetto SQ.CustomAnalysis;
import com.strategyquant.tradinglib.CustomAnalysisMethod;
importare com.strategyquant.tradinglib.ResultsGroup;
importare com.strategyquant.lib.app.MainApp;
importare javax.script.ScriptEngine;
importare javax.script.ScriptEngineManager;
importare javax.script.ScriptContext;
importare javax.script.SimpleScriptContext;
importare java.io.FileReader;
importare java.io.StringWriter;
public class CAJythonScript extends CustomAnalysisMethod {
public CAJythonScript() {
super("CAJythonScript", TYPE_FILTER_STRATEGY);
}
@Override
pubblico booleano filterStrategy(
Progetto stringa,
Compito di stringa,
Stringa databankName,
Gruppo di risultati rg
) lancia un'eccezione {
// preparare un writer per catturare lo stdout di Python
StringWriter writer = new StringWriter();
ScriptContext ctx = new SimpleScriptContext();
ctx.setWriter(writer);
// ottenere il motore Jython ed eseguire lo script
ScriptEngineManager mgr = new ScriptEngineManager();
ScriptEngine engine = mgr.getEngineByName("jython");
// si suppone che sqpython.py si trovi nella cartella dei dati di SQ
String script = MainApp.getDataPath() + "sqpython.py";
engine.eval(new FileReader(script), ctx);
// cattura qualsiasi cosa Python abbia stampato
String pythonOut = writer.toString().trim();
// la memorizza nella mappa specialValues del risultato
rg.specialValues().set("PythonOutput", pythonOut);
// restituisce sempre true, in modo che il filtraggio non faccia cadere le strategie.
restituire true;
}
}