La gran y terrible MT4 para siempre (o cómo hacer una estrategia de transición) - página 25

 
Igor Makanu:

en el PM ha abandonado el servidor

Este servidor (o más bien el software del corredor) tiene protección contra el spam. Tienen previsto actualizarlo para la semana que viene y entonces la ralentización desaparecerá.

 
fxsaber:

Tendré que echar un vistazo a este servidor. Sería bueno comprobar la muleta sugerida aquí, para quien parece importante.

No me gustaría volver a este tema después de un tiempo. Sería mejor señalar los errores, si los hay.

¿Aún no hay opción en el estilo MT4?

¿Simplemente ejecutar el script abriendo 100 posiciones en diferentes servidores?

 
Andrey Khatimlianskii:

¿Aún no hay opción en el estilo MT4?

Todavía no ha empezado. Lo más probable es que el usuario no cambie nada en el código. La funcionalidad adicional se activará a través de una macro.

¿Simplemente ejecutar el script abriendo 100 posiciones en diferentes servidores?

Sí, en diferentes servidores, pero sólo un script diferente. Si no se produce ninguna duplicación durante un minuto de funcionamiento, ha superado la comprobación con éxito. De lo contrario, el fracaso.

Библиотеки: TradesID
Библиотеки: TradesID
  • 2021.03.29
  • www.mql5.com
Статьи и техническая библиотека по автоматическому трейдингу: Библиотеки: TradesID
 
fxsaber:

Todavía no ha empezado. Lo más probable es que el usuario no cambie nada en el código. La funcionalidad extra se activará a través de una macro.

Lo tengo.

Библиотеки: MT4Orders
Библиотеки: MT4Orders
  • 2021.02.09
  • www.mql5.com
MT4Orders: Автор: fxsaber...
 

Lo fue.

Foro sobre trading, sistemas de trading automatizados y pruebas de estrategias de trading

La gran y terrible MT4 para siempre (o cómo construir una estrategia de migración inteligente)

fxsaber, 2021.05.11 09:05

Sin esperar a una posición: resultados inmediatos.

#include <fxsaber\TradesID\ByPass.mqh>
#include <MT4Orders.mqh>

#define  Ask SymbolInfoDouble(_Symbol, SYMBOL_ASK)

void OnStart()
{
  BYPASS ByPass;
  
  MT4ORDERS::OrderSend_MaxPause = 0; // Запрет на ожидание позиции после OrderSend
  
  while (OrdersTotal() < 30)
    if (ByPass.Is())
      ByPass += OrderSend(_Symbol, OP_BUY, 0.1, Ask, 0, 0, 0);      
    
  Print(OrdersTotal());
}

Lo hizo.

#define  MT4ORDERS_BYPASS_MAXTIME 1000000 // Максимальное время (в мкс.) на ожидание синхронизации торгового окружения
#include <MT4Orders.mqh> // https://www.mql5.com/ru/code/16006

#define  Ask SymbolInfoDouble(_Symbol, SYMBOL_ASK)

void OnStart()
{
  MT4ORDERS::OrderSend_MaxPause = 0; // Запрет на ожидание позиции после OrderSend
  
  while (OrdersTotal() < 30)
    OrderSend(_Symbol, OP_BUY, 0.1, Ask, 0, 0, 0);      
    
  Print(OrdersTotal());
}


Ahora no es diferente a la variante MT4, incluyendo la fiabilidad.

Los ejemplos que son tan difíciles de escribir en MT5 se han vuelto fácilmente implementables, como debería ser.

 

Foro sobre trading, sistemas de trading automatizados y pruebas de estrategias de trading

La gran y terrible MT4 para siempre (o cómo construir su estrategia de migración)

Igor Makanu, 2021.05.10 10:28

parece que funciona:

#include <Trade\Trade.mqh>
void OnStart()
{
   CTrade Trade;
   while(PositionsTotal() < 10)
   {
      if(OrdersTotal() > 0) continue;
      if(!Trade.Buy(0.01)) continue;
      if(OrdersTotal() == 0 && PositionsTotal() >= 10) return;
   }
}

pero muy lento, y la solución es más o menos.

¿Qué ocurrirá si después de la orden de apertura de la décima posición, en la siguiente iteración del

while(PositionsTotal() < 10)

PositionTotal no ha tenido tiempo de actualizarse (=9), y la orden ya ha conseguido pasar al historial y OrdersTotal()==0.

En ese caso, ¿habrá otro Trade.Buy()?

En teoría, puede ocurrir varias veces seguidas...

¿O me he perdido algo?

 
mktr8591:

¿Qué ocurre, si después de la orden de apertura de la 10ª posición, en la siguiente iteración de la

PositionTotal no ha tenido tiempo de actualizarse (=9), y la orden ya ha conseguido pasar al historial y OrdersTotal()==0.

En ese caso, ¿habrá otro Trade.Buy()?

En teoría, puede ocurrir varias veces seguidas...

¿O me estoy perdiendo algo?

es su interés de alta frecuencia, el resto tiene suficiente tiempo de espera y no hay problema con una segunda vuelta

Estoy seguro de que es como se construye en MT4, esperar y ver
 
mktr8591:

¿Qué ocurre, si después de la orden de apertura de la 10ª posición, en la siguiente iteración de la

PositionTotal no ha tenido tiempo de actualizarse (=9), y la orden ya ha conseguido pasar al historial y OrdersTotal()==0.

En ese caso, ¿habrá otro Trade.Buy()?

Por supuesto, lo será. El razonamiento en el código es exactamente el mismo.

En teoría, puede repetir varias iteraciones sucesivas...

Si Buy es cierto, entonces hay casi cero probabilidad de que la siguiente iteración tenga OrdersTotal() == 0. Es decir, abrir 12 posiciones es imposible en la práctica.


Este es un caso muy primitivo. Una doble iteración suele tener este aspecto:

  1. Total de Órdenes de Límite = 1, Total de Posiciones = 0.
  2. Los limitadores se ejecutan. PedidosTotal = 0, PosicionesTotal = 0.
  3. Los puestos están abiertos. PedidosTotal = 0, PosicionesTotal = 1.

En el segundo paso, el Asesor Experto ve que no hay nada y establece un Límite. En consecuencia, tenemos dos puestos vacantes.

El segundo punto es el rebasamiento de la MT5. Y ahora la muleta lo evita.

 

Gracias.

Sobre eso:

fxsaber:

La duplicación no es una dificultad de MT5, sino un error de arquitectura, cuando las funciones de Total() muestran falsos positivos.

Puedes decir que es un error, o puedes presentarlo de otra manera :-)

PositionsTotal() no es el número de posiciones abiertas, sino el tamaño de la tabla de posiciones abiertas. La tabla de posiciones - es de hecho un caché, como el caché de la historia de los acuerdos, sólo que se actualiza no a petición, sino automáticamente, pero no al instante, y con un ligero retraso. Por ello, es posible que no contenga posiciones ya abiertas, o que contenga posiciones ya cerradas.

Lo mismo con OrdersTotal().

Si explicamos la ayuda de esta manera, habrá menos preguntas, quejas y malentendidos.

Y en el artículo "Órdenes, posiciones y operaciones en MetaTrader 5", puede prestar atención a esto (ahora es ambiguo - "El resultado de la función PositionsTotal() no depende de si la caché de posiciones está llena - siempre devuelve el número real de posiciones abiertas en el terminal base para todos los símbolos").


P.S. Pero entonces surge una pregunta legítima: ¿por qué no hacer una función/bandera del sistema para determinar el estado de sincronización de las tablas de órdenes vivas, posiciones, operaciones y órdenes ejecutadas, para no crear muletas?
 
mktr8591:

P.S. Pero entonces surge una pregunta legítima: ¿por qué no hacer un sistema fi/flag para determinar el estado de sincronización de las tablas de órdenes vivas, posiciones, operaciones y órdenes ejecutadas, para no crear muletas?

Lo más probable es que no exista tal bandera en el interior.

Razón de la queja: