Registramos fortemente o código acima e descobrimos as razões. Se o CopyTicks (de > 0) recebe carrapatos antes do mais fresco, pode pular alguns.
Uma resposta muito importante do Service Desk.
Em relação ao problema original - que o CopyTicks na próxima chamada pode dar mais carrapatos para o mesmo período:
Este é, de fato, o caso. O problema é que os fluxos de troca de dados bid/ask e flipper/volume são fluxos diferentes, que não estão sincronizados entre si já no lado da troca.
Por causa disso, há situações em que, pela primeira vez, o lance/venda com o tempo 12:12:12.12.300, e depois vem o flipper/volume com o tempo 12:12:12.299.
Assim, solicitando dados desde o último tick (12:12:12.300) você não receberá um novo flipper para 12:12:12.12.299.
PS. O terminal salva e envia carrapatos ordenados por tempo. Ou seja, a seqüência temporal de ticks dada ao CopyTicks está sempre aumentando.
Há duas correntes de recebimento de carrapatos - INFO e TRADE. ALL é uma união sintetizada (parece estar no lado terminal), é por isso que tais contratempos podem ocorrer.
É por causa da sintetização que existem tais palavras
Slawa:
os registros iniciais de tick após a chamada do CopyTicks não conterão zeros, mas os valores atuais de licitação, pedido e último no momento solicitado
Portanto, ao trabalhar com TODOS os carrapatos, você precisa ser claro sobre o que você está lidando. Também é possível que as bandeiras de seleção sejam sintetizadas. Eu gostaria de ter uma especificidade total sobre estas questões.
Com a fita, este problema não deve surgir se o CopyTicks funcionar corretamente.
Penso que a Ajuda será muito seriamente complementada.
fxsaber: Você mesmo pode acrescentar qualquer sobrecarga.
Eu posso fazer muito, você pode fazer muito, outros programadores também podem fazer muito, mas espero que os desenvolvedores conheçam melhor o "recheio" e possam criar algoritmos rápidos para obter os carrapatos necessários.
Registramos fortemente o código acima e descobrimos as razões. Se o CopyTicks (de > 0) recebe carrapatos até os mais frescos, pode pular alguns.
Exemplo.
Carrapatos solicitados a partir de = 2016.09.29 11:05:55.564. Recebi três carrapatos em resposta
Algum tempo depois eu pedi o histórico do tick de longe e recebi um tick, que o CopyTicks perdeu antes.
Que insecto!
Parece haver algum conflito de escrita e leitura simultâneas no banco de dados de carrapatos.
1434 é o mesmo bug para os tipos TRADE-tipos. Consultor especialista em reprodução
#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
O histórico coletado do tick em tempo real do tópico TRADE não continha um tick com o tempo 2016.10.04 10:37:08.773, que apareceu mais tarde na história.
Isto é um tanto inconsistente com o que eu disse acima. Os problemas não são apenas com o fluxo sintetizado de TODOS, mas também com o fluxo direto - TRADE.
Gostaria de aproveitar esta oportunidade para agradecer aos desenvolvedores por seu trabalho com o CopyTicks!
Não posso afirmar que o CopyTicks funciona absolutamente corretamente, mas consegui trabalhar com a fita perfeitamente e entender o CopyTicks mais profundamente.
Para não reinventar a roda, você pode ver exemplos de indicadores de carrapatos de escrita bem ajustados baseados na fita aqui e aqui.
1434 - 1ms em média leva para que o CopyTicks já tenha carregado 1000 ticks. Devagar, ao que parece.
Solicitando TRADE0tic com from_msc do último tick recebido anteriormente. Recebo 3 carrapatos, mas em 0,3 - 0,9ms! - Muito lento agora.
Registramos fortemente o código acima e descobrimos as razões. Se o CopyTicks (de > 0) recebe carrapatos antes do mais fresco, pode pular alguns.
Em relação ao problema original - que o CopyTicks na próxima chamada pode dar mais carrapatos para o mesmo período:
Este é, de fato, o caso. O problema é que os fluxos de troca de dados bid/ask e flipper/volume são fluxos diferentes, que não estão sincronizados entre si já no lado da troca.
Por causa disso, há situações em que, pela primeira vez, o lance/venda com o tempo 12:12:12.12.300, e depois vem o flipper/volume com o tempo 12:12:12.299.
Assim, solicitando dados desde o último tick (12:12:12.300) você não receberá um novo flipper para 12:12:12.12.299.
PS. O terminal salva e envia carrapatos ordenados por tempo. Ou seja, a seqüência temporal de ticks dada ao CopyTicks está sempre aumentando.
Há duas correntes de recebimento de carrapatos - INFO e TRADE. ALL é uma união sintetizada (parece estar no lado terminal), é por isso que tais contratempos podem ocorrer.
É por causa da sintetização que existem tais palavras
os registros iniciais de tick após a chamada do CopyTicks não conterão zeros, mas os valores atuais de licitação, pedido e último no momento solicitado
Com a fita, este problema não deve surgir se o CopyTicks funcionar corretamente.
Penso que a Ajuda será muito seriamente complementada.
Você mesmo pode acrescentar qualquer sobrecarga.
Testes com a bandeira COPY_TICKS_TRADE
Não há diferença.
Testes com a bandeira COPY_TICKS_TRADE
Não há diferença.
Fórum sobre comércio, sistemas automatizados de comércio e testador de estratégias
Indicador de estoque misterioso
fxsaber, 2016.09.30 21:26
1434 - o problema não foi resolvido.
Registramos fortemente o código acima e descobrimos as razões. Se o CopyTicks (de > 0) recebe carrapatos até os mais frescos, pode pular alguns.
Exemplo.
Carrapatos solicitados a partir de = 2016.09.29 11:05:55.564. Recebi três carrapatos em resposta
Algum tempo depois eu pedi o histórico do tick de longe e recebi um tick, que o CopyTicks perdeu antes.
Que insecto!
Parece haver algum conflito de escrita e leitura simultâneas no banco de dados de carrapatos.
O histórico coletado do tick em tempo real do tópico TRADE não continha um tick com o tempo 2016.10.04 10:37:08.773, que apareceu mais tarde na história.
Isto é um tanto inconsistente com o que eu disse acima. Os problemas não são apenas com o fluxo sintetizado de TODOS, mas também com o fluxo direto - TRADE.
1434 é o mesmo bug para os tipos TRADE-tipos. Conselheiro de reprodução
1434 - 1ms em média leva para que o CopyTicks já tenha carregado 1000 ticks. Devagar, ao que parece.
Solicitando TRADE0tic com from_msc do último tick recebido anteriormente. Recebo 3 carrapatos, mas em 0,3 - 0,9ms! - Muito lento agora.
Relevante! Não há como acelerá-lo?
Gostaria de aproveitar esta oportunidade para agradecer aos desenvolvedores por seu trabalho com o CopyTicks!
Não posso afirmar que o CopyTicks funciona absolutamente corretamente, mas consegui trabalhar com a fita perfeitamente e entender o CopyTicks mais profundamente.
Para não reinventar a roda, você pode ver exemplos de indicadores de carrapatos de escrita bem ajustados baseados na fita aqui e aqui.