Quaisquer perguntas de recém-chegados sobre MQL4 e MQL5, ajuda e discussão sobre algoritmos e códigos - página 147

 
-Aleks-:

Por favor, ajude - Não consigo entender porque recebo zero ao calcular a matriz VesMass em valores i>0 ?

Acontece que eu deveria escrever não 4 e 5, mas 4.0 e 5.0 - qual é a lógica - não está claro para mim...
 
-Aleks-:

Acontece que você deve escrever não 4 e 5, mas 4.0 e 5.0 - qual é a lógica - não está claro para mim...
Leia a documentação e ela se tornará clara. É bom que você mesmo o tenha feito.
 
Alexey Viktorov:
Leia a documentação e ela se tornará clara. É bom que você mesmo o tenha feito.

Sim, já li sobre algo assim antes - então decidi tentar, mas não está claro onde está a lógica por trás disso... e, a propósito, não consegui encontrar a resposta na documentação.
 
-Aleks-:

Já li sobre algo assim antes - então decidi tentar, mas não está claro onde está a lógica por trás disso... E, a propósito, não consegui encontrar a resposta na documentação.


Esta é uma característica não apenas no MCL, em C++ e em outras linguagens de programação também - a divisão de dois inteiros ou variáveis do tipo (int) dará um resultado truncado ao inteiro. No seu caso 4/5=0.

Você pode escrever 4,0/5 ou (duplo)4/5 - então o resultado é um número real.
 
Vitalie Postolache:


Esta não é apenas uma característica da ICL, em C++ e outras linguagens de programação é a mesma - dividir dois inteiros ou variáveis de tipo (int) dará um resultado truncado a um inteiro. No seu caso 4/5=0.

Você pode escrever 4,0/5 ou (duplo)4/5 - então o resultado é um número real.

Entendo isso, mas não entendo a lógica da solução - ou seja, a necessidade.

 
-Aleks-:

Eu entendo isso, mas não entendo a lógica por trás da solução - ou seja, a necessidade.


Bem, você não argumenta "por que 2*2=4 em aritmética, qual é a lógica da solução"? Basta tomá-lo como um axioma e usá-lo. É assim com a divisão de dois números inteiros.
 
Vitalie Postolache:

Bem, você não argumenta "por que 2*2=4 em aritmética, qual é a lógica por trás da solução"? Basta tomá-lo como um axioma e usá-lo. É o mesmo com a divisão de dois números inteiros.

Vou verificar com adição...

 


Kot:


A linha é uma linha de tendência. Eu mudei as propriedades para um raio. Isso não ajudou. Se eu quisesse que ele produzisse o preço independentemente da posição da barra zero (acima, abaixo).

Este código também não funciona.

int start() {

double pr=ObjectGetValueByShift("line",0);

Se (Bid==pr){

Alerta (pr);}

retorno(0);}


O nome da linha está escrito corretamente?

Experimente este roteiro e mostre o que ele diz nos registros.

void OnStart()
  {
     double pr;
     int obj_total=ObjectsTotal(); 
     string name;
     int i; 
     
   for(i=0;i<obj_total;i++) 
     { 
      name=ObjectName(i); 
      if(ObjectType(name)!=OBJ_TREND) continue; 
      PrintFormat("Объект %d:     Имя объекта - %s",i,name); 
      pr=ObjectGetValueByShift(name,0);
      PrintFormat("Объект %d:     Цена - %.5f",i,pr);
      
     }  

}

O roteiro detecta o objeto, escreve o nome corretamente. Mas o preço é absolutamente canhoto. É marcado na foto com uma linha horizontal. Ele dá esses preços independentemente de as barras terem cruzado a linha ou não.

Arquivos anexados:
23.png  62 kb
 
Kot:


A linha é de tendência. Alterou as propriedades para vigiar. Isso não ajudou. Idealmente, o preço deve ser exibido independentemente da posição da barra zero (superior, inferior).

Este código também não funciona.

int start() {

double pr=ObjectGetValueByShift("line",0);

Se (Bid==pr){

Alerta (pr);}

retorno(0);}

A licitação pode facilmente saltar sua linha, não é obrigada a parar em cada ponto (ou seja, você não terá a igualdade exata).

mudar a condição para, por exemplo, se ((MathMin(Close[1],Open[0])<=pr && Bid>=pr) ||| (MathMax(Close[1],Open[0])>=pr && Bid<=pr)) ou similar...

 
Maxim Kuznetsov:

A licitação pode facilmente saltar sua linha, não é obrigada a parar em todos os pontos (ou seja, a igualdade exata não acontecerá)

mudar a condição para, por exemplo, se ((MathMin(Close[1],Open[0])<=pr && Bid>=pr) ||| (MathMax(Close[1],Open[0])>=pr && Bid<=pr)) ou similar...


Obrigado!

E se a situação for diferente? Há linhas horizontais com nomes diferentes na tabela. Você precisa do roteiro para calcular qual linha corresponde a qual preço.