[¡AVISO CERRADO!] Cualquier pregunta de novato, para no saturar el foro. Profesionales, no pasen. No puedo ir a ningún sitio sin ti. - página 793

 
artmedia70:
¿No estamos abriendo la compra a precio de compra ???????


Eso es lo que escribí: "Lasórdenes de compra se abren al precio Ask".

Pero en el gráfico se ve el precio de oferta.

 
PapaYozh:


Eso es lo que escribí: "Las órdenes de compra se abren al precio Ask".

Pero en el gráfico se ve el precio de oferta.

Siempre tengo los dos precios en la tabla... En la configuración del terminal mediante F8 he habilitado la visualización de los precios Ask`... También he corregido un poco el post anterior sobre el diferencial, no puede ser así.
 
artmedia70:
¿No estamos abriendo una compra en Ask ??????? Y no puede haber un spread de 60 pips (si lo tomas después del gap), y si lo tomas antes ... entonces el spread en el EUR de 325 pips equivale a ... :)

su foto no muestra los puntos.
 
PapaYozh:

tu foto no muestra los puntos.
Sí, me arrepiento .... puede ser engañoso (como los paréntesis en tu post, donde me hicieron perder el sentido de tu respuesta sobre las preguntas y respondí de manera equivocada... :) )
 
artmedia70:
Siempre tengo los dos precios en la tabla... En la configuración de la terminal he habilitado la visualización de Ask`ts mediante F8... Y corregido un poco el post anterior sobre la propagación - no puede ser.


Pero el precio Ask no es visible en las barras.

Sobre la difusión. ¿Es un diferencial de cinco dígitos? Si es así, el spread ampliado en las noticias + el deslizamiento = son 6 pips completos (60 de cinco dígitos) para usted

 
PapaYozh:


Pero el precio Ask no es visible en las barras.

Sobre la difusión. ¿Es un margen de cinco cifras? Si es así, entonces el spread extendido en las noticias + el deslizamiento = son 6 pips completos (60 de cinco dígitos)

Esa es la cuestión: cuatro... :(
 
PapaYozh:

Si he entendido bien su problema, no debe guiarse por la hora de cierre de la orden. Hay que empezar por el principio de la barra en la que se dio la señal de apertura y se abrió la posición. Lo que yo haría, personalmente, es lo siguiente:

1) crear una variable de tipo datetime donde introduciría el valor Time[0] si el pedido se realiza con éxito;

2) en la función init(), inicializar esta variable con el valor "0". Prefiero una inicialización explícita, ya que es más clara al revisar el código;

3) cuando aparezcan las condiciones para abrir una posición, antes de enviar la petición OrderSend(...), compara el valor de esta variable con el valor Time[0] y si no son iguales, envía una petición.

4) si la posición se abriera, almacenaría el valor de Time[0] en la misma variable.


Gracias por la aclaración - pero ¿crees que en lugar de comparar con el valor de Time[0], tratar de dar esta tarea antes de la solicitud de OrderSend(...) : comprobar si hay un cierre StopLoss-y en la barra actual? Entonces tengo que introducir duble función StopLoss() que trabajará con la variable StopLoss anuncié? ¿O NO ES POSIBLE por una cuestión de principios? Para mí es importante que no se abra una nueva posición en la barra que ha tenido pérdidas, aunque coincida con los parámetros de la apertura.

extern double Stoploss           =1000;
//+------------------------------------------------------------------+
//| Check for open order conditions                                  |
//+------------------------------------------------------------------+
void CheckForOpen()
  {
   double ma;
   int    res;
    
//---- go trading only for first tiks of new bar
   if(Volume[0]>1) return;
//---- get Moving Average 
   ma=iMA(NULL,0,MovingPeriod,MovingShift,MODE_SMA,PRICE_CLOSE,0);
//---- sell conditions
   if(Open[1]>ma && Close[1]<ma)  
     {
      res=OrderSend(Symbol(),OP_SELL,Lots,Bid,30,Bid+Stoploss*Point,Bid-Takeprofit*Point,"",MAGICMA,0,Red);
      return;
     }
//---- buy conditions
   if(Open[1]<ma && Close[1]>ma)  
     {
      res=OrderSend(Symbol(),OP_BUY,Lots,Ask,30,Ask-Stoploss*Point,Ask+Takeprofit*Point,"",MAGICMA,0,Blue);
      return;
     }
//----
  }

La cuestión es que los factores de tiempo deben considerarse en último lugar - muy a menudo se deslizan - o más bien la interpretación de una orden resulta de alguna manera diferente (ambigua).

 
obla4ko, crea una variable datetime x, y deja que sea la hora de apertura de la barra donde se produjo el stop loss. Y en la condición abierta establece que (¡Tiempo[0]!=x). En este caso, x debería actualizarse en un nuevo bucle de parada activado. Esta es la primera variante. Y la segunda, como estoy escribiendo por tercera vez, después de un interruptor de parada activado en la espera de 1 barra, esto sería exactamente lo mismo, ¿no es lógico?
 
PapaYozh:


Pero no se puede ver el precio Ask en las barras.

Sobre la difusión. ¿Es un margen de cinco cifras? Si es así, entonces el spread se amplió en las noticias + el deslizamiento = son 6 pips completos (60 de cinco dígitos)

También, en mi opinión, puede haber una "horquilla", posteriormente limpiada :)), pero "guardada en la memoria" de plazos menores, a los que no se llegará...

Y la pregunta sobre las pruebas en la historia :

puede un Asesor Experto (¡uno sencillo!) - ...) sobre el mismo período de la historia, con los mismos parámetros dan resultados completamente diferentes?

Lo único que hice, entre estas dos pruebas, fue actualizar el archivo de citas... y que podría haber llevado a tal resultado? - ¿¡Y luego resulta que toda la historia es una mierda!?

 

¿Puede alguien decirme por qué MathRound() se comporta de forma extraña? Los valores grandes cuentan, los pequeños no...

Hay un código sencillo para aumentar los valores de algunas variables en un 10%:

if (IncreaseTP) 
   {
      LastTakeProfitS = MathRound(LastTakeProfitS+LastTakeProfitS/100*PercentTakePr);  // PercentTakePr = 10; (десять процентов) эту строку считает
      TStartS = MathRound(TStartS+TStartS/10*PercentTakePr);                          // а вот эту и все, которые ниже - нет
      TStop.Sell = MathRound(TStop.Sell+TStop.Sell/10*PercentTakePr);                 // ... причём, если деление на 100 заменить на деление на 10,
      TStartLastPosS = MathRound(TStartLastPosS+TStartLastPosS/10*PercentTakePr);     // ... то начинает считать и эти строки, но уже, естественно...
      if (TStop.SellLP<=Level_new+spread) TStop.SellLP=Level_new+spread;               // ... рассчёт становится неверным...
   }

Los valores calculados se registran. Si todas las líneas, excepto la primera, se dividen por 10, entonces ésta cuenta como número 100 y no hay problema con ella:

2010.08.11 19:16:20 2009.01.02 10:34 Sergitas_v1.01 EURUSD,M5: Función de cálculo: SLs = 11 y TPs = 66, TStartS = 60, TStop.Sell = 20, TStopLastPosS = 60, TStop.SellLP = 25

Lo que está marcado en verde es lo que cuenta en la primera línea de código.

Pero si se pone la división por 100 (como debe ser)

if (IncreaseTP) 
   {
      LastTakeProfitS = MathRound(LastTakeProfitS+LastTakeProfitS/100*PercentTakePr);  // PercentTakePr = 10; (десять процентов) эту строку считает
      TStartS = MathRound(TStartS+TStartS/100*PercentTakePr);                          // а вот эту и все, которые ниже - нет
      TStop.Sell = MathRound(TStop.Sell+TStop.Sell/10 0*PercentTakePr);                 // ... причём, если деление на 100 заменить на деление на 10,
      TStartLastPosS = MathRound(TStartLastPosS+TStartLastPosS/100*PercentTakePr);     // ... то начинает считать и эти строки, но уже, естественно...
      if (TStop.SellLP<=Level_new+spread) TStop.SellLP=Level_new+spread;               // ... рассчёт становится неверным...
   }

... entonces todas las líneas, excepto la superior, no cuentan: los valores iniciales permanecen, como si no se hubieran añadido

el diez por ciento:

2010.08.11 19:41:03 2009.01.02 10:34 Sergitas_v1.01 EURUSD,M5: Función de cálculo: SLs = 11 y TPs = 66, TStartS = 30, TStopLastPosS = 10, TStopLastPosS = 30, TStop.SellLP = 15

Ayúdenme a entender qué y dónde coño está... :)


Razón de la queja: