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

 
mila.com:

Lectura, pero nunca habría adivinado abrir el archivo antes del bucle )

Tal vez no lo haya leído con atención.)
Incluso hay un ejemplo de lectura de un archivo línea por línea desde el principio hasta el final...
 

Hay un Asesor Experto, que se guía por la Pinbar al operar. El robot funciona correctamente en las divisas y es completamente imprevisible en los CFD.

¿Pueden decirme cómo puede ocurrir esto?

 
RichLux:

He escrito un robot que se basa en Pinbar cuando el comercio. El robot funciona correctamente en las divisas y es completamente imprevisible en los CFD.

¿Pueden decirme cómo puede ocurrir esto?

Aquí está todo para su caso.
 

Esta es la función de definición de Pinbar

int Pin() { 
  double Close1 = iClose (_Symbol,_Period,1); 
  double Open1 = iOpen (_Symbol,_Period,1); 
  double Low1 = iLow(_Symbol,_Period,1); 
  double High1 = iHigh (_Symbol,_Period,1); 
  double Close2 = iClose (_Symbol,_Period,2); 
  double Open2 = iOpen (_Symbol,_Period,2); 
  double Low2 = iLow(_Symbol,_Period,2); 
  double High2 = iHigh (_Symbol,_Period,2); 
  if (MathAbs(Close1-Open1)/(High1-Low1)<= BodyPercent) 
    { 
       if(Close1>High1 - BodyLocaut*(High1-Low1)&&Open1>High1-BodyLocaut*(High1-Low1)&&Low1<Low2-nose*_Point && High2>High1) 
          return (1); 
       if(Close1<Low1 + BodyLocaut*(High1-Low1)&&Open1<Low1+BodyLocaut*(High1-Low1)&&High1>High2+nose*_Point && Low2<Low1) 
          return (-1); 
    } 
  return(0); 
}

Cuando la introduzco en el Asesor Experto, la función funciona bien (es decir, el Asesor Experto establece acuerdos en la siguiente barra después de la barra correspondiente a las condiciones de la función) para los pares de divisas. Sin embargo, las operaciones con CFD se abren en todas partes.

¿Cuál es la diferencia entre los CFD y los pares de divisas para esta función?

 
RichLux:

Esta es la función de definición de Pinbar

Cuando la introduzco en el Asesor Experto, la función funciona bien (es decir, el Asesor Experto establece acuerdos en la siguiente barra después de la barra correspondiente a las condiciones de la función) para los pares de divisas. Sin embargo, las operaciones con CFD se abren en todas partes.

¿Cuál es la diferencia entre los CFD y los pares de divisas para esta función?

En primer lugar, sustituya todos los && por {} para que cada una de las condiciones esté en su propio bloque - entonces puede desimprimir el resultado probado en cada bloque - vea qué valores obtiene en el registro.
 
Artyom Trishkin:
En primer lugar, sustituya todos los && por {} para que cada una de las condiciones esté en su propio bloque - entonces puede en cada bloque desenrollar el resultado de la prueba - ver en el registro qué valores obtiene.

Gracias, he seguido los consejos y he entendido en qué me estaba equivocando. Porque mi EA se movía en 5 dígitos y el CFD es de sólo 2 dígitos y esperaba que el EA reaccionara a 50 pips como mínimo y obtuve la reacción de 5 pips. Lo he estropeado.

Por favor, ayúdenme con este aspecto.

Existe esa parte en el código:

MathAbs(Close1-Open1)/(High1-Low1)

A veces ocurre que High1=Low1. El comprobador genera entonces el error crítico diciendo que no puede dividir por cero.

¿Cómo se puede evitar?

 
RichLux:

Gracias, he seguido los consejos y he entendido en qué me estaba equivocando. Porque mi EA se movía en 5 dígitos y el CFD es de sólo 2 dígitos y esperaba que el EA reaccionara a 50 pips como mínimo y obtuve la reacción de 5 pips. Lo he estropeado.

Por favor, ayúdenme con este aspecto.

Existe esa parte en el código:

A veces sucede que High1=Low1. El comprobador genera entonces el error crítico diciendo que no puede dividir por cero.

¿Cómo se puede evitar?

Puedes hacerlo sin pensar:

MathAbs((Close1-Open1)/(High1-Low1>0?High1-Low1:0.00001))
 

Hola, he encontrado un problema durante la compilación:


void OnTick()

{

double minprice=999999, mp, maxprice=-999999;

for(int i=0; i<10; i++)

{

mp = iLow(Simbol(), PERIOD_CURRENT, i);

si (mp < precio mínimo)

precio mínimo = mp;

}


for(int i=0; i<10; i++)

{

mp = iHigh(Simbol(), PERIOD_CURRENT, i);

si (mp > maxprice)

maxprice = mp;

}

Comment("Precio mínimo: " + DoubleToString(minprice, 5) + "\n "+

"Precio máximo: " + DoubleToString(maxprice, 5));

}


El código fuente contiene funciones que el compilador jura por iLow y iHigh y la variable Simbol() allí en el modo de cadena, pero resuelve otro problema en el ejemplo. ¿Qué tengo que arreglar en el código anterior? Estoy atascado y no puedo compilar el bucle para comprobarlo.

DEL LIBRO DE TEXTO

Si desea obtener el valor correspondiente a la barra incompleta actual, entonces

puede utilizar la primera forma de la llamada, especificando start_pos=0 y count=1.

Ejemplo:

#property copyright "2009, MetaQuotes Software Corp."

#enlace de propiedad "https://www.mql5.com"

#versión de la propiedad "1.00"

#property description "Ejemplo de salida de los valores High[i] y Low[i]"

#descripción de la propiedad "para barras elegidas al azar"

doble Alto[],Bajo[];

//+------------------------------------------------------------------+

//| Obtenga el mínimo para un número de barra dado |

//+------------------------------------------------------------------+

double iLow(string symbol,ENUM_TIMEFRAMES timeframe,int index)

{

doble bajo=0;

ArraySetAsSeries(low,true);

int copied=CopyLow(símbolo,timeframe,0,Bars(símbolo,timeframe),Low);

if(copiado>0 && índice<copiado) low=Low[índice];

retorno(bajo);

}

//+------------------------------------------------------------------+

//| Obtener el máximo para el número de barra dado |

//+------------------------------------------------------------------+

double iHigh(string symbol,ENUM_TIMEFRAMES timeframe,int index)

{

doble alto=0;

ArraySetAsSeries(high,true);

int copied=CopyHigh(símbolo,timeframe,0,Bars(símbolo,timeframe),High);

if(copied>0 && index<copied) high=High[index];

retorno(alto);

}

//+------------------------------------------------------------------+

Автоматический трейдинг и тестирование торговых стратегий
Автоматический трейдинг и тестирование торговых стратегий
  • www.mql5.com
MQL5: язык торговых стратегий для MetaTrader 5, позволяет писать собственные торговые роботы, технические индикаторы, скрипты и библиотеки функций
 
geratdc:

Hola, he encontrado un problema durante la compilación:


void OnTick()

{

double minprice=999999, mp, maxprice=-999999;

for(int i=0; i<10; i++)

{

mp = iLow(Simbol(), PERIOD_CURRENT, i);

si (mp < precio mínimo)

precio mínimo = mp;

}


for(int i=0; i<10; i++)

{

mp = iHigh(Simbol(), PERIOD_CURRENT, i);

si (mp > maxprice)

maxprice = mp;

}

Comment("Precio mínimo: " + DoubleToString(minprice, 5) + "\n "+

"Precio máximo: " + DoubleToString(maxprice, 5))

}


El código fuente contiene funciones que el compilador jura por iLow y iHigh b variable Simbol() está en modo de cadena allí, pero resuelve otro problema en el ejemplo. ¿Qué tengo que arreglar en el código anterior? Estoy atascado y no puedo compilar el bucle para comprobarlo.

DEL LIBRO DE TEXTO

Si desea obtener el valor correspondiente a la barra incompleta actual, entonces

puede utilizar la primera forma de la llamada especificando start_pos=0 y count=1.

Ejemplo:

#property copyright "2009, MetaQuotes Software Corp."

#enlace de propiedad "https://www.mql5.com"

#versión de la propiedad "1.00"

#property description "Ejemplo de salida de los valores High[i] y Low[i]"

#descripción de la propiedad "para barras elegidas al azar"

doble Alto[],Bajo[];

//+------------------------------------------------------------------+

//| Obtenga el mínimo para un número de barra dado |

//+------------------------------------------------------------------+

double iLow(string symbol,ENUM_TIMEFRAMES timeframe,int index)

{

doble bajo=0;

ArraySetAsSeries(low,true);

int copied=CopyLow(símbolo,timeframe,0,Bars(símbolo,timeframe),Low);

if(copiado>0 && índice<copiado) low=Low[índice];

retorno(bajo);

}

//+------------------------------------------------------------------+

//| Obtener el máximo para el número de barra dado |

//+------------------------------------------------------------------+

double iHigh(string symbol,ENUM_TIMEFRAMES timeframe,int index)

{

doble alto=0;

ArraySetAsSeries(high,true);

int copied=CopyHigh(símbolo,timeframe,0,Bars(símbolo,timeframe),High);

if(copied>0 && index<copied) high=High[index];

retorno(alto);

}

//+------------------------------------------------------------------+


hay un error en esta palabraSimbol() deberías escribir Symbol() o _Symbol
 
Sergey Gritsay:

Tiene un error en esta palabraSimbol() - Debería escribirse Symbol() o _Symbol

Gracias, el error en Simbol está corregido al escribir correctamente Símbolo. Tengo algo mal con las funciones iLow y iHigh.

¿Ladiferencia en % entre MQL4 y MQL5? De lo contrario, tendré que rascarme la cabeza cada vez que repase los videotutoriales de MQL4.

Archivos adjuntos:
1.png  64 kb
Razón de la queja: