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

 
Maxim Kuznetsov:

if (time[i]>=time_m1 && time[i]<time_m1+PeriodSeconds(PERIOD_M1) {

  // время time[i] попало внутрь бара открытого в time_m1

}

OK) una flecha, pero por esta condición en M15 y superior la flecha se fija en 21:00

 if(time[i]>=StringToTime("2019.04.22 20:55:00") && time[i]<StringToTime("2019.04.22 20:55:00")+Period()*PeriodSeconds(PERIOD_M1))

y si sólo utiliza+PeriodSeconds(PERIOD_M1) sinPeriod()*, no se establece en absoluto)

 
yiduwi:

OK) una flecha, pero por esta condición en M15 y superior la flecha se fija en 21:00

Y si sólo utiliza+PeriodSeconds(PERIOD_M1) sinPeriod()*, no se establece en absoluto)

Lea la documentación :-) Period() devuelve sólo el id del periodo actual - ¿por qué se multiplica por él?

en lugar de PERIOD_M1 (que se da como ejemplo), pásalo a PeriodSeconds( Period() ) - y luego obtener cuántos segundos en 1 barra del período actual.

 
kopeyka2:

Hasta aquí el enigma del "paralelepípedo de las Bermudas".

A mí me funciona :) Incluso he intentado abrir y cerrar el terminal.

PD: Artyom, has movido la pregunta del cinco al tema del cuatro... Lo encontré por accidente.

 
kopeyka2:


Línea EMA 20 23.04.2019 00:00

Al encender MT5, SIN conexión online, aparece inmediatamente el mensaje "array out....".

Los errores varían, pero siempre están presentes. Puede replicarse en línea, pero suele estar presente cuando la MT está encendida.


Tal es el misterio del "paralelepípedo de las Bermudas"

el mensaje de error muestra el número de línea donde se produjo el error. Empieza a cavar desde ahí
 
Igor Zakharov:

A mí me funciona :) Incluso he intentado abrir y cerrar el terminal.

PD: Artyom, has movido la pregunta del cinco al tema del cuatro... Lo encontré por accidente.

Este es un tema común - aquí ayudamos no sólo con MQL4, sino también para la migración a MQL5. Así que está en el tema.

 
Por favor, aconseje cómo escribir conceptualmente el código de EA, que toma los precios de las operaciones desde el archivo de texto .csv. Por qué surge esta pregunta: en cada tick el EA comparará el precio actual con el precio del archivo .csv, que es leído en su totalidad por un bucle en la función fileopen, si entiendo bien. Pero el archivo contiene más de 5000 líneas para el año pasado, cada línea tiene el nombre del instrumento, el precio, el tipo de operación (compra/venta), la fecha de registro, la fecha de cancelación de la orden. Al hacer la prueba, el Asesor Experto recorrerá todas las líneas del archivo en cada tick para entender si es el momento de colocar una orden? O, para probar, ¿debemos hacer que nuestro EA establezca todas las órdenes con la fecha de cancelación a la vez durante la inicialización y comprobar las órdenes reales por su fecha de vencimiento en cada tick para la negociación real? Puede ser que esto sea lo correcto desde el punto de vista de los recursos o que haya otras variantes (por ejemplo, habría que hacer objetos gráficos y comparar el precio actual con ellos, pero parece que es el mismo ciclo); no entiendo, por favor, aconsejen.
 

¡Hola!


He descargado el video tutorial de programación de MQL4.

He creado un Asesor Experto según la lección.

Pero no funciona cuando estoy comerciando.

No tengo ningún error al compilarlo.

Como estoy al principio de mi viaje, es difícil encontrar el error hasta ahora.

Pido ayuda si alguien puede ayudarme.

Gracias.

Código:

/+----Входные параметры----------------+

extern inttern BarCount=10;

extern int HourStart=14;

extern double Lots=0.1;

extern int StopLoss=120;

extern int TakeProfit=300;

extern int Magia=1456;

//+------------Глобальные переменные----------------+

double minprice=999999,mp,

maxprice=-99999,SL,TP;

int ticket;

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

//| Función de inicialización de expertos |

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

int OnInit()

{

return(INIT_SUCCEED);

}

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

//| Función de desinicialización experta |

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

void OnDeinit(const int reason)

{


}

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

//| función de tic experto |

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

void OnTick()

{

GetMinPrice();

GetMaxPrice();


if(HoraHora(HoraActual())==HoraInicio)

{

if(BuyLimitCount()&& BuyCount() ==0)

{

SL=NormalizeDouble(minprice-StopLoss*Point,5);

TP=NormalizeDouble(minprice+TakeProfit*Point,5);

ticket=OrderSend(Symbol(),OP_BUYLIMIT,Lots,minprice,5,SL,TP,"",Magic,0,Blue);

if(ticket<0)

Print("Fallo en la apertura del límite de compra");

}

if(SellLimitCount()&& SellCount()==0)

{

SL=NormalizeDouble(maxprice+StopLoss*Point,5);

TP=NormalizeDouble(maxprice-TakeProfit*Point,5);

ticket=OrderSend(Symbol(),OP_SELLLIMIT,Lots,maxprice,5,SL,TP,"",Magic,0,Red);

if(ticket<0)

Print("Fallo en la apertura del Límite de Venta");

}

}



Comment("Precio mínimo: "+DoubleToStr(precio mínimo,5)+"\NPrecio máximo: "+DoubleToStr(precio máximo,5));


}

//+FUNCIÓN PARA DEFINIR EL PRECIO MÍNIMO EN EL NÚMERO DE BARRA DE BARCOUNT

void GetMinPrice()

{

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

{

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

if(mp<minprice)

precio mínimo=mp;

}

volver;

}

//+FUNCIÓN PARA DETERMINAR EL PRECIO MÁXIMO EN EL NÚMERO DE BARRAS

void GetMaxPrice()

{

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

{

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

si(mp>precio máximo)

maxprice=mp;

}

volver;

}

//+FUNCIÓN DEL NÚMERO DE ÓRDENES LIMITADAS ABIERTAS PARA COMPRAR

int CantidadLímiteDeCompra()

{

int count=0;

for(int i=Total de Pedidos()-1; i>=0; i--)

{

if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true && OrderMagicNumber()==Magic && OrderType()==OP_BUYLIMIT)

{

cuenta++;

}

}

return(count);

}

//+FUNCIÓN DEL NÚMERO DE ÓRDENES LIMITADAS DE VENTA ABIERTAS

int CantidadLímiteDeVenta()

{

int count=0;

for(int i=Total de Pedidos()-1; i>=0; i--)

{

if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true && OrderMagicNumber()==Magic && OrderType()==OP_SELLLIMIT)

{

cuenta++;

}

}

return(count);

}

//+FUNCIÓN DEL NÚMERO DE ÓRDENES DE MERCADO ABIERTO

int CuentaDeCompra()

{

int count=0;

for(int i=Total de Pedidos()-1; i>=0; i--)

{

if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true && OrderMagicNumber()==Magic && OrderType()==OP_BUY)

{

cuenta++;

}

}

return(count);

}

//+FUNCIÓN DEL NÚMERO DE ÓRDENES DE VENTA EN EL MERCADO ABIERTO

int CuentaVenta()

{

int count=0;

for(int i=Total de Pedidos()-1; i>=0; i--)

{

if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true && OrderMagicNumber()==Magic && OrderType()==OP_SELL)

{

cuenta++;

}

}

return(count);

}

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


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

 

Seric29

Gracias, añadiré su información a mi equipaje.

 
WinProject:
¿Puede usted por favor aconsejar cómo escribir conceptualmente el código de EA, que toma los precios de comercio de archivo .csv. Por qué surge esta pregunta: En cada tick el EA comparará el precio actual con el precio en el archivo .csv, que es leído en su totalidad por la función fileopen, si lo entiendo correctamente. Pero el archivo contiene más de 5000 líneas para el año pasado, cada línea tiene el nombre del instrumento, el precio, el tipo de operación (compra/venta), la fecha de registro, la fecha de cancelación de la orden. Al hacer la prueba, el Asesor Experto recorrerá todas las líneas del archivo en cada tick para entender si es el momento de colocar una orden? O, para probar, ¿debemos hacer que nuestro EA establezca todas las órdenes con la fecha de cancelación a la vez durante la inicialización y comprobar las órdenes reales por su fecha de vencimiento en cada tick para la negociación real? Puede que no sea correcto en cuanto a recursos o que haya otras variantes (por ejemplo, habría que hacer objetos gráficos y comparar el precio actual con ellos, pero ahí también hay un bucle); por favor, aconséjenme.

Normalmente se intenta leer (escribir) en el archivo el menor número de veces posible.

Para su tarea, sería mejor leer los datos en un array al cargar (aunque probablemente sea más conveniente hacerlo en una estructura) y luego comparar los valores de precio y tiempo actuales con los valores del array

SZY: búsqueda en la base de código "archivo" o "csv" fue una vez tales Asesores Expertos listos - leer de un archivo de comercio de los datos

 
Igor Makanu:

Normalmente se intenta leer (escribir) en el archivo el menor número de veces posible.

Para su tarea, sería mejor leer los datos en un array al cargar (aunque probablemente sea más conveniente hacerlo en una estructura) y luego comparar los valores de precio y tiempo actuales con los valores del array

ZS: buscar en codebase "archivo" o "csv" fue una vez tales EAs listos - leer de un archivo de comercio en que los datos

Muchas gracias, tengo la respuesta que quería.

Razón de la queja: