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

 
Artyom Trishkin:
¿En ruso? ¿En español? ¿En inglés? ¿Cuál?

por supuesto en todos los idiomas que el terminal soporta

el formato no importa - puede ser una SB en forma de clase donde el constructor recibe el lenguaje como parámetro

o puede ser un grupo de funciones personalizadas con terminación de lenguaje GetTxtErrDescription_RU()

o incluso una función normal como GetLastError()

si lo desea


Vale, olvídalo, lo tengo todo, y mi rango no permite ocuparse del bienestar universal, deja que personas especialmente formadas se ocupen de la usabilidad y la facilidad de uso

 

Adiviné por qué su posición es doble))) Porque has colocado dos bibliotecas en CodeBase))


 

Por qué no te gusta GetTickCount(); no ralentiza todo el código, a diferencia de Sleep, al menos puedes añadir 500ms si el ping es alto,

En mi multisímbolo, para cada par se activa un contador independiente después de OrderSend, el resto de la lógica sigue funcionando

void OnStart()
  {
   MqlTradeRequest BuyRequest = {0};
   MqlTradeResult result = {0};
   BuyRequest.action = TRADE_ACTION_DEAL;
   BuyRequest.type = ORDER_TYPE_BUY;
   BuyRequest.symbol = _Symbol;
   BuyRequest.volume = 0.1;
   BuyRequest.type_filling = GetFilling();
//---
   while(1 && !IsStopped())
     {
      static uint LastOnCalculate = GetTickCount();
      if(GetTickCount() - LastOnCalculate > 5)
         //---
        {
         BuyRequest.price = SymbolInfoDouble(_Symbol, SYMBOL_ASK);
         OrderSend(BuyRequest, result);
         LastOnCalculate = GetTickCount();
         continue;
        }
      if(PositionGetTicket(0) > 0 && PositionsTotal() >= 10)
        {
         Sleep(100);
         Print(PositionsTotal());
         return;
        }
     }
  }
//+------------------------------------------------------------------+
ENUM_ORDER_TYPE_FILLING GetFilling(const uint Type = ORDER_FILLING_FOK)
  {
   const ENUM_SYMBOL_TRADE_EXECUTION ExeMode = (ENUM_SYMBOL_TRADE_EXECUTION)::SymbolInfoInteger(_Symbol, SYMBOL_TRADE_EXEMODE);
   const int FillingMode = (int)::SymbolInfoInteger(_Symbol, SYMBOL_FILLING_MODE);
   return((FillingMode == 0 || (Type >= ORDER_FILLING_RETURN) || ((FillingMode & (Type + 1)) != Type + 1)) ?
          (((ExeMode == SYMBOL_TRADE_EXECUTION_EXCHANGE) || (ExeMode == SYMBOL_TRADE_EXECUTION_INSTANT)) ?
           ORDER_FILLING_RETURN : ((FillingMode == SYMBOL_FILLING_IOC) ? ORDER_FILLING_IOC : ORDER_FILLING_FOK)) :
          (ENUM_ORDER_TYPE_FILLING)Type);
  }
//+------------------------------------------------------------------+
 
Fast235:

Por qué no te gusta GetTickCount(); no ralentiza todo el código a diferencia de Sleep, al menos puedes añadir 500ms si el ping es alto,

Es un bucle activo y se come el procesador. ¿Y si hay 50 Asesores Expertos de este tipo en el terminal? Hay 8 de ellos en un par donde los 8 enviarán órdenes en un pico.

 
traveller00:

Es un ciclo activo y se come la CPU. ¿Y si hay 50 de estos Asesores Expertos en el terminal? Hay 8 de ellos en un par donde en la horquilla los 8 enviarán órdenes.

Se activa durante medio segundo y sólo después de que se envíe la orden no hay ninguna orden para ella y entonces comprueba la presencia de las posiciones abiertas primero

Optimicé mi código, se volvió más rápido y empezó a abrir 2 posiciones a la vez) al principio Sleep ayudó, pero estaba ralentizando las cosas, tengo 7 caracteres
 
fxsaber:

Todavía no he probado el estilo MT4, pero en teoría debería funcionar. Todavía no he tenido la oportunidad de mirarlo.

Funciona. Fue interesante comparar dos versiones (con y sin espera de posición).


Con posición de espera después de OrderSend.

#include <MT4Orders.mqh>

#define  Ask SymbolInfoDouble(_Symbol, SYMBOL_ASK)

void OnStart()
{
  while (OrdersTotal() < 30)
    OrderSend(_Symbol, OP_BUY, 0.1, Ask, 0, 0, 0);      
    
  Print(OrdersTotal());
}


Sin esperar la posición, el resultado es inmediato.

#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());
}


Estaba seguro de que la segunda variante era más rápida. Resultó ser igual en tiempo de ejecución.


Cuando se espera la posición ByPass.Is(), el código devuelve false una vez, mientras que sin esperar devuelve 740 veces. En definitiva, la muleta parece funcionar.

 
Parece ser la única solución que funciona presentada.

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

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

Igor Makanu, 2021.05.10 10:28

parece que funciona:

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

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

Su velocidad está bien. Falta de sincronización 37 veces.

 
fxsaber:

Su velocidad es normal. Falta de sincronización 37 veces.

Lo he comprobado en fx: este script abrió 10 órdenes 5 veces rápido, y la última vez que fui rápido, cuando abrí 10 órdenes durante 10 segundos en la demo, el cierre de las órdenes tampoco fue rápido.

Aquí hay un rasguño en el registro para la orden 11143290:

LL 0 11:19:31.444 Operaciones '20615687': orden #11143290 compra 0.1 / 0.1 EURUSD a mercado realizada en 1580.643 ms

PO 0 11:19:33.621 Operaciones '20615687': operación #1865643 compra 0.1 EURUSD a 1.21460 realizada (basada en la orden #11143290)

CL 0 11:19:33.622 Operaciones '20615687': mercado compra 0.1 EURUSD

JF 0 11:19:33.679 Operaciones '20615687': aceptada la compra de mercado 0.1 EURUSD

QO 0 11:19:33.679 Operaciones '20615687': compra de mercado 0.1 EURUSD colocada para su ejecución

KM 0 11:22:41.224 Operaciones '20615687': mercado vender 0.1 EURUSD, cerrar #11143290 comprar 0.1 EURUSD 1.21460

DR 0 11:22:41.280 Operaciones '20615687': mercado aceptado vender 0.1 EURUSD, cerrar #11143290 comprar 0.1 EURUSD 1.21460

KQ 0 11:22:41.282 Operaciones '20615687': mercado vender 0.1 EURUSD, cerrar #11143290 comprar 0.1 EURUSD 1.21460 colocado para ejecución

ON 0 11:22:43.824 Operaciones '20615687': mercado vender 0.1 EURUSD, cerrar #11143290 comprar 0.1 EURUSD 1.21460

DO 2 11:22:43.880 Operaciones '20615687': mercado vender 0.1 EURUSD, cerrar #11143290 comprar 0.1 EURUSD 1.21460 [La orden para cerrar esta posición ya existe]

JN 0 11:22:46.280 Operaciones '20615687': mercado vender 0.1 EURUSD, cerrar #11143290 comprar 0.1 EURUSD 1.21460

OL 2 11:22:46.336 Operaciones '20615687': mercado vender 0.1 EURUSD, cerrar #11143290 comprar 0.1 EURUSD 1.21460 [La orden para cerrar esta posición ya existe]

 
Igor Makanu:

Acabo de comprobar en el fx ... n.

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

Volver a este tema después de un tiempo sería muy reacio. Es mejor señalar los fallos de inmediato si los hay.

 
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. Es mejor señalar inmediatamente los fallos, si los hay.

En el PM lanzó el servidor