por 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
por 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
-
cdtrader
-
- Mensajes: 1428
- Registrado: 23 Ago 2014, 13:47
- Karma: 17
por 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...
-
Refresko
-
- Mensajes: 165
- Registrado: 12 Dic 2011, 22:56
- Karma: 5
por 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
por 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 ?
No puedes cometer/ dos veces el mismo error/ la segunda vez sera/ Por eleccion...
-
Refresko
-
- Mensajes: 165
- Registrado: 12 Dic 2011, 22:56
- Karma: 5
por 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
por 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...
-
Refresko
-
- Mensajes: 165
- Registrado: 12 Dic 2011, 22:56
- Karma: 5
|
|