lo he probado en un par de indicadores. ambos solían funcionar bien, ahora no.
2) a menudo hay problemas al tratar de probar la ejecución con la conexión a los núcleos (funciona con la enésima ejecución). ver la imagen.
TheXpert: Un grupo de telépatas ya está investigando su problema.
no hace falta ser telépata para entender que iCustom() no funciona como debería.
para probarlo, puede ejecutar el código del Asesor Experto: doble buffer[]; ResetLastError(); int MA_handle = iCustom(NULL, 0, "Examples\Custom Moving Average", 21, 0, MODE_SMMA); //int MA_handle = iMA(NULL, 0, 21, 0, MODE_SMMA, PRICE_MEDIAN); Print("MA_handle = ", MA_handle, " error = ", GetLastError()); int copia = CopyBuffer(MA_handle, 0, 0, 5, buffer); if (copy == -1) Print("Failed to get Custom Moving Average indicator"); si no for (int i = 0; i < 5; i++) Print("buffer[", i, "] = ", buffer[i];
y aparecerá el mensaje "Failed to get Custom Moving Average indicator values".
es decir, CopyBuffer da un error (devuelve -1) para el manejador del indicador iCustom(). si tomamos el indicador estándar iMA(), ¡el mismo código funciona!
Urain: Fíjate en la dirección de indexación del array resultante, quizá haya que ampliarlo.
todo esta bien con la direccion de indexacion y en builds anteriores tambien funcionaba. en 448 y 450 no funcionaba. He sugerido muchas veces que los desarrolladores deberían probar más a fondo la funcionalidad principal del terminal, pero de compilación a compilación obtienen diferentes errores críticos en lugar de críticos. Es decir, se arregla una cosa y se rompe otra que normalmente funcionaba y no se ve el final. Supongo que nunca veré llegar una versión estable (((
El deslizamiento antes de copiar los datos, tarda en calcular el indicador, por lo que aunque la manivela vuelve correctamente, los datos aún no se han calculado,
En general, se recomienda llamar a los indicadores en el inite, y solicitar los datos ya en OnTick() u otras funciones especiales.
double buffer[];
ResetLastError();
int MA_handle = iCustom(NULL, 0, "Examples\\Custom Moving Average", 21, 0, MODE_SMMA);
//int MA_handle = iMA(NULL, 0, 21, 0, MODE_SMMA, PRICE_MEDIAN);Print("MA_handle = ", MA_handle, " error = ", GetLastError());
Sleep(100);
int copy = CopyBuffer(MA_handle, 0, 0, 5, buffer);
if (copy == -1) Print("Неудачная попытка получить значения индикатора Custom Moving Average");
elsefor (int i = 0; i < 5; i++) Print("buffer[", i, "] = ", buffer[i]);
De nuevo, copias 5 datos de la barra cero, pero en el copybuffer la barra cero está en algún lugar alrededor de 1970 (depende de la configuración de la barra máxima), por eso dije que miraras la indexación del array.
El deslizamiento antes de copiar los datos, tarda en calcular el indicador, por lo que aunque la manija vuelve correctamente, los datos aún no se han calculado.
Sleep(1000); // 1 segundo después de llamar a iCustom() ayudó, PERO. ¿Debo recoger ahora el tiempo de retardo? ¿Cómo puedo saber cuánto tiempo durará el proceso de cálculo? es incorrecto dar la manija correcta del indicador apuntando a la basura ! y debe haber funcionado correctamente antes porque no había tal problema.
Urain:
en general, se recomienda llamar a los indicadores en el initis, y pedir los datos ya en OnTick() u otras funciones especiales.
Es un buen consejo para mí, gracias ) porque si lo hubiera hecho así, no habría visto el problema...
De nuevo estás copiando 5 datos de la barra cero, pero en copyBuffer la barra cero está en algún lugar alrededor de 1970 (depende de la configuración de la barra máxima), por eso dije que miraras la indexación del array.
Por lo que entiendo de la documentación de ayuda, en CopyBuffer() la barra cero es en realidad "tiempo presente", y ya al copiarla, el array se expande.
Sleep(1000); // 1 seg. después de llamar a iCustom() ayudó, PERO... ¿debo recoger ahora el tiempo de retardo? ¿cómo se supone que debo saber cuánto tiempo durará el proceso de cálculo? es incorrecto dar el mango indicador correcto indicando la basura ! y debe haber funcionado correctamente antes, porque no había tal problema.
No es necesario ajustar el tiempo de retardo de la función Sleep(), si se divide por tiempo la llamada iCustom y se accede a los valores de este indicador. Además, existe la función BarsCalculated()
No sé si es un bug, pero creo que hay errores en el código de las librerías para todos los tipos de muvings (SignalFrAMA, SignalAMA, SignalMA, SignalDEMA, SignalTEMA) para el maestro, verCSignalTEMA::ShortCondition()
//| "Voting" that price will grow. |//| INPUT: no. |//| OUTPUT: number of "votes" that price will grow. |//| REMARK: no. |//+------------------------------------------------------------------+int CSignalTEMA::LongCondition()
{
int result=0;
int idx =StartIndex();
//--- analyze positional relationship of the close price and the indicator at the first analyzed barif(DiffCloseMA(idx)<0.0)
{
//--- the close price is below the indicatorif(IS_PATTERN_USAGE(1) && DiffOpenMA(idx)>0.0 && DiffMA(idx)>0.0)
{
//--- the open price is above the indicator (i.e. there was an intersection), but the indicator is directed upwards
result=m_pattern_1;
//--- consider that this is an unformed "piercing" and suggest to enter the market at the current price
m_base_price=0.0;
}
}
else
{
//--- the close price is above the indicator (the indicator has no objections to buying)if(IS_PATTERN_USAGE(0))
result=m_pattern_0;
//--- if the model 2 is usedif(IS_PATTERN_USAGE(2) && DiffMA(idx)>0.0)
{
//--- the indicator is directed upwardsif(DiffOpenMA(idx)<0.0)
{
//--- the open price is below the indicator (i.e. there was an intersection)
result=m_pattern_2;
//--- suggest to enter the market at the "roll back"
m_base_price=m_symbol.NormalizePrice(MA(idx));
}
else
{
//--- the open price is above the indicatorif(DiffLowMA(idx)<0.0)
{
//--- the low price is below the indicator
result=m_pattern_2;
//--- consider that this is a formed "piercing" and suggest to enter the market at the current price
m_base_price=0.0;
}
}
}
}
//--- return the resultreturn(result);
}
//+------------------------------------------------------------------+//| "Voting" that price will fall. |//| INPUT: no. |//| OUTPUT: number of "votes" that price will fall. |//| REMARK: no. |//+------------------------------------------------------------------+int CSignalTEMA::ShortCondition()
{
int result=0;
int idx =StartIndex();
//--- analyze positional relationship of the close price and the indicator at the first analyzed barif(DiffCloseMA(idx)>0.0)
{
//--- the close price is above the indicatorif(IS_PATTERN_USAGE(1) && DiffOpenMA(idx)<0.0 && DiffMA(idx)<0.0)
{
//--- the open price is below the indicator (i.e. there was an intersection), but the indicator is directed downwards
result=m_pattern_1;
//--- consider that this is an unformed "piercing" and suggest to enter the market at the current price
m_base_price=0.0;
}
}
else
{
//--- the close price is below the indicator (the indicator has no objections to buying)if(IS_PATTERN_USAGE(0))
result=m_pattern_0;
//--- if the model 2 is usedif(IS_PATTERN_USAGE(2) && DiffMA(idx)<0.0)
{
//--- the indicator is directed downwardsif(DiffOpenMA(idx)<0.0)---------------------------------------->ДОЛЖЕН БЫТЬ ЗНАК "БОЛЬШЕ"!!!
{
//--- the open price is above the indicator (i.e. there was an intersection)
result=m_pattern_2;
//--- suggest to enter the market at the "roll back"
m_base_price=m_symbol.NormalizePrice(MA(idx));
}
else
{
//--- the open price is below the indicatorif(DiffHighMA(idx)>0.0)
{
//--- the high price is above the indicator
result=m_pattern_2;
//--- consider that this is a formed "piercing" and suggest to enter the market at the current price
m_base_price=0.0;
}
}
}
}
//--- return the resultreturn(result);
}
También en la biblioteca SignalMA en
int CSignalMA::ShortCondition()
{
.......
//--- analyze positional relationship of the close price and the indicator at the first analyzed barif(DiffCloseMA(idx)>0.0)
{
.......
}
else
{
//--- the close price is below the indicator (the indicator has no objections to buying)if(IS_PATTERN_USAGE(0))
result=m_pattern_0;
//--- if the model 2 is used
То что ниже не корректно:
if(DiffMA(idx)<0.0)
{
//--- the indicator is directed downwardsif(IS_PATTERN_USAGE(2) && DiffOpenMA(idx)<0.0)
{
.....
}
Последние 2 условия должны выглядеть так:
if(IS_PATTERN_USAGE(2) && DiffMA(idx)<0.0)
{
//--- the indicator is directed downwardsif(DiffOpenMA(idx)>0.0)
{
.....
}
No sé si es un bug, pero creo que hay errores en el código de las librerías para todos los tipos de muvings (SignalFrAMA, SignalAMA, SignalMA, SignalDEMA, SignalTEMA) para el maestro, ver CSignalTEMA::ShortCondition()
¿Cuál?
lo he probado en un par de indicadores. ambos solían funcionar bien, ahora no.
2) a menudo hay problemas al tratar de probar la ejecución con la conexión a los núcleos (funciona con la enésima ejecución). ver la imagen.
Un grupo de telépatas ya está investigando su problema.
no hace falta ser telépata para entender que iCustom() no funciona como debería.
para probarlo, puede ejecutar el código del Asesor Experto:
doble buffer[];
ResetLastError();
int MA_handle = iCustom(NULL, 0, "Examples\Custom Moving Average", 21, 0, MODE_SMMA);
//int MA_handle = iMA(NULL, 0, 21, 0, MODE_SMMA, PRICE_MEDIAN);
Print("MA_handle = ", MA_handle, " error = ", GetLastError());
int copia = CopyBuffer(MA_handle, 0, 0, 5, buffer);
if (copy == -1) Print("Failed to get Custom Moving Average indicator");
si no
for (int i = 0; i < 5; i++) Print("buffer[", i, "] = ", buffer[i];
y aparecerá el mensaje "Failed to get Custom Moving Average indicator values".
es decir, CopyBuffer da un error (devuelve -1) para el manejador del indicador iCustom(). si tomamos el indicador estándar iMA(), ¡el mismo código funciona!
Fíjate en la dirección de indexación del array resultante, quizá haya que ampliarlo.
todo esta bien con la direccion de indexacion y en builds anteriores tambien funcionaba. en 448 y 450 no funcionaba.
He sugerido muchas veces que los desarrolladores deberían probar más a fondo la funcionalidad principal del terminal,
pero de compilación a compilación obtienen diferentes errores críticos en lugar de críticos.
Es decir, se arregla una cosa y se rompe otra que normalmente funcionaba y no se ve el final. Supongo que nunca veré llegar una versión estable (((
El deslizamiento antes de copiar los datos, tarda en calcular el indicador, por lo que aunque la manivela vuelve correctamente, los datos aún no se han calculado,
En general, se recomienda llamar a los indicadores en el inite, y solicitar los datos ya en OnTick() u otras funciones especiales.
De nuevo, copias 5 datos de la barra cero, pero en el copybuffer la barra cero está en algún lugar alrededor de 1970 (depende de la configuración de la barra máxima), por eso dije que miraras la indexación del array.
El deslizamiento antes de copiar los datos, tarda en calcular el indicador, por lo que aunque la manija vuelve correctamente, los datos aún no se han calculado.
Sleep(1000); // 1 segundo después de llamar a iCustom() ayudó, PERO. ¿Debo recoger ahora el tiempo de retardo? ¿Cómo puedo saber cuánto tiempo durará el proceso de cálculo?
es incorrecto dar la manija correcta del indicador apuntando a la basura ! y debe haber funcionado correctamente antes porque no había tal problema.
en general, se recomienda llamar a los indicadores en el initis, y pedir los datos ya en OnTick() u otras funciones especiales.
Es un buen consejo para mí, gracias ) porque si lo hubiera hecho así, no habría visto el problema...
De nuevo estás copiando 5 datos de la barra cero, pero en copyBuffer la barra cero está en algún lugar alrededor de 1970 (depende de la configuración de la barra máxima), por eso dije que miraras la indexación del array.
Por lo que entiendo de la documentación de ayuda, en CopyBuffer() la barra cero es en realidad "tiempo presente", y ya al copiarla, el array se expande.
Sleep(1000); // 1 seg. después de llamar a iCustom() ayudó, PERO... ¿debo recoger ahora el tiempo de retardo? ¿cómo se supone que debo saber cuánto tiempo durará el proceso de cálculo?
es incorrecto dar el mango indicador correcto indicando la basura ! y debe haber funcionado correctamente antes, porque no había tal problema.
¿Pueden establecerse las siguientes opciones del indicador (marcadas con un círculo rojo) de forma programada?
No he encontrado la manera de hacerlo.
No sé si es un bug, pero creo que hay errores en el código de las librerías para todos los tipos de muvings (SignalFrAMA, SignalAMA, SignalMA, SignalDEMA, SignalTEMA) para el maestro, verCSignalTEMA::ShortCondition()
También en la biblioteca SignalMA en
No sé si es un bug, pero creo que hay errores en el código de las librerías para todos los tipos de muvings (SignalFrAMA, SignalAMA, SignalMA, SignalDEMA, SignalTEMA) para el maestro, ver CSignalTEMA::ShortCondition()
También en la biblioteca SignalMA en
https://www.mql5.com/ru/forum/1111/page391#comment_67358
Da la línea completa de la llamada.
/i:<ruta a la carpeta MQL5>.
Dar la cadena de llamada completa.
Aquí están todas las opciones probadas:
Después de cada intento, se comprobaba si el archivo existía en la ruta
D:\Users\Дмитрий\AppData\Roaming\MetaQuotes\Terminal\44 D6FB562C883F0C70690F3306A3851D\MQL5\Scripts\sInstallerTestScript.ex5El intruso en el camino
D:\Users\Дмитрий\AppData\Roaming\MetaQuotes\Terminal\44 D6FB562C883F0C70690F3306A3851D\MQL5\Include\InstallerTestInclude\IncInstallerTest.mqhexiste.
La comprobación de la existencia fue realizada por la función: