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

 
yaaarik777:

¡Buenas noches!

Por favor, ayúdame a escribir el código, no me siento capaz de hacerlo yo mismo, aquí está la esencia:


La conclusión es esta: aquí en este hilo para ayudar a los que sufren y a los que buscan.
Si necesitas hacerlo por ti, este es un autónomo. Y para ayudarte a contar lo que quieres conseguir, muestra lo que has hecho y describe lo que ha fallado.
 
Maxim Kuznetsov:
El punto es este: aquí en este hilo para ayudar al que sufre y al que busca.
Si tienes que hacerlo por ti, eso es en el autónomo. Y para conseguir ayuda, tienes que decir lo que quieres conseguir, mostrar lo que estás haciendo y describir lo que ha fallado.


La cuestión es que no entiendo cómo hacer que el EA analice sólo las órdenes de un par en concreto, en lugar de las órdenes de todos los pares del terminal.

Si puedes, por favor, dame una idea o un ejemplo de código, ya que los libros de texto describen por separado lo que funciona y cómo funciona, pero no hay muchos ejemplos concretos.

Le agradecería su ayuda.

Gracias.

 
Hola.
Hacía mucho tiempo que no cogía las damas, y cuando lo hice, resultó

No sé cómo jugar.
Estoy pidiendo ayuda.
Hay un buen EA a la antigua que utiliza el indicador ZigZag de Rosh
Y funciona bien como reloj suizo.
Se ha adjuntado el código para no descargar el asesor experto dado en la parte inferior del texto.

La idea del EA era que las órdenes se abrieran y cerraran en el momento de

coincidencia de diferentes ZigZags.
Ahora tengo que sustituir el indicador Rosh por otro

indicador, también una de las primeras versiones de ZigZag de la época de MT3.
Pero este indicador tiene un algoritmo diferente de dibujo ZigZag.

Su nombre es High_Low v2 (ZigZag), (en el archivo adjunto por alguna razón el nombre glitched)

Por el método de la intuición, que a veces funcionaba, simplemente cambiaba las condiciones
double zz1 = iCustom( NULL, 60, "ZigZag_Rosh",12, 5, 3, 0, 0);
double zz2 = iCustom( NULL, 60, "ZigZag_Rosh",48, 20, 12, 0, 0);
en
double zz1 = iCustom( NULL, 0, "High_Low v2 (ZigZag)",300, 6, 0, 0);

double zz2 = iCustom( NULL, 0, "High_Low v2 (ZigZag)",300, 6, 0, 0);

Es decir, he sustituido el nombre de un indicador personalizado y su

En el caso de los fractales, por ejemplo, me ha funcionado.

.
Los parámetros son los mismos, porque dos Zigzags no tienen por qué ser iguales.

No he necesitado la coincidencia de Zigzags, sólo necesito el hecho de su variación.
He sustituido el número 60 por el 0 para que funcione en todos los TF.

Después de la sustitución, el EA compiló sin errores, pero se niega rotundamente a funcionar cuando se adjunta a

Además, se niega a funcionar en el Probador de Estrategias.

no quiere trabajar.

La pregunta es: ¿qué pasa?
Y otra pregunta, ¿cuál es la forma correcta de hacerlo?
Gracias, perdón por el texto tan grande.


//+------------------------------------------------------------------+
//| ZZ.mq4 |
//| Copyright © 2011, MetaQuotes Software Corp.
//| http://www.metaquotes.net |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2011, MetaQuotes Software Corp.
#enlace de propiedad "http://www.metaquotes.net"

#include <stdlib.mqh>

#define MAGIC 20110220

extern double TakeProfit = 50;
//+------------------------------------------------------------------+
//| función de inicialización de expertos |
//+------------------------------------------------------------------+
int init()
{
//----
//----
return(0);
}
//+------------------------------------------------------------------+
//| función de desinicialización experta |
//+------------------------------------------------------------------+
int deinit()
{
//----
//----
return(0);
}
//+------------------------------------------------------------------+
//| Calcular las posiciones abiertas |
//+------------------------------------------------------------------+
int CalcularPedidosActualizados(símbolo de cadena)
{
int pos=0;
//----
for(int i=0;i<TotalPedidos();i++)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) break;
if(OrderSymbol()==Symbol() && OrderMagicNumber()==MAGIC)
{
if(OrderType()==OP_BUY || OrderType()==OP_SELL) pos++;
}
}
//---- volumen de pedidos de devolución
if(pos>0) return(pos)
}
//+------------------------------------------------------------------+
//| Comprueba las condiciones de las órdenes abiertas |
//+------------------------------------------------------------------+
void CheckForOpen()
{
int res;

//---- obtener ZZ
double zz1 = iCustom( NULL, 60, "ZigZag_Rosh",12, 5, 3, 0, 0);
double zz2 = iCustom( NULL, 60, "ZigZag_Rosh",48, 20, 12, 0, 0);
//---- comprar condiciones
if(CompareDoubles(zz1,Low[0]) && CompareDoubles(zz2,Low[0])
{

res=OrderSend(Symbol(),OP_BUY,1,Ask,3,0,Ask+TakeProfit*Point,"",MAGIC,0,Bl

ue);
volver;
}
//---- condiciones de venta
if(CompareDoubles(zz1,High[0]) && CompareDoubles(zz2,High[0])
{

res=Envío de orden(Símbolo(),OP_SELL,1,Oferta,3,0,Oferta-Toma de Beneficios*Punto,"",MAGIC,0,Re

d);
volver;
}

//----
}
//+------------------------------------------------------------------+
//| Comprueba las condiciones de cierre de la orden |
//+------------------------------------------------------------------+
void CheckForClose()
{
//---- obtener ZZ
double zz1 = iCustom( NULL, 60, "ZigZag_Rosh",12, 5, 3, 0, 0);
double zz2 = iCustom( NULL, 60, "ZigZag_Rosh",48, 20, 12, 0, 0);
//----
for(int i=0;i<TotalPedidos();i++)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) break;
if(OrderMagicNumber()!=MAGIC | OrderSymbol()!=Symbol()) continue;
//---- comprobar el tipo de orden
if(OrderType()==OP_BUY)
{
if(CompareDoubles(zz1,High[0]) && CompareDoubles(zz2,High[0])

OrderClose(OrderTicket(),OrderLots(),Bid,3);
romper;
}
if(OrderType()==OP_SELL)
{
if(CompareDoubles(zz1,Low[0]) && CompareDoubles(zz2,Low[0])

OrderClose(OrderTicket(),OrderLots(),Ask,3,White);
romper;
}
}
//----
}
//+------------------------------------------------------------------+
//| Función de inicio |
//+------------------------------------------------------------------+
void start()
{
//---- comprobar el historial y el comercio
if(Bars<100 || IsTradeAllowed()==false) return;
//---- calcular las órdenes abiertas por el símbolo actual
if(CalculateCurrentOrders(Symbol())==0) CheckForOpen();
else CheckForClose();
//----
}
//+------------------------------------------------------------------+













MetaQuotes Software Corp.
MetaQuotes Software Corp.
  • www.metaquotes.net
Торговая платформа MetaTrader 5 - это бесплатный инструмент трейдера, позволяющий торговать на форексе и фондовых биржах.
Archivos adjuntos:
 
yaaarik777:


La cuestión es que no entiendo cómo hacer que el EA sólo cuente las órdenes de un par en concreto, y no el total de todos los pares del terminal.

No entiendo cómo hacer que un EA calcule sólo las órdenes de un par en particular, y no la suma de todos los pares del terminal.

Estaré muy agradecido por la ayuda.

Se lo agradecería.

siéntase libre de buscar en el CodeBase - cada EA tiene un bucle de orden :-)

Por ejemplo https://www.mql5.com/ru/code/16588 (el primero que encontré)

  for(int index = orders-1; index >= 0; index--)
      {
      if(OrderSelect(index,SELECT_BY_POS,MODE_HISTORY)==false)
         {
         Print("Error in history!");
         break;
         }
      if(OrderSymbol()==symbol && OrderMagicNumber()==MAGICMA)
         {
         if(OrderType()==OP_BUY || OrderType()==OP_SELL)
            {
            if(OrderProfit()>0) break;
            if(OrderProfit()<0) losses++;
            }
         }
      }

la condición"if(OrderSymbol()==symbol && OrderMagicNumber()==MAGICMA)" es exactamente lo que selecciona las órdenes por un símbolo específico y con un MAGIC específico

PS/ en el código anterior copiar-pegar romper en caso de un error OrderSelect no es del todo correcto, en lugar de utilizar continuar (no importa lo que la razón es la orden no se recoge, tal vez hay un problema con algún mecanismo interno de MetaTrader, pero la siguiente orden no se saltará)

Middle Moving Average
Middle Moving Average
  • votos: 6
  • 2016.10.18
  • Dmitriy Kudryashov
  • www.mql5.com
Вариант советника, основанного на среднем значении цены для расчета Moving Average.
 
Maxim Kuznetsov:

siéntase libre de buscar en el CodeBase - cada EA tiene un bucle de orden :-)

Por ejemplo https://www.mql5.com/ru/code/16588 (el primero que encontré)

No sólo está en CodeBase, está en uno de los dos hilos del foro, lo importante es empezar a buscar y habrá más de cien en diferentes interpretaciones.
 
Gracias, voy a visitar
 

Hola chicos!!! Ayúdenme a escribir una función que devuelva una señal de compra o venta. Todavía no sé cómo trabajar con barras en MQL (¡aunque no sé muchas cosas!).

La condición es la siguiente: la barra padre es una barra dentro de la cual, es decir, dentro de la alta y la baja hay una barra con el precio de cierre (¡¡es importante!! exactamente el precio de cierre.) Una vez que alguna barra atraviesa la padre y cierra por encima de la alta o por debajo de la baja, ¡se convierte ahora en la barra padre!

Si el precio de cierre de la barra principal es mayor que el precio de apertura, devolvemos la señal de compra.

Si el precio de cierre de la barra madre es inferior al precio de apertura, devolvemos la señal de venta.

Es muy importante establecer el plazo en la variable externa.

Pero aquí está el problema, al menos para mí, ¿cómo puede el Asesor Experto encontrar la última barra mate en el gráfico? Sí, visualmente puedo verlo de inmediato! ....

Me convendría especificar el índice de la última barra MAT en una variable externa y entonces la función empezará a bailar desde ella; u otra variante para tomar una barra con el índice, por ejemplo, 50 y recorrer el bucle hasta el cero.

¡¡¡Muy por favor ayuda a los huérfanos!!!

 

¡Buenas tardes!

¿Puede darme una idea? Necesitamos que un EA no pueda abrir una orden si ya se ha abierto una orden a este precio. ¿Cómo se realiza el control?

 
Kot:

¡Buenas tardes!

¿Puede darme una idea? Necesitamos que un EA no pueda abrir una orden si ya se ha abierto una orden a este precio. ¿Cómo se realiza el control?

Es una tarea difícil. Por desesperación, solía asignar una orden mágica al precio/punto deseado dado el deslizamiento.

Es mucho más fácil en mql5: hay una posición con un precio que no corresponde al precio solicitado y una orden con el precio solicitado.

 
Kot:

¡Buenas tardes!

¿Puede darme una idea? Necesitamos que un EA no pueda abrir una orden si ya se ha abierto una orden a este precio. ¿Cómo se realiza el control?


Se escribe un bucle de órdenes, en el que se compara el precio de apertura de cada orden con el valor del precio dado, y si hay una coincidencia, entonces no se levanta la bandera de una nueva orden.
Razón de la queja: