Questions d'un "mannequin - page 235

 
lazarev-d-m:

Changé en ceci

Ça a l'air de fonctionner.

vos tableaux ne sont pas sérialisés.

c'est pour ça que c'est ça.

Buffer[i+1]=Buffer[i]+delta;

un coup d'œil sur l'avenir


Il ne recalcule pas la barre 0 - pour la même raison - votre départ - il ne commence pas par 0.

 
sergeev:

vos tableaux ne sont pas sérialisés.

donc c'est pour ça que c'est ça.

jeter un coup d'œil à l'avenir.


Il ne recalcule pas la barre 0 pour la même raison que vous ne commencez pas avec 0.

Mon 0 bar n'est pas calculé selon la formule.

Buffer[0]=price[0]; 

Puis, en fonction du mouvement des prix, l'indicateur rattrapera la tendance.

Par exemple, si le prix s'est éloigné de l'indicateur et ne bougera pas, alors pendant la"période" de la bougie, l'indicateur rattrapera le prix, c'est une sorte d'alternative à la MA pour moi.

 

lazarev-d-m:

c'est une sorte d'alternative à MA pour moi

en regardant une barre dans le futur, vous pouvez sans risque jeter cette alternative à la poubelle.
 

Mon premier indicateur. Je veux mettre le symbole à l'échelle de 0 à 100. Est-ce que je le fais bien ? Et comment faire pour que la barre courante ne soit pas recalculée (dans le testeur, elle est saccadée, mais pas sur le graphique).

#property indicator_separate_window
#property indicator_minimum 0
#property indicator_maximum 100
#property indicator_buffers 1
#property indicator_plots   1
//--- plot Label1
#property indicator_label1  "Main"
#property indicator_type1   DRAW_LINE
#property indicator_color1  clrRed
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1
//--- indicator buffers
double         MainBuffer[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   SetIndexBuffer(0,MainBuffer,INDICATOR_DATA);
   IndicatorSetString(INDICATOR_SHORTNAME,"NormSymbol");
   IndicatorSetInteger(INDICATOR_DIGITS,2);
   ArrayInitialize(MainBuffer, EMPTY_VALUE);

//---
   return(0);
  }
  
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
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 first,bar,nLowBar=0,nHighBar=0;
   int nVizCount = (int)ChartGetInteger(0, CHART_VISIBLE_BARS);
   if(prev_calculated==0) // проверка на первый старт расчёта индикатора
     {
      first=0; // стартовый номер для расчёта всех баров
     }
   else
     {
      first=prev_calculated-1; // стартовый номер для расчёта новых баров
     }


//---- основной цикл расчёта индикатора
   for(bar=first; bar<rates_total; bar++)
     {
      nLowBar =ArrayMinimum(low, bar, nVizCount);
      nHighBar=ArrayMaximum(high, bar, nVizCount);
      if(nLowBar>0 && nHighBar>0 && high[nHighBar]-low[nLowBar]!=0)
        {
         MainBuffer[bar]=((close[bar] -low[nLowBar])/(high[nHighBar]-low[nLowBar]))*100;
        }
      else
        {
         MainBuffer[bar]=EMPTY_VALUE;
        }
     }

  
//--- return value of prev_calculated for next call

   return(rates_total);
  }
 
Konstantin83: Comment faire en sorte que la barre actuelle ne soit pas recalculée ?

Mémorisez l'heure d'ouverture de la barre actuelle et comparez-la avec la même valeur du tick entrant. Ne recalculez la valeur de la barre actuelle que lorsque les valeurs ne correspondent pas.

Je mettrais ça dans le bloc d'initialisation :

   nVizCount = (int)ChartGetInteger(0, CHART_VISIBLE_BARS);
   

et les variables seraient déclarées au niveau global du programme :

int first,bar,nLowBar=0,nHighBar=0, nVizCount; 
 
Yedelkin:

Mémorisez l'heure d'ouverture de la barre actuelle et comparez-la avec la même valeur du tick entrant. Ne recalculez la valeur de la barre actuelle que lorsque les valeurs ne correspondent pas.

Je mettrais cela dans le bloc d'initialisation :

Merci. Est-ce correct en général ?
 
Konstantin83: Et tout est correct en général ?

Je n'ai rien remarqué d'autre. Les articles suggèrent une structure similaire. Il y a un contrôle pour la division par zéro.

Oui, pour éviter de recalculer, vous pouvez aussi comparer prev_calculé et rates_total, si je me souviens bien.

 
Yedelkin:

Je n'ai rien remarqué d'autre. Les articles suggèrent une structure similaire. Il y a un contrôle pour la division par zéro.

Oui, pour éviter de recalculer, vous pouvez aussi comparer prev_calculé et rates_total, si je me souviens bien.

Savez-vous pourquoi l'indicateur ne trace pas la ligne après avoir fermé le terminal et redémarré le terminal? Si vous passez à une autre période, elle est dessinée.
 
Konstantin83: Savez-vous pourquoi, après avoir fermé le terminal avec l'indicateur et redémarré le terminal, l'indicateur ne dessine pas de ligne ? Si vous passez à une autre période, elle sera dessinée.

Le terminal a besoin d'un certain temps pour "se lever", synchroniser ses bases de données avec le serveur, etc. au démarrage. Si l'indicateur est lancé en même temps, il se peut qu'il n'y ait pas de données pour le calcul de l'indicateur. Essayez la solution la plus simple : insérer un délai de deux ou trois secondes dans OnInit().

En général, il est souhaitable d'imprimer toutes les informations importantes lors de la recherche d'une zone problématique. Comme

if(nLowBar<0) Print("Ошибка, nLowBar=",nLowBar,", prev_calculated=",prev_calculated,", bar=",bar);
 

Yedelkin:

forward666 : besoin d'une visualisation

Je n'ai pas encore trouvé d'aide pour le trading en direct - essayez simplement d'ouvrir et de fermer une position sur un compte de démonstration.

Le voici : https://www.mql5.com/ru/forum/6343/page96#comment_419028