Erros, bugs, perguntas - página 452

 

Obrigado!

 
alexvd:

Sim, sobre o primeiro ponto estou claramente confuso. Explicar o que está exactamente errado na descrição, que uma cópia deve ser devolvida?

E sobre a concatenação no seu caso deveria ter escrito algo como

Para esclarecer. Diz"Devolve uma cópia da cadeia com um valor alterado do carácter na posição especificada. "O protótipo da função é boolStringSetCharacter(...) . Obviamente, não se pode pôr um cordel num bool. Se de facto um booleano é devolvido, então aparentemente isto é um sinal de sucesso/erro. Normalmente outras páginas de documentação têm uma secção separada de Valores Devolvidos, mas esta página não tem uma. Deve ser acrescentado, e na descrição textual formular uma frase relativa à semântica da função, e não ao valor de retorno.


Relativamente à concatenação, se o que escreveu estiver correcto, a descrição da função StringConcatenate também deve ser alterada. A descrição diz que o parâmetrostring_var é uma String [in][out] que será gerada como resultado de concatenação. Afirma-se que este parâmetro está apenas [fora].

 
Nova questão. O que significa quando o BarsCalculated retorna 0. Não parece ser um erro, mas como é que se pode calcular 0 barras? Na verdade - nada foi contado. Não é um erro?
 
MoneyJinn:

Infelizmente, o problema é que o terminal só publica encomendas para fechar posições com comentários no separador "Resultados".

A ordem correspondente não é adicionada à lista de HistorialDealsTotal().

Na lista geral de encomendas HistoryOrdersTotal(), a encomenda também está em falta, mesmo que seleccione um período com alguma redundância.

Posso assegurar-vos que tanto as encomendas como os negócios, no caso de fecho por "fim de teste", estão presentes na história. A minha multimoeda calcula o lucro ganho em cada símbolo. Os negócios fechados no testador por "fim de teste" são corrigidos na des-inicialização para reflectir estes negócios. O lucro total para todos os símbolos coincide com os dados do relatório de teste. Este é o código;

       if(HistorySelect(0,TimeTradeServer()))   // Поправка для 'end of test'
        {
         int DeelsTotal=HistoryDealsTotal();
         for(int i=0;i<SymbolsNumber;i++)
           {
            ulong ticket=HistoryDealGetTicket(DeelsTotal-1-i);
            string comment=HistoryDealGetString(ticket,DEAL_COMMENT);
            if(comment!="end of test"&&StringSubstr(comment,0,3)!="so ")
               break;
            for(int j=0;j<SymbolsNumber;j++)
              {
               if(HistoryDealGetString(ticket,DEAL_SYMBOL)!=m_expert[j].Name())
                continue;
               m_Profit[j]=m_Profit[j]+HistoryDealGetDouble(ticket,DEAL_PROFIT)+  // Добавим профит закрытой позиции для "end of test" и "so"
                           HistoryDealGetDouble(ticket,DEAL_SWAP)+HistoryDealGetDouble(ticket,DEAL_COMMISSION);
              }
           }
        }
 

Colegas, há alguma forma de fazer com que a SymbolInfoSessionTrade funcione no testador de estratégias?

Uma entrada trivial não funciona:

void OnTick() {
  datetime from, to;
  if (SymbolInfoSessionTrade(_Symbol, FRIDAY, 0, from, to)) Print("WOW!");
}
Документация по MQL5: Получение рыночной информации / SymbolInfoSessionQuote
Документация по MQL5: Получение рыночной информации / SymbolInfoSessionQuote
  • www.mql5.com
Получение рыночной информации / SymbolInfoSessionQuote - Документация по MQL5
 

Mais uma pergunta, se possível. Gostaria de compreender o significado do novo operador. Qual é a ideia por detrás disto? Porque não criar o objecto da forma habitual? Afinal de contas, após o fim do bloco o acesso ao objecto declarado através do novo será perdido, então porque precisamos dele?

P.S. Honestamente, não consegui encontrá-lo na documentação :)

Документация по MQL5: Основы языка / Операторы / Оператор создания объекта new
Документация по MQL5: Основы языка / Операторы / Оператор создания объекта new
  • www.mql5.com
Основы языка / Операторы / Оператор создания объекта new - Документация по MQL5
 
220Volt:

Mais uma pergunta, se possível. Gostaria de compreender o significado do novo operador. Qual é a ideia por detrás disto?? Porque não criar o objecto da forma habitual? Afinal de contas, após o fim do bloco o acesso ao objecto declarado através do novo será perdido, então porque precisamos dele?

Tudo passa em algum momento. Isso significa que nada precisa de ser feito...?


P.S. sinceramente não consegui encontrá-lo na documentação :)

Eu acredito em si... :))
 
Valmars:

Obrigado! Imaginei-o. É necessário e suficiente utilizar oTimeTradeServer() em vez do TimeCurrent().

No final da semana de negociação não há novas cotações e é por isso que a TimeCurrent() não é actualizada durante muito tempo.

Ao desinicializar o Expert Advisor, TimeCurrent() mostra a hora 23:00; TimeTradeServer() mostra a hora 23:59, que coincide com o fim do teste.

 
MoneyJinn:

Obrigado! Imaginei-o. É necessário e suficiente utilizar oTimeTradeServer() em vez do TimeCurrent().

No final da semana de negociação não há novas cotações e, portanto, o TimeCurrent() não é actualizado durante muito tempo.

A questão não está entre aspas, mas sim em que os acordos de "fim de teste" são executados após o período de teste ter terminado. Portanto, nem "OnTick" nem "OnTimer" os podem obter da história. Pelo menos foi assim há um ano atrás, por isso mudei a sua verificação para 'OnDeinit'.
 
220Volt:

Mais uma pergunta, se possível. Gostaria de compreender o significado do novo operador. Qual é a ideia por detrás disto? Porque não criar o objecto da forma habitual? Afinal, após o fim do bloco o acesso ao objecto declarado via novo será perdido, então porque é que precisamos dele?

P.S. honestamente não o conseguiu encontrar na documentação :)

Não crie objectos dinâmicos - não terá de usar agora e tudo o resto que está associado a estes objectos (embora não possa fazer muito então).

Quer compreender não o significado de agora, mas o significado de trabalhar com objectos dinâmicos...

Inicialização e desinicialização de objectos colocados dinamicamente

Os apontadores para objectos sãoum caso especial, porque a declaração de um apontador não requer a inicialização do objecto em questão. Os objectos dinamicamente colocados são inicializados apenas no momento da criação de uma instância de uma classe por um novo operador. A inicialização de um objecto implica uma chamada do construtor da classe correspondente. Se não houver um construtor correspondente numa classe, os seus membros de tipo simples não serão automaticamente inicializados; membros de string, array dinâmico e tipos de objectos complexos serão automaticamente inicializados.

Os ponteiros podem ser declarados local ou globalmente, e podem ser inicializados com um valor NULL vazio ou com um ponteiro do mesmo tipo ou do tipo desovado . Se umnovoponteiro for invocado a nível local , a declaração de eliminaçãodesse ponteiro deve ser executada antes de deixar também o nível local. Caso contrário, o ponteiro será perdido e o objecto não poderá ser apagado explicitamente.

Todos os objectos criados pela expressão pointer_object=new_ClassName devem ser destruídos posteriormente pelo operador delete(pointer_object).Se, por alguma razão, esta variável não tiver sido destruída pelo operador de eliminação, a mensagem sobre ela aparecerá no Jornal de Peritos. Pode declarar múltiplas variáveis, e atribuir a todas elas apontadores para o mesmo objecto.

Se o objecto a ser criado dinamicamente tiver um construtor, este construtor será chamado quando um novooperador for executado . Se o objecto tiver um destruidor, o destruidor será chamado quando o operador deeliminação for executado.

Assim, os objectos dinamicamente colocados são criados apenas quando são criados utilizando umnovooperador , e é garantida a sua eliminação quer pelo operador de eliminação quer automaticamente pelo sistema de execução MQL5 no momento da descarga do programa.A ordem de declaração dos apontadores dos objectos dinamicamente criados não afecta a ordem da sua inicialização. A ordem de inicialização e de desinicialização é totalmente controlada pelo programador.