aventuras de um novato - página 10

 
niko:
Seu desejo é meu comando (eu ia dizer 'high flyer' mas depois verifiquei o dicionário online e aparentemente é um comentário grosseiro, nevermind)

Ok. Eu só dei uma olhada rápida, pois agora você está sendo um pouco aleatório demais para o meu gosto.

Você não baseou suas mudanças na última versão do meu código.

Portanto, não tenho idéia se a última versão do meu código fez o que você precisava, antes de você começar a acrescentar mais coisas à versão anterior.

Mas o que eu notei foi que logo no início da função start() faltou sua cinta de abertura. Eu pensei que já tínhamos passado por isso.

Você precisa exercer algum controle. Se você for mudar alguma coisa - certifique-se de acrescentar sua mudança à versão mais recente. E diga-nos qual é sua mudança e por que você a está fazendo.


CB.

 
niko wrote >>

Tim,

Consegui que o código indicasse onde não há erros reportados quando ele é compilado (ele estava apenas corrigindo alguns erros que você destacou), mesmo que no testador de estratégia ele ainda não faça nenhuma negociação. Mas estou intrigado com algo: ...

Oi Nick,

Analisando seus comentários aqui e algumas das mudanças que você fez no código, suspeito que seu "quebra-cabeças" possa estar surgindo por causa da confusão entre variáveis e parâmetros de função. Eles parecem e agem de forma bastante semelhante, mas na verdade são bestas bem diferentes.


Talvez o exemplo de código comentado abaixo torne as coisas um pouco mais claras.


Tomei a liberdade de arrumar um pouco mais o código de desenvolvimento e mudar um pouco alguns nomes de parâmetros de função para tentar diferenciá-los de outras variáveis. Também movi todas as notas supérfluas, comentários, etc. para um "Apêndice" no final do arquivo para que você possa fazer o que quiser.

O código está com bom aspecto. Ainda há algumas pequenas probabilidades e fins a serem alcançados que marquei no arquivo como TODO's, mas a principal tarefa à sua frente agora é depurar e testar.


Os testes são uma parte muito importante do ciclo de desenvolvimento. Com sistemas de negociação, a falha em testar adequadamente pode resultar em problemas sutis que podem causar estragos em sua estratégia de negociação e, em última instância, em sua conta. A tarefa principal com os testes é garantir que o código esteja fazendo o que você espera que ele faça. Efetivamente, você tem que escrever ou dizer para você mesmo: "Nesta situação, eu espero este resultado". Em seguida, você deve elaborar e realizar seu teste para ver se é isto que realmente acontece. Se não for preciso retificar o problema. Você repete este processo para todas as situações prováveis que você pode prever e talvez algumas não muito improváveis também. É claro que você também está procurando por erros de tempo de execução ou bugs que podem ou não aparecer com mensagens de erro do sistema MetaTrader.


Com o MT4, sua principal ferramenta de teste será o Strategy Tester e os arquivos de log (sob a guia Journal), bem como os Resultados, Gráfico e Facilidades do Relatório.


Com o arquivo de log, muitas vezes acho mais fácil abrir o arquivo inteiro no Bloco de Notas da Microsoft em vez de tentar olhar parte dele através do visualizador do Journal. Não se esqueça de limpar o arquivo de log/jornal antes de cada execução ou você terminará de procurar muitas informações antigas, e talvez não mais relevantes. Após cada execução de teste no testador de estratégia, você examina o arquivo de registro tanto para mensagens de depuração como para mensagens do sistema de metatrader . Você pode usar sua documentação onine do MetaTrader para procurar códigos de erro ap para obter informações adicionais. Use também os recursos de Resultados, Gráficos e Relatórios para ver o que o programa está fazendo em qualquer conjunto específico de condições.


Dica - Quando você fizer seus testes iniciais, mantenha o período de teste curto, para minimizar a quantidade de dados no arquivo de registro.


Já construímos algumas facilidades de depuração no código, mas você provavelmente precisará expandi-las. Desative as declarações de depuração individuais conforme necessário para manter as informações no arquivo de registro condensadas e relevantes. Há um exemplo no código de como fazer isso sem excluir ou comentar as declarações de depuração que podem ser bastante demoradas. Deixo minhas principais declarações de depuração no arquivo do programa indefinidamente e as apago todas com a bandeira DEBUG_ON no programa assim que terminar os testes.


O gerenciamento eficiente dos arquivos de registro e das declarações de depuração é, acredito, a chave para testes e depuração bons e eficientes no ambiente MetaTrader. Vi pessoas neste fórum reclamando sobre a falta de instalações de depuração no MetaTrader. Milhões de linhas de código comercial foram depurados e testados com sucesso usando instalações não mais sofisticadas do que as que você encontra no MetaTrader. Estas instalações podem ser básicas, mas funcionam bem, desde que você saiba como utilizá-las corretamente.


Outro ponto que vale a pena ressaltar é que tentar depurar códigos confusos ou mal organizados pode consumir muito tempo e ser frustrante. É a partir deste ponto que você realmente começará a colher os benefícios de seu código bem estruturado e bem comentado. Se alguém mais precisar trabalhar em seu código, ficará muito grato a você por seus esforços a este respeito.


Nick, esta jornada ainda tem um longo caminho a percorrer. Para mim, o teste, a depuração e a otimização - o "fazer tudo funcionar" é a parte mais interessante do trabalho, e muitas vezes a mais desafiadora. Vou passar o código de volta para você para começar os testes e esperar que você me responda com perguntas e/ou problemas que você encontrar.


Cumprimentos

Tim



Um exemplo simples de código para tentar demonstrar a diferença entre uma variável global e um parâmetro de função

//+------------------------------------------------------------------+
//| Hello Trader.mq4 |
//| Copyright © 2009, Your Name |
//| |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2009, Your Name"
#property link ""


//+------------------------------------------------------------------+
//| expert initialization function |
//+------------------------------------------------------------------+
stringMyGlobalVariable; // This global variable which holds a string i.e text value has been declared
// but as yet has no value in it. It is a 'container' which at this point in time holds
// only an empty or null string.

int init()

{

MyGlobalVariable = "Nick"; // Now we assign i.e put a value in the variable. Our 'container' which is named
// MyGlobalVariable now holds the string value of "Nick"

return(0);
}


//+------------------------------------------------------------------+
//| expert deinitialization function |
//+------------------------------------------------------------------+
int deinit()
{

return(0);
}


//+------------------------------------------------------------------+
//| expert start function |
//+------------------------------------------------------------------+
int start()
{

MyFunction(MyGlobalVariable); // This calls the function named MyFunction which is declared below
// This function requires one string parameter.

// In this case we have passed it our global variable as a parameter.

// MyFunction("Fred"); // We could also pass this function the literal string "Fred"

// MyFunction(12.739); // This would not work. The passed value must be a string because that is what we
// have declared the parameter as in the function declaration below.

// MyFunction(DoubleToStr(12.739,3)); // This would work because we have used an inbuilt MT4 function to convert the decimal
// number to a string i.e "12.739").
// We can also pass other functions as parameters as we have shown here, provided the
// function that we are using as a parameter returns the correct data type which in
// this case is a string.

return(0);
}


//+------------------------------------------------------------------+
//| A function with one parameter |
//+------------------------------------------------------------------+


void MyFunction(string MyFunctionParameter) // The function is declared with a parameter in the same way that a varible is declared
// but it is a function parameter not a variable. It can be used just like a variable
// but only inside the function. The big difference is that it can be passed a different value
// from outside the function whenever the function is called. This enables functions to
// be used as general purpose blocks or modules.
// Function parameters are also used in some circumstances to return values from the
// function to the outside world but that is another more complex story for another day!

{
Comment(MyFunctionParameter); // The value passed to 'MyFunctionParameter' will be displayed at the top, left hand
// corner of the screen

}

Arquivos anexados:
 
hey CB, isso é estranho, pois sempre salvo o arquivo mq4 como novo, com a última data para separar os outros arquivos. a confusão deve ter escapado. o parêntese que eu queria incluir, mas pensei que como algum ponto você me pediu para removê-lo (era o último, mas sem o último, o início() seria desequilibrado. por isso removi o primeiro também, mas o coloquei de volta).
 
niko
Olá CB, isso é estranho, pois eu sempre salvo o arquivo mq4 como novo, com a última data para separar os outros arquivos. a confusão deve ter escapado. o parêntese que eu queria incluir, mas eu pensei que como algum ponto você me pediu para removê-lo (era o último, mas sem o último, o início() seria desequilibrado. por isso eu removi o primeiro também, mas eu o coloquei de volta).

Não vamos começar a adicionar e remover aparelhos intencionalmente a zero. Eu já havia assinalado anteriormente que você tinha um conjunto completamente supérfluo, ambos podendo ser removidos.

Aqui está a última versão. Por favor, faça o seguinte:

- Compile-o primeiro e corrija quaisquer erros - assim você saberá que quaisquer erros subseqüentes são devidos a mudanças que você possa fazer

- Informe-me se houve ou não algum erro que você teve que corrigir

- Experimente e veja se ele faz o que você precisa

- Me informe como isso funciona - e me informe sobre as mudanças que você acha que precisa fazer


CB

Arquivos anexados:
 
Obrigado CB. Desculpe se o frustei um pouco.
 

Obrigado Tim,

Aprecio muito o tempo que você vai para me explicar estas coisas, é muito encorajador. Pareço ter "flashes" de obtê-lo e depois não consegui-lo de todo (em relação às funções e chamadas), embora eu já deva ter lido a documentação sobre funções vinte vezes. Eu gasto mais tempo com isso. Sobre 'testar e depurar' já fiz isso antes em um pacote diferente (passando por cada comércio que foi feito, garantindo que tudo se encaixasse), pois acho que é essencial, mesmo para o comércio manual(teste de estratégia). Vou prosseguir com seu código e informá-lo.

 
niko:
Obrigado CB. Desculpe se o frustei um pouco.

Não se preocupe, amigo. Apenas tentando dar um passo de cada vez.


CB

 

Hey CB,


Eu corrigi alguns erros no código, faltava principalmente o parêntese, ele está destacado no código. Acabaram-se os erros de sintaxe.

Executo o código no testador de estratégia, mas ele só COMPRAR negócios. Não há negócios curtos em absoluto. Eu olhei através dos logs, ele produz erros 130 (a respeito de paradas) para não lançar nenhuma luz sobre nosso problema.

Tentei ver se conseguia descobrir onde estava o erro (presumo que esteja no fnSHouldWeTrade ou fnOrderDuplicate).

A versão mais recente do código anexado, adicionei valores ao TopFilter e BotFilter para possibilitar a estratégia de fazer negócios.

ps: eu descobri porque eu colava o código antigo para você antes, reinstalei o mt4 em uma pasta diferente (sem erros de conexão) e o código era um duplicado antigo de uma pasta antiga

Arquivos anexados:
 
niko:

Hey CB,


Eu consertei alguns erros no código, faltavam principalmente os parênteses, está destacado no código. Acabaram-se os erros de sintaxe.

Executo o código no testador de estratégia, mas ele só COMPRAR negócios. Não há negócios curtos em absoluto. Eu olhei através dos logs, ele produz erros 130 (a respeito de paradas) para não lançar nenhuma luz sobre nosso problema.

Tentei ver se conseguia descobrir onde estava o erro (presumo que esteja no fnSHouldWeTrade ou fnOrderDuplicate).

A versão mais recente do código anexado, adicionei valores ao TopFilter e BotFilter para possibilitar a estratégia de fazer negócios.

ps: eu descobri porque eu colava o código antigo para você antes, reinstalei o mt4 em uma pasta diferente (sem erros de conexão) e o código era um duplicado antigo de uma pasta antiga


Mudança:

OrderSend(Symbol(),OP_SELL,Lots,Bid,5,0,Bid+TakeProfit*Point, "Nikos First EA",0,0,Red);

para:

OrderSend(Symbol(),OP_SELL,Lots,Bid,5,0,Ask-TakeProfit*Point, "Nikos First EA",0,0,Vermelho);


CB

 
graças à CB, eu deveria ter notado isso, então o erro estava certo no final (130).
Razão: