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

 
Igor Makanu:

no PM abandonou o servidor

Este servidor (ou melhor, o software do corretor) tem proteção contra spam. Eles planejam atualizá-lo até a próxima semana e então a desaceleração desaparecerá.

 
fxsaber:

Vou ter 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. Seria melhor apontar os bugs, se houver algum.

Ainda não há opção no estilo MT4?

Basta executar o script abrindo 100 posições em diferentes servidores?

 
Andrey Khatimlianskii:

Ainda não há opção no estilo MT4?

Ainda não começou. Muito provavelmente, o usuário não mudará nada no código. A funcionalidade adicional será ativada através de uma macro.

Basta executar o script abrindo 100 posições em diferentes servidores?

Sim, em servidores diferentes, mas apenas um roteiro diferente. Se não ocorrer duplicação durante um minuto de execução, o cheque foi aprovado com sucesso. Caso contrário - falha.

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

Ainda não começou. Muito provavelmente, o usuário não mudará nada no código. A funcionalidade extra será ativada através de uma macro.

Entendi.

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

Foi.

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 uma estratégia de migração inteligente)

fxsaber, 2021.05.11 09:05

Sem esperar por uma posição - resultados imediatos.

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

E assim foi.

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


Agora não é diferente da variante MT4, incluindo a confiabilidade.

Quaisquer exemplos que são tão difíceis de escrever em MT5 se tornaram facilmente implementáveis, como deveriam ser.

 

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() < 10)
   {
      if(OrdersTotal() > 0) continue;
      if(!Trade.Buy(0.01)) continue;
      if(OrdersTotal() == 0 && PositionsTotal() >= 10) return;
   }
}

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

O que acontecerá se após a ordem de abertura da 10ª posição for colocada, na próxima iteração do

while(PositionsTotal() < 10)

PositionTotal não teve tempo para atualizar (=9), e a ordem já conseguiu entrar na história e OrderTotal()==0.

Nesse caso, existirá outro Trade.Buy()?

Teoricamente, isso pode acontecer várias vezes seguidas?

Ou eu perdi alguma coisa?

 
mktr8591:

O que acontece, se após a ordem de abertura da 10ª posição for colocada, na próxima iteração do

PositionTotal não teve tempo para atualizar (=9), e a ordem já conseguiu ir para a história e OrderTotal()==0.

Nesse caso, existirá outro Trade.Buy()?

Teoricamente, isso pode acontecer várias vezes seguidas?

Ou está me faltando algo?

são seus interesses de alta freqüência, o resto tem tempo livre suficiente e não há problema com uma segunda tentativa

Tenho certeza de que é assim que é construído no MT4, espere e veja
 
mktr8591:

O que acontece, se após a ordem de abertura da 10ª posição for colocada, na próxima iteração do

PositionTotal não teve tempo para atualizar (=9), e a ordem já conseguiu ir para a história e OrderTotal()==0.

Nesse caso, existirá outro Trade.Buy()?

É claro que será. O raciocínio no código é exatamente o mesmo.

Teoricamente, pode repetir várias iterações sucessivas?

Se a compra for verdadeira, então há quase zero probabilidade de que a próxima iteração tenha OrdensTotal() == 0. Isto é, a abertura de 12 posições é impossível na prática.


Este é um caso muito primitivo. Uma dupla iteração muitas vezes se parece com isto:

  1. Limit OrdersTotal = 1, PositionsTotal = 0.
  2. Os limitadores são executados. OrdensTotal = 0, PosiçõesTotal = 0.
  3. As posições são abertas. OrdensTotal = 0, PosiçõesTotal = 1.

No segundo passo, o Expert Advisor vê que não há nada e estabelece um limite. Como resultado, temos duas posições em aberto.

O segundo ponto é a ultrapassagem do MT5. E agora a muleta a ultrapassa.

 

Obrigado.

Sobre isso:

fxsaber:

A duplicação não é uma dificuldade do MT5, mas um bug arquitetônico, quando as funções Total()-funções mostram falsos positivos.

Você pode dizer que é um bug, ou você pode apresentá-lo de outra forma :-)

PosiçõesTotal() não é o número de posições abertas, mas o tamanho da tabela de posições abertas. A tabela de posições - é na verdade um cache, como o cache do histórico de negócios, só que não é atualizada a pedido, mas automaticamente, mas não instantaneamente, e com um ligeiro atraso. Por causa disso, pode não conter posições já abertas, ou conter posições já fechadas.

A mesma coisa com OrderTotal().

Se explicarmos a ajuda desta forma, haverá menos perguntas, reclamações e mal-entendidos.

E no artigo "Ordens, Posições e Oportunidades no MetaTrader 5", você pode prestar atenção a isto (agora é ambíguo - "O resultado da função PositionsTotal() não depende se o cache de posições está cheio - ele sempre retorna o número real de posições em aberto no terminal base para todos os símbolos").


P.S. Mas então surge uma pergunta legítima - por que não fazer um sistema funcionar/bandeira para determinar o status de sincronização das tabelas de ordens ao vivo, posições, negociações e ordens executadas, de modo a não criar muletas?
 
mktr8591:

P.S. Mas então surge uma pergunta legítima - por que não fazer um sistema fi/flag para determinar o status de sincronização das tabelas de ordens ao vivo, posições, negociações e ordens executadas, de modo a não criar muletas?

Muito provavelmente, não existe tal bandeira no interior.