Cualquier pregunta de los recién llegados sobre MQL4 y MQL5, ayuda y discusión sobre algoritmos y códigos - página 21
![MQL5 - Lenguaje de estrategias comerciales para el terminal de cliente MetaTrader 5](https://c.mql5.com/i/registerlandings/logo-2.png)
Está perdiendo oportunidades comerciales:
- Aplicaciones de trading gratuitas
- 8 000+ señales para copiar
- Noticias económicas para analizar los mercados financieros
Registro
Entrada
Usted acepta la política del sitio web y las condiciones de uso
Si no tiene cuenta de usuario, regístrese
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á
(Necesito una pista, porque estoy empezando a tener lag)
Hay una construcción así:
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 una pista, estoy empezando a tener lag)
Hay una construcción así:
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 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.
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);
}
//+------------------------------------------------------------------+
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 |
//+------------------------------------------------------------------+
...
//+------------------------------------------------------------------+
Gracias, ¡funciona muy bien!
PS. ¿Entiendo que esta cosa funcionará en la quinta?
Gracias, ¡funciona muy bien!
PS. ¿Supongo que esta cosa funcionará en la quinta?
{
//+--------------------------------------------------------------------+
//| -= 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;
}
}
}
}
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
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.
Lo siento, Artem, pero quiero mostrar una solución más sencilla a este problema
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.