[ARCHIVO] Cualquier pregunta de novato, para no saturar el foro. Profesionales, no pasen de largo. En ninguna parte sin ti - 3. - página 182

 
 
dent:
Cómo pedir un asesor
Puede pedirlo aquí: https://www.mql5.com/ru/job
 
NaVolne:


¿Por qué es así?

El EA procesa cada tic, y en cada tic hay una comprobación y apertura de una orden.... Debe recordar la hora de la última posición abierta y hacer una pausa de 15 minutos, o puede trabajar por la apertura o el cierre de una barra. Es mejor estar vinculado a la hora de la barra en el código.

double OpenBar=0; 
 
int start()
   {
    //Проверка на начало нового бара
    if (OpenBar==Time[0]) {return;} else {OpenBar=Time[0];}
    //ваш код
   }
 
dent:
Cómo pedir un asesor
 
OlegTs:
double OpenBar=0; 

 

int start()
   {
    //Проверка на начало нового бара
    double CurOpenBar=iOpen(NULL,PERIOD_M15,0);  
    if (OpenBar==CurOpenBar) {return;} else {OpenBar=CurOpenBar;}
    //ваш код
   }


algo así...

Un mal ejemplo. Porque el precio de apertura de las velas puede repetirse. Pero el momento no lo es.
 
MaxZ:
Un mal ejemplo. Porque el precio de apertura de las velas puede repetirse. Pero el momento no lo es.

Estoy de acuerdo:)))
 
Muchas gracias chicos, está empezando a funcionar :)
 

Estoy tratando de aprender mcl4 y escribir un EA para pruebas. Han surgido algunas preguntas.

1) ¿Existe un procedimiento para comprobar el historial analizado en busca de velas de minutos perdidas para tal o cual par? ¿Quizás el procedimiento ya está escrito y disponible en la red?

2) Si hay huecos o sólo una pequeña cantidad de historia, ¿cómo puede el EA descargar las velas de minutos enteros para este o aquel par desde la fecha necesaria o llenar los huecos?

La idea es que el EA compruebe la corrección del historial mientras trabaja y corrija los huecos o el pequeño número de barras si es necesario.
 

Estoy aprendiendo un lenguaje de programación y tengo problemas para entender el comportamiento del programa. He escrito un EA basado en el libro de texto, pero lo he retorcido a un principio de funcionamiento ligeramente diferente.

El Asesor Experto se basa en un promedio de 2 muwings. La idea es sencilla, las medias móviles se cruzan, se cierra la orden y se abre la contraria. He escrito un EA y funciona bien. Por supuesto, está en ligera desventaja, pero de acuerdo con la idea. El problema completo es el siguiente (en negrita):

A=iMA(NULL,0,Period_MA_1,0,MODE_SMA, PRICE_CLOSE,1); // A

B=iMA(NULL,0,Period_MA_2,0,MODE_SMA,PRICE_CLOSE,1); // B

C=iMA(NULL,0,Period_MA_1,0,MODE_SMA,PRICE_CLOSE,2); // C

D=iMA(NULL,0,Period_MA_2,0,MODE_SMA,PRICE_CLOSE,2); // D

Si cambio la forma de calcular las medias móviles (puede mostrar el signo más) y pongo el método exponencial( MODE_SMA) en lugar del simple(MODE_EEMA ) y uno más(MODE_SMMA), el llamado método suavizado, todo va mal. El principio de funcionamiento se vuelve aún más divertido (en el probador de estrategias) ya que el EA abre una orden al principio del periodo establecido y la cierra al final. Es decir, durante un año abre una única operación al principio del periodo y la cierra al final. Como resultado, el Asesor Experto me ha mostrado un plus, pero no necesito dicho plus. Yo mismo puedo lanzar una moneda al aire y abrir una orden de compra o de venta y ver, si estoy ganando o perdiendo en un año. Por cierto, si pongo MODE_SMA en MODE_LWMA (Media Móvil Lineal Ponderada), el programa funciona bien.

Por favor, aconséjeme, ¿qué pasa? El principio es el mismo; sólo se ha cambiado un poco la forma de calcular las medias móviles.

Aquí está el código completo del programa:

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

//| Basado en dos medias móviles.mq4

//| Copyright © 2011, MetaQuotes Software Corp.

//| http://www.metaquotes.net |

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

#property copyright "Copyright © 2011, MetaQuotes Software Corp.

#enlace de propiedad "http://www.metaquotes.net"



//--------------------------------------------------------------- 1 --

// Valores numéricos para M15


extern int int Period_MA_1=6; // Periodo MA1

extern int Periodo_MA_2=15; // Periodo MA 2

extern double Lotes =0.1; // Número fijo de lotes



bool Work=true; // El Asesor Experto funcionará.

string Symb; // Nombre del instrumento financiero

//--------------------------------------------------------------- 2 --

int inicio()

{

int

Total, // Número de pedidos en la ventana

Tip=-1, // Tipo de pedido seleccionado (B=0,S=1)

Ticket; // Número de pedido

doble

A, //Valor. Valor de MA_1 para la primera barra desde el final

Valor de MA_2 para la primera barra desde el final

Precio, // Precio de la orden seleccionada

C, //Valor. MA_1 para el segundo compás desde el final

D, // Significado. Valor de MA_2 para la segunda barra desde el final

Lote; // Número de lotes en la orden seleccionada

bool

Ans =false, // Respuesta del servidor tras el cierre

Cls_B=false, // Criterio de cierre Comprar

Cls_S=false, // Criterio de cierre Venta

Opn_B=false, // Criterio de apertura de Buy

Opn__S=false; // criterio de apertura Venta

//--------------------------------------------------------------- 3 --

/Preprocesamiento

if(Bars < Period_MA_2) // No hay suficientes barras

{

Alert("No hay suficientes barras en la ventana. El Asesor Experto no funciona");

return; // Salir de start()

}

if(Work==false) // Error crítico.

{

Alert("Error crítico. El Asesor Experto no funciona");

return; // Salir de start()

}

//--------------------------------------------------------------- 4 --

// Recuento de pedidos

Symb=Símbolo(); // Nombre del instrumento financiero.

Total=0; // Número de pedidos

for(int i=1; i<=TotalPedidos(); i++) // Bucle de pedidos

{

if(OrderSelect(i-1,SELECT_BY_POS)==true) // Si

{ // Análisis de pedidos:

if (OrderSymbol()!=Symb)continue; // No es nuestro instrumento financiero

if (OrderType()>1) // Tenemos una orden pendiente

{

Alert("Orden pendiente detectada. El Asesor Experto no está funcionando;)

return; // Exit()

}

Total++; // Contador de órdenes de mercado

if (Total>1) // No hay más de un pedido

{

Alert("Varias órdenes de mercado. El Asesor Experto no funciona;)

return; // Exit()

}

Ticket=OrderTicket(); // Número de pedido seleccionado.

Tip =OrderType(); // Tipo de la orden seleccionada.

Precio =OrderOpenPrice(); // Precio de la orden seleccionada.

Lot =OrderLots(); // Número de lotes

}

}

//--------------------------------------------------------------- 5 --

// Criterios comerciales

A=iMA(NULL,0,Period_MA_1,0,MODE_SMA,PRICE_CLOSE,1); // A

B=iMA(NULL,0,Period_MA_2,0,MODE_SMA,PRICE_CLOSE,1); // B

C=iMA(NULL,0,Period_MA_1,0,MODE_SMA,PRICE_CLOSE,2); // C

D=iMA(NULL,0,Period_MA_2,0,MODE_SMA,PRICE_CLOSE,2); // D


if (A<C&C>D&B>=A) // МА1 línea va hacia abajo,

{ // MA1 se cruza con MA2

Opn_B=true; // de arriba hacia abajo

Cls_S=true; //

}

if (B<D&D>C&&A>=B) // La línea MA2 va hacia abajo

{ // MA2 se cruza con MA1

Opn_S=true; // de arriba abajo

Cls_B=true; //

}

//--------------------------------------------------------------- 6 --

// Cerrar órdenes

while(true) //Ordenar el cierre del bucle.

{

if (Tip==0 && Cls_B==true) //Abrir orden de compra.

{ //hay un criterio de cierre

Alert("Intentando cerrar Buy ",Ticket,";)

RefreshRates(); // Actualizar datos

Ans=OrderClose(Ticket,Lot,Bid,2); // Cerrar la compra

if (Ans==true) // Ha funcionado :)

{

Alerta ("Orden de compra cerrada ",Ticket;)

break; // Salir del bucle de cierre

}

if (Fun_Error(GetLastError())==1) // Gestión de errores

continuar; // reintentar

return; // Salir de start()

}


if (Tip==1 && Cls_S==true) // Orden de venta abierta.

{ // hay un criterio de proximidad

Alert("Intentando cerrar la venta ",Ticket,";)

RefreshRates(); // Actualizar datos

Ans=OrderClose(Ticket,Lot,Ask,2); // Cierre de la venta

if (Ans==true) // Ha funcionado :)

{

Alerta ("Orden de venta cerrada ",Ticket;)

break; // Salir del bucle de cierre

}

if (Fun_Error(GetLastError())==1) // Gestión de errores

continuar; // reintentar

return; // Salir de start()

}

break; // Salir mientras

}

//--------------------------------------------------------------- 7 --

//--------------------------------------------------------------- 8 --

//Apertura de pedidos

while(true) //Ordenar el cierre del bucle.

{

if (Total==0 && Opn_B==true) // No hay órdenes abiertas

{ //criterio de compra abierto.

RefreshRates(); // Actualizar datos

Alert("Intentando abrir Buy. Esperando respuesta...");

Ticket=OrderSend(Symb,OP_BUY,Lots,Ask,20,0,0, "EA 2xMA");//Compra abierta

if (Ticket > 0) // ha funcionado :)

{

Alerta ("Orden de compra abierta ",Ticket;)

return; //Salir de la orden

}

if (Fun_Error(GetLastError())==1) // Gestión de errores

continuar; // reintentar

return; // Salir de start()

}

if (Total==0 && Opn_S==true) // no hay órdenes abiertas

{ //abrir criterio de venta.

RefreshRates(); // Actualizar datos

Alert("Intentando abrir la venta. Esperando respuesta...");

Ticket=OrderSend(Symb,OP_SELL,Lots,Bid,20,0,0, "EA 2xMA");//Open Sel.

if (Ticket > 0) // ha funcionado :)

{

Alerta ("Orden de venta abierta ",Ticket;)

return; // Salir del inicio()

}

if (Fun_Error(GetLastError())==1) // Gestión de errores

continuar; // reintentar

return; // Salir de start()

}

break; // Salir mientras

}

//--------------------------------------------------------------- 9 --

return; //salir de start()

}

//-------------------------------------------------------------- 10 --

int Fun_Error(int Error) // Fie de gestión de errores

{

switch(Error)

{ // Errores insalvables.

caso 4: Alerta("El servidor de comercio está ocupado. Inténtelo de nuevo...");

Sleep(3000); // Solución simple.

return(1); // Salir de la función.

case 135:Alert("El precio ha cambiado. Inténtelo de nuevo...");

RefreshRates(); // Actualizar datos.

return(1); // Salir de la función.

case 136:Alert("No hay precio. Esperando un nuevo tick...");

while(RefreshRates()==false) // Till a new tick

Sleep(1); // Retraso en el bucle

return(1); // Salir de la función

case 137:Alerta("El corredor está ocupado. Inténtelo de nuevo...");

Sleep(3000); // Solución simple.

return(1); // Salir de la función.

case 146:Alert("El subsistema de comercio está ocupado. Inténtelo de nuevo...");

Sleep(500); // Decisión simple

return(1); // Salir de la función

// Errores críticos

caso 2: Alert("Error general;)

return(0); // Salir de la función.

caso 5: Alert("Versión antigua del terminal.");

Work=false; // Ya no funciona

return(0); // Salir de la función

caso 64: Alerta("Cuenta bloqueada.");

Work=false; // Ya no funciona

return(0); // Salir de la función

caso 133:Alerta("Prohibido comerciar");

return(0); // Salir de la función

case 134:Alert("No hay suficiente dinero para ejecutar la transacción");

return(0); // Salir de la función

por defecto: Alert("Se ha producido un error ",Error); // Otras opciones

return(0); // Salir de la función

}

}

//-------------------------------------------------------------- 11 --



 
neisseria:

Estoy aprendiendo un lenguaje de programación y tengo problemas para entender el comportamiento del programa. He escrito un EA basado en el tutorial, pero lo he cambiado a un principio ligeramente diferente.



Al cerrar la orden estaría bien disminuir el Total, o mejor aún, no nos preocupemos por esto y hagamos una función que devuelva el número de órdenes abiertas para el símbolo y el número mágico.

Cuatro medias móviles son demasiadas y es mejor mostrarlas en dos periodos y con diferentes desfases. Se recomienda mostrarlos en la pantalla y ver cómo se comportan.