TrendLinesFromFiboAndTrend2 — Proyección Dinámica de Tendencias en Niveles Fibonacci
Descripción general: TrendLinesFromFiboAndTrend2 es una herramienta para MetaTrader 5 diseñada para clonar el ángulo y la velocidad de una línea de tendencia existente y proyectarla automáticamente a través de todos los niveles clave (retrocesos y extensiones) de un objeto Fibonacci dibujado en el gráfico.
Ventajas principales:
-
Proyección geométrica exacta: Mantiene la inclinación y duración exacta de la línea de tendencia de origen.
-
Proyección completa: Traza 9 líneas de soporte/resistencia dinámicas en niveles clave (0.0%, 23.6%, 38.2%, 50.0%, 61.8%, 100.0%, 161.8%, 200.0% y 261.8%).
-
Soporte multidireccional: Permite seleccionar la orientación del Fibonacci (Alcista o Bajista) para calcular correctamente las extensiones fuera del rango 0-100%.
-
Estilo personalizable: Configuración de color, estilo y grosor para diferenciar fácilmente los canales creados.
-
Ejecución ultra-rápida: Al ser un script de un solo paso, no consume recursos ni ralentiza el gráfico.
Cómo funciona:
-
El script toma los puntos temporales y de precio de una línea de tendencia seleccionada para calcular su pendiente.
-
Identifica el origen y los niveles de precio del Fibonacci especificado.
-
Genera y dibuja automáticamente 9 líneas paralelas proyectadas desde el tiempo inicial del Fibonacci a lo largo de cada nivel.
Parámetros de entrada:
-
InpTrendName — Nombre exacto del objeto línea de tendencia en el gráfico (ej. AutoTrend_175779433).
-
InpFiboName — Nombre exacto del objeto Fibonacci en el gráfico (ej. M1 Fibo 57122).
-
InpFiboDirection — Orientación del Fibonacci (FIBO_ALCISTA o FIBO_BAJISTA).
-
InpLineColor — Color de las líneas proyectadas.
-
InpLineStyle — Estilo visual de la línea (sólida, puntos, guiones).
-
InpLineWidth — Grosor de la línea (1 a 5).
Uso recomendado: Combínelo con AutoFindBestTrendLine (o cualquier línea de tendencia manual) y un retroceso de Fibonacci para proyectar estructuras dinámicas de canales, tomar beneficios en extensiones y detectar confluencias clave en el gráfico.
//+------------------------------------------------------------------+
//| TrendLinesFromFiboAndTrend2.mq5 |
//| Copyright 2026 |
//| |
//+------------------------------------------------------------------+
#property copyright "Copyright 2026"
#property link ""
#property version "5.00"
#property script_show_inputs
// Definición de la dirección del Fibonacci para el panel de propiedades
enum ENUM_FIBO_DIR
{
FIBO_ALCISTA = 0, // Alcista (0% Abajo -> 100% Arriba | Extensiones arriba)
FIBO_BAJISTA = 1 // Bajista (0% Arriba -> 100% Abajo | Extensiones abajo)
};
// Parámetros de entrada configurables
input string InpTrendName = "AutoTrend_175779433"; // Nombre exacto de la Línea de Tendencia
input string InpFiboName = "M1 Fibo 57122"; // Nombre exacto del Fibonacci
input ENUM_FIBO_DIR InpFiboDirection = FIBO_ALCISTA; // Dirección del Fibonacci
input color InpLineColor = clrDodgerBlue; // Color de las nuevas líneas
input ENUM_LINE_STYLE InpLineStyle = STYLE_SOLID; // Estilo de línea (Sólida, Rayas, Puntos...)
input int InpLineWidth = 2; // Grosor de línea (1 a 5)
//+------------------------------------------------------------------+
//| Script program start function |
//+------------------------------------------------------------------+
void OnStart()
{
string trendName = InpTrendName;
string fiboName = InpFiboName;
// 1. Validar que la línea de tendencia exista y sea correcta
if(ObjectFind(0, trendName) < 0)
{
Print("Error: No se encontró ninguna línea de tendencia con el nombre: ", trendName);
return;
}
if((int)ObjectGetInteger(0, trendName, OBJPROP_TYPE) != OBJ_TREND)
{
Print("Error: El objeto '", trendName, "' no es una Línea de Tendencia.");
return;
}
// 2. Validar que el objeto Fibonacci exista y sea correcto
if(ObjectFind(0, fiboName) < 0)
{
Print("Error: No se encontró ningún objeto Fibonacci con el nombre: ", fiboName);
return;
}
if((int)ObjectGetInteger(0, fiboName, OBJPROP_TYPE) != OBJ_FIBO)
{
Print("Error: El objeto '", fiboName, "' no es un Fibonacci.");
return;
}
// 3. Obtener y ordenar cronológicamente la línea de tendencia (Izquierda a Derecha)
datetime t_a = (datetime)ObjectGetInteger(0, trendName, OBJPROP_TIME, 0);
double p_a = ObjectGetDouble(0, trendName, OBJPROP_PRICE, 0);
datetime t_b = (datetime)ObjectGetInteger(0, trendName, OBJPROP_TIME, 1);
double p_b = ObjectGetDouble(0, trendName, OBJPROP_PRICE, 1);
datetime tr_start_time = (t_a <= t_b) ? t_a : t_b;
datetime tr_end_time = (t_a <= t_b) ? t_b : t_a;
double tr_start_price = (t_a <= t_b) ? p_a : p_b;
double tr_end_price = (t_a <= t_b) ? p_b : p_a;
datetime trDuration = tr_end_time - tr_start_time;
double trPriceDelta = tr_end_price - tr_start_price;
if(trDuration <= 0)
{
Print("Error: La duración de la línea de tendencia es inválida.");
return;
}
// 4. Obtener los puntos físicos del Fibonacci en el gráfico
datetime fibTime0 = (datetime)ObjectGetInteger(0, fiboName, OBJPROP_TIME, 0);
double f_p1 = ObjectGetDouble(0, fiboName, OBJPROP_PRICE, 0);
double f_p2 = ObjectGetDouble(0, fiboName, OBJPROP_PRICE, 1);
double baseLow = MathMin(f_p1, f_p2);
double baseHigh = MathMax(f_p1, f_p2);
double fibSpan = baseHigh - baseLow;
if(fibSpan == 0.0)
{
Print("Error: El rango del Fibonacci es cero.");
return;
}
// Declaración de precios de referencia para 0% y 100% según el input elegido
double price0 = 0.0;
double price100 = 0.0;
if(InpFiboDirection == FIBO_ALCISTA)
{
price0 = baseLow; // 0.0% abajo
price100 = baseHigh; // 100.0% arriba
}
else
{
price0 = baseHigh; // 0.0% arriba
price100 = baseLow; // 100.0% abajo
}
Print("==================================================");
Print(" [CONFIGURACIÓN APLICADA]");
Print(" Tendencia Usada : ", trendName);
Print(" Fibonacci Usado : ", fiboName);
Print(" Dirección Fibo : ", (InpFiboDirection == FIBO_ALCISTA) ? "ALCISTA" : "BAJISTA");
Print(" Fibo 0.0% -> Precio: ", DoubleToString(price0, _Digits));
Print(" Fibo 100.0% -> Precio: ", DoubleToString(price100, _Digits));
Print("==================================================");
// Niveles solicitados (incluyendo extensiones)
double fibLevels[9] = {0.0, 23.6, 38.2, 50.0, 61.8, 100.0, 161.8, 200.0, 261.8};
string fibLabels[9] = {"0.0", "23.6", "38.2", "50.0", "61.8", "100.0", "161.8", "200.0", "261.8"};
long uniqueBase = GetTickCount();
int createdCount = 0;
// 5. Crear las réplicas exactas respetando la dirección especificada
for(int k = 0; k < 9; k++)
{
double levelPct = fibLevels[k];
double levelPrice = 0.0;
if(InpFiboDirection == FIBO_ALCISTA)
{
if(levelPct <= 100.0)
{
levelPrice = price0 + (fibSpan * (levelPct / 100.0));
}
else
{
double extFactor = (levelPct - 100.0) / 100.0;
levelPrice = price100 + (fibSpan * extFactor); // Extiende hacia arriba
}
}
else // FIBO_BAJISTA
{
if(levelPct <= 100.0)
{
levelPrice = price0 - (fibSpan * (levelPct / 100.0));
}
else
{
double extFactor = (levelPct - 100.0) / 100.0;
levelPrice = price100 - (fibSpan * extFactor); // Extiende hacia abajo
}
}
datetime new_t1 = fibTime0;
double new_p1 = levelPrice;
datetime new_t2 = new_t1 + trDuration;
double new_p2 = new_p1 + trPriceDelta;
string lineName = StringFormat("FiboTrend_%s_%d", fibLabels[k], uniqueBase + k);
if(ObjectCreate(0, lineName, OBJ_TREND, 0, new_t1, new_p1, new_t2, new_p2))
{
ObjectSetInteger(0, lineName, OBJPROP_RAY_LEFT, true);
ObjectSetInteger(0, lineName, OBJPROP_RAY_RIGHT, true);
ObjectSetInteger(0, lineName, OBJPROP_COLOR, InpLineColor);
ObjectSetInteger(0, lineName, OBJPROP_STYLE, InpLineStyle);
ObjectSetInteger(0, lineName, OBJPROP_WIDTH, InpLineWidth);
ObjectSetInteger(0, lineName, OBJPROP_SELECTABLE, true);
ObjectSetInteger(0, lineName, OBJPROP_HIDDEN, false);
createdCount++;
}
}
ChartRedraw(0);
Print("¡Éxito! Se han dibujado ", createdCount, " líneas utilizando la dirección configurada.");
}