Problema de los pedidos múltiples - página 3

 
luisneves:


Hola Kronin,

Sí, tengo mucho que aprender....Ahora entender que cuando hay una necesidad de un valor para obtener acceso desde fuera de una función que debe estar en Global.

Eso no es cierto y además suele ser una mala idea.

Parte de la razón para hacer parte de su código en una función es ser capaz de reutilizar ese código. Si la función está codificada para trabajar con variables globales específicas puede llegar a ser menos flexible. Usted debe considerar el paso de variables a la función definida por el usuario... no siempre use variables declaradas globalmente. Por ejemplo:

//+--------------------------------------------------------------------------------+
//| ToStr function - calls DoubleToString (double, Digits) and returns the string  |
//+--------------------------------------------------------------------------------+
string ToStr(double ValueToString)
   {
   return (DoubleToStr(ValueToString, Digits));
   }

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

. . esto no utiliza una variable declarada globalmente, utiliza la variable que se le pasa cuando se llama. . .

Print("Bid price is: ", ToStr(Bid) );
 
luisneves:


Hola Kronin,

Sí, tengo mucho que aprender....Ahora entender que cuando hay una necesidad de un valor para obtener acceso desde fuera de una función que debe estar en Global.

Los valores que están en externo se multiplican por 10 porque el EA también debe correr en corredores de 5 dígitos. Estoy usando este bloque de código para conseguirlo automáticamente, pero recibo un consejo de WHRoeder que no es compatible con los metales.

El spread del par puede ser variable. Es por eso que estoy usando el código para salir del nivel de parada.

Con respecto a este tema "Pero he ajustado sus parámetros de entrada para que no todas las órdenes se abran casi al mismo tiempo. Tal vez tengas que verificar los params por defecto".

Por lo que veo (perdón si no es así...), OpenDistance se mantiene como 2 pips y ReturnDistance está ahora con 2 también. Lo que veo ahora mismo es que la orden se abre pero no con 2 pips de diferencia. Esto se está ejecutando con un tester desde una plataforma de un broker ECN (IC Markets). ¿Podría tener esto alguna importancia?

De hecho las ordenes no se abren al mismo tiempo pero parece que la distancia de apertura y la distancia de retorno no se tienen en cuenta para obtener la distancia correcta para abrir las ordenes.

Usted tiene en el código que;

He incluido la línea en negrita para llamar a la función OpenOppositeOrder y aquí no estoy seguro de si esto es correcto. Por otro lado no veo donde está la comparación del tick actual con el último tick que ocurrió 2 pips antes (OpenDistance).

Lo siento si empiezo a aburrirte con mis problemas.

Saludos cordiales

Luis



Hola Kronin,

Acabo de tomar más atención por lo que han preguntado lo que la propagación es y sólo buscar el Tester que algo está mal. Aquí el spread es de 50 (5 dígitos) así que 5 en realidad. Hummm... Voy a reiniciar la plataforma y confirmar.

Luis

 
RaptorUK:

Eso no es cierto y además suele ser una mala idea.

Parte de la razón para convertir parte de su código en una función es poder reutilizar ese código. Si la función está codificada para trabajar con variables globales específicas puede volverse menos flexible. Debería considerar pasar variables a la función definida por el usuario... no utilice siempre variables declaradas globalmente. Por ejemplo:

... esto no usa una variable declarada globalmente, usa la variable que se le pasa cuando se llama...


Hola RaptorUK.

Gracias por su intervención para mantenerme en la dirección correcta...

Por cierto, ¿has oído algo como lo que he mencionado con respecto al problema con el Tester, es decir, que en este momento el spread es de 50 cuando el viernes no lo era?

Saludos cordiales

Luis

 
luisneves:


Hola RaptorUK.

Gracias por su intervención para mantenerme en la dirección correcta...

Saludos cordiales

Luis

Si, la idea con la función no era realmente declararlas todas como void.... Acabo de eliminar la declaración en su void MM() para LotSize para dejar que el comercio EA de nuevo ... - Pensé que hablamos más tarde sobre eso de nuevo ... :-)

Sobre el punto de 'no abrir en el nivel de 2 pips'
Por ejemplo no tengo datos de tick para probar, también el spread es más de 2 pips (podría ajustarlo, pero ¿de qué sirve, si no tengo datos de tick?). Todo esto hace que sea difícil de probar algo con ese cerrado stopps fiable.


16:21:09 _help_53198_markettorderdecnqv80 entradas: EquityPercent=1; FixedLotSize=0.01; Multiplier=2; LotDigits=2; StopLoss=50; TakeProfit=20; TrailingStop=2; MinimumProfit=3; Slippage=3; OpenDistance=2; ReturnDist=1; MinStop=1; MagicNumber=8012013; MaxOrders=7;
EURUSD,M1: open #1 comprar 0.01 EURUSD a 1.43310 ok
EURUSD,M1: Orden de compra inicial colocada # 1
EURUSD,M1: modificar #1 comprar 0.01 EURUSD a 1.43310 sl: 1.42810 tp: 1.43510 ok
EURUSD,M1: abrir #2 vender 0.01 EURUSD a 1.43257 ok
EURUSD,M1: Orden de venta opuesta colocada # 2
EURUSD,M1: modificar #2 vender 0.01 EURUSD a 1.43257 sl: 1.43757 tp: 1.43057 ok
EURUSD,M1: abrir #3 comprar 0.01 EURUSD a 1.43283 ok
EURUSD,M1: Orden de compra opuesta colocada # 3
EURUSD,M1: modificar #3 comprar 0.01 EURUSD a 1.43283 sl: 1.42783 tp: 1.43483 ok
EURUSD,M1: abrir #4 vender 0.01 EURUSD a 1.43230 ok
EURUSD,M1: Orden de venta opuesta colocada # 4
EURUSD,M1: modificar #4 vender 0.01 EURUSD a 1.43230 sl: 1.43730 tp: 1.43030 ok
EURUSD,M1: abrir #5 comprar 0.01 EURUSD a 1.43280 ok
EURUSD,M1: Orden de compra opuesta # 5
EURUSD,M1: modificar #5 comprar 0.01 EURUSD a 1.43280 sl: 1.42780 tp: 1.43480 ok
EURUSD,M1: abrir #6 vender 0.01 EURUSD a 1.43200 ok
EURUSD,M1: Orden de venta opuesta # 6
EURUSD,M1: modificar #6 vender 0.01 EURUSD a 1.43200 sl: 1.43700 tp: 1.43000 ok
EURUSD,M1: abrir #7 comprar 0.01 EURUSD a 1.43250 ok
EURUSD,M1: Orden de compra opuesta # 7
EURUSD,M1: modificar #7 comprar 0.01 EURUSD a 1.43250 sl: 1.42750 tp: 1.43450 ok
EURUSD,M1: modificar #7 comprar 0.01 EURUSD a 1.43250 sl: 1.43267 tp: 1.43450 ok
EURUSD,M1: modificar #7 comprar 0.01 EURUSD a 1.43250 sl: 1.43283 tp: 1.43450 ok
EURUSD,M1: modificar #3 comprar 0.01 EURUSD a 1.43283 sl: 1.43300 tp: 1.43483 ok
EURUSD,M1: modificar #5 comprar 0.01 EURUSD a 1.43280 sl: 1.43300 tp: 1.43480 ok
EURUSD,M1: modificar #7 comprar 0.01 EURUSD a 1.43250 sl: 1.43300 tp: 1.43450 ok
Probador: stop loss #3 en 1.43300 (1.43300 / 1.43340)
Probador: stop loss #5 en 1.43300 (1.43300 / 1.43340)
Probador: stop loss #7 en 1,43300 (1,43300 / 1,43340)
EURUSD,M1: LastClosedTicket=7
EURUSD,M1: ¡Orden con ticketnr: 7 hit SL! Cerrar todas las órdenes abiertas
EURUSD,M1: close #6 sell 0.01 EURUSD at 1.43200 sl: 1.43700 tp: 1.43000 at price 1.43340
EURUSD,M1: cierre #4 vender 0.01 EURUSD a 1.43230 sl: 1.43730 tp: 1.43030 al precio 1.43340
EURUSD,M1: cierre #2 vender 0.01 EURUSD a 1.43257 sl: 1.43757 tp: 1.43057 al precio 1.43340
EURUSD,M1: cierre #1 comprar 0.01 EURUSD a 1.43310 sl: 1.42810 tp: 1.43510 al precio 1.43300

Desde mi punto de vista, hace lo que quieres. Nunca he cambiado su cálculo para OpenOpposite o abrir la orden inital .

 
kronin:

Sí, la idea con la función no era realmente declararlas todas como void.... Acabo de eliminar la declaración en su void MM() para LotSize para dejar que el comercio EA de nuevo ... - Pensé que hablamos más tarde sobre eso de nuevo ... :-)

Sobre el punto de "no abrir en el nivel de 2 pips
Por ejemplo no tengo datos de ticks para probar, además el spread es de más de 2 pips (podría ajustarlo, pero de qué sirve, si no tengo datos de ticks). Todo esto hace que sea difícil de probar algo con ese cerrado stopps fiable.


16:21:09 _help_53198_markettorderdecnqv80 entradas: EquityPercent=1; FixedLotSize=0.01; Multiplier=2; LotDigits=2; StopLoss=50; TakeProfit=20; TrailingStop=2; MinimumProfit=3; Slippage=3; OpenDistance=2; ReturnDist=1; MinStop=1; MagicNumber=8012013; MaxOrders=7;
EURUSD,M1: open #1 comprar 0.01 EURUSD a 1.43310 ok
EURUSD,M1: Orden de compra inicial colocada # 1
EURUSD,M1: modificar #1 comprar 0.01 EURUSD a 1.43310 sl: 1.42810 tp: 1.43510 ok
EURUSD,M1: abrir #2 vender 0.01 EURUSD a 1.43257 ok
EURUSD,M1: Orden de venta opuesta colocada # 2
EURUSD,M1: modificar #2 vender 0.01 EURUSD a 1.43257 sl: 1.43757 tp: 1.43057 ok
EURUSD,M1: abrir #3 comprar 0.01 EURUSD a 1.43283 ok
EURUSD,M1: Orden de compra opuesta colocada # 3
EURUSD,M1: modificar #3 comprar 0.01 EURUSD a 1.43283 sl: 1.42783 tp: 1.43483 ok
EURUSD,M1: abrir #4 vender 0.01 EURUSD a 1.43230 ok
EURUSD,M1: Orden de venta opuesta colocada # 4
EURUSD,M1: modificar #4 vender 0.01 EURUSD a 1.43230 sl: 1.43730 tp: 1.43030 ok
EURUSD,M1: abrir #5 comprar 0.01 EURUSD a 1.43280 ok
EURUSD,M1: Orden de compra opuesta # 5
EURUSD,M1: modificar #5 comprar 0.01 EURUSD a 1.43280 sl: 1.42780 tp: 1.43480 ok
EURUSD,M1: abrir #6 vender 0.01 EURUSD a 1.43200 ok
EURUSD,M1: Orden de venta opuesta # 6
EURUSD,M1: modificar #6 vender 0.01 EURUSD a 1.43200 sl: 1.43700 tp: 1.43000 ok
EURUSD,M1: abrir #7 comprar 0.01 EURUSD a 1.43250 ok
EURUSD,M1: Orden de compra opuesta # 7
EURUSD,M1: modificar #7 comprar 0.01 EURUSD a 1.43250 sl: 1.42750 tp: 1.43450 ok
EURUSD,M1: modificar #7 comprar 0.01 EURUSD a 1.43250 sl: 1.43267 tp: 1.43450 ok
EURUSD,M1: modificar #7 comprar 0.01 EURUSD a 1.43250 sl: 1.43283 tp: 1.43450 ok
EURUSD,M1: modificar #3 comprar 0.01 EURUSD a 1.43283 sl: 1.43300 tp: 1.43483 ok
EURUSD,M1: modificar #5 comprar 0.01 EURUSD a 1.43280 sl: 1.43300 tp: 1.43480 ok
EURUSD,M1: modificar #7 comprar 0.01 EURUSD a 1.43250 sl: 1.43300 tp: 1.43450 ok
Probador: stop loss #3 en 1.43300 (1.43300 / 1.43340)
Probador: stop loss #5 en 1.43300 (1.43300 / 1.43340)
Probador: stop loss #7 en 1.43300 (1.43300 / 1.43340)
EURUSD,M1: LastClosedTicket=7
EURUSD,M1: ¡Orden con ticketnr: 7 hit SL! Cerrar todas las órdenes abiertas
EURUSD,M1: close #6 sell 0.01 EURUSD at 1.43200 sl: 1.43700 tp: 1.43000 at price 1.43340
EURUSD,M1: cierre #4 vender 0.01 EURUSD a 1.43230 sl: 1.43730 tp: 1.43030 al precio 1.43340
EURUSD,M1: cierre #2 vender 0.01 EURUSD a 1.43257 sl: 1.43757 tp: 1.43057 al precio 1.43340
EURUSD,M1: cierre #1 comprar 0.01 EURUSD a 1.43310 sl: 1.42810 tp: 1.43510 al precio 1.43300

Desde mi punto de vista, hace lo que quieres. Nunca he cambiado su cálculo para OpenOpposite o abrir la orden inital .


Hola Kronin,

Estoy descargando otra plataforma de otro broker y esperaré a probarlo de nuevo y te comentaré los resultados.

Gracias de nuevo

Luis

 

Hola Kronin,

Acabo de confirmar que en Tester el spread ha saltado a 5 pips (50). Así que hoy en Tester tu código muestra que funciona bien, ahora lo he puesto en una cuenta ECN Demo y veremos.

Un saludo

Luis

 

Hola Kronin,

Una cuestión;

¿Cuando el EA comienza no debería esperar a que el precio se desvíe 2 pip antes de abrir la primera orden?

Cuando la segunda orden tiene la condición de abrirse se abre en el lugar correcto.

Saludos

Luis

 
luisneves:

Hola Kronin,

Una cuestión;

¿Cuando el EA comienza no debería esperar a que el precio se desvíe 2 pip antes de abrir la primera orden?

Cuando la segunda orden tiene la condición de abrirse se abre en el lugar correcto.

Saludos

Luis

Hola Luis

Bueno, probablemente debería según la estrategia, pero por supuesto no lo hace según el código...

if(OpenDistance*pt && BuyAllowed) //<-- this doesn't make any sense.

Lo anterior se lee como if(2*0.0001 && true) . Cualquier expresión numérica diferente de 0 se interpreta como verdadera. Así que la expresión es siempre verdadera si BuyAllowed es verdadera.

Lo siento, no he prestado atención a la primera apertura de una serie y como sólo son 2 pips, no he notado nada raro.

Prueba con esto:

//global scope
double BuyTrigger,SellTrigger;

//init function
BuyTrigger=Ask+OpenDistance*pt;
SellTrigger=Bid-OpenDistance*pt;

//start function
  OTCurrentTick=OrdersTotal();                   //reinit OrderTotal   <<-- this is already there, place the 4 lines below after this line
  if(OTCurrentTick==0&&OTLastTick>0){
     BuyTrigger=Ask+OpenDistance*pt;
     SellTrigger=Bid-OpenDistance*pt;
  }

if(Ask>BuyTrigger && BuyAllowed)                // <-- use this instead of if(OpenDistance*pt && BuyAllowed)

if(Bid<SellTrigger && SellAllowed)
 

Hola Kronin,

Siento aburrirte con mis limitaciones en la comprensión del código, sin embargo no es demasiado tarde para aprender y estoy intentando mi máximo para entrar en el código que tan amablemente has proporcionado.

Ahora mismo estoy probando la mejor configuración a utilizar y voy a introducir tu último código actualizado.

Gracias de antemano por seguir apoyándome en estos temas( aventuras...digo....)

Luis

 

Hola Kronin,

Su modificación está funcionando. Has limitado las órdenes máximas, pero ¿es posible cerrarlas todas?

He intentado hacerlo con el siguiente código, pero parece que no funciona.

if(LastClosedTicket>0|| OrdersTotal()>= MaxOrders)

Saludos cordiales

Luis