NIVELES FIBONACCI 1.14 — Proyección de niveles Fibonacci personalizados
Este script para MetaTrader 5 permite calcular y dibujar automáticamente niveles de Fibonacci personalizados a partir de dos precios conocidos y sus correspondientes niveles Fibonacci.
La herramienta utiliza una relación matemática lineal entre los dos puntos introducidos para proyectar cualquier nivel Fibonacci que el usuario desee.
¿Cómo funciona?
El usuario debe introducir:
- Precio del Punto A
- Nivel Fibonacci asignado al Punto A
- Precio del Punto B
- Nivel Fibonacci asignado al Punto B
A partir de estos dos puntos de referencia, el script calcula automáticamente el precio correspondiente a cada nivel Fibonacci indicado en la lista de niveles.
Por ejemplo:
Punto A → 1.16594 = 100% Punto B → 1.16363 = 423.6%
Con estos datos, el script puede calcular y dibujar niveles como:
0%
23.6%
38.2%
50%
61.8%
100%
161.8%
261.8%
423.6%
Los niveles pueden modificarse libremente desde los parámetros de entrada.
Características principales
- Proyección matemática de niveles Fibonacci personalizados.
- Permite utilizar cualquier nivel Fibonacci como referencia.
- Permite trabajar con niveles positivos o negativos.
- Lista de niveles completamente configurable.
- Las líneas se dibujan como líneas horizontales en el gráfico.
- Adaptación automática al número de decimales del símbolo mediante _Digits.
- Normalización del precio calculado al número de decimales del activo.
- Tooltip informativo con el nivel Fibonacci y su precio.
- Las líneas generadas utilizan un prefijo identificativo para facilitar su gestión.
- Posibilidad de eliminar todas las líneas generadas por el script mediante la opción ACTION_DELETE.
- Permite configurar color, estilo y grosor de las líneas.
- No utiliza indicadores externos ni requiere DLL.
Configuración
En Configuración de Precios Conocidos:
InpPriceA InpFiboLevelA InpPriceB InpFiboLevelB
se introducen los dos puntos conocidos.
En Niveles a Dibujar:
InpTargetLevels
se especifican los niveles que se desean representar, separados por ;.
Ejemplo:
0; 23.6; 38.2; 50; 61.8; 100; 161.8; 261.8; 423.6
Gestión de las líneas
El parámetro InpAction permite elegir entre:
ACTION_DRAW
Calcula y dibuja los niveles configurados.
ACTION_DELETE
Elimina las líneas creadas por este script utilizando el prefijo configurado en InpPrefix.
Importante
Este script es una herramienta matemática y gráfica para la proyección de niveles Fibonacci.
No genera señales de compra o venta, no ejecuta operaciones y no constituye por sí mismo un sistema automático de trading.
Los niveles calculados dependen directamente de los dos precios y niveles Fibonacci introducidos por el usuario.
Versión: 1.14
Plataforma: MetaTrader 5
Tipo: Script
Autor: SPC
//+------------------------------------------------------------------+
//| NIVELESFIBONACCI1.1.mq5 |
//| SPC |
//+------------------------------------------------------------------+
#property copyright "SPC"
#property version "1.14"
#property script_show_inputs
//--- Enumeración para elegir la acción del script
enum ENUM_SCRIPT_ACTION
{
ACTION_DRAW = 0, // Dibujar Niveles
ACTION_DELETE = 1 // Borrar Líneas Dibujadas
};
//--- Parámetros de Entrada (Input Parameters)
input group "=== Acción Principal ==="
input ENUM_SCRIPT_ACTION InpAction = ACTION_DRAW; // Acción a realizar
input group "=== Configuración de Precios Conocidos ==="
input double InpPriceA = 1.16594; // Precio del Punto A
input double InpFiboLevelA = 100.0; // Nivel Fibo asignado al Punto A (%)
input double InpPriceB = 1.16363; // Precio del Punto B
input double InpFiboLevelB = 423.6; // Nivel Fibo asignado al Punto B (%)
input group "=== Niveles a Dibujar ==="
input string InpTargetLevels = "0; 23.6; 38.2; 50; 61.8; 100; 161.8; 261.8; 423.6"; // Niveles Fibo % (Separados por ;)
input group "=== Estilo de las Líneas Horizontales ==="
input color InpLineColor = clrOrange; // Color de las líneas
input ENUM_LINE_STYLE InpLineStyle = STYLE_SOLID; // Estilo de línea
input int InpLineWidth = 3; // Grosor de línea
input string InpPrefix = "FiboCustom_";// Prefijo para identificar las líneas
//+------------------------------------------------------------------+
//| Script program start function |
//+------------------------------------------------------------------+
void OnStart()
{
// 1. Si la acción elegida es BORRAR, ejecutamos la función de limpieza y salimos
if(InpAction == ACTION_DELETE)
{
DeleteFiboLines(InpPrefix);
ChartRedraw(0);
Print("NIVELESFIBONACCI1.1 (v1.14): Se han eliminado todas las líneas con prefijo '", InpPrefix, "'.");
return;
}
// 2. Validación para evitar división por cero en modo DIBUJAR
if(InpFiboLevelA == InpFiboLevelB)
{
Print("Error: Los niveles Fibo A y B no pueden ser idénticos.");
return;
}
// 3. Procesar el texto de niveles personalizados introducido por el usuario
double targetLevels[];
ushort u_sep = StringGetCharacter(";", 0);
string rawLevels[];
int totalSplit = StringSplit(InpTargetLevels, u_sep, rawLevels);
if(totalSplit <= 0)
{
Print("Error: No se han especificado niveles válidos en InpTargetLevels.");
return;
}
ArrayResize(targetLevels, totalSplit);
int validCount = 0;
for(int i = 0; i < totalSplit; i++)
{
string trimmed = rawLevels[i];
StringTrimLeft(trimmed);
StringTrimRight(trimmed);
if(StringLen(trimmed) > 0)
{
// Validación para omitir valores que no sean numéricos (ej. "abc")
double val = StringToDouble(trimmed);
if(val == 0.0 && trimmed != "0" && trimmed != "0.0" && trimmed != "0,0")
{
Print("Aviso: El nivel '", trimmed, "' no es un número válido y será ignorado.");
continue;
}
targetLevels[validCount] = val;
validCount++;
}
}
if(validCount == 0)
{
Print("Error: No se pudieron interpretar los niveles de Fibonacci especificados.");
return;
}
// 4. Cálculo de la variación de precio por cada 1% de Fibonacci
double pricePerUnit = (InpPriceB - InpPriceA) / (InpFiboLevelB - InpFiboLevelA);
// 5. Proyección y trazado directo adaptado a los decimales del activo (_Digits)
for(int i = 0; i < validCount; i++)
{
double currentPct = targetLevels[i];
double rawPrice = InpPriceA + (pricePerUnit * (currentPct - InpFiboLevelA));
// Normalización del precio al número exacto de decimales del símbolo actual
double targetPrice = NormalizeDouble(rawPrice, _Digits);
string objName = InpPrefix + DoubleToString(currentPct, 1);
// Eliminar el objeto previo si existía para actualizar el trazo
ObjectDelete(0, objName);
if(ObjectCreate(0, objName, OBJ_HLINE, 0, 0, targetPrice))
{
ObjectSetInteger(0, objName, OBJPROP_COLOR, InpLineColor);
ObjectSetInteger(0, objName, OBJPROP_STYLE, InpLineStyle);
ObjectSetInteger(0, objName, OBJPROP_WIDTH, InpLineWidth);
ObjectSetInteger(0, objName, OBJPROP_SELECTABLE, true);
ObjectSetInteger(0, objName, OBJPROP_SELECTED, false);
// Formato dinámico del valor visual con los decimales automáticos del activo (_Digits)
string tooltip = StringFormat("Fibo %.1f%% : %.*f", currentPct, _Digits, targetPrice);
ObjectSetString(0, objName, OBJPROP_TOOLTIP, tooltip);
}
}
ChartRedraw(0);
Print("NIVELESFIBONACCI1.1 (v1.14): Proyección completada con ", validCount, " niveles válidos.");
}
//+------------------------------------------------------------------+
//| Función auxiliar para borrar objetos por prefijo |
//+------------------------------------------------------------------+
void DeleteFiboLines(string prefix)
{
int totalObjects = ObjectsTotal(0, -1, -1);
// Recorremos los objetos en orden inverso para evitar desajustes de índice al eliminar
for(int i = totalObjects - 1; i >= 0; i--)
{
string objName = ObjectName(0, i, -1);
if(StringFind(objName, prefix) == 0)
{
ObjectDelete(0, objName);
}
}
}
//+------------------------------------------------------------------+