Como codificar? - página 306

 

Hi,

Eu realmente não estava chegando a lugar algum com as funções, eu as verifiquei inúmeras vezes em vão, então decidi escrever muitas mensagens de impressão() em cada etapa do meu código para ver até onde ele chega antes de clonar. Na verdade, não chega tão longe quanto a função GetLots e falha ao verificar meus critérios de compra e venda. Estranhamente, eu não mudei esta parte do código, mas algo é um erro - mas pelo menos agora eu sei onde me concentrar!

 

Olá a todos,

Testei meu código hoje cedo e ele funcionou relativamente bem. Sem alterar o código ou os critérios de backtest (como datas, etc.) fiz um backtest uma hora depois e os resultados são completamente diferentes, como em nenhum outro resultado. Então eu só me pergunto por que isso aconteceu? Por exemplo, a conectividade MT4?

 

...

Se você não alterou nenhum parâmetro, então verifique o seguinte: ao executar o back-test, abra a aba do diário e verifique se alguns erros estão escritos lá fora. Erros na execução de ordens podem ser a única causa de resultados erráticos. Verifique também se os critérios de compra e venda são :sólidos" : ou seja - eles entrarão em um mesmo ponto.

crsnape@btinternet.com:
Olá a todos, eu testei meu código hoje cedo e funcionou relativamente bem. Sem alterar o código ou os critérios de backtest (como datas etc.) fiz um backtest uma hora depois e os resultados são completamente diferentes, como em nenhum outro resultado. Então eu só me pergunto por que isso aconteceu? Por exemplo, a conectividade MT4?
 

Eu não recebo nenhum erro em meu diário. A primeira entrada é esta:

2012.07.22 15:35:37 H4 Período EA EURUSD,H4: carregado com sucesso

Seguido de uma enorme lista destas:

2012.07.22 15:47:07 TestGenerator: erro de dados inigualável (limite de volume 56304 em 2012.07.19 12:00 excedido)

e depois, finalmente:

2012.07.22 15:47:07 H4 Período entradas EA: MagicNumber=42; RiskRewardRatio=3; D1SlowMAPeriod=200; D1FastMAPeriod=50; FastMACDPeriod=12; SlowMACDPeriod=26; SignalPeriod=9; DNCPeriod=120; SL_Period=10;

Mas nada depois.

Meu teste foi feito de 04.01.2012 - 21.07.2012.

 

...

Então você tem um problema com as condições de entrada (sua EA nunca tentou abrir um pedido)

crsnape@btinternet.com:
Eu não recebo nenhum erro em meu diário. A primeira entrada é esta:

2012.07.22 15:35:37 H4 Período EA EURUSD,H4: carregado com sucesso

Seguido de uma enorme lista destas:

2012.07.22 15:47:07 TestGenerator: erro de dados inigualável (limite de volume 56304 em 2012.07.19 12:00 excedido)

e depois, finalmente:

2012.07.22 15:47:07 H4 Período entradas EA: MagicNumber=42; RiskRewardRatio=3; D1SlowMAPeriod=200; D1FastMAPeriod=50; FastMACDPeriod=12; SlowMACDPeriod=26; SignalPeriod=9; DNCPeriod=120; SL_Period=10;

Mas nada depois.

Meu teste foi feito de 04.01.2012 - 21.07.2012.
 

Sim, é estranho porque antes de entrar em posições. Tenho alguma impressão() escrita em meu código do começo ao fim e nada é escrito no diário para registrar até mesmo o início do meu código. Nem mesmo este para verificar se uma posição anterior já foi aberta na barra atual:

se ((GlobalVariableGet (barsGV) == 0) || (GlobalVariableGet (barsGV) < Bars)

{

GlobalVariableSet(HasOrderedGV,false);

GlobalVariableSet(barsGV,Bars);

}

//--- Verificar a possibilidade de posição longa (BUY)

se (GlobalVariableGet (HasOrderedGV) == falso)

{

Imprimir("TESTE");

se (... condições de entrada...

 

...

Se sua EA tentasse em qualquer etapa abrir uma ordem, ela teria sido escrita no diário (erro ou não, não importa - caso houvesse um erro, um erro teria estado lá, se ela abrisse uma ordem que seria escrita lá)

Mas como nada está escrito ali, significa que sua EA nunca chegou ao estágio de realmente tentar abrir um pedido e isso só pode acontecer se seu conjunto de condições que devem ser cumpridas na EA nunca chegar ao estágio de realmente abrir um pedido. Portanto, você tem que esclarecer suas condições. Tente a partir da condição mais simples que você sabe que será executada, e então construa adicionando condições. Assim, você será capaz de identificar a etapa que está impedindo que você abra uma ordem.

crsnape@btinternet.com:
Sim, é estranho porque antes de entrar em posições. Tenho alguma impressão() escrita em meu código do começo ao fim e nada é escrito no diário para registrar até mesmo o início do meu código. Nem mesmo este para verificar se uma posição anterior já foi aberta na barra atual:

se ((GlobalVariableGet (barsGV) == 0) || (GlobalVariableGet (barsGV) < Bars)

{

GlobalVariableSet(HasOrderedGV,false);

GlobalVariableSet(barsGV,Bars);

}

//--- Verificar a possibilidade de posição longa (BUY)

se (GlobalVariableGet (HasOrderedGV) == falso)

{

Imprimir("TESTE");

se (... condições de entrada...
 

Eu coloquei mais alguns Print()s após os comandos do if e acho que neste momento está falhando, particularmente a linha vermelha quando meu diário pára de imprimir depois deste ponto.

//--- VARIÁVEIS GLOBAIS

string HasOrderedGV = "has_ordered_GV";

string barsGV = "bars_GV";

//--- Determinar se o pedido já foi colocado no bloco de tempo H4

se ((GlobalVariableGet (barsGV) == 0) || (GlobalVariableGet (barsGV) < Bars)

{

GlobalVariableSet(HasOrderedGV,false);

GlobalVariableSet(barsGV,Bars);

}

Imprimir("Determinar se o pedido já foi feito para a barra atual", HasOrderedGV);

//--- Verificar a possibilidade de posição longa (BUY)

se (GlobalVariableGet (HasOrderedGV) == falso)

{

Encontrei este pedaço de código on-line e o usei no meu. Mas agora só me pergunto se vai funcionar. A variável global barsGV é declarada como uma string, no entanto, ela se refere a 0 na primeira linha. Isto é correto?

 

...

Esse código funciona bem quando ele é executado pela primeira vez

0 é testado pela seguinte razão :

duplo GlobalVariableGet([/TD][TD] nome dacadeia )

"Retorna o valor de uma variável global existente ou 0 se ocorrer um erro".

O erro ao recuperar o valor da variável global seria quando a variável global ainda não foi criada. Mas, como eu disse, esse código está OK quando executado pela primeira vez. O problema é o seguinte: imagine que você execute um teste e o barGV esteja configurado para 5000 no final do teste. Agora você executa o EA novamente e as barras serão sempre inferiores ao valor do barsGV (que ainda é 5000). Ele (o código) tem que ser escrito de maneira diferente. Use algo como isto

GlobalVariableSet(barsGV,0);

no init(), e então deve funcionar bem para testes consecutivos também. Mas também, artificialmente, "fingirá" que não houve ordem aberta na barra atual quando você iniciar o EA, o que pode ser um erro. É muito melhor usar a função para contar as ordens abertas em uma barra atual do que usar varíbulas globais para esse fim (por várias razões).

________________________________________________

PS: o uso de variável(s) global(is) como essa impede que você use múltiplas instâncias de uma EA (cada variável global é visível a partir de outro código - qualquer código : EA,script, indicador ..., então se o nome não for único, você corre o risco de uma mistura de EAs lendo e definindo todas as mesmas variáveis globais ao mesmo tempo)

crsnape@btinternet.com:
Coloquei mais alguns Print()s após os comandos do if e acho que neste momento está falhando, particularmente a linha vermelha quando meu diário pára de imprimir depois deste ponto.

//--- VARIÁVEIS GLOBAIS

string HasOrderedGV = "has_ordered_GV";

string barsGV = "bars_GV";

//--- Determinar se o pedido já foi colocado no bloco de tempo H4

se ((GlobalVariableGet (barsGV) == 0) || (GlobalVariableGet (barsGV) < Bars)

{

GlobalVariableSet(HasOrderedGV,false);

GlobalVariableSet(barsGV,Bars);

}

Imprimir("Determinar se o pedido já foi feito para a barra atual", HasOrderedGV);

//--- Verificar a possibilidade de posição longa (BUY)

se (GlobalVariableGet (HasOrderedGV) == falso)

{

Encontrei este pedaço de código on-line e o usei no meu. Mas agora só me pergunto se vai funcionar. A variável global barsGV é declarada como uma string, no entanto, ela se refere a 0 na primeira linha. Isto é correto?
 

Ahh... estou vendo. Porque as Variáveis Globais guardam seus valores na memória. Então, como você diz quando termina o backtesting e seus 5000 dizem, isto é gravado na memória mesmo que o backtesting seja executado novamente, então nunca retornará falso porque o BarsGV não está abaixo de 5000? Caramba, isto é profundo.

E também, se ele gerar um erro, ele define HasOrderedGV como falso para que possa continuar com o resto do código?

Eu o entendi corretamente?

BTW- isto é permitido?

GlobalVariableSet(HasOrderedGV, falso);

Porque no livro MQL4 diz:

data/hora GlobalVariableSet([/TD][TD] nome dastring, valor duplo )

O segundo valor na minha instância é bool não o dobro?