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

 
Artyom Trishkin #:

Dobro. Permítanme ponerlo en términos rusos simples.

Vas a pescar.

  1. Abres la despensa en casa, te rascas la cabeza y la cierras.
  2. Vas a pescar y necesitas una caña de pescar.
  3. Vas a casa, al almacén, a por una caña de pescar.
  4. Fuiste a pescar, lanzaste tu caña y atrapaste un pez, y luego necesitaste una red
  5. Fui a casa al almacén para la red
  6. Fuiste a pescar, recogiste el pescado que habías capturado y que flotaba en el anzuelo con la red, y necesitabas un recipiente para guardar el pescado que habías capturado
  7. Ir a casa para ..... ¿Continúo?

O puedes coger todo lo que necesites de la despensa (OnInit) directamente, pescar sin dar vueltas y, cuando llegues a casa, poner todo en la despensa y la nevera (OnDeinit).

Esposible que lo sepa aquí en el foro. Sólo hay que escuchar y oír lo que se dice a veces.

De lo contrario, te hacen una pregunta, te responden, dices "tonterías" y haces lo que piensas.

Primero hay que reflexionar sobre la cuestión, hacer preguntas y luego empezar a editar.

¿Sabe que lo más sencillo en programación es imprimir el código? Y la mayor parte del desarrollo es pensar en la lógica.

Es una analogía ridícula. En ese caso, hagamos que todas las variables, objetos de clase, etc. sean globales y no se creen a petición, o tal vez un objeto gráfico sea otra cosa (ciertamente no una caña de pescar o una red :)) ? Así que mi planteamiento es bastante racional y justificado, lo que pasa es que mql o metatrader mete la pata.

 
MakarFX #:
De esta manera la señal se perderá

O estoy siendo obtuso, o no hay condición si hay órdenes abiertas Y hay señal y la barra ya es nueva.

Si las señales son largas, más de un múltiplo de barra, también funcionará en el primer tick de la barra.

La única cuestión es cuándo abrir una orden, cuando aparece la señal o en el primer tick de la siguiente barra.
 
Valeriy Yastremskiy #:

O estoy siendo obtuso, o no hay condición si hay órdenes abiertas Y hay señal y la barra ya es nueva.

Si las señales son largas, más de un múltiplo de barra, también funcionará en el primer tick de la barra.

La única cuestión es cuándo debe abrirse la orden, en el momento de la señal o en el primer tick de la siguiente barra.
Le pido que abra una orden por bar
 
законопослушный гражданин Sleep(), pero Makar dijo que sería mejor no detener el proceso.


El código ahora se ve así:

Antes de abrir, compruebe si hay una posición abierta en esta vela. Si no, ábrelo.

 
законопослушный гражданин #:

En principio, una orden abierta se cerraría normalmente en los ticks de una barra ya abierta. MakarFX y Artem han señalado correctamente. Por lo tanto, lo correcto sería hacer esto:

void OnTick()
  {
  datetime cTime;
  static datetime time = 0;
  int nOrders;

  cTime = iTime(NULL, PERIOD_CURRENT, 0);

  nOrders = CountOrders();

  if (time != cTime && nOrders == 0)
    time = cTime;
  else
    return;

// Получим значение индикатора
   dMA = iMA(Symbol(), 0,PeriodMA, MovingShift, MODE_SMA, PRICE_CLOSE, 0); // MODE_SMA - простое усреднение , значение 0. PRICE_CLOSE- цена закрытия, значение 0.

// Если нет открытых ордеров, то входим в условие
      if(nOrders == 0) // теперь это условие можно убрать
     {
// Если появился сигнал на покупку, то откроем ордер на покупку
      if(bSignalBuy() == true)
         vOrderOpenBuy();

// Если появился сигнал на продажу, то откроем ордер на продажу
      if(bSignalSell() == true)
         vOrderOpenSell();
     }
   }
 
Mihail Matkovskij #:

En principio, una orden abierta se cerraría normalmente en los ticks de una barra ya abierta. MakarFX y Artem han señalado correctamente. Por lo tanto, lo correcto es esto:

Artem tiene razón, debería ser así

//+-----------------------------------------------------------------------------------------------+
void OnTick()
  {
// Получим значение индикатора
   dMA = iMA(Symbol(), 0,PeriodMA, MovingShift, MODE_SMA, PRICE_CLOSE, 0); // MODE_SMA - простое усреднение , значение 0. PRICE_CLOSE- цена закрытия, значение 0.

// Если нет открытых ордеров и появился сигнал на покупку, то откроем ордер на покупку
   if(CountOrders()==0&&bSignalBuy())
     {
      vOrderOpenBuy();
     }
// Если нет открытых ордеров и появился сигнал на продажу, то откроем ордер на продажу
   if(CountOrders()==0&&bSignalSell())
     {
      vOrderOpenSell();
     }
   }
 
MakarFX #:

Tienes razón, Artem, debería ser así.

El resultado será el mismo aquí. Sólo que el código es más complicado. Estás escribiendo el mismo código en dos funciones diferentes. Y será menos legible. Aunque, cada uno escribe como quiere o se siente cómodo...

 

Aquí pasan muchas cosas.

Una posición abierta tiene una hora de apertura. La hora de apertura se puede comparar con la hora de una vela - para saber si la hora de apertura de la posición está dentro de la vela (y ésta es la vela actual).

¿Y por qué siempre se averigua el número de pedidos en todos los ejemplos? Y si hay cero pedidos, entonces los abres. Esto limita mucho las posibilidades.

En general, sólo deberíamos centrarnos en el número de órdenes/posiciones para una dirección de estrategia muy estrecha.

 
Mihail Matkovskij #:

El resultado aquí será el mismo. Sólo el código es más confuso. Estás escribiendo el mismo código en dos funciones diferentes. Y será menos legible. Aunque, cada uno escribe como quiere o se siente cómodo...

Su código

  if (time != cTime && nOrders == 0)
    time = cTime;

(Se ha abierto un bar y no se ha hecho ningún pedido)

comprobado para una señal - no hay señal

... esperamos el siguiente bar.

Has repetido el mismo error que la última vez

P.D.

esto es

 time = cTime;
debe llevarse a cabo después de la apertura de la orden
 
MakarFX #:

Tienes razón, Artem, debería ser así

En su código, si una posición está abierta, otra no se abrirá por la señal contraria. Es decir, en primer lugar, cuando entra la señal, hay que comprobar si hay una posición contraria y cerrarla.

Pero, de nuevo, todo esto limita mucho las posibilidades de mejorar las estrategias.

Deberíamos evitar vincularnos a la presencia/ausencia de órdenes (especialmente en cuatro - órdenes pendientes (que es correcto) y posiciones (que es incorrecto)).

No, es correcto y necesario tener a mano el número de órdenes y posiciones por sus tipos. Pero es un error basarse en la ausencia de órdenes sólo para las señales.

En general, la forma correcta es tener funciones para contar órdenes y posiciones (una función que llene la estructura cuando el número de órdenes y posiciones cambie), funciones para abrir/cerrar posiciones, funciones para fijar órdenes y funciones de alarma. Funciones de varias redes de arrastre y obtención de datos de indicadores. Plus - capacidad de comparar los datos de una posición (abierta o cerrada) con algunos valores.

Cualquier estrategia puede construirse a partir de este conjunto.

Razón de la queja: