¿Cómo codificar? - página 18

 

Michel,

Muchas gracias por tomarte el tiempo de mirar el código y responder. A veces sólo hace falta otro par de ojos. Tenías razón en que el error era la división por 0 con una barra que faltaba. Ya está solucionado.

BW

 

Explicación del código - Ind-Fractals-1

alguien puede explicar cómo se determinan los fractales en este indicador(https://c.mql5.com/forextsd/forum/165/ind-fractals-1.mq4). he notado que al igual que los fractales normales hay un retraso entre el punto de giro y el fractal real que se dibuja, sin embargo, me gustaría saber cuánto tiempo es ese retraso. creo que un fractal de 15 minutos se dibuja 40-50 barras de 1 minuto después de que se establezca el punto. también he notado que el color de los fractales cambia (aunque su posición no lo hace) como algunos fractales de 15 minutos se convierten en fractales de 1 hora.

 

¿cómo codificar lo siguiente?

Hola a todos,

Soy un recién llegado a metatrader 4. No sé mucho acerca de la codificación en mt4.

quiero que metatrader de una alerta cuando

1. La media móvil simple de 30 periodos se eleva por encima de la media móvil simple de 60 periodos.

2. 2. La media móvil simple de 30 periodos cae por debajo de la media móvil simple de 60 periodos.

¿Alguien puede ayudarme a publicar el código aquí?

muchas gracias

 
adamk203:
Hola a todos,

Soy un recién llegado a metatrader 4. No sé mucho acerca de la codificación en mt4.

quiero que metatrader de una alerta cuando

1. La media móvil simple de 30 períodos se eleva por encima de la media móvil simple de 60 períodos.

2. 2. La media móvil simple de 30 periodos cae por debajo de la media móvil simple de 60 periodos.

¿Puede alguien ayudarme a publicar el código aquí?

muchas gracias

¿Por qué no usas esto? pon tu MA y elige 0 para simple, te da líneas y flechas

Archivos adjuntos:
 

Muchas gracias~~

 
increase:
¿Por qué no usas esto? pon tu MA y elige 0 para simple, te da líneas y flechas

Hola, me gustaría que la señal apareciera cuando la vela 2 limpia ha terminado después de la cruz over.thx de antemano

Archivos adjuntos:
gbp_4h.gif  19 kb
 

por favor ayude a corregir mi código

En primer lugar, creo que este código es muy útil, muchos ppl se encanta. Así que por favor ayúdame a mejorarlo.

De hecho, este código ya funciona muy bien. Pero estoy cansado de la simple ventana emergente de Alerta, sin que se muestre ningún símbolo. Así que he cambiado/añadido algunas líneas para probar, que es la parte %%%%%%%%%.

No sé por qué, imprima, comente... lo que sea, no pasa nada.

Y, extrañamente, se puede ver en la parte "----alert----", he cambiado la alerta UPBREAK por otra cosa, pero sigue mostrando "UP BREAK". ---- Seguro que cada vez que reescribo el código, lo compilo, lo borro del gráfico y lo vuelvo a cargar.

¿Alguna idea?

#property indicator_chart_window

#import "usr32.dll" // %%%%%%%%%%

int MessageBoxA(int hWnd,string lpText,string lpCaption,int uType); //%%%%%%%%%%

#import //%%%%%%%%%%

int PrevAlertTime = 0;

int init()

{

return(0);

}

int deinit()

{

return(0);

}

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

int start()

{

int i=ObjectsTotal();

int redtotal=0,j,typ1;

double price1,price2,up,down;

color col;

string name1,name2,nameup,namedown,warn1,sym=Symbol();

warn1=sym + "Break Up"; //%%%%%%%%%%

Print(sym); //%%%%%%%%%%%

//----make sure exactly 2 red lines on chart---------------------

for (j=0; j<i; j++)

if(ObjectGet(ObjectName(j),OBJPROP_COLOR)==255 && ObjectType(ObjectName(j))==OBJ_TREND)

{ redtotal++;

if (redtotal==1) name1=ObjectName(j);

if (redtotal==2) name2=ObjectName(j);

}

if (redtotal==2)

{

if(ObjectFind("remind")==0) ObjectDelete("remind");

}

else

{

ObjectCreate("remind",OBJ_LABEL,0,0,0);

ObjectSet("remind", OBJPROP_XDISTANCE,0);

ObjectSet("remind", OBJPROP_YDISTANCE,20);

ObjectSetText("remind", "Keep exactly 2 red lines on chart" ,16,"Times New Roman",Blue);

return(0); // question here: what should I use, 0 or -1 ?

}

//--------decide which line is up / down ---------------------

price1=NormalizeDouble(ObjectGetValueByShift(name1,1),

MarketInfo(Symbol(),MODE_DIGITS));

price2=NormalizeDouble(ObjectGetValueByShift(name2,1),

MarketInfo(Symbol(),MODE_DIGITS));

if (price2>=price1)

{

nameup=name2; namedown=name1;

up=price2; down=price1;

}

else

{ nameup=name1; namedown=name2;

up=price1; down=price2;

}

//-------- alert ----------------------------------------------

if (TimeCurrent() - PrevAlertTime > Period()*60/3)

{

if (Close[1]up)

{ MessageBoxA(NULL,"tupole","11111",0); // %%%%%%%%%%

Print(Symbol()); // %%%%%%%%%%

PrevAlertTime = TimeCurrent();

}

if (Close[1]>=down && Close[0]<down)

{ Alert("DOWN BREAK",Symbol());

PrevAlertTime = TimeCurrent();

}

}

return(0);

}

 

He encontrado lo que está mal:

Normalmente, creo o edito un código mediante: "Metaeditor--archivo--nuevo/abierto..."

Pero acabo de descubrir: después de adjuntar al gráfico, y luego algunos cambios en este código, finalmente más cambios no afectan el gráfico más (seguramente he compilado !)----- pero "Metaeditor--navegador--archivos--mi código..." sí ! ¡Es raro, deberían ser el mismo código!

 

Ayuda con el código de la pista

void TrailIt( int byPips ) // based on trailing stop code from MT site... thanks MT!

{

if (byPips >=5)

{

for (int i = 0; i < OrdersTotal(); i++) {

OrderSelect(i, SELECT_BY_POS, MODE_TRADES);

if ( OrderSymbol()==Symbol() && ( (OrderMagicNumber() == uniqueGridMagic) || (OrderComment() == GridName)) ) // only look if mygrid and symbol...

{

if (OrderType() == OP_BUY) {

//if (Bid > (OrderValue(cnt,VAL_OPENPRICE) + TrailingStop * Point)) {

// OrderClose(OrderTicket(), OrderLots(), Bid, 3, Violet);

// break;

//}

if (Bid - OrderOpenPrice() > byPips * MarketInfo(OrderSymbol(), MODE_POINT)) {

if (OrderStopLoss() < Bid - byPips * MarketInfo(OrderSymbol(), MODE_POINT)) {

OrderModify(OrderTicket(), OrderOpenPrice(), Bid - byPips * MarketInfo(OrderSymbol(), MODE_POINT), OrderTakeProfit(), Red);

}

}

} else if (OrderType() == OP_SELL) {

if (OrderOpenPrice() - Ask > byPips * MarketInfo(OrderSymbol(), MODE_POINT)) {

if ((OrderStopLoss() > Ask + byPips * MarketInfo(OrderSymbol(), MODE_POINT)) ||

(OrderStopLoss() == 0)) {

OrderModify(OrderTicket(), OrderOpenPrice(),

Ask + byPips * MarketInfo(OrderSymbol(), MODE_POINT), OrderTakeProfit(), Red);

}

}

}

}

}

}

} // proc TrailIt()

Este es el código. Como se ve en el archivo adjunto en una orden, modificará el tope pero también lo modificará en la dirección equivocada y no puedo solucionarlo. ¡¡Agradecería mucho la ayuda para encontrar la solución!!

Archivos adjuntos:
ordermodify.txt  40 kb
 

Intenta esto. Parece que posiblemente esté intentando modificar órdenes con diferentes símbolos. Si es así, el Bid y el Ask estarán tirando de los datos del mercado sólo del símbolo de la ventana del gráfico que el EA está adjuntando. Usando MarketData(symbol, MODE_BID) es la manera de obtener los datos apropiados.

void TrailIt( int byPips ) // based on trailing stop code from MT site... thanks MT!

{

if (byPips >=5)

{

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

{

OrderSelect(i, SELECT_BY_POS, MODE_TRADES);

double bid=MarketInfo(OrderSymbol(),MODE_BID);

double ask=MarketInfo(OrderSymbol(),MODE_ASK);

if ( OrderSymbol()==Symbol() && ( (OrderMagicNumber() == uniqueGridMagic) || (OrderComment() == GridName)) ) // only look if mygrid and symbol...

{

if (OrderType() == OP_BUY)

{

if (bid - OrderOpenPrice() >= byPips * MarketInfo(OrderSymbol(), MODE_POINT))

{

if (OrderStopLoss() < bid - byPips * MarketInfo(OrderSymbol(), MODE_POINT)|| (OrderStopLoss() == 0))

{

OrderModify(OrderTicket(), OrderOpenPrice(), bid - byPips * MarketInfo(OrderSymbol(), MODE_POINT), OrderTakeProfit(), Red);

}

}

}

else if (OrderType() == OP_SELL)

{

if (OrderOpenPrice() - ask >= byPips * MarketInfo(OrderSymbol(), MODE_POINT))

{

if ((OrderStopLoss() > ask + byPips * MarketInfo(OrderSymbol(), MODE_POINT)) || (OrderStopLoss() == 0))

{

OrderModify(OrderTicket(), OrderOpenPrice(),ask + byPips * MarketInfo(OrderSymbol(), MODE_POINT), OrderTakeProfit(), Red);

}

}

}

}

}

}

return;

}
Razón de la queja: