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

 
Renat Akhtyamov:

Lo único que hay que tener en cuenta aquí es que después del bloque de bucle i==x

En este caso Array[i] después de for(...){} devolverá un error de desbordamiento de array y ya está

Al hacer esto, proporcionas un terreno fértil para posibles errores, por ejemplo, si más adelante en el código tienes una variable j, y accidentalmente la llamas i. O puedes escribir [i] en lugar de índice de matriz [1] y así sucesivamente.
No he escrito aquí sobre un código concreto, sino un ejemplo de lo que puede ser. Puede ocurrir que no haya límites de la matriz y que el error sea difícil de detectar, y que se pierdan muchos minutos preciosos (si no horas) para localizarlo.
 

(Necesito una pista, porque estoy empezando a tener lag)

Hay una construcción así:

int RangeBar = 10;
 HighRange = iHigh(symbol,0,iHighest(symbol,0,MODE_HIGH,RangeBar,1));
 LowRange = iLow(symbol,0,iLowest(symbol,0,MODE_LOW,RangeBar,1));

Encuentra elHigh/Low delrango en N velas.

Pregunta: ¿Cómo encontrar el mismoAlto/Bajo, pero no por sombras, sino por cuerpos?

 
Vitaly Muzichenko:

(Necesito una pista, estoy empezando a tener lag)

Hay una construcción así:

int RangeBar = 10;
 HighRange = iHigh(symbol,0,iHighest(symbol,0,MODE_HIGH,RangeBar,1));
 LowRange = iLow(symbol,0,iLowest(symbol,0,MODE_LOW,RangeBar,1));

Encuentra elHigh/Low delrango en N velas.

Pregunta: ¿Cómo encontrar el mismoAlto/Bajo, pero no por sombras, sino por cuerpos?

Necesito encontrar fmax(Open[i],Close[i]) para la parte superior y fmin(Open[i],Close[i]) para la parte inferior de la vela
 
Artyom Trishkin:
Necesito buscar fmax(Open[i],Close[i]) para la parte superior y fmin(Open[i],Close[i]) para la parte inferior

Es decir, ¿hacer un bucle en lugar de dos líneas buscando High/Low?

HighRange =iHigh(símbolo,0,iHighest(símbolo,0,MODE_HIGH,RangeBar,1));

LowRange =iLow(símbolo,0,iLowest(símbolo,0,MODE_LOW,RangeBar,1))

Esto es necesario para el EA, no para el indicador, funciona correctamente en el EA, pero como encontrar el rango por cuerpos - no se me ocurre.

 
Vitaly Muzichenko:

Es decir, ¿hacer un bucle en lugar de dos líneas buscando High/Low?

HighRange =iHigh(símbolo,0,iHighest(símbolo,0,MODE_HIGH,RangeBar,1));

LowRange =iLow(símbolo,0,iLowest(símbolo,0,MODE_LOW,RangeBar,1));

Lo necesito para el Expert Advisor, no para el indicador, funciona correctamente en el Expert Advisor, pero no consigo encontrar el rango por cuerpos.

He lanzado un script de prueba. Puede ser inexacto, no he estado trabajando en ello. Espero que lo descubras.

//+------------------------------------------------------------------+
//|                                      sFindRangeByCandlesBody.mq4 |
//|              Copyright 2016, Artem A. Trishkin, Skype artmedia70 |
//|                       https://login.mql5.com/ru/users/artmedia70 |
//+------------------------------------------------------------------+
#property copyright "Copyright 2016, Artem A. Trishkin, Skype artmedia70"
#property link      "https://login.mql5.com/ru/users/artmedia70"
#property version   "1.00"
#property strict
#property script_show_inputs
//--- input parameters
input int      Begin=1;       // Бар начала диапазона поиска
input int      RangeBars=20;  // Диапазон поиска
//---
int bars=Bars(Symbol(),PERIOD_CURRENT);
int begin=(Begin<0?0:Begin>bars-3?bars-3:Begin);
int rangeBars=(RangeBars<2?2:
               RangeBars>bars-begin?bars-begin:
               RangeBars); // Диапазон поиска
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//---
   MqlRates array[];
   double   high=0, low=0;
   int      highest=-1, lowest=-1;
   if(CopyRates(Symbol(),PERIOD_CURRENT,begin,rangeBars,array)>0) {
      ArraySetAsSeries(array,true);
      high=GetHighestValue(begin,array,highest);
      low=GetLowestValue(begin,array,lowest);
      }
   Print("High=",DoubleToString(high,Digits()),", Highest=",highest,", Low=",DoubleToString(low,Digits()),", Lowest=",lowest);
  }
//+------------------------------------------------------------------+
double GetHighestValue(int bar_begin, MqlRates &array[], int &bar_highest){
   int      sz=ArraySize(array);
   if(sz==0) return(-1);
   double   high=DBL_MIN;
   bar_highest=-1;
   for(int i=0; i<sz; i++) {
      double value=fmax(array[i].open,array[i].close);
      if(value>high) {
         high=value;
         bar_highest=bar_begin+i;
         }
      }
   return(high);
}
//+------------------------------------------------------------------+
double GetLowestValue(int bar_begin, MqlRates &array[], int &bar_lowest){
   int      sz=ArraySize(array);
   if(sz==0) return(-1);
   double   low=DBL_MAX;
   bar_lowest=-1;
   for(int i=0; i<sz; i++) {
      double value=fmin(array[i].open,array[i].close);
      if(value<low) {
         low=value;
         bar_lowest=bar_begin+i;
         }
      }
   return(low);
}
//+------------------------------------------------------------------+
Si tiene alguna duda, sólo tiene que preguntar...
 
Artyom Trishkin:

Acabo de lanzar un script de prueba. Puede haber imprecisiones: lo escribí sobre la marcha. Espero que le cojas el tranquillo.

//+------------------------------------------------------------------+
//|                                      sFindRangeByCandlesBody.mq4 |
//|              Copyright 2016, Artem A. Trishkin, Skype artmedia70 |
//|                       https://login.mql5.com/ru/users/artmedia70 |
//+------------------------------------------------------------------+
...
//+------------------------------------------------------------------+
En todo caso, sólo hay que preguntar...

Gracias, ¡funciona muy bien!

PS. ¿Entiendo que esta cosa funcionará en la quinta?

 
Vitaly Muzichenko:

Gracias, ¡funciona muy bien!

PS. ¿Supongo que esta cosa funcionará en la quinta?

Sí. Intento hacer código multiplataforma. O con mínimas modificaciones para la quinta.
 
Tengo una mano muy mala. por favor ayúdame a añadir stop loss para vender (slevel).
int start()
{
//+--------------------------------------------------------------------+
//|   -= stop loss в без убыток =-                                      |
//+--------------------------------------------------------------------+
bool   result;
double stop;
int    cmd,error;
for(int i=0;i<OrdersTotal();i++)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES) && OrderProfit()>pOPCS)
{
cmd=OrderType();
double blevel=OrderStopLoss()<Bid-Point*TS;
double slevel=OrderStopLoss()>Ask+Point*TS;
//---
if(cmd==OP_BUY || cmd==OP_SELL)
{
while(true)
{
if(cmd==OP_BUY && blevel) stop=Bid-Point*TS;
else                      stop=Ask+Point*TS;
result=OrderModify(OrderTicket(),OrderOpenPrice(),stop,0,0,Orange);
if(result!=TRUE) { error=GetLastError(); Print("LastError = ",error); }
else error=0;
if(error==135) RefreshRates();
else break;
}
}
}
}
 
Artyom Trishkin:

He adjuntado un script de prueba. Puede ser inexacto, no he estado trabajando en mi mano. Espero que lo entiendas.

Si tiene alguna pregunta...

Lo siento Artem, pero quiero mostrar la solución a este problema de una manera más sencilla

  double openCandle[], closeCandle[];
  CopyOpen(_Symbol, PERIOD_CURRENT, 1, 15, openCandle);
  CopyClose(_Symbol, PERIOD_CURRENT, 1, 15, closeCandle);
  double maxCandle = fmax(openCandle[ArrayMaximum(openCandle)], closeCandle[ArrayMaximum(closeCandle)]);
  double minCandle = fmin(openCandle[ArrayMinimum(openCandle)], closeCandle[ArrayMinimum(closeCandle)]);

Espero que todo el mundo pueda escribirlo en su código y añadir las comprobaciones necesarias. La funcionalidad es la misma tanto para mql4 como para mql5.

 
Alexey Viktorov:

Lo siento, Artem, pero quiero mostrar una solución más sencilla a este problema

  double openCandle[], closeCandle[];
  CopyOpen(_Symbol, PERIOD_CURRENT, 1, 15, openCandle);
  CopyClose(_Symbol, PERIOD_CURRENT, 1, 15, closeCandle);
  double maxCandle = fmax(openCandle[ArrayMaximum(openCandle)], closeCandle[ArrayMaximum(closeCandle)]);
  double minCandle = fmin(openCandle[ArrayMinimum(openCandle)], closeCandle[ArrayMinimum(closeCandle)]);

Espero que todo el mundo sea capaz de escribirlo en su código y añadir las comprobaciones necesarias. La funcionalidad es la misma tanto para mql4 como para mql5.

¡О! Gracias. No lo he adivinado por la mañana... Es cierto, hay que comprobar que las matrices se llenan. No lo he visto en cuádruples, y en cincos, los datos no suelen rellenarse a la primera por la falta de datos históricos.

ZS. Deberías dormir más - tus pensamientos trabajarán en esa dirección.

Razón de la queja: