Orrery Cycle Toolkit
- Bibliotecas
-
Syarief Azman Bin Rosli
¡Hola y bienvenido a mi perfil oficial en MQL5!
Soy Syarief Azman Bin Rosli, desarrollador de sistemas de trading algorítmico e ingeniero de software cuantitativo con más de una década de experiencia especializada en la creación de soluciones automatizadas para MetaTrader 5 y MetaTrader 4. - Versión: 1.0
- Activaciones: 5
Biblioteca MQL5 que mide el ciclo dominante del mercado en cualquier símbolo y marco temporal: periodo en barras, fase, un par seno / seno adelantado cuyos cruces marcan los giros del ciclo, modo ciclo o tendencia, amplitud, línea de tendencia, espectro, longitudes adaptativas para indicadores y una proyección del ciclo actual. Solo lee el historial de precios: nunca opera, no dibuja y no escribe archivos. Usted recibe el archivo compilado Orrery_Cycle_Toolkit.ex5; esta página es la referencia completa de la API.
Inicio rápido
- Copie Orrery_Cycle_Toolkit.ex5 en MQL5/Libraries (Archivo > Abrir carpeta de datos).
- Pegue el bloque #import de abajo en su EA, indicador o script.
- OnInit: h = OCT_Create(_Symbol, PERIOD_CURRENT, OCT_HOMODYNE, 8, 48, 2000).
- OnTick u OnTimer: si OCT_Update(h) devuelve true, lea OCT_Value(h, campo, 1). Decida sobre shift 1, la última barra cerrada.
- OnDeinit: OCT_Release(h).
- Verificación: ejecute el ejemplo de abajo en EURUSD H1 en el Probador de estrategias; tras el calentamiento (3 x max_period barras) el registro muestra las lecturas en cada barra.
Declaración de importación (lista para copiar)
#import "Orrery_Cycle_Toolkit.ex5"
int OCT_Create(string symbol, ENUM_TIMEFRAMES timeframe, int method, int min_period, int max_period, int lookback);
bool OCT_SetParam(int handle, int param, double value);
bool OCT_Update(int handle);
void OCT_Release(int handle);
int OCT_Bars(int handle);
double OCT_Value(int handle, int field, int shift);
int OCT_TurnSignal(int handle, int shift);
int OCT_Spectrum(int handle, int shift, double &power[]);
int OCT_Project(int handle, int bars, double &path[]);
int OCT_AdaptiveLength(int handle, double fraction, int min_len, int max_len, int shift);
int OCT_SuperSmoother(const double &src[], double &dst[], double period);
int OCT_HighPass(const double &src[], double &dst[], double period);
int OCT_Roofing(const double &src[], double &dst[], int min_period, int max_period);
int OCT_CycleSeries(const double &src[], int method, int min_period, int max_period, int field, double &dst[]);
int OCT_DFTSpectrum(const double &src[], int index, int min_period, int max_period, double &power[]);
int OCT_LastError();
string OCT_ErrorText(int code);
#import
enum OCT_METHOD { OCT_HOMODYNE, OCT_AUTOCORR, OCT_DFT };
enum OCT_FIELD { OCT_PERIOD, OCT_RAW_PERIOD, OCT_PHASE, OCT_SINE, OCT_LEADSINE, OCT_FILTER, OCT_TRENDLINE,
OCT_AMPLITUDE, OCT_STRENGTH, OCT_MODE, OCT_PHASE_STEP };
enum OCT_PARAM { OCT_PARAM_PRICE, OCT_PARAM_TREND_BAND, OCT_PARAM_SMOOTHING, OCT_PARAM_AVGLEN }; Cómo funciona
- Filtro roofing: un paso alto de 2 polos en max_period y un super smoother en min_period conservan solo los ciclos entre ambas longitudes (campo FILTER).
- Periodo, según el método: 0 Homodyne discriminator (transformada de Hilbert, el más rápido), 1 Autocorrelation periodogram (el más estable), 2 DFT spectrum. Los métodos 1 y 2 usan el centro de gravedad, en frecuencia, de las bandas con al menos la mitad de la potencia. Luego periodo = s x bruto + (1 - s) x anterior (s = suavizado, 0.33).
- Fase: el filtro correlacionado con un ciclo de seno y coseno, corregida por la respuesta de fase exacta del filtro en el periodo medido. 0-360 grados: 90 = cresta del ciclo, 270 = valle. SINE = sin(fase), LEADSINE = sin(fase + 45).
- Giro: LEADSINE cruza por encima de SINE (+1, mínimo del ciclo cercano) o por debajo (-1, máximo cercano).
- Modo: ciclo (0) si hubo un giro en el último medio ciclo o la fase avanzó 0.67-1.5 x 360/periodo en la barra; si no, tendencia: +1 alcista o -1 bajista según el precio frente a TRENDLINE. Siempre tendencia si el precio está al menos a banda de tendencia x AMPLITUDE de TRENDLINE.
- Calentamiento: las primeras 3 x max_period barras devuelven EMPTY_VALUE.
Campos
0 PERIOD: ciclo dominante suavizado en barras (de min_period a max_period). 1 RAW_PERIOD: medición sin suavizar. 2 PHASE: grados, 0-360. 3 SINE y 4 LEADSINE: de -1 a +1. 5 FILTER: filtro roofing, en unidades de precio. 6 TRENDLINE: precio medio de un ciclo, suavizado 4-3-2-1. 7 AMPLITUDE: RMS del filtro en un ciclo x 1.414, en unidades de precio. 8 STRENGTH: AMPLITUDE / rango medio de barra en un ciclo. 9 MODE: 0 ciclo, 1 tendencia alcista, -1 tendencia bajista. 10 PHASE_STEP: avance de fase en la barra, de -180 a 180 grados (360/periodo en un ciclo limpio).
Referencia de la API
Shift 0 = barra en formación (cambia hasta que cierra), 1 = última barra cerrada; las barras cerradas no cambian nunca. Cada llamada actualiza OCT_LastError.
OCT_Create
Abre un rastreador. symbol: "" o NULL = símbolo del gráfico. timeframe: se admite PERIOD_CURRENT. method: 0-2. min_period: 4-50 (0 = 8). max_period: de min_period + 4 a 120 (0 = 48). lookback: barras conservadas, 0 = 2000, elevado a 4 x max_period (mínimo 200), máximo 50000. Devuelve un handle 0-31, o -1 con -1 (parámetro erróneo, símbolo desconocido) o -2 (32 handles en uso). Aún no carga datos.
int h = OCT_Create("XAUUSD", PERIOD_M15, OCT_AUTOCORR, 10, 40, 3000); OCT_SetParam
param 0 precio: 0 cierre, 1 mediano, 2 típico, 3 ponderado (por defecto 0). 1 banda de tendencia, x AMPLITUDE: 0.1-10 (1.5). 2 suavizado: 0.05-1 (0.33; 1 = ninguno). 3 longitud de promediado de la autocorrelación: 0-50 (3; 0 = longitud del retardo). Otros valores: false y -1. Un valor cambiado reconstruye el rastreador en el siguiente OCT_Update; hasta entonces OCT_Bars devuelve 0.
OCT_Update
Carga el historial en la primera llamada; después añade las barras nuevas y recalcula la barra en formación. Llámelo en cada tick o temporizador. true si hay valores; false con -3 (handle erróneo), -4 NO DATA (historial aún cargando: vuelva a llamar) o -5 NOT ENOUGH BARS (menos de 3 x max_period + 1 barras). Huecos o historial editado provocan una reconstrucción. Por encima de lookback + 500 barras se descartan las más antiguas; ningún valor cambia.
OCT_Release
Libera un handle; -1 los libera todos. Llámelo en OnDeinit.
OCT_Bars
Barras con valores (shift 0 a OCT_Bars - 1); 0 antes de la primera actualización correcta; -1 para un handle erróneo.
OCT_Value
Valor del campo en shift. EMPTY_VALUE con -1 (campo fuera de 0-10), -3 o -6 (shift negativo, shift mayor que OCT_Bars - 1, sin actualización aún).
if(OCT_Value(h, OCT_MODE, 1) == 0 && OCT_TurnSignal(h, 1) == 1) Print("cycle low turn"); OCT_TurnSignal
+1 si LEADSINE cruzó por encima de SINE en esa barra, -1 por debajo, 0 ninguno o shift no válido. Los giros sirven para el modo ciclo: compruebe MODE. En shift 0 un giro puede aparecer y desaparecer dentro de la barra.
OCT_Spectrum
Llena power[] con max_period - min_period + 1 valores (power[0] = min_period barras), en escala 0-1. Métodos 0 y 2: DFT del filtro sobre max_period barras, banda más fuerte = 1. Método 1: el periodograma de autocorrelación suavizado frente a su máximo, que decae lentamente. Devuelve la cantidad o -1.
OCT_Project
Prolonga el ciclo actual desde shift 0 durante bars (1-500): path[k] = TRENDLINE + pendiente x (k + 1) + AMPLITUDE x sin(PHASE + 360 x (k + 1) / PERIOD), con pendiente = cambio de TRENDLINE por barra en el último cuarto de ciclo; path[0] = barra siguiente. Devuelve bars, o -1 con -1 (bars fuera de rango) o -5 (no listo). Una continuación geométrica, no una previsión.
OCT_AdaptiveLength
round(PERIOD x fraction) limitado a min_len..max_len; fraction mayor que 0 y hasta 10, 1 <= min_len <= max_len. -1 en caso de error. RSI sobre medio ciclo:
int len = OCT_AdaptiveLength(h, 0.5, 2, 100, 1);
Funciones de arrays
Sin handle; nada se conserva entre llamadas. src[] puede ser cronológico o indexado como serie; dst[i] corresponde a src[i] y dst conserva su propia indexación. Un dst dinámico se redimensiona; un búfer de indicador necesita el tamaño de src. Devuelven la cantidad de valores, o -1 con -1 (parámetro erróneo, dst demasiado pequeño) o -5 (vacío o demasiado corto). Ajustes fijos: suavizado 0.33, promediado 3, banda de tendencia 1.5; STRENGTH usa la variación absoluta media de src.
- OCT_SuperSmoother: super smoother de 2 polos, periodo 2-1000; los 2 primeros valores copian src.
- OCT_HighPass: paso alto de 2 polos, periodo 2-1000; los 2 primeros valores son 0.
- OCT_Roofing: paso alto en max_period y luego super smoother en min_period (igual a FILTER).
- OCT_CycleSeries: el motor completo sobre src; dst = campo 0-10 por barra, EMPTY_VALUE en el calentamiento. Necesita 3 x max_period + 1 valores.
- OCT_DFTSpectrum: potencia en src[index] (indexación propia de src), escalada como OCT_Spectrum; necesita max_period - 1 valores anteriores. Devuelve max_period - min_period + 1, o -1 con -6 (índice fuera de rango) o -5.
double c[], per[]; ArraySetAsSeries(c, true); CopyClose(_Symbol, _Period, 0, 500, c); OCT_CycleSeries(c, OCT_HOMODYNE, 8, 48, OCT_PERIOD, per); // per[0] = forming bar
OCT_LastError y OCT_ErrorText
Código de la última llamada y su texto en mayúsculas: 0 OK, -1 INVALID PARAMETER, -2 NO FREE HANDLE, -3 INVALID HANDLE, -4 NO DATA, -5 NOT ENOUGH BARS, -6 SHIFT OUT OF RANGE, en otro caso UNKNOWN.
Ejemplo de integración funcional
Un Expert Advisor: pegue antes el bloque de importación y las tres líneas enum de arriba.
int h = -1;
datetime last = 0;
int OnInit()
{
h = OCT_Create(_Symbol, PERIOD_CURRENT, OCT_HOMODYNE, 8, 48, 2000);
return(h < 0 ? INIT_FAILED : INIT_SUCCEEDED);
}
void OnDeinit(const int reason) { OCT_Release(h); }
void OnTick()
{
datetime bar = iTime(_Symbol, _Period, 0);
if(bar == last)
return;
if(!OCT_Update(h)) { Print("orrery: ", OCT_ErrorText(OCT_LastError())); return; }
last = bar;
PrintFormat("period %.1f phase %.0f mode %.0f turn %d rsi length %d", OCT_Value(h, OCT_PERIOD, 1),
OCT_Value(h, OCT_PHASE, 1), OCT_Value(h, OCT_MODE, 1), OCT_TurnSignal(h, 1), OCT_AdaptiveLength(h, 0.5, 2, 100, 1));
} Arquitectura y notas
- Cada handle guarda su propio historial y resultados; cada programa que importa la biblioteca tiene sus propios 32 handles.
- Un tick recalcula solo la barra en formación (muy por debajo de 1 ms en las pruebas); la primera actualización de 2,000 barras tarda de unos pocos a unos 100 ms, según el método y max_period.
- MetaTrader 5, cualquier símbolo y marco temporal; EAs, indicadores, scripts. Seguro en el Probador de estrategias, la optimización y MQL5 Cloud Network: sin DLL, archivos, peticiones web, objetos gráficos, temporizadores ni variables globales. OCT_Create añade el símbolo a Observación del mercado para cargar su historial.
- Límites: 32 handles por programa, periodos de 4-120 barras, proyección de hasta 500 barras, lookback de hasta 50000 barras.
- Configuraciones típicas. Longitudes adaptativas: método 0, periodos 8-48, longitud del RSI OCT_AdaptiveLength(h, 0.5, 2, 100, 1). Oscilaciones del ciclo: método 1, periodos 10-40, actúe sobre OCT_TurnSignal(h, 1) solo cuando MODE en shift 1 sea 0. Filtro de tendencia: MODE distinto de 0 = tendencia; banda de tendencia 2.5 para menos barras de tendencia. Indicadores: OCT_CycleSeries en OnCalculate.
- Las capturas y el vídeo muestran un EA de demostración construido con esta biblioteca; no forma parte de la compra.
Aviso de riesgo
Las lecturas de ciclo describen precios pasados. Los mercados cambian de régimen, una proyección no es una previsión y ninguna lectura garantiza beneficios. Pruebe primero en una cuenta demo.
