Registró fuertemente el código de arriba y descubrió las razones. Si CopyTicks (desde > 0) obtiene ticks antes del más reciente, puede omitir algunos.
Una respuesta muy importante de Service Desk.
En cuanto al problema original - que CopyTicks en la siguiente llamada puede dar más ticks para el mismo período:
Así es. El problema es que los flujos de datos de la bolsa bid/ask y flipper/volumen son flujos diferentes, que no están sincronizados entre sí ya en el lado de la bolsa.
Debido a esto hay situaciones, cuando primero llega la oferta/compra con el tiempo 12:12:12.300, y más tarde llega el flipper/volumen con el tiempo 12:12:12.299.
En consecuencia, al solicitar datos desde el último tick (12:12:12.300) no obtendrá una nueva aleta para las 12:12:12.299.
PD: El terminal guarda y envía los ticks ordenados por tiempo. Es decir, la secuencia de tiempo de los ticks dados a CopyTicks es siempre creciente.
Hay dos flujos de recepción de ticks: INFO y TRADE. TODO es una unión sintetizada (parece que está en el lado del terminal), por eso pueden ocurrir estos percances.
Es por sintetizar que había tales palabras
Slawa:
los registros de ticks iniciales después de la llamada de CopyTicks no contendrán ceros, sino los valores actuales de bid, ask y last en el momento solicitado
Por lo tanto, cuando se trabaja con TODAS las garrapatas, hay que ser claramente consciente de lo que se está tratando. Es posible que las banderas de las garrapatas también se sinteticen. Me gustaría que se concretaran todas estas cuestiones.
Con la cinta este problema no debería surgir con el correcto funcionamiento de CopyTicks.
Creo que la ayuda se complementará muy seriamente.
fxsaber: Puede añadir cualquier sobrecarga usted mismo.
Yo puedo hacer mucho, tú puedes hacer mucho, otros programadores también pueden hacer mucho, pero es de esperar que los desarrolladores conozcan mejor el "relleno" y puedan crear algoritmos rápidos para obtener los ticks necesarios.
Registró fuertemente el código de arriba y descubrió las razones. Si CopyTicks (desde > 0) obtiene ticks hasta el más reciente, puede omitir 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 conflicto de escritura y lectura concurrente en la base de datos de ticks.
1434 es el mismo error para los tipos de comercio. Reproducción del Asesor Experto
#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(Res);
}
string GetTickFlag( uint tickflag )
{
string flag = "";
#define TICKFLAG_MACRO(A) flag += ((bool)(tickflag & TICK_FLAG_##A)) ? " TICK_FLAG_" + #A : "";
TICKFLAG_MACRO(BID)
TICKFLAG_MACRO(ASK)
TICKFLAG_MACRO(LAST)
TICKFLAG_MACRO(VOLUME)
TICKFLAG_MACRO(BUY)
TICKFLAG_MACRO(SELL)
#undef TICKFLAG_MACRO
if (flag == "")
flag = " FLAG_UNKNOWN (" + (string)tickflag + ")";
return(flag);
}
#define TOSTRING(A) " " + #A + " = " + (string)Tick.A
string TickToString( constMqlTick &Tick )
{
return(TOSTRING(time) + "." + (string)IntegerToString(Tick.time_msc %1000, 3, '0') +
TOSTRING(bid) + TOSTRING(ask) + TOSTRING(last)+ TOSTRING(volume) + GetTickFlag(Tick.flags));
}
#define TOSTRING2(A) #A + " = " + (string)(A) + " "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
{
Print(TOSTRING2(i) + TOSTRING2(ArraySize(Array1)) + TOSTRING2(ArraySize(Array2)));
Print(TOSTRING2(TickToString(Array1[i])) + "\n" + TOSTRING2(TickToString(Array2[i])) + "\n");
Print(TOSTRING2(TickToString(Array1[i - 1])) + "\n" + TOSTRING2(TickToString(Array2[i - 1])) + "\n");
Res = false;
ExpertRemove();
break;
}
return(Res);
}
voidOnTick( void )
{
staticbool FirstRun = true;
staticMqlTick PrevTicks[];
if (FirstRun)
{
LastTime = TimeCurrent() * 1000;
Count = 0;
FirstRun = false;
}
MqlTick Ticks[];
// Взяли свеженькие тикиconstint Amount = GetFreshTicks(Ticks);
ArrayCopy(PrevTicks, Ticks, ArraySize(PrevTicks));
if (ArraySize(PrevTicks) > 0)
{
MqlTick NewTicks[];
// Взяли историю тиковPrint(CopyTicks(_Symbol, NewTicks, COPY_TICKS_TRADE, PrevTicks[0].time_msc, 1000000));
// Проверка на совпадение собираемой истории с самой историейPrint(ArrayEqual(NewTicks, PrevTicks) ? "Equal" : "Not Equal");
}
}
Resultado
2016.10.0410:36:17.743 Test13 (RTS-12.16,M1) Not Equal
2016.10.0410:36:17.743 Test13 (RTS-12.16,M1) ExpertRemove() function called
2016.10.0410:36:17.743 Test13 (RTS-12.16,M1)
2016.10.0410:36:17.743 Test13 (RTS-12.16,M1) TickToString(Array2[i-1]) = time = 2016.10.0410:37:07.791 bid = 99680.0 ask = 99690.0 last = 99690.0 volume = 4TICK_FLAG_LASTTICK_FLAG_VOLUMETICK_FLAG_BUY2016.10.0410:36:17.743 Test13 (RTS-12.16,M1) TickToString(Array1[i-1]) = time = 2016.10.0410:37:07.791 bid = 99680.0 ask = 99690.0 last = 99690.0 volume = 4TICK_FLAG_LASTTICK_FLAG_VOLUMETICK_FLAG_BUY2016.10.0410:36:17.743 Test13 (RTS-12.16,M1)
2016.10.0410:36:17.743 Test13 (RTS-12.16,M1) TickToString(Array2[i]) = time = 2016.10.0410:37:07.791 bid = 99680.0 ask = 99690.0 last = 99690.0 volume = 4TICK_FLAG_LASTTICK_FLAG_VOLUMETICK_FLAG_BUY2016.10.0410:36:17.743 Test13 (RTS-12.16,M1) TickToString(Array1[i]) = time = 2016.10.0410:37:08.773 bid = 99690.0 ask = 99700.0 last = 99690.0 volume = 1TICK_FLAG_LASTTICK_FLAG_VOLUMETICK_FLAG_SELL2016.10.0410:36:17.743 Test13 (RTS-12.16,M1) i = 144ArraySize(Array1) = 145ArraySize(Array2) = 1462016.10.0410:36:17.743 Test13 (RTS-12.16,M1) 1452016.10.0410:36:16.768 Test13 (RTS-12.16,M1) Equal
El historial de ticks en tiempo real recopilado del hilo TRADE no contenía un tick con la hora 2016.10.04 10:37:08.773, que apareció más tarde en el historial.
Esto es algo incoherente con lo que he dicho más arriba. Los problemas no son sólo del flujo sintetizado, sino también del directo: el comercio.
¡Me gustaría aprovechar esta oportunidad para agradecer a los desarrolladores su trabajo con CopyTicks!
No puedo afirmar que CopyTicks funcione de forma absolutamente correcta, pero he conseguido trabajar con la cinta perfectamente y entender CopyTicks más profundamente.
Para no reinventar la rueda, puede ver ejemplos afinados de escritura de indicadores de tick basados en la cinta aquí y aquí.
1434 - 1ms de media tarda en llegar CopyTicks ya cargado 1000 ticks. Lento, parece.
Solicitar TRADE0tic con from_msc del último tick recibido anteriormente. ¡Obtengo 3 ticks, pero en 0.3 - 0.9ms! - Muy lento ahora.
Registró fuertemente el código de arriba y descubrió las razones. Si CopyTicks (desde > 0) obtiene ticks antes del más reciente, puede omitir algunos.
En cuanto al problema original - que CopyTicks en la siguiente llamada puede dar más ticks para el mismo período:
Así es. El problema es que los flujos de datos de la bolsa bid/ask y flipper/volumen son flujos diferentes, que no están sincronizados entre sí ya en el lado de la bolsa.
Debido a esto hay situaciones, cuando primero llega la oferta/compra con el tiempo 12:12:12.300, y más tarde llega el flipper/volumen con el tiempo 12:12:12.299.
En consecuencia, al solicitar datos desde el último tick (12:12:12.300) no obtendrá una nueva aleta para las 12:12:12.299.
PD: El terminal guarda y envía los ticks ordenados por tiempo. Es decir, la secuencia de tiempo de los ticks dados a CopyTicks es siempre creciente.
Hay dos flujos de recepción de ticks: INFO y TRADE. TODO es una unión sintetizada (parece que está en el lado del terminal), por eso pueden ocurrir estos percances.
Es por sintetizar que había tales palabras
los registros de ticks iniciales después de la llamada de CopyTicks no contendrán ceros, sino los valores actuales de bid, ask y last en el momento solicitado
Con la cinta este problema no debería surgir con el correcto funcionamiento de CopyTicks.
Creo que la ayuda se complementará muy seriamente.
Puede añadir cualquier sobrecarga usted mismo.
CopyTicks probados con la bandera COPY_TICKS_TRADE
No hay diferencia.
CopyTicks probados con la bandera COPY_TICKS_TRADE
No hay diferencia.
Foro sobre trading, sistemas de trading automatizados y comprobador de estrategias
Misterioso indicador de valores
fxsaber, 2016.09.30 21:26
1434 - el problema no se ha resuelto.
Registró fuertemente el código de arriba y descubrió las razones. Si CopyTicks (desde > 0) obtiene ticks hasta el más reciente, puede omitir 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 conflicto de escritura y lectura concurrente en la base de datos de ticks.
El historial de ticks en tiempo real recopilado del hilo TRADE no contenía un tick con la hora 2016.10.04 10:37:08.773, que apareció más tarde en el historial.
Esto es algo incoherente con lo que he dicho más arriba. Los problemas no son sólo del flujo sintetizado, sino también del directo: el comercio.
1434 es el mismo error para los tipos de comercio. Asesor de reproducción
1434 - 1ms de media tarda en llegar CopyTicks ya cargado 1000 ticks. Lento, parece.
Solicitar TRADE0tic con from_msc del último tick recibido anteriormente. ¡Obtengo 3 ticks, pero en 0.3 - 0.9ms! - Muy lento ahora.
¡Relevante! ¿No hay forma de acelerarlo?
¡Me gustaría aprovechar esta oportunidad para agradecer a los desarrolladores su trabajo con CopyTicks!
No puedo afirmar que CopyTicks funcione de forma absolutamente correcta, pero he conseguido trabajar con la cinta perfectamente y entender CopyTicks más profundamente.
Para no reinventar la rueda, puede ver ejemplos afinados de escritura de indicadores de tick basados en la cinta aquí y aquí.