Tema interessante para muitos: o que há de novo em MetaTrader 4 e MQL4 - grandes mudanças no caminho - página 66

 
Mischek:
Bem, não vai haver.

O que não acontecerá exactamente? Corresponder, ou as suas consequências automáticas?

Seja mais específico... ;)

 
MetaDriver:

O que não acontecerá exactamente? Corresponder, ou as suas consequências automáticas?

Seja específico, por favor... ;)

Não haverá lições, é o que é. :)
 
MetaDriver:

O que não acontecerá exactamente? Corresponder, ou as suas consequências automáticas?

Seja específico, por favor... ;)

As suas consequências exageradas.
 
MetaDriver:

O que é que não vai acontecer exactamente?

Não vai haver nada. Um grande metatarraxador. E silêncio).
 
MetaDriver:

A introdução em massa do Matching em plataformas MT5 pode, em certo sentido, tornar-se uma "bomba" de mercado, porque teoricamente poderia levar a uma "revolução anti-mercado" no mercado Forex num futuro muito próximo. Talvez o termo "revolução" seja um exagero, talvez não, porque qualquer comerciante será capaz de comercializar (influenciar os preços). Com a propagação em massa de agregadores nativos cobrindo segmentos significativos do mercado mundial.... a era do (bem, quase) poder monopolista dos fornecedores de liquidez sobre os preços das divisas pode (poderia) acabar para sempre.

Neste contexto, surge a questão "epocal": Os comerciantes estão prontos para a "nova era"? Que ferramentas regulares têm as "massas gerais de comerciantes" para testar, optimizar e depurar algoritmos de propagação?

Nenhuma.

O formato da base de cotação não deixa a possibilidade de a utilizar para testar e optimizar estratégias HFT usando ordens limite (que são todos os algoritmos de propagação).

Concordo com isso. Apenas um contra-argumento: O formato actual das citações é tão idiota para estratégias de fuga como para estratégias invertidas, mas não é possível corrigi-lo por um método tão simples como este. Pode curar pelo menos uma classe de estratégias, enquanto que na situação que se avizinha toma uma "forma dramática" (ver acima). E as outras estratégias não sofrerão! Se o vir, dê-me um exemplo de uma classe de estratégias para a qual modificar a propagação da forma proposta tornará os testes/optimização menos realistas.

De facto, o testador ainda está no sentido do tickwise, por isso é apenas uma questão de formato da história. E também a possibilidade de utilizar "citações não padronizadas", se necessário.
MetaDriver:

Estou a tentar "olhar um pouco mais à volta da curva" // Tudo o que escreveu está correcto.

A "criação do mercado de massas", precisamente devido ao desencadeamento dos cenários descritos por si, pode eventualmente levar à perda da posição de "permutador universal" pelo dólar. Esta é uma consequência simples de um colapso dos spreads sobre "menores". O mercado de divisas tornar-se-á mais dinâmico e eficiente. E são os sistemas comerciais baseados na previsão (e não na manipulação de preços) que irão beneficiar. Para mim, qualquer regulação não-mercantil das taxas de câmbio está repleta de grandes abusos. Não importa quão nobres sejam os objectivos declarados - há sempre a possibilidade de monetização do informador e é uma tolice assumir que quaisquer mecanismos legais podem opor-se-lhe.

Em suma - estou interessado em "Forex honesto", talvez pessoalmente não beneficie financeiramente de tal reversão (ou talvez beneficie). Mas se perder, pelo menos saberei que perdi porque desenvolvi um algoritmo idiota, e não porque fui "enganado".

Por agora não há comentários. Não tenho visto uma única estratégia lucrativa que negoceie um lote constante apenas em paragens. Nem um único. Teoricamente, é muito compreensível. ( Afirmar que tais estratégias existem é afirmar que existe qualquer horizonte de negociação em que a volatilidade H é consistentemente superior a 2,0) Todas as estratégias de tendência que vi a funcionar são preenchidas usando ordens de mercado ou entrando/saindo em pullbacks usando limitadores (ou market puts). Para os mercados highAsk/lowBid a história não é mais valiosa do que LowAsk/HighBid. Para eles a informação importante é antes sobre o spread em todos os pontos do bar OHLC.

Finalmente vem o entendimento de que meias-medidas como HighBid+LowAsk não serão suficientes para fazer um testador adequado.

 
Urain:

Finalmente é evidente que meias medidas como HighBid+LowAsk não serão suficientes para tornar o testador adequado.

Se estás a tirar tal conclusão do que escrevi... então também não se percebe)
 
TheXpert:
Se é essa a conclusão que está a tirar do que escrevi... ...então também não compreende).

O que é que vai fazer?! Ele vai entrar, dizer algumas palavras, e pronto, um par de noites sem dormir está garantido. )

O posto não era para mim, mas também não vou dormir.

 
MetaDriver:

( argumentar que estes existem é argumentar que existem quaisquer horizontes comerciais onde a volatilidade H é consistentemente superior a 2,0 )

bem, isso é um graal de uma tendência. Também não é consistentemente inferior a 2x. Não existem tais instrumentos em que a volatilidade H ao longo de toda a série seja constantemente inferior ou superior a 2. Em segmentos separados/em momentos separados. Saber quando negociar uma tendência, quando negociar um retorno. Filtrar o bazar))
 
hrenfx:

Precisava de melhorar o meu testador para uma nova profissão. Para compreender o código do antigo foi mais tempo perdido (matei várias semanas - abordagens ocasionais), do que para escrever um novo.

Assim, levei 5 horas (com depuração) para escrever um novo testador a partir do zero. O seu desempenho (satisfatório para mim como titular):

  • Funciona com M1 HighBid + LowAsk (os resultados são mais precisos do que em MT5-tester).
  • Um símbolo.
  • Velocidade (i7 2700K) cerca de 100.000.000 barras por segundo (277 anos FOREX por segundo) no teste TS - não vazio, muitas coisas são calculadas. Constantemente no mercado.
  • Sem MM - sem lotes.
  • Lucro apenas em pips.
  • O comerciante tem a possibilidade de controlar o escorregamento e a comissão.
  • Optimizer com os seus próprios critérios de optimização - para cada um deles abre o seu próprio ficheiro (pode levar muitos GB) com cadeias ordenadas de ofícios.
  • Não há verificações de erro no testador - conheço todas as nuances do meu testador, por isso não o permito.
  • O TS está escrito num MQL4 ligeiramente abreviado - todas as coisas desnecessárias foram removidas. Mas pode usar todo o poder do C++.
  • O provador é escrito sem OOP - não sei como fazê-lo de forma competente. Portanto, é praticamente uma língua C pura.
  • Código fonte em C++ livre~ 20Kb.
  • As paragens e os mercados foram expulsos (OrderClose foi deixado) - não foi necessário.
  • Cada execução (por escolha - especificar número de execução) pode ser visualizada e estudada no pacote matemático - o ficheiro de alterações de Equidade e Equilíbrio é escrito de forma simples.
  • Sem genética.
  • Não OpenCL - não o pode fazer.
  • Com uma única rosca. Carrega todos os núcleos estúpidos - múltiplos optimizadores executados manualmente.
  • Aplicação de consola.
  • Os parâmetros de entrada TC, as configurações do testador e as gamas de optimização são definidos em ficheiro.
  • TC é compilado em conjunto com o testador num ficheiro EXE.
  • Antes do início, existem apenas três ficheiros: EXE, histórico, definições.
  • O optimizador tem uma interrupção da corrida, se o estado actual da corrida não satisfizer as condições (por exemplo, a subsidência é demasiado elevada).
  • O guião MQL4 prepara a história para o testador, foi escrito há muito tempo.
  • Sem atribuição dinâmica de memória para a tabela de encomendas - uma vez atribuída memória e esquecida.
  • Sem registos - não olho para eles.
  • Sem historial de encomendas - da mesma forma.
  • Não há nenhuma ideia sobre indicadores e tudo o que tem a ver com eles - não precisamos deles para o TS.
  • Os preços são inteiros (int longo).

Se o mesmo disparate for implementado na MQL5, podemos utilizar a Cloud no modo de optimização da matriz. Só tem de ser enviado sempre o histórico - é necessária a compressão integrada de tal informação.

Teoricamente, a velocidade de ~ 100 Bb/s (no teste TS) pode teoricamente ser alcançada. O que será o desempenho do MT5-tester em toda a nuvem, nos mesmos papagaios?

100 mil milhões de barras por segundo é uma boa velocidade para todo o tipo de investigação. Se convertida para outras unidades, essa velocidade diz que um ano de um minuto de história FOREX é executado ~300.000 vezes por segundo sobre um símbolo.

A maior parte do tempo foi gasto a aprender a sintaxe da língua - apenas a pesquisar no Google. Não é um programador.

Digo-vos desde já, escrever um quadro universal para as vossas próprias necessidades modestas é uma enorme perda de tempo. É melhor explorar. Se algo precisa de ser tido em conta - basta terminá-lo.

Isto é apenas um núcleo, agora precisa de um conjunto de ferramentas astuciosas para o optimizador. Aqui vai levar muito mais tempo - é preciso pensar bem.

Aqui estou eu a ler tudo isto e ocorre-me que ou uma pessoa está completamente perdida nas correntes da sua consciência ou pelo menos metade do que escreveu é apenas uma mentira comum.

Um programador autodidacta sem um conhecimento profundo da língua escreveu um testador de uma única rosca com o desempenho de 100 000 000 de barras por segundo durante várias horas? Em contraste: pessoas do mais alto nível de profissionalismo passam anos a criar um testador HFT competente e de alto desempenho, criam equipas inteiras para trabalhar com ele e preenchê-lo com estratégias, e aqui uma pessoa decidiu construir um testador por conta própria e imediatamente obteve uma ordem de magnitude superior de desempenho de plataformas HFT (fechadas) líderes.

Vamos apenas calcular quanta largura de banda de memória precisamos para executar 100 000 000 de barras por segundo. Cada barra tem 4 preços + AskLow HighBid, o que resulta em 6 tipos inteiros com 64 bits cada(os preços são inteiros (int longo)). Para 100.000.000 barras por segundo, seria necessário

64 bits * 6 preços * 100.000.000 barras = 38.400.000.000 bits = 4.800.000.000 bytes = . 4 577 Mbytes por segundo..


Isto significa que este desempenho pode, fundamentalmente e puramente teórico, ser alcançado em módulos de memória DDR2 533 e superiores. Pelo menos o desempenho declarado é comparável ao limite físico do hardware moderno.

Mas os custos de tempo do software impõem restrições ainda mais significativas. Estes não podem ser ignorados. Foi por isso que peguei num compilador rápido C de 64 bits Win-Lcc 64 e medi o desempenho de uma pesquisa directa de um conjunto de barras sem cálculos matemáticos pesados. Atenção: estamos a falar de pesquisa directa, ou seja, a pesquisa mais rápida. Sem manipulação do ambiente e outras despesas gerais. Ao contrário do dickfix, forneço o código fonte completo do meu "testador de estratégia", para que qualquer pessoa possa compilá-lo e medir o desempenho no seu compilador favorito:

#include <time.h>
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <windows.h>
#define  LAPS 10000              //Количество серий
#define  ELEMENTS 10000          //Количество баров в одной серии
#define  INVOKE                  //Определено, если требуется эмулировать
                                //вызов функции

//Представление бара
struct bar
{
        long long Open;
        long long High;
        long long Low;
        long long Close;
        long long AskLow;
        long long BidHigh;
};

int main(void)
{
        struct bar bar_array[ELEMENTS];
        //Общее время выполнения стратегии
        clock_t eleps_time = 0;
        //Общее время выполения
        clock_t total_time = 0;
        //К сожалению заявленный объем памяти (100 000 000 баров) выделить не удалось,
    //поэтому выделяем память порциями, 1000 раз, по 100 000 баров за раз.
        clock_t ttime = clock();
        for(int lap = 0; lap < LAPS; lap++)
        {
                //Заполняем бары случайными числами
                for(int i = 0; i < ELEMENTS; i++)
                {
                        bar_array[i].Open = (long long)rand();
                        bar_array[i].High = (long long)rand();
                        bar_array[i].Low = (long long)rand();
                        bar_array[i].Close = (long long)rand();
                        bar_array[i].AskLow = (long long)rand();
                        bar_array[i].BidHigh = (long long)rand();
                        //if(i < 5)
                        //      printf("%i\n", bar_array[i].High);
                }
                //Эмулируем работу ТС c массивом котировок
                //Рассчитываем время на выполнение этого блока и суммируем его, получая общее время
                //выполнения
                clock_t btime = clock();
                //Наша стратегия будет проверять простое соответствие проверяемого бара настоящему.
                //Настоящий бар, это бар чей high > open, low, close а low < high, open, close
                int signal = 0;

                for(int i = 0; i < ELEMENTS; i++)
                {
                        #ifndef  INVOKE
                        if( bar_array[i].High > bar_array[i].Low &&
                            bar_array[i].High > bar_array[i].Open &&
                                bar_array[i].High > bar_array[i].Close)
                                signal++;
                        #endif
                        #ifdef  INVOKE
                        signal += TradeSystem(&bar_array[i]);
                        #endif
                }
                eleps_time += clock() - btime;
        }
        printf("Bars was worked: %i\n", LAPS*ELEMENTS);
        //Печатаем общее время выполнения
    double timedif = ((double)clock() / (double)CLOCKS_PER_SEC);
    printf("Bars %f seconds\n", timedif);
        //Печатаем время выполнения торговой системы
        double eleps_diff = (double)eleps_time / (double)CLOCKS_PER_SEC;
        printf("The TradeSystem time is %f seconds\n", eleps_diff);
        printf("The Eleps tik is %i tiks\n", eleps_time);
        return 0;
}
//
// Функция торговой системы. Принимает на вход бар,
// обрабатывает его и возвращает целочисленный результат
int TradeSystem(struct bar &cbar)
{
        if( cbar.High > cbar.Low &&
                cbar.High > cbar.Open &&
                cbar.High > cbar.Close)
                                return 1;
        return 0;
}

Pode ver que este código, dependendo da directiva Invoke, ou percorre a matriz e realiza uma simples comparação (uma operação muito rápida) ou chama uma função que realiza a mesma comparação.

Vamos ver quanto tempo leva para este código pesquisar e comparar 100 000 000 de barras:

Podemos ver que demorou 1,28 segundos a passar directamente por 100.000.000 bares, o que é quase um terço pior do que o desempenho anunciado.

Pode-se ver que a pesquisa de 100 000 000 de barras com função de chamada de cálculo em cada barra levou 1,79 segundos, o que é mais de 1,5 vezes pior do que o desempenho declarado.

Todos os testes foram realizados emi7 870, DDR3 3200 8Gb hardware.

A maior parte do tempo foi gasto na preparação dos dados reais (cerca de 9 segundos). O que, no mínimo, não optimizará a concepção do optimizador, resultando em enormes despesas gerais. Mas não levei esse tempo em conta, uma vez que estávamos a falar apenas da execução da estratégia.

Tira as suas próprias conclusões. Espero ter demonstrado por números que o resultado reclamado, para o dizer de forma suave, não corresponde à realidade. Mesmo o desempenho teórico do código que descreve o optimizador não corresponde ao resultado reclamado. E se implementar um verdadeiro testador que se aproxima da funcionalidade do reclamado, o desempenho cairá ainda mais baixo, uma vez que qualquer chamada de função e quaisquer cálculos matemáticos mais ou menos úteis reduzirão imediatamente o tempo da pesquisa nua.

 
Avals:
bem, isso é um graal de uma tendência. Nenhum dos dois é constantemente inferior a 2x. Não existem tais instrumentos para fazer a onda H consistentemente menos ou mais de 2 em toda a série. Em algumas secções/em alguns momentos. Saber quando negociar uma tendência, quando negociar um retorno. Filtrar o bazar))

Exactamente! Mas neste caso, chegamos a limitar o comércio como fase final de desenvolvimento de um sistema de comércio ideal.

Agora pense com o seu cérebro, se um sistema "ideal" deve trocar Limites, então porque é que um sistema real deve trocar Marquets ou Stops? Por modéstia? ;)

Razão: