Benennen Sie alle Strategien in einer Datenbank mithilfe von Suchen & Ersetzen-Mustern im Batch um. Ideal zum Bereinigen von Namenskonventionen, Entfernen von Präfixen/Suffixen und Standardisieren von Strategienamen in Ihrer gesamten Bibliothek.
Ideal, wenn Sie schnell saubere, aussagekräftige Namen für eine gesamte Datenbank erstellen möchten – mit diesem Custom Analysis-Snippet können Sie Strategien in StrategyQuant X per einfachem Suchen → Ersetzen (oder Suchen → Entfernen) im Batch umbenennen.
— Was es macht
Läuft als Custom Analysis (Full databank analysis).
Input args akzeptiert find=>replace or just find to remove.
Benennt direkt vor Ort in der ausgewählten Source-Datenbank um.
Exakte Übereinstimmung unter Berücksichtigung von Groß-/Kleinschreibung. Unterstützt \n, \t, \r.
Hervorragend für Massenbereinigungen: Präfixe/Suffixe kürzen, Wörter entfernen, Symbole/Timeframes/Richtungen vereinheitlichen.
— Installation
Code Editor → New → Custom Analysis, nennen Sie die Datei CARenameFindReplace
Fügen Sie den Code (unten) ein und klicken Sie auf Compile.
Starten Sie SQX bei Bedarf neu.
— Verwendung
Custom Project → Task → Custom Analysis. (Kann auch innerhalb einer Datenbank über Databank > Tools > Run CA ausgeführt werden).
Wählen Sie in Full databank analysisCARenameFindReplace aus und bestimmen Sie Ihre Source-Datenbank.
Geben Sie in Input args eines der folgenden Formate ein:
-
Ersetzen: old=>new
Entfernen: old
-
Aktivieren Sie 'Filter by results of custom analysis', um die ursprünglichen Strategien umzubenennen. (Wenn Sie dies deaktivieren, werden die Strategien dupliziert und nur die Duplikate umbenannt, während die Originale unverändert bleiben.)
Ausführen. Alle Strategienamen in der Source-Datenbank werden aktualisiert.
— Beispiele
Das Wort „Strategy “ (mit nachgestelltem Leerzeichen) entfernen:
Strategy =>
Den SQX-Auto-Namen in eine formatierte Bezeichnung umwandeln:
Strategy =>XAUUSD_H1_L_
Punkte nach einem Präfix-Durchlauf entfernen:
.=>
Tipp: Führen Sie mehrere Durchläufe für eine mehrstufige Formatierung aus (z. B. Präfix hinzufügen, dann Zeichen entfernen, dann Suffix hinzufügen). Duplizieren Sie die Datenbank am besten vorher, wenn Sie ein einfaches Rollback wünschen.
Code:
package SQ.CustomAnalysis;
import com.strategyquant.tradinglib.*;
import com.strategyquant.tradinglib.project.ProjectEngine;
import com.strategyquant.tradinglib.project.SQProject;
import java.util.ArrayList;
import java.util.HashSet;
public class CARenameFindReplace extends CustomAnalysisMethod {
public CARenameFindReplace() {
super("CARenameFindReplace", TYPE_PROCESS_DATABANK);
}
@Override
public boolean filterStrategy(String project, String task, String databankName, ResultsGroup rg) throws Exception {
return true;
}
@Override
public ArrayList processDatabank(
String project,
String task,
String databankName,
ArrayList databankRG) throws Exception {
// Read single Input args string
String raw = getInputArgs();
if (raw == null) raw = "";
raw = raw.trim();
// No args -> do nothing
if (raw.isEmpty()) {
return databankRG;
}
// Parse: "find=>replace" OR just "find" (remove)
String find, repl;
int arrow = raw.indexOf("=>");
if (arrow >= 0) {
find = raw.substring(0, arrow);
repl = raw.substring(arrow + 2);
} else {
find = raw;
repl = "";
}
find = unescape(find);
repl = unescape(repl);
// If find is empty, do nothing (prevents accidental rename-all)
if (find.isEmpty()) {
return databankRG;
}
SQProject prj = ProjectEngine.get(project);
Databank db = prj.getDatabanks().get(databankName);
// Snapshot of originals to avoid ConcurrentModificationException
ArrayList snapshot = new ArrayList<>(databankRG);
// Track existing names so we can avoid collisions if needed
HashSet usedNames = new HashSet<>();
for (ResultsGroup rg : snapshot) {
if (rg.getName() != null) usedNames.add(rg.getName());
}
// 1) Create renamed clones (no db.add inside the iteration)
ArrayList clonesToAdd = new ArrayList<>();
for (ResultsGroup rg : snapshot) {
String oldName = rg.getName();
if (oldName == null) continue;
String newName = oldName.replace(find, repl);
// Only duplicate if name changes
if (!newName.equals(oldName)) {
// Avoid exact-name collisions (optional safety)
String finalName = makeUniqueName(newName, usedNames);
ResultsGroup newRg = rg.clone();
newRg.setName(finalName);
clonesToAdd.add(newRg);
usedNames.add(finalName);
}
}
// 2) Add clones after iteration (safe)
for (ResultsGroup newRg : clonesToAdd) {
db.add(newRg, true);
}
// Return the newly created strategies (mirrors SQX RenameStrategies behaviour)
return clonesToAdd;
}
private static String makeUniqueName(String baseName, HashSet used) {
if (!used.contains(baseName)) return baseName;
int i = 2;
while (true) {
String candidate = baseName + "_" + i;
if (!used.contains(candidate)) return candidate;
i++;
}
}
private static String unescape(String s) {
if (s == null) return "";
return s.replace("\\n", "\n")
.replace("\\t", "\t")
.replace("\\r", "\r");
}
}
Kostenlos
Dateien
Snippet-BatchRenameStrategies.sqm5 KBGesperrt
Der Download wird nach dem Kauf oder mit einem aktiven Tier freigeschaltet.