Você está perdendo oportunidades de negociação:
- Aplicativos de negociação gratuitos
- 8 000+ sinais para cópia
- Notícias econômicas para análise dos mercados financeiros
Registro
Login
Você concorda com a política do site e com os termos de uso
Se você não tem uma conta, por favor registre-se
Não, infelizmente. Renat argumentou que o vidro é permanentemente transmitido para todo o relógio de mercado. Mas esta não é uma solução expedita (esbanjadora) para a maioria das situações.
É a única opção possível. As estacas em fluxo é um fluxo nativo e inseparável de carrapatos.
Tudo na plataforma está interligado e requer uma sincronização global de dados. E o fluxo de carrapatos desempenha um papel crucial nisto.
É a única opção possível. As taxas de fluxo é um fluxo nativo e inseparável de carrapatos.
Tudo na plataforma está interligado e requer uma sincronização global de dados. E o fluxo de carrapatos desempenha um papel fundamental neste contexto.
Bem, e se nenhuma EA for subscrita pelo BookEvent?
Você recomenda o corte MarketWatch para melhorar o desempenho?
Mas o mais importante, os cálculos da taxa de amostragem acima são irrelevantes. Elas são feitas de forma tão desajeitada (medindo tudo menos o tempo do CopyTicks), que é até surpreendente.
Bem, e se nenhuma EA for subscrita pelo BookEvent?
Você recomenda o corte do relógio Marketwatch para melhorar o desempenho?
Corte-o se quiser.
É assim que você testa o CopyTicks:
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
void OnTick()
{
ulong from =(TimeTradeServer()-1200)*1000;
ulong ticks =GetMicrosecondCount();
int records=CopyTicks(_Symbol,ExtArr,COPY_TICKS_INFO,from,2048);
ticks=GetMicrosecondCount()-ticks;
Print("Time: ",ticks," msc for ",records," records");
}
Aqui está a saída em microssegundos: 95 microssegundos por amostra de carrapatos 2048 INFO durante os últimos 20 minutos
Eu já comi o olho do meu gato sobre isso. Eu já fiz muitos testes com o CopyTicks. Desta vez, decidi que é suficiente executar o indicador.
Sua variante.
2016.10.18 14:29:11.966 Test14 (GBPUSD,M1) Time: 20263 msc for 2048 records
2016.10.18 14:29:10.841 Test14 (GBPUSD,M1) Time: 13190 msc for 2048 records
2016.10.18 14:29:07.788 Test14 (GBPUSD,M1) Time: 13344 msc for 2048 records
2016.10.18 14:29:07.738 Test14 (GBPUSD,M1) Time: 12751 msc for 2048 records
Trata-se de entrar em um esconderijo próximo para as últimas 4096 citações.
Qualquer coisa que entre nele leva microssegundos, e qualquer coisa mais longa requer acesso ao histórico (incluindo disco).
Por isso, meu exemplo de buscar carrapatos por 20 minutos em USDCHF, que raramente é atualizado, estava em cache, mas em GBPUSD, já ultrapassou os últimos 4096 carrapatos e teve que ir para o banco de dados distante.
Se eu definir ulong de =(TimeTradeServer()-600)*1000, então ele também caberá em GBPUSD.
Trata-se de entrar em um esconderijo próximo para as últimas 4096 citações.
Qualquer coisa que entre nele leva microssegundos, e qualquer coisa mais requer acesso ao histórico (incluindo disco).
Em sua demonstração, este é de fato o caso. Na BCS, não.
2016.10.18 15:12:32.949 Test14 (Si-12.16,M1) Time: 29089 msc for 1503 records
2016.10.18 15:12:32.822 Test14 (Si-12.16,M1) Time: 33207 msc for 1501 records
2016.10.18 15:12:32.639 Test14 (Si-12.16,M1) Time: 21389 msc for 1500 records
2016.10.18 15:12:31.959 Test14 (Si-12.16,M1) Time: 21926 msc for 1500 records
E na Alpari não é nada bom.
2016.10.18 15:14:47.159 Test14 (GBPUSD,M1) Time: 31086 msc for 1836 records
2016.10.18 15:14:46.999 Test14 (GBPUSD,M1) Time: 30698 msc for 1836 records
2016.10.18 15:14:46.779 Test14 (GBPUSD,M1) Time: 46306 msc for 1836 records
2016.10.18 15:14:46.612 Test14 (GBPUSD,M1) Time: 30440 msc for 1836 records
2016.10.18 15:14:46.532 Test14 (GBPUSD,M1) Time: 36227 msc for 1836 records
Portanto, meu exemplo de buscar carrapatos por 20 minutos em USDCHF raramente atualizado cabe no cache, mas para GBPUSD já ultrapassou os últimos 4096 carrapatos e me força a ir a um banco de dados distante.
Comentado acima sobre o inconveniente do copytix. O indicador apresentado está desacelerando devido ao fato de ser obrigado a chamar copyix várias vezes. E todos os atrasos são por causa disso. Aqui está a razão
Fórum sobre comércio, sistemas comerciais automatizados e estratégias comerciais de teste
Testando 'CopyTicks'.
fxsaber, 2016.10.11 19:23
Qual é o algoritmo ideal (mais rápido) para obter os carrapatos de_tempo_a_tempo?Uma solução foi proposta
Fórum sobre comércio, sistemas automatizados de comércio e testes de estratégia comercial
Testando 'CopyTicks'.
fxsaber, 2016.10.12 08:44
Quando o CopyTicks não é zero De dentro do CopyTicks está procurando (provavelmente uma busca binária) um lugar para começar - um índice na base interna.
Favor adicionar uma função que retorna o índice no banco de dados por tempo. Então esta tarefa será possível para resolver de forma ótima
Agora, para fazer o download de ticks entre datas, devemos fazer pedidos de número de ticks UNKNOWN, a partir da data de início. E depois verificar cada vez, se chegou à data final. E, levando em conta o fato de que cada pedido copytix é muito caro, e você recebe tais freios.
E na Alpari não é nada bom
A Alpari parece ter sido corrigida. A BCS não o fez.
Seria bom ter um cache dos dados copiados solicitados anteriormente. E se a cópia é feita em várias etapas (de[i] a[i+ 1]), seria lógico fazer o cache de muito depois da primeira solicitação.
Em suma, não está claro como a função é organizada internamente. Mas é difícil trabalhar com ele - 100%.
int Count = 0; // Количество тиков в последенем запросе, у которых time_msc == LastTime
// Возвращает свежие тики, пришедшие после предыдущего вызова
int GetFreshTicks( MqlTick &Ticks[], const uint flags = COPY_TICKS_INFO, const uint count = 2000 )
{
int Res = 0;
MqlTick NewTicks[];
const int NewAmount = CopyTicks(Symbol(), NewTicks, flags, LastTime, count);
if ((NewAmount > 0) && (Count < NewAmount))
{
Res = ArrayCopy(Ticks, NewTicks, 0, Count);
// Взяли крайнее время из текущей истории
LastTime = NewTicks[NewAmount - 1].time_msc;
Count = 1;
// Находим (Count) в текущей истории количество тиков со временем LastTime
for (int i = NewAmount - 2; i >= 0; i--)
{
if (NewTicks[i].time_msc < LastTime)
break;
Count++;
}
}
return(Res);
}
#define TOSTRING(A) " " + #A + " = " + (string)(A)
void OnTick( void )
{
// возьмем тики с начала утренней сессии
LastTime = (TimeCurrent() - (TimeCurrent() % (24 * 3600))) * 1000;
MqlTick Ticks[];
int i = 0;
int Sum = 0;
const ulong StartTime =GetMicrosecondCount();
// Взяли свеженькие тики
int Amount = GetFreshTicks(Ticks);
while (Amount > 0)
{
Sum += Amount;
i++;
Print(TOSTRING(i) + TOSTRING(Amount) + TOSTRING(Sum) + TOSTRING(GetMicrosecondCount() - StartTime));
// Взяли свеженькие тики
Amount = GetFreshTicks(Ticks);
}
}
2016.10.18 16:06:18.744 Test15 (GBPUSD,M1) i = 39 Amount = 1999 Sum = 77961 GetMicrosecondCount()-StartTime = 584314
2016.10.18 16:06:18.729 Test15 (GBPUSD,M1) i = 38 Amount = 1999 Sum = 75962 GetMicrosecondCount()-StartTime = 568509
2016.10.18 16:06:18.714 Test15 (GBPUSD,M1) i = 37 Amount = 1999 Sum = 73963 GetMicrosecondCount()-StartTime = 552582
2016.10.18 16:06:18.696 Test15 (GBPUSD,M1) i = 36 Amount = 1999 Sum = 71964 GetMicrosecondCount()-StartTime = 536790
2016.10.18 16:06:18.681 Test15 (GBPUSD,M1) i = 35 Amount = 1999 Sum = 69965 GetMicrosecondCount()-StartTime = 520432
2016.10.18 16:06:18.666 Test15 (GBPUSD,M1) i = 34 Amount = 1999 Sum = 67966 GetMicrosecondCount()-StartTime = 504725
2016.10.18 16:06:18.649 Test15 (GBPUSD,M1) i = 33 Amount = 1999 Sum = 65967 GetMicrosecondCount()-StartTime = 488911
2016.10.18 16:06:18.634 Test15 (GBPUSD,M1) i = 32 Amount = 1999 Sum = 63968 GetMicrosecondCount()-StartTime = 473372
2016.10.18 16:06:18.619 Test15 (GBPUSD,M1) i = 31 Amount = 1999 Sum = 61969 GetMicrosecondCount()-StartTime = 458022
2016.10.18 16:06:18.604 Test15 (GBPUSD,M1) i = 30 Amount = 1999 Sum = 59970 GetMicrosecondCount()-StartTime = 442557
2016.10.18 16:06:18.589 Test15 (GBPUSD,M1) i = 29 Amount = 1999 Sum = 57971 GetMicrosecondCount()-StartTime = 427044
2016.10.18 16:06:18.571 Test15 (GBPUSD,M1) i = 28 Amount = 1999 Sum = 55972 GetMicrosecondCount()-StartTime = 411524
2016.10.18 16:06:18.556 Test15 (GBPUSD,M1) i = 27 Amount = 1999 Sum = 53973 GetMicrosecondCount()-StartTime = 396539
2016.10.18 16:06:18.541 Test15 (GBPUSD,M1) i = 26 Amount = 1999 Sum = 51974 GetMicrosecondCount()-StartTime = 381185
2016.10.18 16:06:18.526 Test15 (GBPUSD,M1) i = 25 Amount = 1999 Sum = 49975 GetMicrosecondCount()-StartTime = 366146
2016.10.18 16:06:18.511 Test15 (GBPUSD,M1) i = 24 Amount = 1999 Sum = 47976 GetMicrosecondCount()-StartTime = 351066
2016.10.18 16:06:18.496 Test15 (GBPUSD,M1) i = 23 Amount = 1999 Sum = 45977 GetMicrosecondCount()-StartTime = 336183
2016.10.18 16:06:18.481 Test15 (GBPUSD,M1) i = 22 Amount = 1999 Sum = 43978 GetMicrosecondCount()-StartTime = 321109
2016.10.18 16:06:18.466 Test15 (GBPUSD,M1) i = 21 Amount = 1999 Sum = 41979 GetMicrosecondCount()-StartTime = 306119
2016.10.18 16:06:18.449 Test15 (GBPUSD,M1) i = 20 Amount = 1999 Sum = 39980 GetMicrosecondCount()-StartTime = 288558
2016.10.18 16:06:18.434 Test15 (GBPUSD,M1) i = 19 Amount = 1999 Sum = 37981 GetMicrosecondCount()-StartTime = 273758
2016.10.18 16:06:18.419 Test15 (GBPUSD,M1) i = 18 Amount = 1999 Sum = 35982 GetMicrosecondCount()-StartTime = 259255
2016.10.18 16:06:18.406 Test15 (GBPUSD,M1) i = 17 Amount = 1999 Sum = 33983 GetMicrosecondCount()-StartTime = 244750
2016.10.18 16:06:18.391 Test15 (GBPUSD,M1) i = 16 Amount = 1999 Sum = 31984 GetMicrosecondCount()-StartTime = 230100
2016.10.18 16:06:18.371 Test15 (GBPUSD,M1) i = 15 Amount = 1999 Sum = 29985 GetMicrosecondCount()-StartTime = 216143
2016.10.18 16:06:18.361 Test15 (GBPUSD,M1) i = 14 Amount = 1999 Sum = 27986 GetMicrosecondCount()-StartTime = 201830
2016.10.18 16:06:18.346 Test15 (GBPUSD,M1) i = 13 Amount = 1999 Sum = 25987 GetMicrosecondCount()-StartTime = 186887
2016.10.18 16:06:18.331 Test15 (GBPUSD,M1) i = 12 Amount = 1999 Sum = 23988 GetMicrosecondCount()-StartTime = 172667
2016.10.18 16:06:18.311 Test15 (GBPUSD,M1) i = 11 Amount = 1999 Sum = 21989 GetMicrosecondCount()-StartTime = 158356
2016.10.18 16:06:18.299 Test15 (GBPUSD,M1) i = 10 Amount = 1999 Sum = 19990 GetMicrosecondCount()-StartTime = 143450
2016.10.18 16:06:18.289 Test15 (GBPUSD,M1) i = 9 Amount = 1999 Sum = 17991 GetMicrosecondCount()-StartTime = 128520
2016.10.18 16:06:18.269 Test15 (GBPUSD,M1) i = 8 Amount = 1999 Sum = 15992 GetMicrosecondCount()-StartTime = 114209
2016.10.18 16:06:18.256 Test15 (GBPUSD,M1) i = 7 Amount = 1999 Sum = 13993 GetMicrosecondCount()-StartTime = 100016
2016.10.18 16:06:18.246 Test15 (GBPUSD,M1) i = 6 Amount = 1999 Sum = 11994 GetMicrosecondCount()-StartTime = 85745
2016.10.18 16:06:18.231 Test15 (GBPUSD,M1) i = 5 Amount = 1999 Sum = 9995 GetMicrosecondCount()-StartTime = 71438
2016.10.18 16:06:18.219 Test15 (GBPUSD,M1) i = 4 Amount = 1999 Sum = 7996 GetMicrosecondCount()-StartTime = 57293
2016.10.18 16:06:18.204 Test15 (GBPUSD,M1) i = 3 Amount = 1999 Sum = 5997 GetMicrosecondCount()-StartTime = 43192
2016.10.18 16:06:18.181 Test15 (GBPUSD,M1) i = 2 Amount = 1999 Sum = 3998 GetMicrosecondCount()-StartTime = 28943
2016.10.18 16:06:18.171 Test15 (GBPUSD,M1) i = 1 Amount = 1999 Sum = 1999 GetMicrosecondCount()-StartTime = 15160
80K carrapatos em meio segundo é lento! Dizer que era necessário solicitar não 2000 carrapatos de cada vez, mas mais, é claro, é possível. Que valor de solicitação é ótimo então?
É ideal fazer o download do que você precisa no fundo para si mesmo uma vez, e depois só fazer o download de novos a partir do cache próximo em microssegundos.
Se cada vez que você fizer perguntas profundas com a queda para o disco, então é claro que a culpa é sua.