Preguntas de los principiantes MQL5 MT5 MetaTrader 5 - página 798

 

¡Hola! Necesito vuestra ayuda, miembros del foro. Estoy escribiendo un indicador. Necesito una hora de apertura del bar para ser procesado. Parecería que este tiempo debería almacenarse en time[], pero hay un sinsentido.

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[])
  {
//---check for rates total


   if(rates_total<2)
      return(0);
//--- starting work
   int start=prev_calculated-1;
//--- correct position
   if(start<1) start=1;
//--- main cycle

CalculateVolume(start,rates_total,time);


//--- OnCalculate done. Return new prev_calculated.
   return(rates_total);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void CalculateVolume(const int nPosition,
                     const int nRatesCount,
                     const long &tim[],
                     )
  {
  
MqlDateTime dat1;


for(int j=nPosition;j<nRatesCount && !IsStopped();j++)
{
    TimeToStruct(tim[j],dat1);

    Print("год ",dat1.year," ",dat1.day," ",dat1.hour," ",dat1.min)


 }
} 

2017.11.20 17:48:01.590 (RTS-12.17,M1) año 2016 29 15 26

2017.11.20 17:48:01.734 (RTS-12.17,M1) año 2016 29 15 27

2017.11.20 17:48:01.878 (RTS-12.17,M1) año 2016 29 15 29

2017.11.20 17:48:02.022 (RTS-12.17,M1) año 2016 29 15 33

2017.11.20 17:48:02.165 (RTS-12.17,M1) año 2016 29 15 45

2017.11.20 17:48:02.310 (RTS-12.17,M1) año 2016 29 21 12

2017.11.20 17:48:02.454 (RTS-12.17,M1) año 2016 1 20 54

2017.11.20 17:48:02.599 (RTS-12.17,M1) año 2016 2 12 52

2017.11.20 17:48:02.743 (RTS-12.17,M1) año 2016 2 22 28

2017.11.20 17:48:02.887 (RTS-12.17,M1) año 2016 2 23 20

2017.11.20 17:48:03.031 (RTS-12.17,M1) año 2016 3 11 47

2017.11.20 17:48:03.175 (RTS-12.17,M1) año 2016 3 22 34

2017.11.20 17:48:03.320 (RTS-12.17,M1) año 2016 3 22 35

2017.11.20 17:48:03.463 (RTS-12.17,M1) año 2016 4 21 56

2017.11.20 17:48:03.609 (RTS-12.17,M1) año 2016 4 23 32

Parece que sólo hay unos pocos bares al día. Me puedes dar una pista plz, mi cerebro ya está fastidiado.

 
fxsaber:

Sí, pero torcido.

pivomoe:
A primera vista, CopyTick funciona en el probador. ¿Hay algún error conocido en el funcionamiento de CopyTicks en el probador? ¿CopyTicksRange en la vida real funciona sin errores?

En la próxima compilación los desarrolladores harán que se muestren correctamente las banderas TRADE en el probador.

fxsaber:

Hay un error con los tiempos de tic en el probador. Tenemos que restar un valor determinado cada vez. SD es consciente del problema.

¿Puede explicar esto?
 
Estoy estudiando la estructura de la solicitud de comercio (MqlTradeRequest) en diferentes variantes. Tomé el Asesor Experto my_first_ea.mq5 listo de https://www.mql5.com/ru/articles/100 y traté de cambiar la condición para abrir una posición en el cruce del SAR en el código fuente - funcionó. Entonces añadí el código de seguimiento (cambiar/modificar la posición por el SAR) desde MQL5 usando la estructura MqlTradeRequest. Pero produjo un error [Invalid stops]. Creo que hay algo mal en la solicitud. En resumen, me quedé atascado en el estudio de la modificación de la posición. Realmente no entiendo qué estoy haciendo mal.
Archivos adjuntos:
SAR_SAR.mq5  27 kb
 
Alexey Kozitsyn:

¿Puede explicarlo con más detalle?

void OnTick()
{
  MqlTick Ticks[];
  
  if (CopyTicksRange(_Symbol, Ticks) != -1)
  {
    ArrayPrint(Ticks);              
    
    ExpertRemove();
  }
}
 
¡¡¡¡¡¡¡¡¡¡¡¡Gracias por su ayuda, tantos dispuestos a ayudar!!!!!!!!!!!! Estoy cansado de leer los comentarios sobre mi código..............
 
DCodec:
¡¡¡¡¡¡¡¡¡¡¡¡Gracias por su ayuda, tantos dispuestos a ayudar!!!!!!!!!!!! Estoy cansado de leer los comentarios sobre mi código..............
Sin código, sin comentarios.
 

Por favor, aconséjeme cómo averiguar el paso del precio (en la especificación "tamaño de la teca").

 
Aleksey Vyazmikin:

Por favor, aconséjeme cómo averiguar el paso del precio (en la especificación "tamaño de la teca").

ht

 
Vladislav Andruschenko:
ht


Gracias. He buscado y no he podido encontrarlo...

Entonces la siguiente pregunta, digamos que el paso es 25, entonces cómo arreglar el redondeo a un número divisible por 25, ¿tal vez hay una función?

 
Aleksey Vyazmikin:

Gracias. He buscado y no he podido encontrarlo...

Entonces la siguiente pregunta, digamos que el paso es 25, entonces cómo arreglar el redondeo a un número divisible por 25, ¿tal vez hay una función?


Hice una función, parece que funciona

//+------------------------------------------------------------------+
//|Функция округления числа до кратного целого                       |
//+------------------------------------------------------------------+
double Okr(double cifra)
  {
     double TickSize=SymbolInfoDouble(_Symbol,SYMBOL_TRADE_TICK_SIZE);
     double Okruglenie=NormalizeDouble(cifra/TickSize,_Digits)*TickSize;
     Print ("До кратного округления=",DoubleToString(cifra,_Digits), " После кратного округления=",DoubleToString(Okruglenie,_Digits));
     return(Okruglenie);
  }