¿No parece en el registro de arriba que hay un contador?
Puedes ver en el registro de arriba que un EA no da de baja al otro. Pero no está claro cómo se aplica -mediante contador o de otro modo-. Además, el programador ha dispuesto de un indicador y un Asesor Experto. Pero el indicador tiene la desagradable característica de mezclar el orden de inicio de OnInit() y OnDeinit(). Aunque no debe confundir el contador, si es que realmente lo tiene.
Puedes ver en el registro de arriba que un EA no da de baja al otro. Pero no está claro cómo se aplica, si a través de un contador o algo más. Además, el programador tiene un indicador y un Asesor Experto. Sin embargo, el indicador tiene una característica molesta de mezclar el orden de inicio de OnInit() y OnDeinit().
Por ello, hemos implementado la variable is_book para evitar confusiones.
Los desarrolladores han hecho de MarketBookAdd() una FUNCIÓN por una razón.
¿No ves en el registro de arriba que hay un contador?
El registro no es nada cuando se utiliza una situación diferente a la que se produce el problema.
Tome 2 de sus programas (Asesor Experto y un indicador, o 2 induladores) - póngalos en el mismo gráfico y luego elimine uno de ellos. La suscripción de la instancia restante caerá.
Incluso cuando la secuencia de llamadas OnInit/OnDeinit es correcta (siempre fue correcta en estas pruebas), hay un problema.
Todavía no lo he ejecutado en el terminal, pero tengo una pregunta: ¿cómo ayuda el hecho de mover el código a una envoltura de objetos para evitar que el propio terminal "corte los extremos" (como ocurre ahora)? Bueno, se creará un objeto y se iniciará la suscripción, y luego si alguien cierra otro programa con suscripción, el objeto nunca sabrá que ya no hay suscripción.
Lo hice de la manera más sencilla: comparo los tiempos de espera en OnBookEvent y OnTick. Si el tiempo de espera de la primera supera el tiempo de espera de la segunda en más de N segundos, me vuelvo a suscribir.
Todavía no lo he ejecutado en el terminal, pero surgió la pregunta: ¿cómo ayudará la transferencia del código a un envoltorio de objetos a "cortar los extremos" por el propio terminal dentro de sí mismo (como está sucediendo ahora)? Bueno, se creará un objeto y comenzará la suscripción, y luego, si alguien cierra otro programa con una suscripción, el objeto nunca sabrá que la suscripción ya no existe.
Lo hice de una manera simple: comparo los tiempos de espera para OnBookEvent y OnTick. Si el primer tiempo de espera excede el segundo tiempo de espera en más de N segundos, me suscribo de nuevo.
Bueno, como era de esperar, te equivocas.
1er indicador
//+------------------------------------------------------------------+//| Test_ind_1.mq5 |//| Copyright 2018 prostotrader |//| https://www.mql5.com |//+------------------------------------------------------------------+#property copyright"Copyright 2018 prostotrader"#property link"https://www.mql5.com"#property version"1.00"#define on_call - 111#property indicator_separate_windowbool is_book = false ;
double Buff[];
int event_cnt = 0 ;
#property indicator_buffers1#property indicator_plots1//--- plot Label1#property indicator_label1"Test_1"#property indicator_type1DRAW_LINE#property indicator_color1clrAqua#property indicator_style1STYLE_SOLID#property indicator_width11//+------------------------------------------------------------------+//| Custom indicator initialization function |//+------------------------------------------------------------------+intOnInit ()
{
//--- Set buffers IndicatorSetInteger ( INDICATOR_DIGITS , 0 );
IndicatorSetString ( INDICATOR_SHORTNAME , "Test_ind_1" );
//---Set buffersSetIndexBuffer ( 0 ,Buff, INDICATOR_DATA );
PlotIndexSetDouble ( 0 , PLOT_EMPTY_VALUE , EMPTY_VALUE );
ArraySetAsSeries (Buff, true );
is_book = MarketBookAdd ( Symbol ());
if (is_book == true )
{
Print ( __FUNCTION__ , ": Подписка на стакан добавлена. Символ " , Symbol ());
}
//---return ( INIT_SUCCEEDED );
}
//+------------------------------------------------------------------+//| Expert deinitialization function |//+------------------------------------------------------------------+voidOnDeinit ( constint reason)
{
if (is_book == true )
{
MarketBookRelease ( Symbol ());
Print ( __FUNCTION__ , ": Подписка на стакан удалена. Символ " , Symbol ());
}
}
//+------------------------------------------------------------------+//| Custom indicator iteration function |//+------------------------------------------------------------------+intOnCalculate ( constint rates_total,
constint prev_calculated,
constint begin,
constdouble &price[])
{
if (prev_calculated == 0 )
{
ArrayInitialize (Buff, EMPTY_VALUE );
}
Buff[ 0 ] = 2 ;
//--- return value of prev_calculated for next call
event_cnt = rates_total;
return (rates_total);
}
//+------------------------------------------------------------------+//| BookEvent function |//+------------------------------------------------------------------+voidOnBookEvent ( conststring &symbol)
{
if (symbol == Symbol ())
{
Print ( __FUNCTION__ , ": Подписка работает. Символ " , symbol);
double price[];
OnCalculate (event_cnt,event_cnt,on_call,price);
}
}
//+------------------------------------------------------------------+
Segundo indicador
//+------------------------------------------------------------------+//| Test_ind_1.mq5 |//| Copyright 2018 prostotrader |//| https://www.mql5.com |//+------------------------------------------------------------------+#property copyright"Copyright 2018 prostotrader"#property link"https://www.mql5.com"#property version"1.00"#define on_call - 111#property indicator_separate_windowbool is_book = false ;
double Buff[];
int event_cnt = 0 ;
#property indicator_buffers1#property indicator_plots1//--- plot Label1#property indicator_label1"Test_2"#property indicator_type1DRAW_LINE#property indicator_color1clrLime#property indicator_style1STYLE_SOLID#property indicator_width11//+------------------------------------------------------------------+//| Custom indicator initialization function |//+------------------------------------------------------------------+intOnInit ()
{
//--- Set buffers IndicatorSetInteger ( INDICATOR_DIGITS , 0 );
IndicatorSetString ( INDICATOR_SHORTNAME , "Test_ind_2" );
//---Set buffersSetIndexBuffer ( 0 ,Buff, INDICATOR_DATA );
PlotIndexSetDouble ( 0 , PLOT_EMPTY_VALUE , EMPTY_VALUE );
ArraySetAsSeries (Buff, true );
is_book = MarketBookAdd ( Symbol ());
if (is_book == true )
{
Print ( __FUNCTION__ , ": Подписка 2 на стакан добавлена. Символ " , Symbol ());
}
//---return ( INIT_SUCCEEDED );
}
//+------------------------------------------------------------------+//| Expert deinitialization function |//+------------------------------------------------------------------+voidOnDeinit ( constint reason)
{
if (is_book == true )
{
MarketBookRelease ( Symbol ());
Print ( __FUNCTION__ , ": Подписка 2 на стакан удалена. Символ " , Symbol ());
}
}
//+------------------------------------------------------------------+//| Custom indicator iteration function |//+------------------------------------------------------------------+intOnCalculate ( constint rates_total,
constint prev_calculated,
constint begin,
constdouble &price[])
{
if (prev_calculated == 0 )
{
ArrayInitialize (Buff, EMPTY_VALUE );
}
Buff[ 0 ] = 2 ;
//--- return value of prev_calculated for next call
event_cnt = rates_total;
return (rates_total);
}
//+------------------------------------------------------------------+//| BookEvent function |//+------------------------------------------------------------------+voidOnBookEvent ( conststring &symbol)
{
if (symbol == Symbol ())
{
Print ( __FUNCTION__ , ": Подписка 2 работает. Символ " , symbol);
double price[];
OnCalculate (event_cnt,event_cnt,on_call,price);
}
}
//+------------------------------------------------------------------+
Todavía no lo he ejecutado en el terminal, pero tengo una pregunta: ¿cómo ayuda el hecho de mover el código a una envoltura de objetos para evitar que el propio terminal "corte los extremos" (como ocurre ahora)?
Init y Deinit no participan en la suscripción. Tal vez esta circunstancia ayude.
Me gustaría un comentario de los desarrolladores porque no hay nada en la documentación al respecto.
¿No ves en el registro de arriba que hay un contador?
¿No parece en el registro de arriba que hay un contador?
Puedes ver en el registro de arriba que un EA no da de baja al otro. Pero no está claro cómo se aplica -mediante contador o de otro modo-. Además, el programador ha dispuesto de un indicador y un Asesor Experto. Pero el indicador tiene la desagradable característica de mezclar el orden de inicio de OnInit() y OnDeinit(). Aunque no debe confundir el contador, si es que realmente lo tiene.
Puedes ver en el registro de arriba que un EA no da de baja al otro. Pero no está claro cómo se aplica, si a través de un contador o algo más. Además, el programador tiene un indicador y un Asesor Experto. Sin embargo, el indicador tiene una característica molesta de mezclar el orden de inicio de OnInit() y OnDeinit().
Por ello, hemos implementado la variable is_book para evitar confusiones.
Los desarrolladores han hecho de MarketBookAdd() una FUNCIÓN por una razón.
¿No ves en el registro de arriba que hay un contador?
El registro no es nada cuando se utiliza una situación diferente a la que se produce el problema.
Tome 2 de sus programas (Asesor Experto y un indicador, o 2 induladores) - póngalos en el mismo gráfico y luego elimine uno de ellos. La suscripción de la instancia restante caerá.
Incluso cuando la secuencia de llamadas OnInit/OnDeinit es correcta (siempre fue correcta en estas pruebas), hay un problema.
¿Este enfoque no funciona?
Todavía no lo he ejecutado en el terminal, pero tengo una pregunta: ¿cómo ayuda el hecho de mover el código a una envoltura de objetos para evitar que el propio terminal "corte los extremos" (como ocurre ahora)? Bueno, se creará un objeto y se iniciará la suscripción, y luego si alguien cierra otro programa con suscripción, el objeto nunca sabrá que ya no hay suscripción.
Lo hice de la manera más sencilla: comparo los tiempos de espera en OnBookEvent y OnTick. Si el tiempo de espera de la primera supera el tiempo de espera de la segunda en más de N segundos, me vuelvo a suscribir.
Todavía no lo he ejecutado en el terminal, pero surgió la pregunta: ¿cómo ayudará la transferencia del código a un envoltorio de objetos a "cortar los extremos" por el propio terminal dentro de sí mismo (como está sucediendo ahora)? Bueno, se creará un objeto y comenzará la suscripción, y luego, si alguien cierra otro programa con una suscripción, el objeto nunca sabrá que la suscripción ya no existe.
Lo hice de una manera simple: comparo los tiempos de espera para OnBookEvent y OnTick. Si el primer tiempo de espera excede el segundo tiempo de espera en más de N segundos, me suscribo de nuevo.
Bueno, como era de esperar, te equivocas.
1er indicador
Segundo indicador
Resultado
Todavía no lo he ejecutado en el terminal, pero tengo una pregunta: ¿cómo ayuda el hecho de mover el código a una envoltura de objetos para evitar que el propio terminal "corte los extremos" (como ocurre ahora)?
Init y Deinit no participan en la suscripción. Tal vez esta circunstancia ayude.
He ejecutado estos indicadores en diferentes ventanas del mismo símbolo y funciona bien,
pero cuando ejecuté ambos indicadores en la misma ventana de símbolos, realmente
El abono "se cayó" al quitar un indicador.
Escribir a la SD (tal vez tengan tiempo de hacer un arreglo en la nueva construcción)
Foro sobre trading, sistemas de trading automatizados y pruebas de estrategias de trading
La suscripción a OnBookEvent a veces se cae - ¿existe?
prostotrader, 2018.07.24 21:25