Questions des débutants MQL5 MT5 MetaTrader 5 - page 533

 
      // AO
      if(ao) {
         CopyTime(symbol_name[st],ao_time_frame,1,1,time_buf);
         if(symbol_ao_timebar[st]!=time_buf[0]) {
            symbol_ao_timebar[st]=time_buf[0];
            double ao_buf[];
            CopyBuffer(symbol_ao_handle[st],0,enter_bar,2,ao_buf);
            if(ao_buf[1]>ao_buf[0]&&ao_buf[0]<0) symbol_ao_signal[st]=0;
            if(ao_buf[1]<ao_buf[0]&&ao_buf[0]>0) symbol_ao_signal[st]=1;
            }
         }else symbol_ao_signal[st]=2;
      
      // AC
      if(ac) {
         CopyTime(symbol_name[st],ac_time_frame,1,1,time_buf);
         if(symbol_ac_timebar[st]!=time_buf[0]) {
            symbol_ac_timebar[st]=time_buf[0];
            double ac_buf[];
            CopyBuffer(symbol_ac_handle[st],0,enter_bar,2,ac_buf);
            if(ac_buf[1]>ac_buf[0]&&ac_buf[0]<0) symbol_ac_signal[st]=0;
            if(ac_buf[1]<ac_buf[0]&&ac_buf[0]>0) symbol_ac_signal[st]=1;
            }      
         }else symbol_ac_signal[st]=2;
Bonjour, tout le monde. Voici une question. Il y a un morceau de code C'est écrit. Je veux dire qu'il devrait dire acheter ou vendre, mais seulement lorsque l'AO et l'AC sont sur le même plan. Achetez en dessous de zéro et vendez au-dessus de zéro.
C'est vrai ? Gourous, aidez-nous s'il vous plaît.
La question est essentiellement la suivante. Est-ce un code normal ou une connerie ?
 
MASTERXAYS:
Bonjour, tout le monde. Voici une question. Il y a un morceau de code C'est écrit. Je veux dire qu'il devrait dire acheter ou vendre, mais seulement lorsque l'AO et l'AC sont sur le même plan. Achetez en dessous de zéro et vendez au-dessus de zéro.
C'est vrai ? S'il vous plaît, aidez les gourous.
La question est la suivante. C'est un code normal ou c'est une connerie ?

Je qualifierais cette approche de "connerie" .

Avez-vous déjà vu le prix suivre un indicateur ? Notez également qu'il s'agit des indicateurs de B. Williams, qui n'a pas négocié sur le marché du Forex, et que l'idée même est dépassée.

 
-Aleks-:
Et comment, je suis désolé, faites-vous cette remise à zéro ?
Exactement de la même manière que la mise à zéro des types simples. En leur attribuant la valeur 0. Dès que vous attribuez la valeur 0 aux champs obligatoires, vous utilisez l'opération inverse StructToTime().
 
MASTERXAYS:
Bonjour, tout le monde. Voici une question. Il y a un morceau de code C'est écrit. Je veux dire qu'il devrait dire acheter ou vendre, mais seulement lorsque l'AO et l'AC sont sur le même plan. Achetez en dessous de zéro et vendez au-dessus de zéro.
C'est vrai ? Veuillez aider les gourous.
La question est essentiellement la suivante. Est-ce un code normal ou une connerie dans l'huile verte ?

Lisez mon article où les codes de construction des signaux sont décrits. Mais personnellement, j'écris les fonctions de signal de cette manière.

ENUM_ORDER_TYPE GetSignal(int i,ENUM_TIMEFRAMES tf)
  {
   double bbup[1];
   double bbdw[1];
   double rsi[1];
   double macd[2];
   double stoh[2];
   double Close[2];

   if(IND01[i]==INVALID_HANDLE || IND01[i]==0){IND01[i]=iBands(m_symbol,tf,BB_period,0,2,PRICE_CLOSE);return(WRONG_VALUE);}
   if(IND02[i]==INVALID_HANDLE || IND02[i]==0){IND02[i]=iRSI(m_symbol,tf,RSI_period,PRICE_CLOSE);return(WRONG_VALUE);}
   if(IND03[i]==INVALID_HANDLE || IND03[i]==0){IND03[i]=iMACD(m_symbol,tf,MACD_fast_ema_period,MACD_slow_ema_period,9,PRICE_CLOSE);return(WRONG_VALUE);}
   if(IND04[i]==INVALID_HANDLE || IND04[i]==0){IND04[i]=iStochastic(m_symbol,tf,ST_Kperiod,ST_Dperiod,ST_slowing,MODE_SMA,STO_LOWHIGH);return(WRONG_VALUE);}

   if(CopyBuffer(IND01[i],1,0,1,bbup)<1) return(WRONG_VALUE);
   if(CopyBuffer(IND01[i],2,0,1,bbdw)<1) return(WRONG_VALUE);
   if(CopyBuffer(IND02[i],0,0,1,rsi)<1) return(WRONG_VALUE);
   if(CopyBuffer(IND03[i],0,0,2,macd)<2) return(WRONG_VALUE);
   if(CopyBuffer(IND04[i],0,0,2,stoh)<2) return(WRONG_VALUE);
   if(CopyClose(m_symbol,tf,0,2,Close)<2) return(WRONG_VALUE);

   if(Close[0]<bbdw[0]&& Close[1]>bbdw[0]&&  stoh[1]>stoh[0]&&  stoh[0]<20  &&  rsi[0]<30  &&  macd[1]<macd[0]) return(ORDER_TYPE_BUY);
   if(Close[0]>bbup[0]&& Close[1]<bbup[0]&&  stoh[1]<stoh[0]&&  stoh[0]>80  &&  rsi[0]>70  &&  macd[1]>macd[0]) return(ORDER_TYPE_SELL);

   return(WRONG_VALUE);
  }
 
Aleksey Lebedev:

Ce sera 1, les deux temps sont d'abord arrondis à un jour entier, puis soustraits.

Qu'est-ce qui vous fait penser que tous les chiffres de l'expression sont arrondis ? Ce n'est pas arrondi. Je suis d'accord pour dire qu'une variable sera arrondie.

Et s'ils étaient arrondis, j'ai montré un exemple - la barre actuelle d'aujourd'hui et la barre calculée d'hier - TF 1 heure - leur différence serait égale à zéro dans tous les arrondis ... Peut-être que si nous arrondissons toujours vers le haut...

Alexey Kozitsyn:
Exactement comme la mise à zéro des types simples. En les affectant à 0. Dès que vous avez affecté 0 aux champs obligatoires, vous utilisez l'opération inverse StructToTime().

Merci - je vais réessayer - les exemples dans l'aide ne sont pas bons...

 
-Aleks-:

Qu'est-ce qui vous fait penser que tous les chiffres de l'expression sont arrondis ? Il n'y a pas d'arrondi. Mais la variable est arrondie - je suis d'accord.

Et s'il est arrondi, j'ai montré un exemple - barre actuelle d'aujourd'hui et calculée hier - TF 1 heure - leur différence serait égale à zéro dans tout arrondi ... Peut-être que si nous arrondissons toujours vers le haut...

Lors de la division d'entiers (int, long, datetime, etc.), le résultat est un entier, c'est-à-dire que le reste est éliminé. 00:00 aujourd'hui et 23:59:59 hier, la différence sera de 1 jour.

 

Pouvez-vous me dire s'il vous plaît, MQL4...
Je n'arrive pas à comprendre, l'indicateur fonctionne sur M5, comment se référer au High ou Low de la barre précédente sur H1 dans son code ?
Comme iHigh(NULL,PERIOD_H1, i) ... Il s'agit de déterminer (en plaçant une flèche haut/bas sur le graphique M5) si la bougie M5 actuelle a cassé le prix haut de l'heure précédente.


 
Dans le code de l'indicateur MQL4, en remplaçant la ligne
for(i=pos; i<rates_total; i++) 
avec
for(i=pos; i<rates_total-1; i++) 
conduit au fait que l'indicateur n'est pas considéré à la barre actuelle (non finie) - il n'y a tout simplement pas de ligne d'indicateur sous cette barre.
Dans MQL5, la barre actuelle a des valeurs d'indicateur étranges, parfois juste 0.0000.
Que puis-je faire ?
 
MikeZv:

S'il vous plaît, donnez-moi un indice, MQL4...
Je n'arrive pas à comprendre, l'indicateur fonctionne sur M5, comment se référer au High ou Low de la barre précédente sur H1 ?
Comme iHigh(NULL,PERIOD_H1, i) ... Il s'agit de déterminer (en plaçant une flèche haut/bas sur le graphique M5) si la bougie M5 actuelle a cassé le prix haut de l'heure précédente.


MikeZv:
Dans le code de l'indicateur MQL4, remplacez la ligne
avec
conduit au fait que l'indicateur n'est pas calculé sur la barre actuelle (non finie) - il n'y a tout simplement pas de ligne d'indicateur sous cette barre.
Dans MQL5, la barre actuelle a des valeurs d'indicateur étranges, parfois juste 0.0000.
Que puis-je faire ?

La façon dont vous faites tourner les tampons indicateurs n'a pas d'importance - seule Juna peut vous aider.

Ajouté :

Pour le débogage, vérifiez quelle est la valeur du tableau time[i], afin de comprendre à partir de quelle extrémité vous commencez à compter les barres et où vous avez la barre "zéro".

 
Karputov Vladimir

Vous avez peu tordu les tampons indicateurs à cet endroit - seule Juna peut vous aider ici.
... A partir de quelle extrémité commencez-vous le comptage des barres et où se trouve la barre "zéro".

Vladimir, merci d'avoir répondu à la première question, ces fonctions me manquaient...

Je mets le même indicateur dans MT4 et MT5 (bien sûr le code est adapté à chaque plateforme).
Jusqu'à la barre de zéro, leurs valeurs sont les mêmes, donc apparemment d'une extrémité ... :)
Et lorsque l'on désactive le calcul sur la barre actuelle dans MT4, rien n'est dessiné sous la barre actuelle, dans MT5 - valeurs erronées.

Dossiers :
mvt_Vlt.mq4  5 kb
mvt_Vlt.mq5  5 kb