Projeto aberto - testador-optimizador interno - página 2

 
Entretanto, eu não conheço a reação do compilador de antemão, ele vai deixar passar ou não as constantes comerciais no corpo indicador? <br / translate="no"> O mais provável é que sim.

Claro que deveria, todos eles são apenas inteiros, não um tipo separado.

Uma pequena dica.

É claro que é desejável não reescrever a estratégia para o testador. Uma vez escrita, a estratégia deve funcionar no testador e sem ele (no mundo real).

Isto pode ser feito com a ajuda de bibliotecas.
1. Todas as funções relacionadas ao comércio, mudar um pouco seus nomes (meu... - não muito bom, talvez melhor _....).
2. Criar 2 bibliotecas. O primeiro contém código para testes (sem realmente enviar ordens), o segundo apenas duplica parâmetros em chamadas de funções padrão. A troca de trabalho/teste é feita simplesmente substituindo a biblioteca.

É claro que poderíamos colocar tudo em uma biblioteca e introduzir um parâmetro global para mudar, mas provavelmente é desnecessário.

E seria maravilhoso introduzir à MT mais uma função, que, imho, simplificaria radicalmente a escrita de tal testador - a função de estabelecer a última barra atual.

Isto é, suponha que tenhamos 1000 barras na história em que estamos testando.
Vamos definir 200 bar como a última e usar Close[200] em vez de Close[0]. Esta característica deve funcionar em todas as funções incorporadas.

O testador então parecerá um loop no número da barra em que este valor é definido (a última barra no teste) e a chamada da função de início na estratégia.

Na verdade, não é tão simples assim :))
Preciso de mais alguns pontos ...
 
Eu não entendo, por favor explique
2. Criamos 2 bibliotecas. A primeira biblioteca contém código para testes (sem realmente enviar ordens), a segunda simplesmente duplica os parâmetros nas chamadas de função padrão.
A
troca entre trabalho/teste é feita simplesmente substituindo a biblioteca
.
A frase "código para teste" é um código de teste ou código EA? Seja mais específico.

Isso também
Isto é, deixe-nos ter 1000 barras na história em que estamos testando.
Definimos 200 barras como a última, então em vez de Fechar[0] usamos Fechar[200] em todos os lugares.
E esta ficção deve funcionar (afetar) em todas as funções em linha.


Qualquer código EA é facilmente convertido em código para um indicador :
Pegamos o bloco start() do EA, adicionamos uma construção para (testerconter=Bars;testerconter>=0;testerconter--)
{
fechá-lo com um suporte no final
}
Substituir todos os lugares que utilizam referências por [testerconter+referência].

Aqui está um exemplo do MACD_sample.mq4 Expert Advisor incorporado.
Código fonte:
   MacdCurrent=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,0);
   MacdPrevious=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,1);
   SignalCurrent=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_SIGNAL,0);
   SignalPrevious=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_SIGNAL,1);
   MaCurrent=iMA(NULL,0,MATrendPeriod,MODE_EMA,0,PRICE_CLOSE,0);
   MaPrevious=iMA(NULL,0,MATrendPeriod,MODE_EMA,0,PRICE_CLOSE,1);


Modificado

   MacdCurrent=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,testerconter+0);
   MacdPrevious=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,testerconter+1);
   SignalCurrent=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_SIGNAL,testerconter+0);
   SignalPrevious=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_SIGNAL,testerconter+1);
   MaCurrent=iMA(NULL,0,MATrendPeriod,MODE_EMA,0,PRICE_CLOSE,testerconter+0);
   MaPrevious=iMA(NULL,0,MATrendPeriod,MODE_EMA,0,PRICE_CLOSE,testerconter+1);


Como você pode ver, não há nenhum problema. Se você quiser, você pode sempre redefinir o testadorconter=0 se
O código é executado no órgão do Expert Advisor, não no órgão do Expert Advisor .

 
A frase "código para testes" é um código de teste ou um código de Expert Advisor? Seja mais específico.

Na primeira biblioteca, a função
_OrderSend(Symbol(), OP_SELL, 1, Bid, 5, Bid + Stop * Point, Bid - Take * Point);


emula a execução da ordem no testador, ou seja, adiciona-a à lista de ordens no testador e não envia a ordem para o servidor.

Na segunda biblioteca, esta função simplesmente chama a função embutida

int _OrderSend( string symbol, int cmd, double volume, double price, int slippage, 
                double stoploss, double takeprofit, string comment=NULL, int magic=0, 
                datetime expiration=0, color arrow_color=CLR_NONE) 
{
   return (OrderSend(symbol, cmd, volume, price, slippage, stoploss, 
                        takeprofit, comment, magic, expiration, arrow_color) );
}


Qualquer código do Expert Advisor pode ser facilmente retrabalhado no código para o indicador :
Pegamos o bloco start() do EA, adicionamos uma construção para(testerconter=Bars;testerconter>=0;testerconter--)
{
fechá-lo com um suporte no final
}
Substituir todos os lugares que utilizam referências por [testerconter+referência].

É isso que eu quero dizer.
Seria mais fácil chamar a função que define o valor da variável testconter em MT (0 por padrão) ao invés de substituí-la e esta substituição ([testconter+referência]) seria feita na própria MT.
Assim, não teríamos que fazer essas substituições na própria estratégia.

for(testerconter=Bars;testerconter>=0;testerconter--)
{
   SetTestPoint(testerconter);
      далее текст эксперта без переделки,
      или лучше вызов его функции start (или _start)
}



Por favor, substitua pré por. pré com citação em "ou seja, digamos que temos 1000 barras em ...".
caso contrário, a página desaparece novamente.

 
Eu o substituí por citação, parece que seu texto está indo embora, faça uma tradução forçada do fio em seu exemplo
sobre
int _OrderSend( símbolo de corda,....


Minha conclusão: parece que estamos falando da mesma coisa. Podemos esquecer o pedido atual do último bar, por enquanto.
Devemos tentar fazer isso.
Por enquanto, basta redefinir as funções comerciais padrão, o prefixo _. é ainda mais respeitável :)
 
para avm
Os testes desta forma são possíveis. E é bom o suficiente. Mas, infelizmente, você não terá universalismo. <br / translate="no"> Passei algumas semanas em tais testes. À primeira vista, parece simples.


Eu suspeito que você testou "com muito sangue", ou seja, você não redefiniu as funções comerciais. E cada novo teste
Cada novo teste requer a escrita de um novo indicador-avaliador. Mas você só precisa fazer isso uma vez - e sem problemas.
Se eu estiver errado - afixar as funções - não seja mesquinho.
 
Outro ponto.

Parece que não podemoschamar diretamente afunção de partida do Expert Advisor.
Portanto, seria melhor escrever o código do Expert Advisor em uma biblioteca e ter lá funções _init, _deinit e _start.

No Expert Advisor, escreveremos
#include ".....";
   ...............

int init()
{
   return(_init());
}

int deinit()
{
   return(_deinit());
}

int start()
{
   return(_start());
}


No entanto, é um pouco obscuro quais são os parâmetros.

 
A propósito, você pode combinar vários EAs/sinais em um único gráfico.
Como é feito em Omega:
#include "A1.....";
#include "A2.....";
   ...............

int init()
{
   _initA1();
   _initA2();
   return(0);
}

int deinit()
{
   _deinitA1();
   _deinitA2();
   return(0);
}

int start()
{
   _startA1();
   _startA2();
   return(0);
}


Não é muito bonito, mas vai funcionar.
Em geral, um sistema de processamento de eventos caseiros irá funcionar :))

 
Talvez seja mais fácil? Você faz um roteiro parser, que é aplicado a um arquivo mq4 (com código Expert Advisor).
Ele processa este código - insere todos os tipos de includes, arrays de trabalho para Equilíbrio, Equidade, etc,
renomeia as variáveis Lotes em _Lots (e outros). Em geral, ele faz o trabalho rude.
Só terei que arquivar a saída e ir embora. :)
Método de transporte simples.
 
para avm<br / translate="no">
Os testes desta forma são possíveis. E é bom o suficiente. Mas, infelizmente, você não terá universalismo. Eu passei algumas semanas em tais testes. À primeira vista, parece simples.

Eu suspeito que você testou "com muito sangue", ou seja, você não redefiniu as funções comerciais. E cada novo teste exigia que você escrevesse um novo indicador de testador. Mas você só precisa fazer isso uma vez - e não precisa mais ter problemas. Se eu estiver errado, eu quero que você poste funções - não seja mesquinho.

Absolutamente certo. "Sangue grande". Não houve substituições. Eu fiz tais testadores de volta no MT3.x. A MQL4 é tão diferente da MQL2 quanto o céu é da terra. Entretanto, eu não tirei proveito da MQL4. Eu tenho um estupor psicológico. Eu deveria ter pensado primeiro, e depois trabalhado.
A mulher foi aconselhada: "Pense primeiro, fale depois". A mulher respondeu: "Como posso pensar no que ainda não disse".
 
Eu me antecipei um pouco sobre o analisador, as funções precisam ser escritas primeiro. Mas lembro que os desenvolvedores disseram que não haverá um testador de múltiplas moedas (testador de carteira). Ou estou confundindo algo? Se não estou confuso - mais uma razão para escrever a sua.
Razão: