package 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
*
* Exécute un script Python externe (via Jython) et stocke sa sortie standard (stdout).
* dans les valeurs spéciales du ResultsGroup sous la clé "PythonOutput".
*/
public class CAJythonScript extends CustomAnalysisMethod {
public CAJythonScript() {
// TYPE_FILTER_STRATEGY signifie qu'il est exécuté dans l'étape "Stratégies de filtrage".
super("CAJythonScript", TYPE_FILTER_STRATEGY) ;
// Exemple d'ajout d'un paramètre pour le dossier des scripts Python (facultatif)
addSetting("PythonFolder", SettingType.String, "python",
"Chemin relatif sous user/ où se trouvent vos fichiers .py") ;
}
@Override
public boolean filterStrategy(
Projet de cordes,
Tâche en chaîne,
Chaîne Nom de la banque de données,
Groupe de résultats rg
) jette l'exception {
// Chemin d'accès à votre script Python
String pythonFolder = getSettingAsString("PythonFolder") ;
String basePath = MainApp.getDataPath() + pythonFolder + MainApp.getFS() ;
String scriptPath = basePath + "sqpython.py" ;
// Préparer le moteur Jython avec sa propre capture stdout
ScriptEngineManager mgr = new ScriptEngineManager() ;
ScriptEngine engine = mgr.getEngineByName("jython") ;
// Si votre .py importe des modules locaux dans user/python/, ajoutez-le à sys.path
engine.eval("import sys ; sys.path.insert(0, r\" + basePath + "\")") ;
// Capture de tout ce que le script Python imprime
StringWriter writer = new StringWriter() ;
ScriptContext ctx = nouveau SimpleScriptContext() ;
ctx.setWriter(writer) ;
// Exécuter le script Python
engine.eval(new FileReader(scriptPath), ctx) ;
// Saisir et découper la sortie
String pythonOutput = writer.toString().trim() ;
// Le stocker dans le ResultsGroup pour une utilisation ultérieure
rg.specialValues().set("PythonOutput", pythonOutput) ;
// Retourne toujours true pour que cette CustomAnalysis n'abandonne pas les stratégies
retourner vrai ;
}
}
J'obtiens des erreurs de bibliothèques. C'est la 2ème partie qui accède à l'autre classe
package 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 CustomAnalysisMethod {
public CAJythonScript() {
super("CAJythonScript", TYPE_FILTER_STRATEGY) ;
}
@Override
public boolean filterStrategy(
Projet de cordes,
Tâche en chaîne,
Chaîne Nom de la banque de données,
Groupe de résultats rg
) jette l'exception {
// préparer un rédacteur pour capturer le stdout de Python
StringWriter writer = new StringWriter() ;
ScriptContext ctx = nouveau SimpleScriptContext() ;
ctx.setWriter(writer) ;
// utiliser le moteur Jython et exécuter votre script
ScriptEngineManager mgr = new ScriptEngineManager() ;
ScriptEngine engine = mgr.getEngineByName("jython") ;
// suppose que sqpython.py se trouve dans votre dossier de données SQ
String script = MainApp.getDataPath() + "sqpython.py" ;
engine.eval(new FileReader(script), ctx) ;
// récupérer ce que Python a imprimé
String pythonOut = writer.toString().trim() ;
// le cacher dans la carte specialValues du résultat
rg.specialValues().set("PythonOutput", pythonOut) ;
// renvoie toujours true pour que le filtrage n'annule pas vos stratégies
retourner vrai ;
}
}