Discusión sobre el artículo "Constructor gráfico de estrategias. Creando robots comerciales sin programación" - página 6

 
Andrey Barinov:
...

Añadiré el desplazamiento con rueda en futuras versiones....

Me gustaría compartir mi experiencia en la implementación del desplazamiento con rueda. Tal vez mi tecnología no le convenga, pero puede darle la idea correcta (si aún no ha decidido el método de implementación).

Dentro de la función OnChartEvent() en la condición :

if(id == CHARTEVENT_CHART_CHANGE && !a)

1. Uso la función ChartNavigate y pongo el gráfico actual en la posición -100 barras atrás.

2. 2. Asigno el número de la primera barra visible usando ChartGetInteger(0,FIRST_VISIBLE_BAR) a la variable estática "First_bar_number".

3. A continuación, fijo el evento de gráfico CHARTEVENT_CHART_CHANGE una vez a través de (utilizo la bandera "a" y la bandera "b" para este propósito).

4. 4. Comparo "Número_de_la_primera_barra" y "Número_de_esta_barra" (que también obtengo mediante ChartGetInteger(0,FIRST_VISIBLE_BAR), pero en cada evento CHARTEVENT_CHART_CHANGE, no una vez como con "Número_de_la_primera_barra") y determino la dirección del desplazamiento del gráfico.

y determinar la dirección del desplazamiento del gráfico.

5. A continuación, todo es sencillo - muevo la imagen del kanvas con ObjectSetInteger(0,G_CORE[CANVAS][_NAME],OBJPROP_YOFFSET,G_CORE[CANVAS][_FIELD_TO_VIEW_Y_DISTANCE]); devuelvo el gráfico a su posición original - ChartNavigate(0,CHART_END,-100);

6. Salto el siguiente evento del gráfico porque se genera desde la función ChartNavigate llamada . Luego todo se repite.

Este es el código:

 if(id == CHARTEVENT_CHART_CHANGE && !a)
   {
    //------------------------------------ 
    if(!Номер_первого_бара)
      {
       ChartNavigate(0,CHART_END,-100); 
       Номер_первого_бара = ChartGetInteger(0,CHART_FIRST_VISIBLE_BAR);
      }
    //------------------------------------ 
    Номер_этого_бара = ChartGetInteger(0,CHART_FIRST_VISIBLE_BAR);
    //------------------------------------
    if(Номер_этого_бара > Номер_первого_бара)
      {
       Прокрутка_вниз = 1;
       Прокрутка_вверх = 0;
       Сдвиг = 25;
       a = 1;
      }
    if(Номер_этого_бара  < Номер_первого_бара) 
      {
       Прокрутка_вниз = 0;
       Прокрутка_вверх = 1;
       Сдвиг = -25;
       a = 1;
      }
    //------------------------------------
    G_CORE[КАНВАС][_IMAGE_VIRTUAL_Y] -= Сдвиг;
    //------------------------------------ 
    G_CORE[КАНВАС][_FIELD_TO_VIEW_Y_DISTANCE] = G_CORE[Поле_обзора][_Y] - G_CORE[КАНВАС][_IMAGE_VIRTUAL_Y];  
    //------------------------------------
    ObjectSetInteger(0,G_CORE[КАНВАС][_NAME],OBJPROP_YOFFSET,G_CORE[КАНВАС][_FIELD_TO_VIEW_Y_DISTANCE]);
    //------------------------------------    
  }
//------------------------------------------------------
if(b){a = 0; b = 0;} 
if(a == 1){ChartNavigate(0,CHART_END,-100);  b = 1;} 
//------------------------------------------------------

La desventaja de este método es que el gráfico en segundo plano se mueve. Sin embargo, su constructor ocupa toda la parte visible del mismo, por lo que no se notará.

La ventaja de este método es que se obtiene un excelente desplazamiento con la rueda, no inferior al desplazamiento de las ventanas de Windows. Hay energía, desaceleración... Además, al pasar por encima de una barra de desplazamiento horizontal y desplazar la rueda, tengo una barra de desplazamiento horizontal. Es fácil hacer esto.

Con este desplazamiento, los usuarios tendrán la sensación de estar trabajando en windup).

Esto es lo que parece: https://www.mql5.com/ru/forum/139237/page7

 
Реter Konow:

Me gustaría compartir mi experiencia en la implementación del desplazamiento con la rueda. Tal vez mi tecnología no le convenga, pero puede darle la idea correcta (si aún no ha decidido el método de implementación).

Dentro de la función OnChartEvent() en la condición :

1. Utilizo la función ChartNavigate y pongo el gráfico actual en la posición -100 barras atrás.

2. 2. Introduzco el número de la primera barra visible usando ChartGetInteger(0,FIRST_VISIBLE_BAR) en la variable estática "First_bar_number".

3. 3. A continuación, fijo el evento de gráfico CHARTEVENT_CHART_CHANGE una vez (utilizo la bandera "a" y la bandera "b" para este propósito).

4. 4. Comparo "Número_de_la_primera_barra" y "Número_de_esta_barra" (que también obtengo a través de ChartGetInteger(0,FIRST_VISIBLE_BAR), pero en cada evento CHARTEVENT_CHART_CHANGE, no una vez como con "Número_de_la_primera_barra").

y determinar la dirección del cambio de gráfico.

5. A continuación, todo es sencillo - muevo la imagen del kanvas con ObjectSetInteger(0,G_CORE[CANVAS][_NAME],OBJPROP_YOFFSET,G_CORE[CANVAS][_FIELD_TO_VIEW_Y_DISTANCE]); devuelvo el gráfico a su posición original - ChartNavigate(0,CHART_END,-100);

6. Salto el siguiente evento del gráfico porque se genera desde la función ChartNavigate llamada . Luego todo se repite.

Este es el código:

La desventaja de este método es que el gráfico en segundo plano se mueve. Sin embargo, su constructor ocupa toda la parte visible del mismo, por lo que no se notará.

La ventaja de este método es que se obtiene un excelente desplazamiento de la rueda, no inferior al desplazamiento de las ventanas de Windows. Hay energía, desaceleración... Además, al pasar por encima de una barra de desplazamiento horizontal y desplazar la rueda, tengo una barra de desplazamiento horizontal. Es fácil hacer esto.

Con este desplazamiento, los usuarios tendrán la sensación de estar trabajando en windup).

Esto es lo que parece: https://www.mql5.com/ru/forum/139237/page7

Gracias.

¿Qué pasa con CHARTEVENT_MOUSE_WHEEL?

https://www.mql5.com/es/docs/constants/chartconstants/enum_chartevents&nbsp;

Документация по MQL5: Константы, перечисления и структуры / Константы графиков / Типы событий графика
Документация по MQL5: Константы, перечисления и структуры / Константы графиков / Типы событий графика
  • www.mql5.com
Существуют 11 видов событий, которые можно обрабатывать с помощью функции предопределенной функции OnChartEvent(). Для пользовательских событий предусмотрено 65535 идентификаторов в диапазоне от CHARTEVENT_CUSTOM до CHARTEVENT_CUSTOM_LAST включительно. Для генерации пользовательского события необходимо использовать функцию EventChartCustom...
 
Andrey Barinov:

Gracias, señor.

¿Qué pasa con CHARTEVENT_MOUSE_WHEEL?

https://www.mql5.com/es/docs/constants/chartconstants/enum_chartevents&nbsp;

Cuando hice el desplazamiento con la rueda, todavía no estaba. Así que ni lo probé. (Además, todavía estoy trabajando en MT4, y no parece estar disponible allí).

¿Da energía y desaceleración?

 
Реter Konow:

Cuando hice el desplazamiento con la rueda, todavía no estaba. Por eso ni siquiera lo probé. (Además, todavía estoy trabajando en MT4, y no parece estar disponible allí).

¿Da energía y desaceleración?

No lo sé, no lo he probado. Sólo recuerdo que existe tal evento.

 

Buenas tardes.

Soy el NEOPROGRAMISTA para el que existe este producto y el artículo sobre el mismo.

Tengo una pregunta - con fines educativos traté de reproducir el Asesor Experto del ejemplo número 1 (cruce de MA rápida y lenta). Hice todo como en el artículo, letra por letra. Como resultado, el Asesor Experto a veces abre e inmediatamente cierra varias posiciones, creando instantáneamente una pérdida. Y a veces abre una sola posición, todo como debería, la cierra cuando llega la señal contraria. Todo parecía estar bien al menos con estos, pero me di cuenta de que siempre son sólo Bai.

El esquema se disolvió después de reiniciar el ordenador (actualización en la noche), así que no puedo encontrar un posible error, en el código sigue siendo demasiado débil, y es tan grande e incomprensible.

¿Podría revisar el código y sugerir lo que hice mal?

Archivos adjuntos:
 
Andrey Barinov:

No lo sé, no lo he probado. Sólo recuerdo que existe tal evento.

El evento está ahí, pero nadie lo ha usado todavía).

Me encantaría deshacerme de mi método debido a la crispación gráfico, pero MT4 no tiene este evento, y MT5 no sabe cómo funciona yet....

 
 
Sergey Voytsekhovsky:

Buenas tardes.

Soy el NEOPROGRAMISTA para el que existe este producto y el artículo sobre el mismo.

Tengo una pregunta - con fines educativos traté de reproducir el Asesor Experto del ejemplo número 1 (cruce de MA rápida y lenta). Hice todo como en el artículo, letra por letra. Como resultado, el Asesor Experto a veces abre e inmediatamente cierra varias posiciones, creando instantáneamente una pérdida. Y a veces abre una sola posición, todo como debería, la cierra cuando llega la señal contraria. Todo parecía estar bien al menos con estos, pero me di cuenta de que siempre son sólo Comprar.

El esquema se disolvió después de reiniciar el ordenador (actualización en la noche), así que no puedo encontrar un posible error, en el código sigue siendo demasiado débil, y es tan grande e incomprensible.

¿Podría revisar el código y sugerir lo que hice mal?

Empieza por mirar el patrón #1. Este es exactamente el mismo patrón que se considera en el artículo (sólo se añaden Travelling y Lossless). Puedes ver los parámetros de todos los elementos y jugar con ellos.

Hay una serie de errores en su Asesor Experto. Uno de ellos es que usted no ha cambiado el tipo de transacción en el elemento para hacer ventas (dice "compra" en lugar de venta).

 
Andrey Barinov:

Empiece por estudiar el esquema nº 1. Es exactamente el esquema considerado en el artículo (sólo se añaden Travelling y Breakeven). Puedes ver los parámetros de todos los elementos y jugar con ellos.

Hay algunos errores en su Asesor Experto. Uno de ellos es que no has cambiado el tipo de operación en el elemento para realizar ventas (pone "compra" en lugar de venta).

Gracias, me ha sorprendido muy gratamente la rapidez de su respuesta.

Entiendo lo del tipo de transacción sin cambiar, es la razón por la que sólo las compras funcionan normalmente.

Pero, ¿en qué lugar es incorrecto que en medio segundo, aparentemente en cada tick, se abran y cierren toda una serie de órdenes a la vez, y que haya tanto órdenes de compra como de venta. ???

 
Sergey Voytsekhovsky:

Gracias, muy gratamente sorprendido por la rapidez de la respuesta.

Entiendo lo del tipo de transacción sin cambios, es la razón por la que sólo las compras funcionan normalmente.

Pero en que lugar es incorrecto que en medio segundo, aparentemente en cada tick, toda una serie de ordenes se abren e inmediatamente se cierran, y hay tanto ordenes de compra como de venta. ???

Pues mira, tienes una compra en vez de una venta. Al mismo tiempo, cuando se da una señal de venta, ¡las compras deberían cerrarse! Cosa que hace.

Aparece una señal de venta, el robot abre una compra en lugar de una venta por error, e inmediatamente la cierra, luego la vuelve a abrir y la vuelve a cerrar, etc.

Por lo demás, todo correcto en su esquema.