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

 
Andrey Khatimlianskii:

Não se pode falar com a língua. Você deveria me ensinar. Eu, por favor.

Há um problema, e não é só neste corretor.
E o problema não está em esperar pela execução de uma ordem específica (essa é outra questão), mas no fato de que no momento da execução da ordem eles desaparecem temporariamente de todas as listas (abertas, fechadas, negócios, posições).

Poderíamos usar outra muleta, é claro. Mas nós queremos encontrar uma solução humana. E assim o fxsaber trabalha publicamente, ouvindo o latido de quem deseja bem passar.

Pessoalmente, espero que você possa entender a documentação

Enquanto o Expert Advisor trata as transações comerciais usando o manipulador da OnTradeTransaction(), o terminal continua tratando as transações comerciais recém-chegadas. Portanto, o estado de uma conta comercial já pode mudar enquanto a OnTradeTransaction() estiver em funcionamento. Por exemplo, enquanto um programa MQL5 lida com um evento de adição de um novo pedido, ele pode ser executado, excluído da lista dos abertos e movido para o histórico. Mais adiante, o programa será notificado de todos esses eventos.
e isto se aplica não somente ao manipulador de eventos OnTradeTransaction(), mas também a qualquer parte do código após o OrderSend() ter sido enviado. Aguarde a conclusão da transação. Não há outras opções e não haverá nenhuma. Basta pensar por que tudo é tão simples em mql4? Bem, é porque estas expectativas estão longe de seus olhos. E na MQL5, você de alguma forma pensa que todas as verificações e expectativas são muletas. Por quê?
 
Alexey Viktorov:

Pessoalmente, espero que você tenha uma visão suficiente sobre tais palavras de documentação

E isto diz respeito não somente ao manipulador de eventos OnTradeTransaction(), mas também qualquer parte do código após o envio do OrderSend(). Aguarde a conclusão da transação. Não há outras opções e não haverá nenhuma. Basta pensar por que tudo é tão simples em mql4? Bem, é porque estas expectativas estão muito longe de seus olhos. E na MQL5, você de alguma forma pensa que todas as verificações e expectativas são muletas. Por quê?

Alexey, você está fora do assunto. Desculpe, sem tempo ou inclinação para explicar tudo novamente.

 

tentou desta forma:

void OnTrade()
{
   HistorySelect(TimeCurrent(),0);
   if(PositionsTotal() >= 10) return;
   MqlTradeResult result;
   BuyRequest.price = SymbolInfoDouble(_Symbol, SYMBOL_ASK);
   OrderSend(BuyRequest, result);
}

5 vezes eu corri meu código, até exatamente 10 posições abertas

 
Igor Makanu:

tentou desta forma:

Executar meu código 5 vezes, até exatamente 10 posições abertas

Parece um erro na definição das entradas do HistorySelect.

 
fxsaber:

Parece um erro na definição das entradas do HistorySelect.

idéia para chegar ao servidor e sincronizar

reescreveu-o como um roteiro:

//+------------------------------------------------------------------+
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();
   datetime t_start = TimeCurrent();
   while(PositionsTotal() < 10)
   {
      BuyRequest.price = SymbolInfoDouble(_Symbol, SYMBOL_ASK);
      if(!HistorySelect(TimeCurrent(), t_start) || ! OrderSend(BuyRequest, result)) continue;
      if(PositionsTotal() >= 10) 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);
}
//+------------------------------------------------------------------+

o executou várias vezes, também abre 10 posições, acrescentou a hora de início atual do roteiro

 
Igor Makanu:

a idéia de chegar ao servidor e sincronizar

reescreveu-o como um roteiro:

o executou algumas vezes, também abre 10 posições, acrescentou a hora atual de início do roteiro

O que esta mudança vai mostrar?

#include <fxsaber\Benchmark\Benchmark.mqh> // https://www.mql5.com/ru/code/31279

      if(!_B(HistorySelect(TimeCurrent(), t_start), 1) || ! OrderSend(BuyRequest, result)) continue;
 
fxsaber:

O que esta mudança vai mostrar?


2021.05.09 21:35:06.210 tst (ETHUSD,H1) Benchmark.mqh: TimeAvg[GetMicrosecondsCount()] = 0 mcs.

2021.05.09 21:35:06.211 tst (ETHUSD,H1) Benchmark.mqh is On.

2021.05.09 21:35:06.211 tst (ETHUSD,H1) Alerta: Bench_Stack = 0, 1 <= Tempo[tst.mq5 16 em OnStart: HistorySelect(TimeCurrent(),t_start)] = 20 mcs.

2021.05.09 21:35:06.308 tst (ETHUSD,H1) Alerta: Bench_Stack = 0, 1 <= Tempo[tst.mq5 16 em OnStart: HistorySelect(TimeCurrent(),t_start)] = 6 mcs.

2021.05.09 21:35:06.404 tst (ETHUSD,H1) Alerta: Bench_Stack = 0, 1 <= Tempo[tst.mq5 16 em OnStart: HistorySelect(TimeCurrent(),t_start)] = 10 mcs.

2021.05.09 21:35:06.501 tst (ETHUSD,H1) Alerta: Bench_Stack = 0, 1 <= Tempo[tst.mq5 16 em OnStart: HistorySelect(TimeCurrent(),t_start)] = 13 mcs.

2021.05.09 21:35:06.597 tst (ETHUSD,H1) Alerta: Bench_Stack = 0, 1 <= Tempo[tst.mq5 16 em OnStart: HistorySelect(TimeCurrent(),t_start)] = 10 mcs.

2021.05.09 21:35:06.694 tst (ETHUSD,H1) Alerta: Bench_Stack = 0, 1 <= Tempo[tst.mq5 16 em OnStart: HistorySelect(TimeCurrent(),t_start)] = 3 mcs.

2021.05.09 21:35:06.792 tst (ETHUSD,H1) Alerta: Bench_Stack = 0, 1 <= Tempo[tst.mq5 16 em OnStart: HistorySelect(TimeCurrent(),t_start)] = 4 mcs.

2021.05.09 21:35:06.888 tst (ETHUSD,H1) Alerta: Bench_Stack = 0, 1 <= Tempo[tst.mq5 16 em OnStart: HistorySelect(TimeCurrent(),t_start)] = 3 mcs.

2021.05.09 21:35:06.989 tst (ETHUSD,H1) Alerta: Bench_Stack = 0, 1 <= Tempo[tst.mq5 16 em OnStart: HistorySelect(TimeCurrent(),t_start)] = 4 mcs.

as posições ainda são 10pc, sem dobrar ainda
 
Igor Makanu:

As posições ainda são 10 pcs, sem dobrar ainda

Você pode ver claramente pelo tempo de execução do HistorySelect que ele não está solicitando nada do servidor Trade.


Várias versões.

  1. Você está com sorte.
  2. Esta filial causou uma mudança silenciosa na nova construção do Terminal. O que é fácil de confirmar se há um backlash nos antigos.
  3. Comportamento inusitado da HistóriaSelecione quando De >= Até.
  4. Servidor comercial. Nome?


Tente a mesma maneira de se livrar da duplicação aqui.

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

O Grande e Poderoso MT4 Forever (ou como estrategizar corretamente para mudar)

fxsaber, 2021.05.05 02:04

// Демонстрация открытия дубля позиции в MT5.

#include <Trade\Trade.mqh>

void OnStart()
{
  CTrade Trade;
  
  while (!IsStopped() && (PositionsTotal() <= 1)) // Закончим, когда появится более одной позиции.
    if (PositionsTotal() == 1)
      Trade.PositionClose(PositionGetTicket(0)); // Если есть позиция - закрываем.
    else if (!OrdersTotal())
      Trade.Buy(0.01); // Если нет позиции и ордера - открываем позицию.
}

Execute este código em uma conta demo vazia e veja se duas posições abrem em poucos segundos.

 

Eu vim por acaso e li - é uma pena!

Não se deve confiar em ninguém !
 
fxsaber:

Você pode ver claramente pelo tempo de execução da HistorySelect que ela não solicita nada do servidor Trade.


Várias versões.

  1. Você está com sorte.
  2. Esta filial causou uma mudança silenciosa na nova construção do Terminal. O que é fácil de confirmar se há um backlash nos antigos.
  3. Comportamento inusitado da HistóriaSelecione quando De >= Até.
  4. Servidor comercial. Nome?


Tente a mesma maneira de se livrar da duplicação aqui.

1. infelizmente, não podemos sobreviver em nossos negócios sem isso ))

2. pergunto há alguns dias que construção (não beta) é relevante, silêncio, decidi não atualizar, em um laptop e em um PC é difícil entender o que construções são relevantes - não trabalho com os terminais há um par de meses, não acompanho. Agora no PC constrói 2903.

3. eu vou passar, você é o responsável por este banquete, os desenvolvedores estão em silêncio, meu palpite. polegar no céu, acho que o problema está na latência da rede, e vários soquetes? terminal, sem sincronização, preço de um soquete, outro OrderSend, outro onde OnTrade()..... então os pacotes estão voando de onde e para onde

4. tenho robotforex + 100 mbps óptico (ETTH), tinha uma internet móvel ruim e fhopin no meu laptop antes


Tentei por 2 minutos, o roteiro ficou em branco por 2 minutos, sempre uma posição, sem reviravoltas, tirei o roteiro à mão.