Automatização da busca de estratégias. - página 3

 
Aliaksandr Hryshyn:

De fato, há muitas pequenas coisas.

Estou tentando criar um sistema universal, de modo que, com o mínimo de esforço, seja possível adicionar diferentes possibilidades de análise de indicadores, candlesticks etc. Cada função tem informações sobre com quais dados ela pode trabalhar e quais dados serão gerados. Também serão descritos os indicadores e o tipo de dados que eles fornecem. Os dados são divididos em tipos, tanto simples quanto complexos, por exemplo, {double} e {int,double}. Eles são divididos em categorias, por exemplo, "preço" e "posições no gráfico", outro exemplo: "linha reta" (pode ser usada para definir canais) etc. Eles são divididos por "tipo de escala". Categorizadas por "tipo de escala", por exemplo, "constante" (parâmetro da estratégia), "índice" (há um mínimo e um máximo), "proporção" (há apenas um ponto de referência, por exemplo, preço, volume) etc. É necessário modificar a estratégia de forma consistente, pois há uma nuance: a modificação em um lugar pode afetar as condições de modificação em outro lugar.

É isso mesmo... Para reduzir o número de combinações da pesquisa e usar as restrições acima (tipo, escala, categoria), por enquanto será o suficiente e as alterações pontuais (adicionar/remover uma/algumas funções).

"Se a recombinação também é espontânea, mas de soluções prontas inteiras" - esse pensamento me veio à mente -, é difícil imaginar como ela pode ser realizada. Um grupo de funções combinadas provavelmente terá mais conexões com o "mundo externo" do que uma única função, portanto, haverá menos oportunidades de encaixar tudo. O algoritmo se torna muito complicado, vamos deixar isso para um momento melhor)).

Deixe-me esclarecer o pensamento. Reduzir o número de variantes e a modificação em uma delas não afeta os outros blocos deve ser ainda mais universal. O truque é que as mesmas tarefas podem ser realizadas por métodos diferentes e, muitas vezes, não fica claro de antemão qual é o melhor. Por exemplo, definimos uma determinada tarefa universal chamada TRANSFORMAÇÃO. Há cerca de uma dúzia de osciladores, cada um definindo essa sobrecarga de sua própria maneira. Vamos supor que, no script do oscilador, tenhamos definido a tarefa de experimentar TODOS os indicadores ou todos os métodos. Em seguida, devemos padronizar a interação desses blocos com o restante do código. Digamos que tenhamos escolhido o padrão de interação como sendo as porcentagens do topo. Sequencialmente, o gerador apenas insere no código um bloco chamado Oversold1, encontra as variáveis a serem testadas nesse bloco específico, executa um volkin-forward e lembra os resultados do teste. Em seguida, ele prepara uma nova versão do Expert Advisor, já com o bloco Oversold 2, que também fornece porcentagens, apesar do fato de o indicador original mostrar números inteiros, e até mesmo com um sinal diferente de zero, etc. Ao final do teste, ele deixa o bloco mais bem-sucedido e passa para outra tarefa.

Ao mesmo tempo, não é necessário preparar tantos blocos para começar, 2 ou 3 blocos serão suficientes. O principal é estabelecer a interação.

O mesmo acontece com as dependências. Existem A, B e C. Primeiro, se A é maior que B, então C é verdadeiro. Depois, se B é maior que A, e assim por diante.

Depois, podemos passar para interações mais complexas.

 

"Para reduzir o número de opções e para que a modificação em uma delas não afete as outras, os blocos devem ser BEM mais versáteis." => "Digamos que escolhemos o padrão de interação - porcentagens do topo". - Entendi seu ponto de vista)). Isso envolve trazer os indicadores para uma única visualização, ou seja, o pré-processamento. No meu sistema, tudo é muito formalizado, eu gostaria de manter tudo isso, já estou trabalhando na implementação de coisas como escala, categoria, já descobri como fazer isso, há realmente uma conexão de alguns blocos que afeta a conexão de blocos em outros lugares. A padronização dos indicadores passa pela descrição do próprio indicador e, dependendo disso, determinados blocos serão conectados automaticamente. Um dos blocos pode ser facilmente o cálculo da porcentagem de um valor em relação a outro, mas esses valores devem ter uma conexão entre eles, que será controlada, por exemplo:

  1. Percent( Open[0] , Open[3] )
  2. Percentual(Open[0], Alligator[3])
  3. Porcentagem(Volume[0], Alligator[3])

A primeira e a terceira opções são boas e lógicas, mas a terceira não faz sentido.

Os índices também serão calculados, por exemplo, Open[ Max_on_position(iAC,0,30) ] ]

 
Youri Tarshecki:

Ao mesmo tempo, não é necessário preparar tantos blocos para começar, 2 ou 3 blocos serão suficientes. O principal é estabelecer a interação.

O mesmo acontece com as dependências. Existem A, B e C. Primeiro, se A é maior que B, então C é verdadeiro. Depois, se B é maior que A, e assim por diante.

Depois, podemos passar para interações mais complexas.

Isso já existe.

Ele é implementado da seguinte forma:

  1. existem tipos básicos int, double, bool
  2. os tipos complexos são criados a partir dos tipos básicos (você pode adicioná-los), por exemplo, (int,double) - coordenada no gráfico, (x,b) - coeficientes da equação da linha, (a,b,c,d) - suporte para até 4 valores.
  3. Os indicadores são representados como um conjunto de tipos complexos com um elemento
  4. as constantes são representadas como tipos complexos, esses são os parâmetros da estratégia que são otimizados
  5. as funções recebem determinados tipos complexos de variáveis como entrada, seu número não é limitado e a saída também é de tipos complexos.
  6. As funções não se importam com a origem desses dados, o principal é que haja uma correspondência de tipos
  7. todas as ordens disponíveis no mql4 são compatíveis (6 partes)
  8. a estratégia define apenas um tipo de ordem (compra ou venda ou buy_stop ou...)
  9. para ordens não pendentes, há 4 nós na parte superior do gráfico: condição de entrada no mercado, condição de saída, tp e sl.
  10. Os blocos (funções/nós do gráfico) podem receber parâmetros de entrada de indicadores, constantes, outros nós, é permitido que muitos outros nós recebam dados como parâmetros de entrada do resultado de um nó, não há restrições, exceto pelo fato de que é impossível permitir ciclos no gráfico.
  11. Em seguida, o gráfico é traduzido em um código sequencial, e esse código será enviado ao Expert Advisor para execução, e nada precisa ser compilado em MQL.
Aqui está um exemplo de código:

#define
 symbol          GBPUSD;
period          60;
repeat_signal_skip      True;
stop_level              60;
trade           op_buy;
max_shift               13;
stack           4;
const           9;
cache           1;
#data
{True},{-1.26761795},{4.67108999},
{2.08088665},{-0.33782435},{22},
{1.63150050},{-11},{-0.22006371};
#program
 push    [0];
push    [1];
push    [2];
call    F_plus_d;
push    [3];
push    [4];
call    F_plus_d;
push    [5];
get     .Ichimoku_2;
call    F_plus_d;
push    [6];
call    F_minus_d;
save    [0];
push    [7];
get     .Open;
call    F_plus_d;
call    F_less;
load    [0];
push    [8];
#end

Nem tudo foi feito ainda, nem todas as informações necessárias estão no código, o código é executado corretamente do ponto de vista do controle de tipos, expressões sem sentido ainda não são levadas em consideração.

Somente tipos simples são usados no código.

 

Presumo que as estratégias possam ser transmitidas via protocolo HTTP e que o MQL tenha a possibilidade de receber estratégias dessa forma.

Quero tornar tudo totalmente automatizado, procurar estratégias, criar portfólios de estratégias, transferir para o Expert Advisor, etc.

Parte do sistema em MQL está 90% pronta, trabalhando com muitas estratégias (controle de posição, riscos, tratamento de erros, etc.).

Ainda há muito trabalho a ser feito.

 
Yuriy Asaulenko:
Se estiver procurando por uma estratégia, não é mais fácil. Não sei sobre o resto, não pensei nisso. No entanto, qualquer modelagem é mais fácil em ambientes especiais, não na MT. O MT é um produto final, não foi criado para pesquisa e não é muito adequado para isso
Concordo, inicialmente eu mesmo modelei a ideia no matlab. Ainda assim, o testador MT é uma caixa preta.
 
Aliaksandr Hryshyn:
Aqui está outro exemplo de uma expressão sem sentido: =High>(Open-Close), que também não passará despercebida.

Explique por que ela não tem sentido. Na verdade, eu a escreveria assim

=High>MathAbs(Open-Close)

ю

 

Aliaksandr Hryshyn:

Em seguida, o gráfico é traduzido em um código serial, e esse código será enviado ao Expert Advisor para execução, e nada precisa ser compilado em MQL.


Como, por favor, explique?
 

Ele sempre retornará verdadeiro)).

(Open-Close) sempre será menor que (High)

 
Alexey Volchanskiy:

Explique como, por favor?
Qual é a transmissão ou a apresentação?
 
Aliaksandr Hryshyn:

Ele sempre retornará verdadeiro)).

(Open-Close) sempre será menor que (High)

Frenagem ))))))))))
Razão: