fxsaber: Si uno necesita SOLO la cinta (COPY_TICKS_TRADE - time_msc, last, volume and flags), esta solución es completamente adecuada - no se han detectado errores.
No se ha encontrado ningún fallo. Otro error revelado
Todos los frenos parecen estar activados cuando la entrada de CopyTicks no es cero.
Parece que la implementación de CopyTicks en este modo es muy torcida, incluso si se solicitan los ticks desde la última llamada. Parece que debería volar, pero no lo hace.
He podido localizar uno de los errores que causan divergencias en el indicador. Se trata de nuevo de CopyTicks.
Resulta que si recogemos la historia de las garrapatas por partes, puede no coincidir con la historia real. El Asesor Experto lo muestra
#include <TypeToBytes.mqh> // https://www.mql5.com/ru/code/16280long LastTime = 0; // time_msc-время последнего тика (самого свежего), полученного из историиint Count = 0; // Количество тиков в последенем запросе, у которых time_msc == LastTime// Возвращает следующие тики (после предыдущего вызова)int GetFreshTicks( MqlTick &Ticks[], constuint flags = COPY_TICKS_TRADE, constuint count = 100000 )
{
int Res = 0;
MqlTick NewTicks[];
constint NewAmount = CopyTicks(Symbol(), NewTicks, flags, LastTime, count);
if ((NewAmount > 0) && (Count < NewAmount))
{
Res = ArrayCopy(Ticks, NewTicks, 0, Count);
// Взяли крайнее время из текущей истории
LastTime = Ticks[Res - 1].time_msc;
Count = 1;
// Находим (Count) в текущей истории количество тиков со временем LastTimefor (int i = Res - 2; i >= 0; i--)
{
if (Ticks[i].time_msc < LastTime)
break;
Count++;
}
}
return(ArrayResize(Ticks, Res));
}
// Сравнение двух массивовtemplate <typename T>
bool ArrayEqual( const T &Array1[], const T &Array2[] )
{
constint Amount = MathMin(ArraySize(Array1), ArraySize(Array2));
bool Res = (Amount > 0);
if (Res)
for (int i = 0; i < Amount; i++)
if (_R(Array1[i]) != Array2[i]) // https://www.mql5.com/ru/code/16280
{
Res = false;
ExpertRemove();
break;
}
return(Res);
}
voidOnTick()
{
// возьмем тики с начала утренней сессии
Count = 0;
LastTime = (TimeCurrent() - (TimeCurrent() % (24 * 3600))) * 1000;
MqlTick Ticks[]; // История, собранная по частямMqlTick NewTicks[]; // массив для следующей части тиков// Собираем историю по частям while (GetFreshTicks(NewTicks, COPY_TICKS_TRADE, 100000) > 0)
ArrayCopy(Ticks, NewTicks, ArraySize(Ticks));
if (ArraySize(Ticks) > 0)
{
// Взяли ВСЮ историю тиковPrint(CopyTicks(_Symbol, NewTicks, COPY_TICKS_TRADE, Ticks[0].time_msc, 10000000)); // 10000000 - большое число, чтобы все выкачать.// Проверка на совпадение собранной по частям истории с самой историейPrint(ArrayEqual(NewTicks, Ticks) ? "Equal" : "Not Equal");
}
}
El resultado
2016.09.3016:02:54.661 Test (Si-12.16,M1) Not Equal
2016.09.3016:02:54.661 Test (Si-12.16,M1) ExpertRemove() function called2016.09.3016:02:54.621 Test (Si-12.16,M1) 3337402016.09.3016:02:54.121 Test (Si-12.16,M1) Equal
2016.09.3016:02:54.071 Test (Si-12.16,M1) 3337362016.09.3016:02:53.791 Test (Si-12.16,M1) Equal
2016.09.3016:02:53.741 Test (Si-12.16,M1) 333723
Este EA también muestra un error débil. He descubierto que a la historia recopilada por partes le pueden faltar algunas partes que duran varios minutos. Sólo que no se ha inventado una reproducción concisa y clara en forma de código. Y no tiene sentido publicar los complejos, porque nadie va a mirar.
En general, no hay manera de vencer los errores en CopyTicks. Y tenga en cuenta que el Asesor Experto trabaja en modo cinta (COPY_TICKS_TRADE). Por lo tanto, no puede funcionar ni siquiera con cinta.
Hoy prometen una nueva construcción para la demostración. Por eso tengo que esperar.
Espero que se corrija CopyTicks().
Por cierto, desde que apareció CopyTicks() pedí a los desarrolladores que añadieran la función de sobrecarga como en otras funciones Copy...(). Me dijeron que lo harían. И... el silencio...
Por cierto, desde que apareció CopyTicks(), pedí a los desarrolladores que añadieran la función de sobrecarga, como para otras funciones Copy...(). Me dijeron que lo harían. И... el silencio...
Si uno necesita SOLO la cinta (COPY_TICKS_TRADE - time_msc, last, volume and flags), esta solución es completamente adecuada - no se han detectado errores.
Foro sobre comercio, sistemas de comercio automatizados y prueba de estrategias de comercio
Misterioso indicador de valores
fxsaber, 2016.09.27 18:32
Todos los frenos parecen estar activados cuando la entrada de CopyTicks no es cero.
Parece que la implementación de CopyTicks en este modo es muy torcida, incluso si se solicitan los ticks desde la última llamada. Parece que debería volar, pero no lo hace.
Esperad a la beta de esta semana, en la que hemos introducido una serie de mejoras en las actualizaciones de ticks y tumblr.
1432 - Muchos errores resueltos. Gracias.
Pero no todos.
Si se compara el historial añadido con el real, hay discrepancias en el modo COPY_TICKS_ALL (TRADE e INFO - no hay problema). EA
Resultado
Pero no todos.
Si se compara el historial añadido con el real, hay discrepancias en el modo COPY_TICKS_ALL (TRADE e INFO - no hay problema). EA
Resultado
He registrado el código anterior y he descubierto las razones. Si CopyTicks (desde > 0) recibe los ticks hasta el más reciente, puede perder algunos.
Ejemplo.
Ticks solicitados con from = 2016.09.29 11:05:55.564. Obtuve tres ticks en respuesta
Algún tiempo después he solicitado el historial de gar rapatas desde lejos y he obtenido una garrapata, que CopyTicks pasó por alto antes
¡Qué bicho!
Parece que hay algún tipo de conflicto al escribir y leer de la base de datos de ticks en paralelo.
Foro sobre comercio, sistemas de comercio automatizados y prueba de estrategias de comercio
Misterioso indicador de valores
fxsaber, 2016.09.30 15:09
He podido localizar uno de los errores que causan divergencias en el indicador. Se trata de nuevo de CopyTicks.
Resulta que si recogemos la historia de las garrapatas por partes, puede no coincidir con la historia real. El Asesor Experto lo muestra
El resultado
Este EA también muestra un error débil. He descubierto que a la historia recopilada por partes le pueden faltar algunas partes que duran varios minutos. Sólo que no se ha inventado una reproducción concisa y clara en forma de código. Y no tiene sentido publicar los complejos, porque nadie va a mirar.
En general, no hay manera de vencer los errores en CopyTicks. Y tenga en cuenta que el Asesor Experto trabaja en modo cinta (COPY_TICKS_TRADE). Por lo tanto, no puede funcionar ni siquiera con cinta.
Otro error, ahora en todos los modos COPY_TICKS_*
¿Has probado a obtener ticks tanto a partir de un punto como de un número determinado, por ejemplo, fijo?
Por el código, parece un número determinado (100000) desde el último momento. Y qué pasa si sólo tienes N garrapatas. ¿También habrá saltos?
Permítame decirle de inmediato que yo mismo no he experimentado mucho con las garrapatas...
¿Has probado a obtener ticks tanto a partir de un punto como de un número determinado, por ejemplo, fijo?
Por el código, parece un número determinado (100000) desde el último momento. Y qué pasa si sólo tienes N garrapatas. ¿Habrá también saltos?
Permítame decirle de inmediato que yo mismo no he experimentado mucho con las garrapatas...
Lo he probado.
Hoy prometen una nueva construcción para la demo. Así que tenemos que esperar.
Lo he probado.
Hoy prometen una nueva construcción para la demostración. Por eso tengo que esperar.
Espero que se corrija CopyTicks().
Por cierto, desde que apareció CopyTicks() pedí a los desarrolladores que añadieran la función de sobrecarga como en otras funciones Copy...(). Me dijeron que lo harían. И... el silencio...
Por cierto, desde que apareció CopyTicks(), pedí a los desarrolladores que añadieran la función de sobrecarga, como para otras funciones Copy...(). Me dijeron que lo harían. И... el silencio...