Tutte le domande dei nuovi arrivati su MQL4 e MQL5, aiuto e discussione su algoritmi e codici - pagina 147

 
-Aleks-:

Per favore aiutatemi - non riesco a capire perché ottengo zero quando calcolo l'array VesMass nei valori i>0?

Risulta che non dovrei scrivere 4 e 5, ma 4.0 e 5.0 - qual è la logica - non mi è chiaro...
 
-Aleks-:

Si scopre che non si dovrebbe scrivere 4 e 5, ma 4.0 e 5.0 - qual è la logica - non mi è chiaro...
Leggete la documentazione e vi sarà chiaro. È un bene che tu l'abbia fatto da solo.
 
Alexey Viktorov:
Leggete la documentazione e vi sarà chiaro. È un bene che tu l'abbia fatto da solo.

Sì, ho letto qualcosa del genere prima - così ho deciso di provare, ma non è chiaro dove sia la logica dietro... e non ho trovato la risposta nella documentazione, tra l'altro.
 
-Aleks-:

Ho letto qualcosa del genere prima - così ho deciso di provarlo, ma non è chiaro dove sia la logica dietro... E comunque non ho trovato la risposta nella documentazione.


Questa è una caratteristica non solo in MCL, anche in C++ e in altri linguaggi di programmazione - la divisione di due interi o variabili di tipo (int) darà un risultato troncato all'intero. Nel vostro caso 4/5=0.

Puoi scrivere 4.0/5 o (doppio)4/5 - allora il risultato è un numero reale.
 
Vitalie Postolache:


Questa non è solo una caratteristica di ICL, in C++ e in altri linguaggi di programmazione è lo stesso - dividere due interi o variabili di tipo (int) darà un risultato troncato ad un intero. Nel vostro caso 4/5=0.

Puoi scrivere 4,0/5 o (doppio)4/5 - allora il risultato è un numero reale.

Lo capisco, ma non capisco la logica della soluzione - cioè la necessità.

 
-Aleks-:

Lo capisco, ma non capisco la logica dietro la soluzione - cioè la necessità.


Beh, non si discute "perché 2*2=4 in aritmetica, qual è la logica della soluzione"? Basta prenderlo come un assioma e usarlo. È così per la divisione di due numeri interi.
 
Vitalie Postolache:

Beh, non si discute "perché 2*2=4 in aritmetica, qual è la logica dietro la soluzione"? Basta prenderlo come un assioma e usarlo. È lo stesso con la divisione di due interi.

Controllerò con l'aggiunta...

 


Kot:


La linea è una linea di tendenza. Ho cambiato le sue proprietà in un raggio. Non ha aiutato. Se volessi che emettesse il prezzo indipendentemente dalla posizione della barra zero (sopra, sotto).

Anche questo codice non funziona.

int start() {

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

Se (Bid==pr){

Alert (pr);}

return(0);}


Il nome della linea è scritto correttamente?

Provate questo script e mostrate cosa dice nei log.

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);
      
     }  

}

Lo script rileva l'oggetto, scrive il nome correttamente. Ma il prezzo è assolutamente sinistro. È segnato sulla foto con una linea orizzontale. Dà questi prezzi indipendentemente dal fatto che le barre abbiano attraversato la linea o meno.

File:
23.png  62 kb
 
Kot:


La linea è in tendenza. Cambiato le proprietà in raggio. Non ha aiutato. Idealmente, il prezzo dovrebbe essere visualizzato indipendentemente dalla posizione della barra dello zero (in alto, in basso).

Anche questo codice non funziona.

int start() {

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

Se (Bid==pr){

Alert (pr);}

return(0);}

L'offerta può facilmente saltare la tua linea, non è obbligata a fermarsi in ogni punto (cioè, non otterrai l'esatta uguaglianza).

cambiare la condizione in per esempio se ((MathMin(Close[1],Open[0])<=pr && Bid>=pr) || (MathMax(Close[1],Open[0])>=pr && Bid<=pr)) o simile...

 
Maxim Kuznetsov:

L'offerta può facilmente saltare la tua linea, non è obbligata a fermarsi in ogni punto (cioè, l'uguaglianza esatta non accadrà)

cambiare la condizione in per esempio se ((MathMin(Close[1],Open[0])<=pr && Bid>=pr) || (MathMax(Close[1],Open[0])>=pr && Bid<=pr)) o simile...


Grazie! Ho capito l'idea.

E se la situazione fosse diversa. Ci sono linee orizzontali con nomi diversi sul grafico. È necessario che lo script calcoli quale linea corrisponde a quale prezzo.