Toute question des nouveaux arrivants sur MQL4 et MQL5, aide et discussion sur les algorithmes et les codes. - page 372

 
PokrovMT5:

Maxim, bonjour ! Merci pour la variante, la mienne est presque la même, elle fonctionne aussi, maisAlekseu Fedotov l'a suggéré et j'ai écrit qu'il y a une idée comment la corriger ?



Si cela ne vous dérange pas de le redessiner (par exemple, vous le recalculerez de toute façon, comme maintenant) - renvoyez de la fonction OnCalculate l'endroit à partir duquel vous voulez le recalculer, dans votre cas - la barre de l'heure précédente.

return rates_total-iBarShift(_Symbol,_Period,time[0]-TimeMinute(time[0])*60-TimeSeconds(time[0])-1 ) ; // à propos de ceci, écrit "à la main et non vérifié", pour démontrer l'approche.

 
MakarFX Je l'ai fait, mais cela ne résout pas le problème pour...
// #property  copyright "Copyright © 2005, Yura Prokofiev"
// #property  link      "Yura.prokofiev@gmail.com"
#property  strict
#property  indicator_separate_window
#property  indicator_buffers 3
 
extern int      Barrs  = 10;     // Баров для расчета
extern string   simvol = "EURGBP";
double Buf_0[], Buf_1[], Buf_2[];

void OnInit()
{
   SetIndexStyle(0,DRAW_NONE);
   SetIndexStyle(1,DRAW_HISTOGRAM,STYLE_SOLID,2,Yellow);
   SetIndexStyle(2,DRAW_HISTOGRAM,STYLE_SOLID,2,Red);
   IndicatorDigits((int)SymbolInfoInteger(simvol,SYMBOL_DIGITS));

   SetIndexBuffer(0,Buf_0);
   SetIndexBuffer(1,Buf_1);
   SetIndexBuffer(2,Buf_2);

   IndicatorShortName("Fisher "+simvol);
   SetIndexLabel(1,NULL);
   SetIndexLabel(2,NULL);
}

int start()
{
   int    i, limit, counted_bars=IndicatorCounted();
   double prev,current;
   double Value=0, Value1=0, Value2=0, Fish=0, Fish1=0, Fish2=0;
   double price, MinL=0, MaxH=0;

   if(counted_bars>0) counted_bars--;
   limit=Bars-counted_bars;

   for(i=0; i<limit; i++)
   {
      MaxH = iHigh(simvol,   0, iHighest(simvol,  0, MODE_HIGH,Barrs,i));
      MinL = iLow (simvol,   0, iLowest (simvol,  0, MODE_LOW, Barrs,i));
      price = (iHigh(simvol, 0, i) + iLow(simvol, 0, i))/2;
      if(MaxH != MinL)
      Value = 0.33*2*((price-MinL)/(MaxH-MinL)-0.5) + 0.67*Value1;     
      Value=MathMin(MathMax(Value,-0.999),0.999); 
      Buf_0[i]=0.5*MathLog((1+Value)/(1-Value))+0.5*Fish1;
      Value1=Value;
      Fish1=Buf_0[i];
   }
   bool up=true;
   for(i=limit-2; i>=0; i--)
   {
      current=Buf_0[i];
      prev=Buf_0[i+1];
      if(((current<0)&&(prev>0))||(current<0))   up= false;    
      if(((current>0)&&(prev<0))||(current>0))   up= true;
      Buf_1[i]=0;  Buf_2[i]=0;
      if(!up) Buf_2[i]=current;
      else    Buf_1[i]=current;
   }
   return 0;
}

En bas, vieux, en haut, neuf

La trame temporelle du graphique utilisée est celle où se trouve l'indicateur - zéros

 
YarTrade:

Pouvez-vous m'indiquer comment réinitialiser le tampon lorsqu'une nouvelle barre apparaît, mais de manière à ce que les données précédentes ne soient pas effacées et soient affichées sur le graphique. Pour une raison quelconque, je n'arrive pas à remettre le tampon à zéro et lorsqu'une nouvelle barreapparaît, les nouvelles données sont superposées aux anciennes données accumulées. Qu'est-ce qui ne va pas dans mon code ? Merci pour cette précision.

Lorsqu'une nouvelle barre apparaît, le terminal ajoute de nouveaux éléments nuls dans les tampons. Dans les lignes 3 ... 6 c'est exactement les mettre à zéro. Tout le reste est sauvegardé
 
STARIJ:
Lorsqu'une nouvelle barre apparaît, le terminal ajoute de nouveaux éléments nuls dans les tampons. Dans les lignes 3 ... ... 6 sont exactement nuls. Tous les autres éléments sont préservés

Pourquoi les barres de l'histogramme croissent-elles immédiatement à l'apparition d'une nouvelle barre et continuent-elles de croître, mais la barre suivante croît à l'apparition de la barre suivante et de la précédente ?

 
YarTrade:

Pourquoi les barres de l'histogramme immédiatement après l'apparition d'une nouvelle barre ont-elles la croissance de la barre précédente, puis continuent à croître, et la barre suivante a, à l'apparition de la barre suivante, la croissance de la précédente ?

Vous avez un résumé
V2 = V1 + V2;
 
Bonjour à tous, je n'arrive pas à comprendre moi-même, une sorte de poltergeist, bien que je sois peut-être inattentif.
int ticket_order=0;
void OnTick()
{
  if(OrdersTotal()==0)
   {
    // километр кода
    ticket_order=OrderSend(Symbol(),up_down,lots,Ask,3,0,0);
    }
    if(OrdersTotal()==1)
   {
     OrderSelect(ticket_order,SELECT_BY_TICKET);
     bool Ans=OrderModify(ticket_order,Price,SL,TP,0);
    }
}
     
   
Je ne sais pas quoi reprocher, peut-être devrais-je utiliser OrderModify() ou OrderSelect pour envoyer un ticket par référence et le modifier d'une manière ou d'une autre ?
 
ijonhson: message d'erreur mauvais ticket(OrderModify())
Il y en avait un autre similaire. Réorganisez les première et deuxième déclarations conditionnelles ainsi que les entrailles - ça pourrait aider.
 
STARIJ:

En bas, vieux, en haut, neuf

Le cadre temporel du graphique utilisé est celui où l'indicateur - les zéros se tiennent.

Merci à HUGE. C'est ce que je voulais.
 
ijonhson:
Salutations à tous, je n'arrive pas à comprendre moi-même,

Il est ainsi plus facile de trouver l'erreur :

if ( OrderSelect(ticket_order,SELECT_BY_TICKET) )
  if ( OrderModify(ticket_order,Price,SL,TP,0) ) {}
Mais je pense qu'avant OrderSelect() il devrait être tiket_order=(correct_ticket)
 
ijonhson:
Bonjour à tous, je n'arrive pas à me comprendre, une sorte de poltergeist, bien que je sois peut-être inattentifDans une telle combinaison dans le testeur de stratégie, erreur de ticket incorrect (OrderModify()), et sur le n-ième ordre, pas sur le premier ou le second, je ne sais pas ce qu'il faut blâmer, peut-être dans OrderModify(), ou le ticket OrderSelect est passé par référence et il change en quelque sorte ?
Vous sélectionnez l'ordre par ticket et ensuite, après des kilomètres de code, vous essayez de le modifier. Mais il se peut qu'elle soit déjà fermée à ce moment-là.
Raison: