Erros, bugs, perguntas - página 313

 

Por alguma razão não consigo obter o lucro da conta corrente na função OnTester

É assim que eu recebo 0

double OnTester()
{
   return(AccountInfoDouble(ACCOUNT_PROFIT));

E é assim que eu obtenho lucro:

double OnTester()
{
   return(AccountInfoDouble(ACCOUNT_BALANCE)-100000);

Документация по MQL5: Стандартные константы, перечисления и структуры / Торговые константы / Свойства позиций
Документация по MQL5: Стандартные константы, перечисления и структуры / Торговые константы / Свойства позиций
  • www.mql5.com
Стандартные константы, перечисления и структуры / Торговые константы / Свойства позиций - Документация по MQL5
 
stringo:

Sobre o que estamos a discutir? w0 não colocar

PS É obrigatório que haja uma mensagem (talvez algumas linhas abaixo)


Glória eu concordo - todos estes argumentos são tão demorados, que os lixem ( argumentos ). :)

Mas assim, o que se chama na perna - você, tenho a certeza, sabe tudo perfeitamente bem, mas mesmo assim, se esta função é externa e declarada apenas através de declaração, existem modificadores tais como "const" e "dentro" e "fora". E talvez haja uma falha nesta função. A questão é - se for um parâmetro retornável, então no caso de não ser retornado (no caso de ser retornado via "retorno") é dado um aviso e tendo uma segunda forma de função, quando um valor retornável é retornado via parâmetro, também deve ser dado um aviso, porque é um valor retornável. Caso contrário, se o resultado do sucesso/falha fosse devolvido através de um parâmetro e o próprio valor fosse devolvido através de retorno, seria impossível. E o sucesso ou nenhum sucesso é também SEMPRE devolvido. Por outras palavras - ( http://users.telenet.be/bart.demeyere/C++InOutParameters.html ) aqui está uma solução que já existe há muito tempo.


Mas a conversa em geral, uma vez que não notei nada sobre isso. IMHO, precisa de responder a tais perguntas, se não pretende alterar nada cardinal na implementação actual algo como isto :) - "Sim, existe tal problema, ele será resolvido nas próximas versões do programa, agora já corrigimos o código, e só estamos a corrigir erros". Ninguém ( penso que mesmo o mais inadequado ) ficará ofendido, mas a simples resolução do problema em si é importante e necessária.


Assim, quer haja ou não nesta versão tais ( MUITO ) modificadores úteis para fora e outros, eles permitem minimizar significativamente os erros.


***

Demorará meio dia a fazer toda esta correspondência. Estou farto. :)

 
Erm955:

Por alguma razão não consigo obter o lucro da conta corrente na função OnTester

É assim que eu recebo 0

double OnTester()
{
   return(AccountInfoDouble(ACCOUNT_PROFIT));

E é assim que eu obtenho lucro:

double OnTester()
{
   return(AccountInfoDouble(ACCOUNT_BALANCE)-100000);


Declarar uma variável global e atribuir-lhe o valor do saldo actual no OnInit().

Em OnTester() calcular o lucro total com base nos resultados de todas as transacções concluídas:

Профит=ТекущийБбаланс - Начальный баланс

e produzi-lo em OnTester().


E o que está a tentar obter agora é o lucro actual não fixo , que é zero se todas as posições estiverem fechadas.

 
Academic:


Glória eu concordo - todos estes debates são tão demorados, não se preocupe com eles ( debates ). :)

Haverá nesta versão tais ( MUITO ) modificadores úteis para fora e outros, eles permitem minimizar erros.

"Sobre o que estamos a discutir"? - é uma frase da minha infância que significa "sobre o que é que estamos a discutir?

Passar um parâmetro por referência é exactamente o que significa inout. Há simplesmente implementações que estão para além do controlo do compilador.

De facto, é bastante fácil analisar o fluxo de execução através da introdução de funções (o exemplo Rashid fornecido). Recusámos deliberadamente esta abordagem. A própria razão era que isso iria aumentar significativamente o nosso tempo de compilação. É por isso que escolhemos a forma mais simples - exibir um aviso. É melhor não produzir um aviso deste tipo? Sim, deve. Se fizer uma inicialização explícita, não haverá qualquer aviso.

Repito também que temos uma estimativa resumida de expressões lógicas. Significa que, no seu caso, se o primeiro ObjectGetDouble retorna falso (por exemplo, porque o objecto, repara no exterior do programa, de repente não existe), o segundo ObjectGetDouble não será chamado

Документация по MQL5: Основы языка / Типы данных / Ссылки. Модификатор & и ключевое слово this
Документация по MQL5: Основы языка / Типы данных / Ссылки. Модификатор & и ключевое слово this
  • www.mql5.com
Основы языка / Типы данных / Ссылки. Модификатор & и ключевое слово this - Документация по MQL5
 
stringo:

"Sobre o que estamos a discutir"? - é uma frase da minha infância que significa "sobre o que é que estamos a discutir?

Passar um parâmetro por referência é exactamente o que significa inout. Há simplesmente implementações que estão para além do controlo do compilador.

De facto, é bastante fácil analisar o fluxo de execução através da introdução de funções (o exemplo Rashid fornecido). Recusámos deliberadamente esta abordagem. A própria razão era que isso iria aumentar significativamente o nosso tempo de compilação. É por isso que escolhemos a forma mais simples - exibir um aviso. É melhor não produzir um aviso deste tipo? Sim, deve. Se fizer uma inicialização explícita, não haverá qualquer aviso.

Repito também que temos uma estimativa resumida de expressões lógicas. Significa que, no seu caso, se o primeiro ObjectGetDouble retorna falso (por exemplo, porque o objecto, repara no exterior do programa, subitamente não existe), o segundo ObjectGetDouble não será chamado


Certo, não será chamado - isto é um comportamento padrão em código C.

Os modificadores que entram e saem podem ser além das referências. E por defeito, estão sempre a entrar e a sair para referências. Mas posso passar uma referência com modificador, o que significa que o parâmetro desta função é sempre introduzido e não é possível escrever nela mesmo que seja passado por referência. Já leu ? http://users.telenet.be/bart.demeyere/C++InOutParameters.html


em: o parâmetro será lido (aviso quando não for lido em todos os ramos*)
(em: o parâmetro será lido (aviso quando não for lido em lado nenhum)
fora: o parâmetro será escrito para (aviso quando não escrito em todos os ramos*)
(fora): o parâmetro pode ser escrito para (avisar quando em nenhum lugar escrito)
in without out: o parâmetro não pode ser escrito para
para fora sem entrar: o parâmetro não pode ser lido antes de ser escrito.
* em cada ramo: em todos os fluxos normais possíveis através da função (ambos os ramos numa declaração de se, todos os ramos numa declaração de caso,... ), mas não quando é lançada uma excepção. Este é o mesmo constrangimento que para uma declaração de retorno, de não ter um comportamento indefinido.


E acima de tudo, a introdução das palavras-chave dentro e fora, pode ajudar-nos a encontrar alguns problemas já em tempo de compilação. E não queremos todos encontrar erros o mais depressa possível

 

Existe um modificador constante. A passagem de uma referência constante pressupõe explicitamente a entrada do parâmetro sem qualquer saída. Definitivamente não introduziremos entidades adicionais dentro, fora, dentro e fora

 
stringo:

Existe um modificador constante. A passagem de uma referência constante implica explicitamente um parâmetro in sem qualquer out. Definitivamente não introduziremos entidades adicionais dentro, fora, dentro e fora

Se não o fizer, não o fará. Mas deve compreender que não obterá então uma optimização decente. E se houvesse OUT nesse exemplo, o aviso não teria sido gerado. Mas tudo em vão - IMHO - demorará três minutos, mas há muito menos erros. E se não o quiser usar, não o use. Então tudo é como sempre é. Tal como agora. :)


Como se faz apenas OUT sem IN? O que significa que algo é sempre devolvido, sabe, como um retorno de função?

 

Desenvolvedores.

1. Presumo que o spread nos pares principais tenha sido martelado desde Maio de 1993, cerca de 930 bares semanais na altura actual?

E na história profunda, as barras foram construídas com base em dias.

Portanto, o Expert Advisor pode ser testado exactamente a partir de Maio de 1993 (se utilizarmos uma TF não inferior a D1)?

Podemos olhar mais fundo do que 9 de Maio de 1993 sobre o GBPUSD (como se fosse implementado no EURUSD)?
 

Olá.

Pode explicar por que razão ao criar manualmente um objecto"Graphic Tag", este não tem o ficheiro bmp especificado para estados on/off?

Aqui está o código:

ObjectCreate(....);

.......

ObjectSetString(0, "ColorLabel", OBJPROP_BMPFILE, 0, "Images\on.bmp");
ObjectSetString(0, "ColorLabel", OBJPROP_BMPFILE, 1, "Images\off.bmp");

A etiqueta é criada completamente correctamente, na posição especificada, com cores especificadas, etc., mas "Images\on.bmp" e "Images\off.bmp" não são especificadas. Se no gui MT5
clique na lista de objectos e defina estes ficheiros para o marcador manualmente, eles serão definidos. Mas porque é que a ObjectSetString não faz isso?

O que pensa?

Документация по MQL5: Стандартные константы, перечисления и структуры / Константы объектов / Типы объектов
Документация по MQL5: Стандартные константы, перечисления и структуры / Константы объектов / Типы объектов
  • www.mql5.com
Стандартные константы, перечисления и структуры / Константы объектов / Типы объектов - Документация по MQL5
 
MathX:

O que pensa?

Experimente

ObjectSetString(0, "ColorLabel", OBJPROP_BMPFILE, 0, "\\Images\\on.bmp");
ObjectSetString(0, "ColorLabel", OBJPROP_BMPFILE, 1, "\\Images\\off.bmp");


As alterações ao certificado serão em breve.