Toute question de débutant, afin de ne pas encombrer le forum. Professionnels, ne passez pas à côté. Nulle part sans toi - 6. - page 501

 

Bonjour à tous.

Veuillez commenter le début de l'indicateur dans la nouvelle construction. Je suis intéressé par le démarrage du cycle (comment le faire correctement). Voici le code de BolingerBands. Commentez les endroits avec la question //qu'est-ce que cela signifie et à quoi cela sert-il ?

Dans le tutoriel, jusqu'à présent, tout est identique à https://book.mql4.com/ru/samples/icustom.

int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
   int i,pos;
//---
   if(rates_total<=InpBandsPeriod || InpBandsPeriod<=0)    //что это значит ?
      return(0);
//--- counting from 0 to rates_total
   ArraySetAsSeries(ExtMovingBuffer,false);                //что это значит ?
   ArraySetAsSeries(ExtUpperBuffer,false);                 //что это значит ?
   ArraySetAsSeries(ExtLowerBuffer,false);                 //что это значит ?
   ArraySetAsSeries(ExtStdDevBuffer,false);                //что это значит ?
   ArraySetAsSeries(close,false);
//--- initial zero
   if(prev_calculated<1)                                  //что это значит ?
     {
      for(i=0; i<InpBandsPeriod; i++)                      //что это значит ?
        {
         ExtMovingBuffer[i]=EMPTY_VALUE;                   //что это значит ?
         ExtUpperBuffer[i]=EMPTY_VALUE;                    //что это значит ?
         ExtLowerBuffer[i]=EMPTY_VALUE;                    //что это значит ?
        }
     }
//--- starting calculation
   if(prev_calculated>1)                                   //что это значит ?
      pos=prev_calculated-1;                               //что это значит ?
   else                                                    //что это значит ?
      pos=0;//что это значит ?
//--- main cycle
   for(i=pos; i<rates_total && !IsStopped(); i++)          //что это значит ?
     {
      //--- 
      
      //код индикатора в цикле
      
      //---
     }
//---- OnCalculate done. Return new prev_calculated.
   return(rates_total);
  }
 

Et lire la documentation ? Arrêtez-vous sur une expression incompréhensible et appuyez sur la touche magique F1 ou lisez sur le site web.

https://docs.mql4.com/ru/array/arraysetasseries

https://docs.mql4.com/ru/basis/function/events#oncalculate

 

Bonjour à tous. Aidez-moi, je n'arrive pas à comprendre la situation.

Dans mon code, j'ai besoin que buf0 soit affiché à l'écran, et que buf1 ne soit pas affiché, mais compté pour le traitement ultérieur du tableau et la sortie vers un autre tampon (par exemple dans buf2). Je cache buf1 dans une chaîne :

SetIndexBuffer(0,Buf0) ;

SetIndexStyle (0,DRAW_LINE,STYLE_SOLID,1) ;

SetIndexBuffer(1,Buf1) ;

SetIndexStyle (1,DRAW_NONE) ; //Je veux cacher cette ligne

Mais lorsque je règle l'indicateur, j'obtiens un décalage dû à une différence de calcul...

QUESTION : existe-t-il un moyen de supprimer cette différence pour que buf0 soit dessiné normalement ?
Dossiers :
testbuf.mq4  2 kb
 
clubsmi:

Bonjour à tous. Aidez-moi, je n'arrive pas à comprendre la situation.

Dans mon code, j'ai besoin que buf0 soit affiché à l'écran, et que buf1 ne soit pas affiché, mais compté pour le traitement ultérieur du tableau et la sortie vers un autre tampon (par exemple dansbuf2). Je cache buf1 dans une chaîne :

SetIndexBuffer(0,Buf0) ;

SetIndexStyle (0,DRAW_LINE,STYLE_SOLID,1) ;

SetIndexBuffer(1,Buf1) ;

SetIndexStyle (1,DRAW_NONE) ; //Je veux cacher cette ligne

Mais lorsque je règle l'indicateur, j'obtiens un décalage dû à une différence de calcul...

QUESTION : existe-t-il un moyen de supprimer cette différence pour que buf0 soit dessiné normalement ?

En savoir plus sur INDICATOR_DATA et INDICATOR_CALCULATIONS

Et avant cela, lisez #property indicator_buffers and IndicatorBuffers(10) ; 10 provient de mon indicateur, je ne l'ai pas supprimé pour montrer que le nombre de tampons n'est pas limité comme dans la version ME 509.

 
J'appuie souvent sur la touche F1, mais les choses ne sont pas toujours claires pour un faible programmeur. Exemple - ArraySetAsSeries -> Définit l'indicateur AS_SERIES à l'objet tableau dynamique spécifié, les éléments du tableau seront indexés comme dans les séries temporelles.

Paramètres

tableau[]

[in] [out] Tableau numérique à définir.

drapeau

[in] La direction d'indexation du tableau.

Valeur retournée

Renvoie la valeur true (vrai) en cas de succès, false (faux) dans le cas contraire.

Mais ce qui donne et comment ce sera for(i=0 ; i<InpBandsPeriod ; i++) et for(i=InpBandsPeriod ; i<0 ; i--) . Est-ce que le vrai et le faux seront reflétés dans les boucles. Ceci n'était pas présent dans la version 5xx. Il est peut-être possible de se passer de ArraySetAsSeries, mais dans ce cas, quelle serait la valeur par défaut?Ou peut-être pas.

 

grâce à AlexeyVik, c'est réglé...

Qui peut me dire combien de temps l'ancien langage mql4 de la build 509 va durer ? Est-il nécessaire d'apprendre le langage en urgence à partir de la nouvelle build ?

 
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (""   - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    op - операция                   (-1   - любая позиция)                  |
//|    mn - MagicNumber                (-1   - любой магик)                    |
//|    ot - время открытия             ( 0   - любое время открытия)           |
//+----------------------------------------------------------------------------+
bool ExistPositions(string sy="", int op=-1, int mn=-1, datetime ot=0) {
  int i, k=OrdersTotal();
 
  if (sy=="0") sy=Symbol();
  for (i=0; i<k; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      if (OrderSymbol()==sy || sy=="") {
        if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
          if (op<0 || OrderType()==op) {
            if (mn<0 || OrderMagicNumber()==mn) {
              if (ot<=OrderOpenTime()) return(True);
            }
          }
        }
      }
    }
  }
  return(False);
}

la fonction de kim ne fonctionne pas...

if(IsNewBar()==true)
{
if(ExistPositions(NULL,-1,44444,-1)==false)
           {
       
                  trade=true;
                         
            if(trade!=false)
              {
                    
                        OpenPosition(Symbol(),OP_BUY,0.1,Ask-sl*Point,Ask+tp*Point,44444);

                        trade=false;
                       }
                   
      }
  }            
       }   

la position devrait s 'ouvrir s'il n'y a pas d'autres positions avec l'assistant..... mais elles s'ouvrent sur chaque nouvelle barre avec moi......

 
Zver4991:


la fonction de kim ne fonctionne pas...

la position devrait s'ouvrir s'il n'y a pas d'autres positions avec l'assistant..... mais elles s'ouvrent sur chaque nouvelle barre avec moi......


regardez ce ot - temps ouvert( 0 - tout temps ouvert), et vous ?

 
gince:


regardez ce ot - temps ouvert ( 0 - tout temps ouvert), et vous ?

Et pourquoi

trade=true;if(trade!=false) .......
                          

s'il n'y a pas d'ouverture, ouvrir

 
gince:


regardez cette ot - heure d'ouverture ( 0 - toute heure d'ouverture), et vous ?


donc il devrait vérifier s'il n'y a pas de positions ouvertes avec une telle magie quelle que soit l'heure d'ouverture..... simple limitation sur la magie....toast

if(ExistPositions(NULL,-1,44444,-1)==false)//s'il n'y a pas de positions ouvertes avec ce nombre magique, alors vérifiez.......

.... ou peut-être que je ne comprends pas.... j'ai -1 parce que je ne me soucie pas de savoir quand une position s'est ouverte ..... de toute façon elle ne s'ouvrira que sur une nouvelle barre et quand l'ancienne sera fermée parce que les conditions spécifient que la position ne peut s'ouvrir que s'il n'y a pas de positions ouvertes avec ce nombre magique

pour faire encore plus simple : ouvrir une position et attendre qu'elle se ferme.... quand il se ferme puis s'ouvre à nouveau et il ne faut certainement pas ouvrir sur chaque barre une position avec un tel magicien.... il est vérifié à nouveau s'il n'y a pas de positions ouvertes avec un tel magicien.