Discusión sobre el artículo "Desarrollo de Sistemas Avanzados de Trading ICT: Implementación de Order Blocks en un Indicador"
Buenos días Mendoza
Gracias por este esfuerzo.
mi pregunta es ; ya que estamos utilizando la función OnCalculate:
int OnCalculate(const int rates_total,
const int prev_calculado,
const datetime &time[],// TimeSeries de tiempos de apertura
const double &open[], // Serie temporal de precios de apertura
const double &high[],// Serie temporal de precios máximos
const double &low[],// Serie temporal de precios bajos
const double &close[],// Serie temporal de precios de cierre
const long &tick_volume[],// Serie temporal del volumen de ticks
const long &volume[],// Serie temporal de precios de barra
const int &spread[])//
¿Por qué debemos crear nuevas matrices y reorganizarlas?
int OnCalculate(const int rates_total,
const int prev_calculado,
const datetime &time[],// Series temporales de tiempos de apertura
const double &open[], // Serie temporal de precios de apertura
const double &high[],// Serie temporal de precios máximos
const double &low[],// Serie temporal de precios bajos
const double &close[],// Serie temporal de precios de cierre
const long &tick_volume[],// Serie temporal del volumen de ticks
const long &volume[],// Serie temporal de precios de barra
const int &spread[])//
¿Por qué debemos crear nuevas matrices y reordenarlas?
datetime mitigados_alcsitas(double price, const double &lowArray[], const datetime &Time[], datetime start, datetime end) { int startIndex = iBarShift(_Symbol, PERIOD_CURRENT, start); int endIndex = iBarShift(_Symbol, PERIOD_CURRENT, end); NormalizeDouble(price, _Digits); for(int i = startIndex - 2 ; i >= endIndex + 1 ; i--) { if(price > lowArray[i]) { return Time[i]; //si encuentra que si hubo retorna el tiempo de la vela donde hubo la mitigacion Print("el orderblock tuvo mitigaciones", TimeToString(end)); } } return 0; //En caso de que no se haya encontrado ninguna mitigacion retorna 0 }
Y así sucesivamente en cuatro funciones vecinas.
Hola, tienes toda la razón. Me equivoqué al pensar que NormalizeDouble funcionaba por referencia. En realidad devuelve un valor redondeado, y para que una variable tome ese valor hay que asignárselo explícitamente. Perdón por eso; creo que lo aprendí así cuando escribí ese código y así se me quedó. Lo siento mucho. Estoy usando NormalizeDouble aquí más como una precaución, aunque no creo que tenga un impacto significativo en la comprobación de si un bloque de orden alcista fue mitigado (basado en mis pruebas). Gracias por señalarlo. Podríamos optar por asignar "price = NormalizeDouble(price, _Digits)" directamente, o eliminar esa línea, ya que la normalización no parece afectar significativamente a la revisión.
Hola Ahmed, muchas gracias por tu comentario. Tienes razón. No hace falta crear nuevas matrices, porque la función OnCalculate ya nos da todos los datos listos para usar. Yo lo hice por costumbre en su momento, pero lo mejor es trabajar directamente con los datos que ya están ahí. Por cierto, si quieres el código más actualizado, te lo dejo aquí. En este nuevo código se usan los arrays que ya vienen por defecto, la lógica para detectar los bloques de orden es la misma.
Hola Ahmed, muchas gracias por tu comentario. Tienes razon. No es necesario crear nuevos arrays, porque la función OnCalculate ya nos da todos los datos listos para usar. Yo lo hice por costumbre en su momento, pero lo mejor es trabajar directamente con los datos que ya están ahí. Por cierto, si quieres el código más actualizado, te lo dejo aquí. En este nuevo código se usan los arrays que ya vienen por defecto, la lógica para detectar los bloques de orden es la misma.
Hay otra razón para crear arrays separados. Si decides incorporar la lógica en un EA, no hay función OnCalculate. Además si quieres hacer versiones multi divisa o multi time frame, necesitarás múltiples arrays o arrays multi demen y el 90% del trabajo ya está hecho.
Mi pregunta es ¿por qué la mayoría de los desarrolladores convierten los datos en series de tiempo? Yo convertí un EA MQ4 a MQ5 y no me di cuenta de que las series de tiempo estaban disponibles, así que mantuve todos los arrays como bases cero, no como series de tiempo.Me di cuenta de que hace la vida mucho más fácil, ya que hay una correspondencia 1 a 1 entre los datos y las matrices de apoyo, no más restablecer, cambiar el tamaño y restablecer de nuevo para las series de tiempo, sólo el cambio de tamaño y, finalmente, lo más importante sólo 1 sistema de numeración de barras. Para aquellas funciones Metaquotes que insisten en una serie de tiempo que hacer la indixing inversa en la llamada.
Hola de nuevo, acabo de descargar su fuente, versión 1, compilado y aplicado a un gráficoH4 EURUSD y no apareció nada. Fui al panel de propiedades, no cambié nada y cerré y el png apareció. Sólo barras verdes, no rojas, y onc comienzan, hacen mot terminan. ¿Alguna sugerencia?He descargado el Part2 de la discusión anterior y que tenía en general los mismos problemas, pero con tres más nuevos también. Los problemas de verde rojo start stop eran evidentes. Parece, además, había diferentes criterios como el número de bandas no coinciden exactamente. Además, he intentado cambiar el color verde a clrLime y cambió, pero definitivamente no era Lime.
Además, ¿Cómo se hace la animación. ¿Está utilizando el Probador de Estrategias? Lo pregunto porque no puedo conseguir que el Probador de Estrategias se muestre correctamente en la pantalla cuando pruebo un EA en modo visual, o cuando pruebo un indicadorHola Niquel,
Te adjunto una versión ligeramente revisada de tu parte 2. He añadido ErrorDescription(errornumber) que está en STDLIB.EX5 para ampliar tus distintos mensajes de error.
He añadido ErrorDescription(errornumber), que se encuentra en STDLIB.EX5, para ampliar los distintos mensajes de error. Por alguna razón, no he podido poner la importación directamente en el indicador, así que he tenido que incluirla en un archivo de inclusión BlockOrder Common.mqh, donde sí me funciona. ¿Puedes pasar el indicador por Google Translate para convertir el texto al inglés?
También he añadido un número de versión, 2.01, al programa. Usando la definición, he añadido el número de versión como un prefijo para RectangleCreate para permitir la ejecución de la versión 1 y 2 juntos aunque no he cambiado la versión 1.
Como sugerencia, podría calcular una media móvil de los volúmenes y mostrarla en la parte inferior de la pantalla. Supongo que será necesario algún ajuste decimal.
Espero con interés su próxima actualización
CapeCoddah
Hay otra razón para crear arrays separados. Si usted decide incorporar la lógica en un EA, no hay función OnCalculate. También si usted desea hacer un multi moneda o multi marco de tiempo versiones, necesitará múltiples arrays o arrays multi demen y el 90% del trabajo ya está hecho.
Mi pregunta es ¿por qué la mayoría de los desarrolladores convierten los datos en series de tiempo? Yo convertí un EA MQ4 a MQ5 y no me di cuenta de que las series de tiempo estaban disponibles, así que mantuve todos los arrays como bases cero, no como series de tiempo.Me di cuenta de que hace la vida mucho más fácil, ya que hay una correspondencia 1 a 1 entre los datos y las matrices de apoyo, no más restablecer, cambiar el tamaño y restablecer de nuevo para series de tiempo, sólo cambiar el tamaño y, finalmente, lo más importante, sólo 1 sistema de numeración de barras. Para aquellas funciones Metaquotes que insisten en una serie de tiempo que hacer la indixing inversa en la llamada.
Hola CapeCoddah, En mi caso, suelo utilizar arrays en forma de series temporales para trabajar con datos de precios o indicadores, principalmente por comodidad y por costumbre. Sin embargo, reconozco que no siempre es la mejor razón para utilizarlos. Para los indicadores, a menudo puede ser más práctico trabajar con matrices de base cero, ya que simplifican la gestión de índices y reducen la necesidad de reinicialización o redimensionamiento constante. En mi caso, al programar el indicador de bloques de órdenes, opté por utilizar series temporales porque así es como estructuré la recuperación de bloques de órdenes desde el principio.
Hola de nuevo, acabo de descargar su fuente, la versión 1, compilado y aplicado a un gráficoH4 EURUSD y no apareció nada. Fui al panel de propiedades, no cambió nada y cerró y el png apareció. Sólo barras verdes, sin rojo, y onc comienzan, lo hacen mot terminar. ¿Alguna sugerencia?He descargado el Part2 de la discusión anterior y que tenía en general los mismos problemas, pero con tres más nuevos también. Los problemas de verde rojo start stop eran evidentes. Parece, además, había diferentes criterios como el número de bandas no coinciden exactamente. Además, he intentado cambiar el color verde a clrLime y cambió, pero definitivamente no era Lime.
Además, ¿Cómo haces la animación, utilizas el Probador de Estrategias? Lo pregunto porque no consigo que el Probador de Estrategias se muestre correctamente en la pantalla cuando pruebo un EA en modo visual, o cuando pruebo un indicadorRespecto al primer problema, creo que puede deberse a que el indicador no carga los datos correctamente. Esto suele ocurrir al cambiar de gráfico o al abrir uno nuevo. Sin embargo, si se trata de un gráfico que ya estaba en uso, convendría investigar más a fondo por qué no se obtienen los bloques de órdenes. En ese caso, sería útil incluir mensajes de depuración (Print) en el código para identificar el problema.
En cuanto al segundo problema, en el que sólo se obtienen bloques de órdenes alcistas, podría deberse a que el EURUSD en el marco temporal H4 se encuentra actualmente en máximos de 600-700 velas. En ese contexto, es posible que todos los bloques de órdenes bajistas hayan sido mitigados, razón por la cual no se dibujan en el gráfico.
En cuanto al cambio de criterio, he reducido algunas variables booleanas en el código. Sin embargo, no sería un problema reintroducir esas condiciones si fuera necesario.
En cuanto a los colores, la última versión que publiqué en los comentarios aplica transparencia a los colores de los rectángulos del bloque de órdenes. Quizá por eso los colores no coinciden visualmente con los de las versiones anteriores. Por último, en cuanto a la animación, no he entendido muy bien a qué te referías. ¿Podrías explicar con más detalle qué entiendes por animación en este contexto?
Hola CapeCoddah, En mi caso, suelo utilizar matrices en forma de series temporales para trabajar con datos de precios o indicadores, principalmente por comodidad y por costumbre. Sin embargo, reconozco que no siempre es la mejor razón para utilizarlos. Para los indicadores, a menudo puede ser más práctico trabajar con matrices de base cero, ya que simplifican la gestión de índices y reducen la necesidad de reinicialización o redimensionamiento constante. En mi caso, al programar el indicador de bloques de órdenes, opté por utilizar series temporales porque así es como estructuré la recuperación de bloques de órdenes desde el principio.
Estaba revisando tu código. Cuando redimensionaba arrays en MQ4, descubrí que tenía que establecer las series temporales del array en false, redimensionar y volver a establecer las series temporales en true. Como no lo utilizo en MQ5, no sé si sigue siendo apropiado.
- Aplicaciones de trading gratuitas
- 8 000+ señales para copiar
- Noticias económicas para analizar los mercados financieros
Usted acepta la política del sitio web y las condiciones de uso
Artículo publicado Desarrollo de Sistemas Avanzados de Trading ICT: Implementación de Order Blocks en un Indicador:
En este artículo, aprenderemos cómo crear un indicador que detecte, dibuje y emita alertas sobre la mitigación de Order Blocks. Exploraremos en detalle cómo identificar estos bloques en el gráfico, establecer alertas precisas y visualizar su posición con rectángulos para tener una mejor comprensión del comportamiento del precio. Este indicador será una herramienta clave para quienes siguen la metodología Smart Money Concepts e Inner Circle Trader.
Los Order Blocks, como su nombre lo indica, son zonas en el gráfico donde hay órdenes pendientes de ser activadas.
Esto sucede normalmente cuando un gran participante del mercado, como una institución financiera, quiere entrar con una posición significativa, pero no hay suficiente liquidez para ejecutar su orden completa sin mover el mercado. Según la ley básica de la oferta y la demanda, al ejecutar una parte de su orden, el precio sube (en el caso de compras) de manera agresiva en busca de vendedores interesados en ofrecer liquidez para completar la transacción.
Dado que el gran participante no puede ejecutar toda su orden de una sola vez sin provocar un movimiento considerable en el precio, distribuye sus órdenes en partes más pequeñas. De este modo, puede completar su operación sin que el precio se mueva drásticamente antes de que haya terminado de posicionarse.
A partir de este concepto, podemos identificar estas zonas en el gráfico, ya que son áreas donde ha ocurrido un fuerte desequilibrio entre la oferta y la demanda (ya sea de compra o venta). A continuación, veremos tres formas de identificar estas zonas y cómo implementarlas en código.
Autor: Niquel Mendoza