Hacer que el stop se vaya ajustando según una media móvil?

Foro para cuestiones generales sobre la plataforma MetaTrader 4.

Hacer que el stop se vaya ajustando según una media móvil?

Notapor pelaez » 10 Abr 2015, 02:46

Hola
Estoy haciendo un EA con el sistema de cruces de medias de Lowry. Lo que me gustaría hacer sería poner un stop que se fuera moviendo según va tomando valores la media de 40 sesiones, ya que al introducir la orden si que puedo poner el stop loss en la media, pero se queda siempre en el mismo valor.

Gracias
pelaez
 
Mensajes: 12
Registrado: 13 Oct 2014, 22:34
Karma: 0

Re: Hacer que el stop se vaya ajustando según una media móvi

Notapor cdtrader » 10 Abr 2015, 13:58

usa el comando "OrderModify", ahi puedes ir cambiando el SL y TP
Imagen
Avatar de Usuario
cdtrader
 
Mensajes: 1428
Registrado: 23 Ago 2014, 13:47
Karma: 17

Re: Hacer que el stop se vaya ajustando según una media móvi

Notapor pelaez » 13 Abr 2015, 19:21

Muchas gracias dancotrader
pelaez
 
Mensajes: 12
Registrado: 13 Oct 2014, 22:34
Karma: 0

Re: Hacer que el stop se vaya ajustando según una media móvi

Notapor pelaez » 16 Abr 2015, 14:48

Con OrderModify doy cambiado el stop al valor de la media en el momento de abrir la orden, pero no consigo que cambie el stop al valor de la media en la última barra.

Gracias
pelaez
 
Mensajes: 12
Registrado: 13 Oct 2014, 22:34
Karma: 0

Re: Hacer que el stop se vaya ajustando según una media móvi

Notapor cdtrader » 16 Abr 2015, 16:40

copia el codigo y lo vemos.
Imagen
Avatar de Usuario
cdtrader
 
Mensajes: 1428
Registrado: 23 Ago 2014, 13:47
Karma: 17

Re: Hacer que el stop se vaya ajustando según una media móvi

Notapor pelaez » 16 Abr 2015, 17:17

bool zonapeligro; // 1 - Alcista
// 0 - Bajista

int alerta = 0; // 3 - DF Bajista


bool velanueva = False; // Variable que nos detecta la vela

extern double stoploss = 200.0;
extern double takeprofit = 200.0;
extern int periodolargo = 40;//Media larga
extern int periodocorto = 20;//Media corta
extern int periododisparo = 4;//Media 4
extern int numordenes = 1;

//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
//---

//---
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
//---

}
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void OnTick()
{
// Definimos variables locales

bool tendenciacorta;

//---
nuevabarra ();

int totalordenes = OrdersTotal();

// for (int i=0; i <= (totalordenes); i++){
//Seleccionamos la orden del mercado
//if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==TRUE){
// Comprobando modificacion
// double precioentrada = OrderOpenPrice();
// if (precioentrada < Low[3]&&Low[3]<Low[2]&&Low[2]<Low[1]){
//Modificando
// int modificar;
//modificar = OrderModify(OrderTicket(),precioentrada,Low[3],OrderTakeProfit(),0,Yellow);


// }
// }
// }
if (velanueva == True){
double medialarga = iMA (Symbol(),NULL,periodolargo,0,MODE_SMA,PRICE_CLOSE,0);
double mediacorta = iMA (Symbol(),NULL,periodocorto,0,MODE_SMA,PRICE_CLOSE,0);
double mediadisparo = iMA (Symbol(),NULL,periododisparo,0,MODE_SMA,PRICE_CLOSE,0);

string texto = "Sin determinar";
color visual = Black;


if (totalordenes >=numordenes) {
alerta = 0;
return;
}

if (mediadisparo < mediacorta){
tendenciacorta = 0; // Media Corta Bajista
}
else if (mediadisparo > mediacorta){
tendenciacorta = 1; // Media Corta Alcista
}

if (mediacorta < medialarga){
texto = "Zona de peligro Bajista";
visual = Red;
zonapeligro = 0;
if (( mediacorta < mediadisparo) && (mediadisparo < medialarga)){
texto = "Posible entrada al mercado, DF Bajista";
alerta = 3;
}
}

else if (mediacorta > medialarga){
texto = "Zona de peligro Alcista";
visual = Green;
zonapeligro = 1;
if (( tendenciacorta == 0) && ( mediadisparo > medialarga)){
texto = "Posible entrada al mercado, DF Alcista";
alerta = 1;
}
}

//Entrada Bajista
if ((alerta == 3) && (tendenciacorta == 0)){
int entradabajista;
entradabajista = OrderSend(Symbol(),OP_SELL,1,Bid,3,medialarga + stoploss*Point,0,NULL,0,0,Red);
if (OrderSelect (entradabajista, SELECT_BY_TICKET)==TRUE){
double precioentrada = OrderOpenPrice();
//if(precioentrada < Low[iMA (Symbol(),NULL,40,0,MODE_SMA,PRICE_CLOSE,3)]&&Low[iMA (Symbol(),NULL,40,0,MODE_SMA,PRICE_CLOSE,3)]>Low[iMA (Symbol(),NULL,40,0,MODE_SMA,PRICE_CLOSE,2)]&&Low[iMA (Symbol(),NULL,40,0,MODE_SMA,PRICE_CLOSE,2)]>Low[iMA (Symbol(),NULL,40,0,MODE_SMA,PRICE_CLOSE,)]&&Low[iMA (Symbol(),NULL,40,0,MODE_SMA,PRICE_CLOSE,1)]){
int modificar1;
modificar1 = OrderModify(entradabajista,precioentrada,iMA (Symbol(),NULL,40,0,MODE_SMA,PRICE_CLOSE,1),0,0,Yellow);
}
//}
}

//Fallo FD Bajista
//if ((alerta == 3) && (mediadisparo > medialarga) && (medialarga > mediacorta)){
// int fallobajista;
//fallobajista = OrderSend(Symbol(),OP_BUY,1,Ask,3,mediacorta - stoploss*Point,0,NULL,0,0,Green);
//}

//Entrada Alcista
//if ((alerta == 1) && ( tendenciacorta == 1)){
// int entradaalcista;
//entradaalcista = OrderSend(Symbol(),OP_BUY,1,Ask,3,medialarga - stoploss*Point,0,NULL,0,0,Green);
//}

// Fallo FD Alcista
//if ((alerta == 1) && (mediadisparo < medialarga) && (medialarga < mediacorta)){
//int falloalcista;
//falloalcista = OrderSend(Symbol(),OP_SELL,1,Bid,3,mediacorta + stoploss*Point,0,NULL,0,0,Red);
//}

ObjectDelete ("Tendencia");
ObjectCreate ("Tendencia",OBJ_LABEL,0,0,0);
ObjectSet ("Tendencia",OBJPROP_CORNER,1);
ObjectSet ("Tendencia",OBJPROP_XDISTANCE,30);
ObjectSet ("Tendencia",OBJPROP_YDISTANCE,30);
ObjectSetText ("Tendencia",(string)texto,10,"Arial",visual);


}
}
//+------------------------------------------------------------------+

// Funcion encargada de cambiar la variable nuevavela
void nuevabarra(){

static datetime nuevotime = 0; //Detectar nuevo tiempo

velanueva = False; // 0 - misma vela, 1 - vela nueva

if (nuevotime != Time[0]){
nuevotime = Time[0];
velanueva = True;
}

}
pelaez
 
Mensajes: 12
Registrado: 13 Oct 2014, 22:34
Karma: 0

Re: Hacer que el stop se vaya ajustando según una media móvi

Notapor MacD » 16 Abr 2015, 18:08

Una pregunta.

Que distancia manejas entre el valor que te da la iMa y el precio actual?, hay brokers que imponen bastantes pips del orden de 10 o mas pips y en pares exoticos incluso mas y por tanto las ordenes que se le envien no las acepta.

Por otra parte el codigo que modifica el SL solo se ejecuta una vez, despues de que se ha abierto la orden, no veo mas codigo donde la gestiones a medida que el precio se va moviendo. Esta es la parte que falta por programar.

int modificar1;
modificar1 = OrderModify(entradabajista,precioentrada,iMA (Symbol(),NULL,40,0,MODE_SMA,PRICE_CLOSE,1),0,0,Yellow);

esto es lo que se ejecuta al final del codigo donde se abre la orden y que por lo tanto solo se ejecuta esa unica vez.
MacD
 
Mensajes: 79
Registrado: 08 Jul 2014, 03:48
Karma: 0

Re: Hacer que el stop se vaya ajustando según una media móvi

Notapor pelaez » 16 Abr 2015, 19:45

Y como puedo hacer para que se siga ejecutando?

Gracias
pelaez
 
Mensajes: 12
Registrado: 13 Oct 2014, 22:34
Karma: 0

Siguiente

Volver a MetaTrader 4

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 0 invitados