O grande e terrível MT4 para sempre (ou como fazer uma transição estratégica) - página 24

 
Artyom Trishkin:
Em russo? Em espanhol? Em inglês? Qual deles?

naturalmente em todos os idiomas que o terminal suporta

o formato não importa - pode ser uma SB na forma de uma classe onde o construtor recebe a linguagem como parâmetro

ou pode ser um grupo de funções personalizadas com o final do idioma GetTxtErrDescription_RU()

ou mesmo uma função regular como GetLastError()

se você desejar


OK, esqueça, eu tenho tudo, e minha posição não permite cuidar do bem-estar universal, deixar que pessoas especialmente treinadas lidem com a usabilidade e a facilidade de uso.

 

Eu adivinhei porque sua posição é dupla))) Porque você colocou duas bibliotecas em CodeBase)))


 

Por que você não gosta do GetTickCount(); ele não retarda todo o código, ao contrário do Sleep, você pode pelo menos adicionar 500ms se o ping estiver alto,

Em meu multisímbolo, para cada par é ativado um contador separado após OrderSend, o resto da lógica continua a funcionar

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 que você não gosta do GetTickCount(); ele não retarda todo o código ao contrário do Sleep, você pode pelo menos adicionar 500ms se o ping estiver alto,

É um loop ativo e come o processador. E se houver 50 Expert Advisors desse tipo no terminal? Há 8 deles em um só par onde todos os 8 enviarão pedidos em um espigão.

 
traveller00:

É um ciclo ativo e come a CPU. E se houver 50 Conselheiros Especializados no terminal? Há 8 deles em um só par, para os quais todos os 8 enviarão pedidos no grampo.

É ativado por meio segundo e somente após o envio da ordem não há comando para ele e então verifica primeiro a presença das posições em aberto

Eu otimizei meu código, ele se tornou mais rápido e começou a abrir 2 posições de cada vez) no início o sono ajudou, mas estava diminuindo a velocidade das coisas, eu tenho 7 caracteres
 
fxsaber:

Eu mesmo ainda não experimentei o estilo MT4. Teoricamente, deveria funcionar. Eu ainda não tive a oportunidade de olhar para ela.

Funciona. Foi interessante comparar duas versões (com e sem espera de posição).


Com posição de espera após o 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());
}


Sem esperar pela posição, o resultado é imediato.

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


Eu tinha certeza de que a segunda variante era mais rápida. Acabou sendo igual no momento da execução.


Ao esperar pela posição ByPass.Is(), o código retornou falso uma vez, enquanto que sem esperar retornou 740 vezes. No geral, a muleta parece funcionar.

 
Parece ser a única solução de trabalho apresentada.

Fórum sobre comércio, sistemas automatizados de comércio e testes de estratégia comercial

O grande e terrível MT4 para sempre (ou como construir sua estratégia de migração)

Igor Makanu, 2021.05.10 10:28

parece funcionar:

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

Mas muito lento, e a solução é mais ou menos assim.

Sua velocidade é boa. Falta de sincronização 37 vezes.

 
fxsaber:

Sua velocidade é normal. Falta de sincronização 37 vezes.

Verifiquei na fx: este roteiro abriu 10 pedidos 5 vezes rápido, e a última vez que fui rápido, quando abri 10 pedidos por 10 segundos na demonstração, o fechamento dos pedidos também não foi rápido.

Aqui está um arranhão no registro para o pedido 11143290:

LL 0 11:19:31.444 Comércios '20615687': pedido #11143290 compra 0,1 / 0,1 EURUSD no mercado feito em 1580.643 ms

PO 0 11:19:33.621 Negociações '20615687': negócio #1865643 comprar 0,1 EURUSD a 1,21460 feito (com base no pedido #11143290)

CL 0 11:19:33.622 Comércios '20615687': compra de mercado 0,1 EURUSD

JF 0 11:19:33.679 Comércios '20615687': mercado aceito compra 0,1 EURUSD

QO 0 11:19:33.679 Negociações '20615687': compra de mercado 0,1 EURUSD colocado para execução

KM 0 11:22:41.224 Comércios '20615687': mercado vender 0,1 EURUSD, fechamento #11143290 comprar 0,1 EURUSD 1,21460

DR 0 11:22:41.280 Comércio '20615687': mercado aceito vender 0,1 EURUSD, fechamento #11143290 comprar 0,1 EURUSD 1,21460

KQ 0 11:22:41.282 Negociações '20615687': mercado vender 0,1 EURUSD, fechar #11143290 comprar 0,1 EURUSD 1,21460 colocado para execução

ON 0 11:22:43.824 Comércios '20615687': mercado vender 0,1 EURUSD, fechamento #11143290 comprar 0,1 EURUSD 1,21460

DO 2 11:22:43.880 Comércios '20615687': mercado vender 0,1 EURUSD, fechar #11143290 comprar 0,1 EURUSD 1,21460 [Ordem para fechar esta posição já existe].

JN 0 11:22:46.280 Comércio '20615687': mercado vender 0,1 EURUSD, fechamento #11143290 comprar 0,1 EURUSD 1,21460

OL 2 11:22:46.336 Comércios '20615687': mercado vender 0,1 EURUSD, fechar #11143290 comprar 0,1 EURUSD 1,21460 [Ordem para fechar esta posição já existe].

 
Igor Makanu:

Acabei de verificar no fx...n.

Vou ter que dar uma olhada nesse servidor. Seria bom verificar a muleta sugerida aqui, para quem parece importante.

Voltar a este tópico depois de um tempo seria muito relutante. É melhor apontar os bugs imediatamente, se houver algum.

 
fxsaber:

Teremos que dar uma olhada neste servidor. Seria bom verificar a muleta sugerida aqui, para quem parece importante.

Eu odiaria voltar a este tópico depois de um tempo. É melhor apontar imediatamente os bugs, se houver algum.

No PM, o servidor foi descartado.

Razão: