![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
Soy nuevo en mq4 y estoy tratando de crear una visualización en pantalla cuando hay un cruce para el MACD. Abajo está mi código pero las alertas siguen apareciendo cada pocos minutos.
¿Cómo puedo codificarla para que muestre las alertas sólo una vez cada hora? ¿O una alerta por barra?
int inicio()
{
string MACD1="";
color colt9;
double MACDM_S10 = iCustom(NULL, PERIOD_H1, "MACD", 8,17,9, MODE_MAIN, 0);
double MACDS_S10 = iCustom(NULL, PERIOD_H1, "MACD", 8,17,9, MODE_SIGNAL,0);
double MACDM_S11 = iCustom(NULL, PERIOD_H1, "MACD", 8,17,9, MODE_MAIN, 1);
double MACDS_S11 = iCustom(NULL, PERIOD_H1, "MACD", 8,17,9, MODE_SIGNAL,1);
if ((MACDM_S11 < MACDS_S11 && MACDM_S10 < MACDS_S10)) { MACD1="IN UPTREND"; colt9=LimeGreen; }
if ((MACDM_S11 > MACDS_S11 && MACDM_S10 > MACDS_S10)) { MACD1="IN DOWNTREND"; colt9=Red; }
if ((MACDM_S11 > MACDS_S11 && MACDM_S10 < MACDS_S10)) { MACD1="NUEVO CRUCE ALCISTA"; colt9=Verde lima; }
if ((MACDM_S11 MACDS_S10)) { MACD1="NUEVO CRUCE ABAJO"; colt9=Rojo; }
string MACD2=";
color colt14;
double MACDM_L10 = iCustom(NULL, PERIOD_H1, "MACD", 12,26,9, MODE_MAIN, 0);
double MACDS_L10 = iCustom(NULL, PERIOD_H1, "MACD", 12,26,9, MODE_SIGNAL,0);
double MACDM_L11 = iCustom(NULL, PERIOD_H1, "MACD", 12,26,9, MODE_MAIN, 1);
double MACDS_L11 = iCustom(NULL, PERIOD_H1, "MACD", 12,26,9, MODE_SIGNAL,1);
if ((MACDM_L11 < MACDS_L11 && MACDM_L10 < MACDS_L10)) { MACD2="IN UPTREND"; colt14=LimeGreen; }
if ((MACDM_L11 > MACDS_L11 && MACDM_L10 > MACDS_L10)) { MACD2="IN DOWNTREND"; colt14=Red; }
if ((MACDM_L11 > MACDS_L11 && MACDM_L10 < MACDS_L10)) { MACD2="NUEVO CRUCE ALCISTA"; colt14=Verde lima; }
if ((MACDM_L11 MACDS_L10)) { MACD2="NUEVO CRUCE BAJO"; colt14=Rojo; }
if(MACD1=="NUEVO CRUCE ALCISTA"&&MACD2=="EN TENDENCIA ALCISTA")
Alert(Symbol()," - ", "H1:"," MACD MAIN UPTREND MOVEMENT"," at ", Bid, " - ",TimeToStr(CurTime(),TIME_SECONDS));
if(MACD1=="NUEVO CRUCE BAJO"&&MACD2=="EN TENDENCIA BAJA")
Alert(Symbol()," - ", "H1:"," MACD MAIN DOWNTREND MOVEMENT"," at ", Bid, " - ",TimeToStr(CurTime(),TIME_SECONDS));
if(MACD2=="NUEVO CRUCE ALCISTA"&&MACD1=="EN TENDENCIA ALCISTA")
Alert(Symbol()," - ", "H1:"," MACD, CAMBIO DE TENDENCIA PRINCIPAL A TENDENCIA ALTA"," at ", Bid, " - ",TimeToStr(CurTime(),TIME_SECONDS));
if(MACD2=="NUEVO CRUCE BAJO"&&MACD1=="EN TENDENCIA BAJA")
Alert(Symbol()," - ", "H1:"," MACD, CAMBIO DE TENDENCIA A LA BAJA"," at ", Bid, " - ",TimeToStr(CurTime(),TIME_SECONDS));
return(0);
}Intenta utilizar Minute()==1; en la condición
Tendencia Alexcud para modificar
si (MaH11v < MaH1pr1v){H11v = " V "; co11v = Rojo; u1x5v = 0; d1x5v = 1;} si (MaH11v > MaH1pr1v){H11v = " V "; co11v = Rojo; u1x5v = 0; d1x5v = 1
si (MaH11v > MaH1pr1v){H11v = " /\\"; co11v = Azul; u1x5v = 1; d1x5v = 0;}
si (MaH11v == MaH1pr1v){H11v = " 0 "; co11v = Verde; u1x5v = 0; d1x5v = 0;}
Hola a todos, estoy intentando modificar el trend alexcud(adjunto)
quiero solo 2 señales arriba y abajo en vez de 3 con "0"...
para que el cálculo sea más preciso...
¿Alguna idea?
¿Puede alguien ayudarme a entender estas líneas de programación? En inglés sencillo![](https://c.mql5.com/forextsd/smiles/biggrin.png)
Se trata de que un EA inicie algo después de que una barra haya terminado.
El código es así :
datetime timeprev=0;
// Sólo se ejecuta una vez por barra terminada
if(timeprev==Time[0]) return(0);
timeprev = Time[0];
Según miro en el manual de MQ4, Time[0] es para extraer la hora de apertura de la barra [0]. Se indica como segundos desde el 1 de enero de 1970.
No entiendo cómo funciona eso. Primero tenemos "timeprev=0".
Luego la siguiente línea "if (timeprev==Time[0]) return(0).
¿Cuál es el valor de Time[0] en este momento? ¿Cómo es posible que se convierta en 0 (el valor de "timeprev")?
La siguiente línea es "timeprev=Time[0]".
¿Cómo es que toda la línea hace que el EA no haga nada hasta que una barra haya terminado?
Intente utilizar Minuto()==1; en la condición
Esto seguirá activando cada tick en el primer minuto de cada barra. Esto puede reducir significativamente el número, pero todavía alertará varias veces.
Lo mejor que puede hacer es establecer una variable global (u objeto) y establecerla en el Tiempo[] de la última barra.
if (Time[0]!=lastTime) {
... alert, whatever...
lastTime=Time[0];
}
Hola,
¡No puedo evitar el error 1 de OrderModify : siempre aparece aunque intente controlar que los datos antes de modificar son diferentes ! También he probado con doublenormalize...no funciona...
Este es el código
if (Bid-OrderOpenPrice() >= VPoint*BreakEvenAtProfit)
{
if (OrderStopLoss() != OrderOpenPrice() + BreakEvenShift*VPoint)
{
Vresultado = OrderModify(OrderTicket(),OrderOpenPrice(),OrderOpenPrice()+ BreakEvenShift*VPoint,OrderTakeProfit(),0,Green);
¿Alguna sugerencia?
Gracias.Comprobación rápida... asegúrese de que no está estableciendo la distancia de equilibrio demasiado corta. Compruébalo con MarketInfo(Symbol(),MODE_STOPLEVEL) para asegurarte de que es lo suficientemente grande.
¿Cuál es el propósito de VPoint? Si ese número es incorrecto, se complicarán las cosas. "Punto" por sí mismo siempre será correcto. Si ese número está fuera de lugar, eso podría ser definitivamente la causa del problema. Es decir, es accidentalmente 0 o menos de lo que POINT realmente es.
Pregunta de codificación SIMPLE
OrderSelect(5555, SELECT_BY_TICKET);
RefrescarTarifas();
if (Ask >= (OrderOpenPrice()+ (5 * Point)) && OrderLots() == 2 && (OrderType() == OP_BUY)) {
OrderClose(5555,1,Ask,10,Red); }
if (Bid <= (OrderOpenPrice()- (5 * Point)) && OrderLots() == 2 && (OrderType() = OP_SELL)) {
OrderClose(5555,1,Bid,10,Blue); }
Todavía tratando de aprender...
¿funcionaría esto para básicamente cerrar la mitad (2 lotes a 1) de una posición cuando el precio llega a 5 pips de distancia del precio de apertura?
¡¡¡¡¡¡GRACIAS!!!!!!
Parece que está bien. Aunque es un poco desordenado. También podrías usar OrderProfit dependiendo de lo que quieras conseguir realmente.
Lux
PD: Se me olvidó mencionar que hay que tener cuidado con los brokers de 5 decimales. Todo necesita ser multiplicado por 10 así que en tu ejemplo 5 sería 50. ¡Buena suerte!
Parece que está bien. Aunque es un poco desordenado. También podrías usar OrderProfit dependiendo de lo que realmente quieras conseguir.
Lux
PD: Se me olvidó mencionar que hay que tener cuidado con los corredores de 5 decimales. Todo necesita ser multiplicado por 10 así que en tu ejemplo 5 sería 50. ¡Buena suerte!Gracias LUX
El problema es que lo tengo funcionando sólo para depurar en un gráfico de 1 minuto de GBP/USD con Windsor direct y no está cerrando 1 lote cuando llega a los 5 pips así que no sé qué pasa.
TAMBIÉN,
Estoy tratando de cerrar una compra e inmediatamente abrir una venta y ESO tampoco va bien.
Funciona y luego no...
DESEO QUE ESTO FUE MUCHO más fácil de programar
if (*******************) {
RefreshRates();
OrderSelect(5555,SELECT_BY_TICKET);
if (OrdersTotal() > 0 && OrderType()==OP_BUY) {OrderClose(5555, OrderLots(), Bid, Slippage, MediumSeaGreen);
if (SignalMail) SendMail("[Signal Alert]", "[" + Symbol() + "] " + DoubleToStr(Bid, Digits) + " Close Buy");}
Sleep(1500);
ActualizarTarifas();
if (OrdersTotal() ==0) Ticket = OrderSend(Symbol(), OP_SELL, Lots, Bid, 10, 0, 0, "Sell(#" + MagicNumber + ")", MagicNumber, 0, DeepPink);
if(Ticket<0)Print("OrderSend failed with error #",GetLastError());
}
Depuración de indicadores
Soy nuevo en este lenguaje y estoy tratando de escribir un indicador. Estoy teniendo problemas ya que no hay depurador. Traté de usar el Print() pero no se imprime nada. Usando el Alert() obtengo ZERO como salida para el buffer[1] . ¿Puede alguien explicarme esto por favor? Como puedo usar Print() y Alert() para depurar sin obtener todos los ZEROs. Si alguien tiene alguna idea por favor hágamelo saber. Muchas gracias.
tigger.longtail@gmail.com
ExtMapBuffer1 = iMA(NULL,0,ExtParam1,0,MODE_EMA,PRICE_CLOSE,i);
ExtMapBuffer2 = iMA(NULL,0,ExtParam2,0,MODE_EMA,PRICE_CLOSE,i);
CurrentBar = Tiempo;
if( ExtMapBuffer1 >= ExtMapBuffer2 && CurrentBar == Time && Flag == 0)
{
Alert("ExtMapBuffer1 =", ExtMapBuffer1," Short is Above. ",Hora()," Minuto ",Minuto());
Alert("ExtMapBuffer2 =", ExtMapBuffer2," Short is Above. ",Hora()," Minuto ",Minuto());
Print("ExtMapBuffer1 = ", ExtMapBuffer1);
Print("ExtMapBuffer2 = ", ExtMapBuffer2);
de todas formas no hay manera