Preguntas de los principiantes MQL5 MT5 MetaTrader 5 - página 1220

 
HistorySelect(xxx,TimeCurrent()+1)

Un segundo es a menudo la pérdida de la última operación/orden en el real. Por ejemplo, en muchas brechas una orden pasa a ejecución por el tiempo TTL, que puede ser de cinco segundos. Si no se ejecuta en cinco segundos, la orden es una redirección. O se ejecuta, pero en tres segundos.

En el caso, si no hubo ticks desde la aceptación hasta la ejecución, tal llamada HistorySelect no recibirá información sobre ella.


Quizás, el TimeCurrent debería ser igual a MathMax(LastOrder_time, MarketWatch_Time). Entonces el HistorySelect será correcto. Pero TimeCurrent puede ser demasiado caro.


Por cierto, este esquema de trabajo HistorySelect se saltará parte de la historia de las operaciones.

void OnStart()
{
  static MqlTick PrevTick = {0};
  
  MqlTick Tick;
  
  if (SymbolInfoTick(_Symbol, Tick))
  {
    if (HistorySelect(PrevTick.time, INT_MAX))
      // Учитываем новые ордера/сделки в Истории торгов

    PrevTick = Tick;  
  }
}

Aunque, a primera vista, todo está claro.


Escribir un DealsTotal() barato no es fácil en MT5. No es elemental (y gratuito) OrdersHistoryTotal() en MT4.

 

pensamientos en voz alta, sin pretensiones de relevancia o competencia:


fxsaber:

Si no hubo ticks desde la aceptación hasta la ejecución, dicha llamada a HistorySelect no obtendrá información al respecto.

No va a resolver este problema, el modelo de interacción servidor - terminal - MQL fue diseñado originalmente

No he llegado a comprobarlo en MT5, pero en MT4 sé a ciencia cierta que hay situaciones, en las que hay cambios de precio en nuestro símbolo en la ventana de observación del mercado, pero puede que no haya ticks o que haya menos de los que hay en ЕА


ok, no importa, por lo que funciona, sólo tiene que elegir en la decisión TS, lo que sucede a la orden en la ausencia de información desde el servidor desde el momento de enviar la orden - es decir, la orden se establece o se rechaza a priori, y recibió la respuesta para confirmar esta decisión preliminar o cancelar - es decir, trabajar con la información no confirmada o seguir esperando la respuesta del servidor - esta oferta MQ y probablemente no se adapte


fxsaber:

No es fácil utilizar DealsTotal() barato en MT5. No es el elemental (y gratuito) OrdersHistoryTotal() en MT4.

no escribir ;)

o mejor dicho, lo más probable es que lo hagas, y gastes recursos de EA para mantener el algoritmo, creo que debes averiguar cómo funciona SQLite, las pruebas de rendimiento MQ declaradas, el trabajo con tablas grandes y las muestras es sólo el propósito de la base de datos - el código de EA será minimalista, todo el trabajo que hará la base de datos, todo el trabajo se reduce a llenar los datos al realizar un pedido y actualizar cuando el servidor responde (sincronización, por supuesto, cuando se ejecuta EA, la base de datos en la memoria)

 
Igor Makanu:

pero no lo harás ;)

o más bien, lo más probable es que va a escribir y va a gastar los recursos de EA para mantener el algoritmo, creo que usted necesita para averiguar cómo funciona SQLite, pruebas de rendimiento MQ declaró, el trabajo con grandes tablas y muestras es exactamente el propósito de la base de datos - código de EA será minimalista, todo el trabajo de la base de datos le hará, todo el trabajo se reducirá a llenar los datos al realizar un pedido y actualizar al responder desde el servidor (sincronización, por supuesto en el arranque de EA, la base de datos en la memoria)

Fue escrito y publicado originalmente. Es poco probable que sea más rápido.

 
fxsaber:

Fue escrito y publicado originalmente. Es poco probable que sea más rápido.

Debo haber visto la tarea incorrectamente.

Pensé que necesitaba actualizar la lista de órdenes desde dos puntosOnTradeTransaction() y OnTick() , por eso sugerí hacerlo en la base de datos

 
void OnTradeTransaction(const MqlTradeTransaction &trans, const MqlTradeRequest &request, const MqlTradeResult &result)
  {
   if(trans.type==TRADE_TRANSACTION_DEAL_ADD)
     {
      if(!HistoryDealSelect(trans.deal))
         return;
      bool time_to_sum_up=false;
      if(HistoryDealGetInteger(trans.deal,DEAL_ENTRY)==DEAL_ENTRY_OUT)
        {
         time_to_sum_up=true;
        }
      if(!time_to_sum_up)
         return;
      HistorySelect(0,TimeCurrent());
      int deals=HistoryDealsTotal();
      for(int i=deals-1; i>=0; i--)
        {
         if(HistoryDealGetTicket(i)==trans.deal)
           {
            Print("Found!");
            return;
           }
        }
      Print("Not Found!");
     }
   return;
  
Este código es un fragmento simplificado de mi EA.
Supongamos que, en algunos casos, el resultado de ejecutar este código es devolver "No encontrado".
No entiendo muy bien por qué.
¿Por qué no puede encontrarse a sí mismo en los eventos que desencadena?
El evento de transacción enviado por el servidor al terminal ha llegado, pero el servidor no puede sincronizar simultáneamente la hora correcta al terminal?
Entiendo que un segundo de incremento en el valor de TimeCurrent() es más que suficiente.
Debo estar pasando por alto algoimportante, ¿verdad?
Les agradecería mucho que me indicaran cualquier error en mi comprensión.
Объем импорта г/г - экономический индекс Японии
Объем импорта г/г - экономический индекс Японии
  • www.mql5.com
Объем импорта г/г (Imports y/y) отражает изменение объема импорта товаров и услуг в отчетном месяце по сравнению с тем же месяцем прошлого года. Показатели импорта используются для оценки внешней торговой активности Японии и спроса на импортируемые товары внутри страны. Из-за последствий "финансового кризиса" США Япония также столкнулась с...
 
¿Puede crear un método para abrir Market Deep de algún símbolo en mql5 por favor? esto es importante cuando se trabaja con múltiples símbolos.
 
Dmitri Custurov:

Aquí está mi código. En la inicialización crea un registro en la tabla. En el cuerpo de OnTick debería devolver inmediatamente un error, porque intento añadir un registro con la misma PRIMARY KEY, y después de eso la base se cierra inmediatamente. Pero al mismo tiempo debería ver al menos ese primer registro cuando lo abro, pero cuando lo ejecuto en el probador no está. Y ni siquiera se crea la tabla. Si lo abro en el terminal, todo es normal. El primer disco está ahí.

Con la ubicación de la base de datos que no se estropeó con suerte?

 
Aleksey Mavrin:

No estás confundido sobre la ubicación de la base, ¿verdad?

No, no lo estoy. Todo está en Archivos. Creo que en el modo tester, la base de datos se crea en memoria y se destruye después de la prueba.

 
Igor Makanu:

pensamientos en voz alta, sin pretensiones de relevancia o competencia:

...

o más bien, lo más probable es que va a escribir y gastar recursos de EA para mantener el algoritmo, creo que usted necesita para averiguar cómo funciona SQLite, las pruebas de rendimiento MQ declaró, el trabajo con grandes tablas y las muestras es precisamente el propósito de la base de datos - código de EA será minimalista, todo el trabajo de la base de datos le hará, todo el trabajo se reduce a llenar los datos al realizar un pedido y actualizar al responder desde el servidor (sincronización, por supuesto, cuando se ejecuta EA, la base de datos en la memoria)

¿Y qué base de datos hará todo su trabajo? ¿Puede decírmelo?

 

La comunicación es a través de la base de datos o a través de PUB/SUB ZMQ. Por supuesto la base de datos no es SQLite, la más adecuada para estos fines es Redis, por supuesto mi opinión personal.

Buena suerte

Razón de la queja: