¿Cómo codificar? - página 199

 
V-Force:
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?

Archivos adjuntos:
 

¿Puede alguien ayudarme a entender estas líneas de programación? En inglés sencillo

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?

 
crn:
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];

}

 
Jorged23:
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!

 
luxinterior:
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

Razón de la queja: