Cualquier pregunta de los recién llegados sobre MQL4 y MQL5, ayuda y discusión sobre algoritmos y códigos - página 1386

 
Mikhail Mishanin:

Es gracioso) no debería serlo)

Si la batalla ha terminado - negocie con un spread normal, simplemente saque su "límite" en la entrada y simplemente ignore la operación si el spread está por encima del límite.

Los diferenciales pueden ser estirados por medio de dillings sin que se produzca un vuelco.

Tengo bastantes oscilaciones de spread, desde 10 unidades hasta 45

Tengo que esperar a la pantalla 45.

Al mismo tiempo, la función cuenta con una media de 17, lo cual es bastante satisfactorio.

Sube a 100-140 durante 1 hora después del rollover, voy a ejecutar el código y ver cómo se comporta.

 
Vitaly Muzichenko:

Sin embargo, podría prescribirlo de esta manera:

Debería funcionar correctamente.

No me gusta esta lógica.

La primera entrada de la función:

res = 0;

Por lo tanto, la condición

if(dt.hour==22 && res<_sp)

no está satisfecho.

Y no quiero entrar en más detalles. ¿Para qué sirve esta condición de repente?

   if(tc>LONG_MAX-1)
No entiendo la lógica de todo esto.
 
Alexey Viktorov:

No me gusta esta lógica.

La primera entrada de la función:

res = 0;

En consecuencia, la condición

if(dt.hour==22 && res<_sp)

no se cumple.

Y no quiero entrar más en ello. ¿Para qué sirve esta condición de repente?

   if(tc>LONG_MAX-1)
No entiendo la lógica de todo esto.

1. Esta condición es sólo para 1 hora después del vuelco, cuando el tiempo es de 22 horas. Pero esto es sólo en el primer inicio, mientras que el terminal siempre funciona con el Asesor Experto, lo que significa que se vacía sólo una vez.

Tal vez debería declararse también como estática en caso de cambio de marco temporal

2. if(tc>LONG_MAX-1) = ponemos a cero la variable tc si hemos superado los límites permitidos de long. Es poco probable que esto ocurra, ya que la terminal a veces se sobrecarga, por ejemplo, el fin de semana.

---

Código modificado, esto debe ser definitivo:

void OnTick()
{
 int sp = SymbolInfoInteger(Symbol(),SYMBOL_SPREAD);
   if(CheckSpr(sp)) {
      // Здесь код отправки
   }
}

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
MqlDateTime dt;
bool CheckSpr(int _sp)
{
   static int ts=0;
   static ulong tc=0;
   static int res=0;
   TimeGMT(dt);
   if(res<_sp && (dt.hour==22||dt.hour==23)) { // Если 2 часа после Rollover спред упадёт до нормального - торгуем
      Comment("Rollover: Спред: ",_sp,", Средний: ",res,", Тиков: ",tc);
      return(false);
   }
   tc++;
   ts += _sp;
   res =ts/tc;
   if(tc<500) {
      Comment("Тиков менее 500: ",tc,", Спред: ",_sp,", Средний: ",res);
      return(false);
   }
   if(res>_sp) {
      Comment("Торгуем: Спред: ",_sp,", Средний: ",res,", Тиков: ",tc);
      return(true);
   }
   Comment("Не торгуем - спред завышен: Спред: ",_sp,", Средний: ",res,", Тиков: ",tc);
   return(false);
}

P.D. Ponlo a prueba

P.D. Revisado el código

----

P.S. Añadí 1 hora más de tiempo después del rollover, sino tengo un spread muy alto en algunos dealers.

La variante final ha trabajado 20 horas y el resultado es sorprendente

El diferencial medio diario es de 10 a 45 pps, pero la mayor parte del tiempo es de 10 a 17 pps, el diferencial medio se ha calculado en 19

Gracias a todos por vuestra participación, si tenéis algo que añadir, ¡escribid!

 
Vitaly Muzichenko:

Tal vez también debería declararse estática, en caso de cambio de marco temporal

Lo he entendido, parece que funciona, retiro lo de "no debería"), ahora sólo me falta averiguar los momentos de puesta a cero/asignación.

 

He visto una discusión en el foro, pero no la encuentro.

Necesidad de limitarse a una posición en una barra que puede abrirse en cualquier momento, esta es la opción ahora, pero es "pesada" en mi opinión

if(Bars(Symbol(), PERIOD_CURRENT, Buy.LastOpenTime, TimeCurrent())==0) return; // Открывать не более 1 на баре

¿Cómo se puede sustituir esto para que sea más ligero?

 
Vitaly Muzichenko:

He visto una discusión en el foro, pero no la encuentro.

Necesidad de limitarse a una posición en una barra que puede abrirse en cualquier momento, esta es una opción ahora, pero es "pesada" en mi opinión

¿Cómo se puede sustituir esto para que sea más fácil?

"Tienes que limitarte a una posición en la barra, que puede estar abierta en cualquier momento..."

redacción demasiado general, ¿quieres decir que una vez en la barra en este símbolo se puede enviar OrderSend?

 
Mikhail Mishanin:

"Tienes que limitarte a una posición en la barra, que puede abrirse en cualquier momento..."

la redacción es demasiado general, ¿quieres decir que una vez por barra en este símbolo se puede enviar OrderSend?

Sí. El Asesor Experto está trabajando en el marco de tiempo H1 y puede abrir una posición a las 10:17, no necesita abrir otra antes de las 11:00, es decir, en la barra actual.

 
Vitaly Muzichenko:

Sí. El EA está trabajando en el marco de tiempo H1 y puede abrir una posición a las 10:17, es necesario asegurarse de que antes de las 11:00, es decir, en la barra actual - no se abre más.

Sí, de nuevo, creo que el diablo está en los detalles.

abrir una posición - establecer una "bandera de prohibición" y/o guardar el "tiempo" (no importa cuál, siempre que sea el mismo (fuente) para la comparación)

se abre un nuevo bar - se pone la "bandera de prohibición"...

Pregunta: ¿Y si la posición ha cambiado de alguna manera?

Ejemplo de cómo defino una nueva barra - doTB divisor en segundos, para H1 es 3600.0

BARii[].time - tiempo de los compases con M1, pero puede ser arbitrario y con cualquier división, si es más o igual a 1 significa el "tiempo" de diferentes "compases

if(MathFloor(BARii[0].time/doTB)-MathFloor(BARii[1].time/doTB)>=1.0)//если бар закрылся
Совершение сделок - Торговые операции - Справка по MetaTrader 5
Совершение сделок - Торговые операции - Справка по MetaTrader 5
  • www.metatrader5.com
Торговая деятельность в платформе связана с формированием и отсылкой рыночных и отложенных ордеров для исполнения брокером, а также с управлением...
 
Mikhail Mishanin:

Sip, de nuevo condiciones incompletas en mi opinión, "el diablo está en los detalles", en términos simples si el texto

abrir una posición - establecer una "bandera de prohibición" y/o guardar el "tiempo" (no importa cuál, siempre que sea el mismo (fuente) para comparar)

se abre un nuevo bar - se pone la "bandera de prohibición"...

Pregunta: ¿Y si la posición ha cambiado de alguna manera?

Ejemplo de cómo defino una nueva barra - doTB divisor en segundos, para H1 es 3600.0

BARii[].time - tiempo de los compases con M1, pero puede ser arbitrario y con cualquier división, si es más o igual a 1, significa el "tiempo" de diferentes "compases

En ese momento no me satisfizo la opción de usar banderas; no recuerdo por qué, pero la sustituí por

if(Bars(Symbol(), PERIOD_CURRENT, Buy.LastOpenTime, TimeCurrent())==0) return; // Открывать не более 1 на баре

Bien, pensaré en otra implementación

 
Vitaly Muzichenko:

La opción de las banderas no me gustó en su momento, no recuerdo por qué, pero la sustituí por

Bien, pensaré en otra implementación.

¿Y qué retiene esta aplicación? Similar a mi código determina dos veces en una "barra" o en diferentes. Sólo en mi variante "verdadero" cuando en diferentes "barras", en su variante "verdadero" cuando en una barra, sólo pasar por alto la comparación == con "0" especialmente entero, wo, y probablemente puedo cambiar la condición a >0,0 o >0,9, necesidad de pensar...

Razón de la queja: