Cualquier pregunta de los recién llegados sobre MQL4 y MQL5, ayuda y discusión sobre algoritmos y códigos - página 372

 
PokrovMT5:

Maxim, ¡buenos días! Gracias por la variante, la mía es casi igual, también funciona, peroAlekseu Fedotov lo sugirió y escribí que hay una idea de cómo corregirlo?



Si no le importa redibujar (por ejemplo, lo recalculará de todos modos, como ahora) - devuelva desde la función OnCalculate el lugar desde el que quiere recalcularlo, en su caso - la barra de la hora anterior.

return rates_total-iBarShift(_Symbol,_Period,time[0]-TimeMinute(time[0])*60-TimeSeconds(time[0])-1 ); // sobre esto, escrito "a mano y sin comprobar", para demostrar el enfoque.

 
MakarFX Lo hice, pero eso no resuelve el problema para
// #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;
}

Abajo viejo, arriba nuevo

El marco temporal del gráfico utilizado es aquel en el que el indicador - ceros se encuentra

 
YarTrade:

Por favor, me pueden decir cómo restablecer el buffer cuando aparece una nueva barra, pero para que no se borren los datos anteriores y se muestren en el gráfico. Poralguna razón no puedo poner el buffer a cero y cuando apareceuna nueva barra, los nuevos datos se superponen a los antiguos datos acumulados. ¿En qué me equivoco en mi código? Gracias por la aclaración.

Cuando aparece una nueva barra, el terminal añade nuevos elementos nulos a los buffers. En las líneas 3 ... 6 es exactamente ponerlos a cero. Todo lo demás se guarda
 
STARIJ:
Cuando aparece una nueva barra, el terminal añade nuevos elementos nulos a los buffers. En las líneas 3 ... ... 6 son exactamente cero. Todos los demás elementos se conservan

¿Por qué las barras del histograma crecen inmediatamente con la aparición de una nueva barra y siguen creciendo, pero la siguiente barra crece cuando aparece la siguiente barra y la anterior?

 
YarTrade:

¿Por qué las barras del histograma inmediatamente después de la aparición de una nueva barra tienen el crecimiento de la barra anterior, y luego siguen creciendo, y la siguiente barra tiene, al aparecer la siguiente barra, el crecimiento de la anterior?

Tienes un resumen
V2 = V1 + V2;
 
Hola a todos, yo mismo no me lo explico, algún tipo de poltergeist, aunque puede que esté desatento.
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);
    }
}
     
   
No sé a qué echarle la culpa, ¿quizás deba usar OrderModify() o OrderSelect para enviar un ticket por referencia y cambiarlo de alguna manera?
 
ijonhson: mensaje de error ticket(OrderModify()) erróneo
Había uno similar. Reacomodar la primera y segunda declaración condicional junto con las tripas - podría ayudar.
 
STARIJ:

Abajo viejo, arriba nuevo

El marco temporal del gráfico utilizado es aquel en el que el indicador - ceros se mantiene

Gracias HUGE. Eso es lo que quería.
 
ijonhson:
Saludos a todos, no puedo entenderlo yo mismo,

Esto facilita la búsqueda del error:

if ( OrderSelect(ticket_order,SELECT_BY_TICKET) )
  if ( OrderModify(ticket_order,Price,SL,TP,0) ) {}
Pero creo que antes de OrderSelect() debería ser tiket_order=(correct_ticket)
 
ijonhson:
Hola a todos, no puedo entender a mí mismo, una especie de poltergeist, aunque puedo ser desatentoEn una conexión de este tipo en el probador de la estrategia, aerror billete incorrecto (OrderModify()), y en el orden n-ésimo, no en la primera o segunda, no sé qué culpa, tal vez en OrderModify(), o OrderSelect billete se pasa por referencia y de alguna manera los cambios allí?
Seleccionas el orden por el billete y luego, tras un kilómetro de código, intentas modificarlo. Pero puede que ya esté cerrado en ese momento.