Masowo zmieniaj nazwy wszystkich strategii w bazie danych za pomocą reguł znajdź i zamień. Idealne narzędzie do porządkowania konwencji nazewnictwa, usuwania prefiksów/sufiksów i standaryzacji nazw strategii w całej bibliotece.
Idealne rozwiązanie, jeśli chcesz szybko nadać przejrzyste, czytelne nazwy strategiom w całej bazie danych – ten fragment kodu Custom Analysis pozwala na zbiorczą zmianę nazw strategii w StrategyQuant X za pomocą prostej operacji znajdź → zamień (lub znajdź → usuń).
— Co robi
Działa jako Custom Analysis (analiza całej bazy danych).
Parametry wejściowe przyjmują find=>replace or just find to remove.
Zmienia nazwy bezpośrednio w miejscu w wybranej bazie źródłowej.
Dosłowne dopasowanie z uwzględnieniem wielkości liter. Obsługuje \n, \t, \r.
Doskonałe do masowego porządkowania: usuwania prefiksów/sufiksów, wycinania słów oraz standaryzacji symboli/interwałów/kierunków.
— Jak zainstalować
Code Editor → New → Custom Analysis, nazwij plik CARenameFindReplace
Wklej kod (poniżej) i kliknij Compile.
W razie potrzeby zrestartuj SQX.
— Instrukcja użycia
Custom Project → Task → Custom Analysis. (Można go również uruchomić wewnątrz databanku z poziomu Databank > Tools > Run CA).
W sekcji Full databank analysis wybierz CARenameFindReplace i wskaż swój databank Source.
W polu Input args wprowadź jedną z opcji:
-
Zastąp: old=>new
Usuń: old
-
Włącz opcję „Filter by results of custom analysis”, aby zmienić nazwy oryginalnych strategii. (Jeśli ją wyłączysz, strategie zostaną zduplikowane i tylko duplikaty zmienią nazwę, pozostawiając oryginały bez zmian).
Kliknij Run. Wszystkie nazwy strategii w źródłowym databanku zostaną zaktualizowane.
— Przykłady
Usuń słowo „Strategy ” (ze spacją na końcu):
Strategy =>
Konwertuj automatyczną nazwę SQX na sformatowaną etykietę:
Strategy =>XAUUSD_H1_L_
Usuń kropki po przejściu dodawania prefiksu:
.=>
Wskazówka: Wykonaj wiele przejść w celu wieloetapowego formatowania (np. dodaj prefiks, potem usuń znaki, a następnie dodaj sufiks). Rozważ wcześniejsze zduplikowanie bazy danych, jeśli chcesz mieć możliwość łatwego przywrócenia zmian.
Kod:
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");
}
}
Bezpłatne
Pliki
Snippet-BatchRenameStrategies.sqm5 KBZablokowane
Pobieranie odblokuje się po zakupie lub z aktywnym poziomem członkostwa.