Estrategias de cambio de nombre con Batch Find & Replace - Análisis personalizado
Este fragmento de análisis personalizado es ideal si desea crear rápidamente nombres claros e informativos para toda una base de datos, ya que le permite renombrar estrategias por lotes en StrategyQuant X mediante la sencilla función buscar → reemplazar (o simplemente buscar → eliminar).
- Para qué sirve
-
Funciona como Análisis personalizado (Análisis completo del banco de datos).
-
Argumentos de entrada acepta
find=>replace o simplementefind para eliminar. -
Cambia el nombre de en su sitio en el banco de datos Fuente seleccionado.
-
Literal, distingue entre mayúsculas y minúsculas partido. Admite
\n,t,r. -
Ideal para la limpieza masiva: recortar prefijos/sufijos, eliminar palabras, normalizar símbolos/plazos/direcciones.
- Cómo instalar
- Editor de código → Nuevo → Análisis personalizadonombre del archivo
CARenameFindReplace - Pega el código (abajo) y Compile.
- Si es necesario, reinicie SQX.
- Cómo utilizarlo
- Personalizado Project → Tarea → Análisis personalizado. (También se puede ejecutar dentro de un banco de datos desde Banco de datos > Herramientas > Ejecutar CA).
- En Análisis completo de la base de datosseleccione CARenameFindReplace y elija su Fuente banco de datos.
- En Argumentos de entrada introduzca uno de:
-
Sustituir: antiguo=>nuevo
Eliminar: antiguo
- - Active 'Filtrar por resultados de análisis personalizados' para renombrar las estrategias originales. (Si lo desactiva, las estrategias se duplicarán y solo se renombrarán los duplicados, dejando intactos los originales).
- Ejecutar. Se actualizan todos los nombres de estrategias de la base de datos Fuente.
- Ejemplos
- Suprima la palabra "Estrategia " (con espacio al final):
Estrategia => - Convierte el nombre automático SQX en una etiqueta formateada:
Estrategia =>XAUUSD_H1_L_ - Eliminar los puntos después de una pasada de prefijo:
.=>
Consejo: Ejecute varias pasadas para formatear en varios pasos (por ejemplo, añada un prefijo, luego elimine caracteres, luego añada un sufijo). Considere la posibilidad de duplicar primero el banco de datos si desea deshacerlo fácilmente.
Código:
paquete 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 procesarBancoDeDatos(
String proyecto,
String tarea,
String databankName,
ArrayList databankRG) lanza Excepción {
// Leer una única cadena InputArgs
String raw = getInputArgs();
if (raw == null) raw = "";
raw = raw.trim();
// Sin argumentos -> no hacer nada
if (raw.isEmpty()) {
return databankRG;
}
// Parse: "find=>replace" O simplemente "find" (eliminar)
Cadena find, repl;
int flecha = raw.indexOf("=>");
if (flecha >= 0) {
find = raw.substring(0, flecha);
repl = raw.substring(flecha + 2);
} else {
find = raw;
repl = "";
}
find = unescape(find);
repl = unescape(repl);
// Si find está vacío, no hacer nada (previene un renombrado accidental)
if (find.isEmpty()) {
return databankRG;
}
SQProject prj = ProjectEngine.get(project);
Banco de datos db = prj.getDatabanks().get(databankName);
// Instantánea de los originales para evitar ConcurrentModificationException
ArrayList snapshot = new ArrayList(databankRG);
// Rastrear los nombres existentes para evitar colisiones si es necesario
HashSet usedNames = new HashSet();
for (ResultsGroup rg : snapshot) {
if (rg.getName() != null) usedNames.add(rg.getName());
}
// 1) Crear clones renombrados (sin db.add dentro de la iteración)
ArrayList clonesToAdd = new ArrayList();
for (ResultsGroup rg : snapshot) {
String oldName = rg.getName();
if (oldName == null) continue;
String newName = oldName.replace(find, repl);
// Sólo duplicar si cambia el nombre
if (!newName.equals(oldName)) {
// Evitar colisiones de nombres exactos (seguridad opcional)
String finalName = makeUniqueName(newName, usedNames);
ResultsGroup newRg = rg.clone();
newRg.setName(finalName);
clonesToAdd.add(nuevoRg);
usedNames.add(nombrefinal);
}
}
// 2) Añadir clones después de la iteración (seguro)
for (ResultsGroup newRg : clonesToAdd) {
db.add(newRg, true);
}
// Devuelve las estrategias recién creadas (refleja el comportamiento de SQX RenameStrategies)
return clonesToAdd;
}
private static String makeUniqueName(String baseName, HashSet used) {
if (!used.contains(baseName)) return baseName;
int i = 2;
while (true) {
String candidato = nombrebase + "_" + i;
if (!used.contains(candidato)) return candidato;
i++;
}
}
private static String unescape(String s) {
if (s == null) return "";
return s.replace("\\n", "\n")
.replace("\\t", "\t")
.replace("\\r", "\r");
}
}
ACTUALIZACIÓN: este fragmento ya funciona correctamente en la compilación 143. Sólo tienes que hacer clic en el botón de recarga de los bancos de datos después de ejecutarlo.
Atención. No utilice este código. No puedo borrar el artículo. ¡Cambia el nombre de las estrategias dentro de la interfaz de usuario SQX, pero de alguna manera borra el archivo de estrategia en el explorador de Windows! Si alguien sabe cómo solucionarlo, por favor compártalo para que pueda actualizarlo.
ACTUALIZACIÓN - Este comentario ya no es válido. Por favor, ignórelo.
Hola
Me ha fallado la compilación. 3 errores
Tal vez la versión 144