Crear una orden de Breakeven

Espacio para compartir y debatir sobre Asesores Expertos de MetaTrader

Re: Crear una orden de Breakeven

Notapor Nightmare » 09 Abr 2017, 08:29

pues el código que te envie hace eso. estudialo....
Nightmare
 
Mensajes: 246
Registrado: 22 Feb 2017, 20:10
Karma: 5

Re: Crear una orden de Breakeven

Notapor cdtrader » 09 Abr 2017, 15:07

No, solo controla que el precio actual sea mayor. Tienes que colocar:

if(Ask>(OrderOpenPrice()+BreakEven) && OrderStopLoss< (OrderOpenPrice()+BE))

Fíjate si escribí bien OrderStopLoss lo hice del celular y no estoy seguro de las mayúsculas

Enviado desde mi Moto G (4) mediante Tapatalk
Avatar de Usuario
cdtrader
 
Mensajes: 1428
Registrado: 23 Ago 2014, 13:47
Karma: 17

Re: Crear una orden de Breakeven

Notapor Refresko » 09 Abr 2017, 22:53

DistriFx escribió:Hola de nuevo chicos. Despues de varios dias ocupado me he puesto a probar todas las cosas que me dijisteis con tanta amabilidad. No se si es el mejor codigo posible, pero realiza perfectamente lo que me propongo (en una primera fase). Que no es otra cosa que cuando el precio este a nuestro favor x pips, se coloque el stoploss un pips por encima de la entrada garantizando una ligera ganancia en el peor de los casos. Os coloco el codigo para que lo veais (y por si veis algun fallo jejeje).

void Beven()
{
int total=OrdersTotal();
for(int pos=0;pos<total;pos++)
{
if(OrderSelect(pos,SELECT_BY_POS))
if(OrderType()==OP_BUY)
{
if(Ask>(OrderOpenPrice()+BreakEven))
{
OrderModify(OrderTicket(),OrderOpenPrice(),OrderOpenPrice()+BE,OrderTakeProfit(),0);
}
}
}
}

Ahora bien, puse en una primera fase proque una vez que el precio llegue a otra distancia quisiera que el stop subiera otros pocos pips. Pero es muy frustrante ya que lo mas que he llegado a conseguir es que se suba al segundo nivel cuando el precio alcanza el nivel requerido, pero se vuelve a bajar el stoploss al nivel del primer salto si el precio baja de este segundo nivel. Y no consigo solucionarlo. Esa parte del codigo la borre del cabreo, asi que no puedo ponerlo. Pero si necesitais que lo ponga para ver el posible fallo, intentare reescribirlo de nuevo.

Muchas gracias y disculpad mi torpeza :(

Hice lo que entendi que necesitabas, espero te sirva!

Código: Seleccionar todo
void Beven()
  {
// "BreakEven" es la distancia que activa el BreakEven. ejemplo 20 pips
// "BE" es la distancia que se mueve el BreakEven.ejemplo 5 Pips
//"NUEVADISTANCIA" es la distancia que hace el trailing y se mide desde el SL ( quiere decir que se mide desde el BE que ya se debio haber movido), ejemplo 30 pips)
   int total=OrdersTotal();
   for(int pos=0;pos<total;pos++)
     {
      if(OrderSelect(pos,SELECT_BY_POS))
         if(OrderType()==OP_BUY)
           {
            if(Bid>(OrderOpenPrice()+BreakEven) && OrderStopLoss()<(OrderOpenPrice()+BE))
              {
               if(!OrderModify(OrderTicket(),OrderOpenPrice(),NormalizeDouble(OrderOpenPrice()+BE,Digits),OrderTakeProfit(),0))Print("Error # ",GetLastError()," al Hacer la modificacion");
              }

            if(Bid-OrderStopLoss()>NUEVADISTANCIA && OrderStopLoss()>=OrderOpenPrice() && NormalizeDouble(Bid-NUEVADISTANCIA,Digits)!=OrderStopLoss())
              {
               if(!OrderModify(OrderTicket(),OrderOpenPrice(),NormalizeDouble(Bid-NUEVADISTANCIA,Digits),OrderTakeProfit(),0))Print("Error # ",GetLastError()," al Hacer la modificacion");
              }
           }
      if(OrderType()==OP_SELL)
        {
         if((Ask<(OrderOpenPrice()-BreakEven) && OrderStopLoss()>(OrderOpenPrice()-BE)) ||( Ask<(OrderOpenPrice()-BreakEven) && !OrderStopLoss()))
           {
            if(!OrderModify(OrderTicket(),OrderOpenPrice(),NormalizeDouble(OrderOpenPrice()-BE,Digits),OrderTakeProfit(),0))Print("Error # ",GetLastError()," al Hacer la modificacion");
           }

         if(OrderStopLoss()-Ask>NUEVADISTANCIA && OrderStopLoss()<=OrderOpenPrice() && NormalizeDouble(Ask+NUEVADISTANCIA,Digits)!=OrderStopLoss())
           {
            if(!OrderModify(OrderTicket(),OrderOpenPrice(),NormalizeDouble(Ask+NUEVADISTANCIA,Digits),OrderTakeProfit(),0))Print("Error # ",GetLastError()," al Hacer la modificacion");
           }
        }
     }
  }
No puedes cometer/ dos veces el mismo error/ la segunda vez sera/ Por eleccion...
Avatar de Usuario
Refresko
 
Mensajes: 165
Registrado: 12 Dic 2011, 22:56
Karma: 5

Re: Crear una orden de Breakeven

Notapor DistriFx » 28 Abr 2017, 11:24

Muchas gracias a todos chicos. Ya lo he solucionado, de hecho ya hago mis trailings y mis be en distintos niveles etc, jejeje cogiendo un poco de aqui y un poco de alli. Todos me habeis ayudado .
DistriFx
 
Mensajes: 10
Registrado: 18 Dic 2016, 12:20
Karma: 0

Re: Crear una orden de Breakeven

Notapor Refresko » 01 May 2017, 07:08

DistriFx escribió:Muchas gracias a todos chicos. Ya lo he solucionado, de hecho ya hago mis trailings y mis be en distintos niveles etc, jejeje cogiendo un poco de aqui y un poco de alli. Todos me habeis ayudado .

y que tal si compartes el code ? :D
No puedes cometer/ dos veces el mismo error/ la segunda vez sera/ Por eleccion...
Avatar de Usuario
Refresko
 
Mensajes: 165
Registrado: 12 Dic 2011, 22:56
Karma: 5

Re: Crear una orden de Breakeven

Notapor DistriFx » 02 May 2017, 08:34

Claro por supuesto. Faltaría mas.

Son dos funciones separadas para las buy y para las sell. Las he hecho asi a proposito. Son tres movimientos de Stop loss cuando se cumplan las condiciones. Ahi lo teneis:

void ThreeStepBuy()
{//Crear nueva variable
double newsl;
double SLA=OrderStopLoss();
//Comprobar las nuevas condiciones
if(Close[1]>OrderOpenPrice()+BreakEven){newsl=OrderOpenPrice()+BE;}
if(Close[1]>OrderOpenPrice()+BreakEv2){newsl=OrderOpenPrice()+BE2;}
if(Close[1]>OrderOpenPrice()+BreakEv3){newsl=OrderOpenPrice()+BE3;}
//Seleccionar la operacion
int total=OrdersTotal();
for(int pos=0;pos<total;pos++)
{
if(OrderSelect(pos,SELECT_BY_POS))
if(OrderType()==OP_BUY)
{
if(newsl>SLA)
{
double SL=NormalizeDouble(newsl,Digits);
OrderModify(OrderTicket(),OrderOpenPrice(),SL,OrderTakeProfit(),0);
}
}
}
}

void ThreeStepSell()
{//Crear nueva variable
double newsl;
double SLA=OrderStopLoss();
//Comprobar las nuevas condiciones
if(Close[1]<OrderOpenPrice()-BreakEven){newsl=OrderOpenPrice()-BE;}
if(Close[1]<OrderOpenPrice()-BreakEv2){newsl=OrderOpenPrice()-BE2;}
if(Close[1]<OrderOpenPrice()-BreakEv3){newsl=OrderOpenPrice()-BE3;}
//Seleccionar la operacion
int total=OrdersTotal();
for(int pos=0;pos<total;pos++)
{
if(OrderSelect(pos,SELECT_BY_POS))
if(OrderType()==OP_SELL)
{
if(newsl<SLA)
{
double SL=NormalizeDouble(newsl,Digits);
OrderModify(OrderTicket(),OrderOpenPrice(),SL,OrderTakeProfit(),0);
}
}
}
}

Saludos
DistriFx
 
Mensajes: 10
Registrado: 18 Dic 2016, 12:20
Karma: 0

Re: Crear una orden de Breakeven

Notapor Refresko » 06 May 2017, 16:50

DistriFX, esta seguro que te funciona??
disculpa que lo dude (y perdona si me equivoco), pero es que es dificil que funcione, te explico mis razones:

en la linea 4, 6,7 y 8 de cada función, usas "orderStopLoss()" y "OrderOpenPrice()", pero antes, NO has seleccionado la orden de la que tomas esos valores.
debes decir, busco el OrderStopLoss() de la orden XXXXXX,,,,pero alli no lo haces,.

pueda que te funcione, si solo tienes UNA única operación en toda la plataforma (puede ser que por eso no te falla, pero si tienes mas de una, no esta correcta).
ojo, te puedes llevar una mala sorpresa si lo tienes en real.

@cdtrader sera que me equivoque, (vos también lo podes notar)?
No puedes cometer/ dos veces el mismo error/ la segunda vez sera/ Por eleccion...
Avatar de Usuario
Refresko
 
Mensajes: 165
Registrado: 12 Dic 2011, 22:56
Karma: 5

Anterior

Volver a Expert Advisors

¿Quién está conectado?

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

cron