MetaTrader 5 Strategy Tester: bugs, bugs, sugestões para melhorias - página 42

 
fxsaber:

Estão disponíveis instruções para reprodução em qualquer personagem. Qualquer pergunta - basta executá-la.

Não, prefiro-te a ti, vou esquecer porque é que o comecei))

Pode testar num futuro de acções, por exemplo Si ? Quer uma conta de stock para o teste?

 
Sergey Chalyshev:

Não, prefiro-o a si, quando descobrir os seus códigos, esquecerei porque o comecei)))

Pode testar numa bolsa de futuros, por exemplo Si ? Quer uma conta de troca para o teste?

A bolsa tem um problema de baixa liquidez e filas de encomendas. Por conseguinte, o testador na Bolsa de Moscovo não está correcto. Este fenómeno está praticamente ausente no Forex para pequenos lotes. Embora ocorra por vezes.

 
Sergey Chalyshev:

Devo dar-lhe uma conta de stock para um teste?

Sim. Mas devo salientar desde já que qualquer execução ao último preço no Testador é um erro.

 
Verificar o código para a correcção do Testador.
#include <MT4Orders.mqh> // https://www.mql5.com/ru/code/16006

#define  Bid SymbolInfoDouble(_Symbol, SYMBOL_BID)
#define  Ask SymbolInfoDouble(_Symbol, SYMBOL_ASK)

void CloseAll()
{
  for (int i = OrdersTotal() - 1; i >= 0; i--)
    if (OrderSelect(i, SELECT_BY_POS))
    {
      if (OrderType() <= OP_SELL)
        OrderClose(OrderTicket(), OrderLots(), OrderClosePrice(), 0);
      else
        OrderDelete(OrderTicket());
    }    
}

bool Check1()
{
  bool Res = true;
  
  Res &= OrderSend(_Symbol, OP_BUY, 1, Ask, 0, Bid, 0) && !OrdersTotal();
  CloseAll();

  Res &= OrderSend(_Symbol, OP_BUY, 1, Ask, 0, 0, Bid) && !OrdersTotal();
  CloseAll();

  Res &= OrderSend(_Symbol, OP_SELL, 1, Bid, 0, Ask, 0) && !OrdersTotal();
  CloseAll();

  Res &= OrderSend(_Symbol, OP_SELL, 1, Bid, 0, 0, Ask) && !OrdersTotal();
  CloseAll();
  
  return(Res);
}

bool Check2()
{
  bool Res = true;
  
  Res &= OrderModify(OrderSend(_Symbol, OP_BUY, 1, Ask, 0, 0, 0), Ask, Bid, 0, 0) && !OrdersTotal();
  CloseAll();

  Res &= OrderModify(OrderSend(_Symbol, OP_BUY, 1, Ask, 0, 0, 0), Ask, 0, Bid, 0) && !OrdersTotal();
  CloseAll();

  Res &= OrderModify(OrderSend(_Symbol, OP_SELL, 1, Bid, 0, 0, 0), Bid, Ask, 0, 0) && !OrdersTotal();
  CloseAll();

  Res &= OrderModify(OrderSend(_Symbol, OP_SELL, 1, Bid, 0, 0, 0), Bid, 0, Ask  , 0) && !OrdersTotal();
  CloseAll();
  
  return(Res);
}

bool Check3()
{
  bool Res = true;
  
  Res &= OrderSelect(OrderSend(_Symbol, OP_BUYLIMIT, 1, Ask, 0, 0, 0), SELECT_BY_TICKET) && (OrderType() <= OP_SELL);
  CloseAll();

  Res &= OrderSelect(OrderSend(_Symbol, OP_SELLLIMIT, 1, Bid, 0, 0, 0), SELECT_BY_TICKET) && (OrderType() <= OP_SELL);
  CloseAll();

  Res &= OrderSelect(OrderSend(_Symbol, OP_BUYSTOP, 1, Ask, 0, 0, 0), SELECT_BY_TICKET) && (OrderType() <= OP_SELL);
  CloseAll();

  Res &= OrderSelect(OrderSend(_Symbol, OP_SELLSTOP, 1, Bid, 0, 0, 0), SELECT_BY_TICKET) && (OrderType() <= OP_SELL);
  CloseAll();
  
  return(Res);
}

bool Check4()
{
  bool Res = true;
  
  const double TickSize = SymbolInfoDouble(_Symbol, SYMBOL_TRADE_TICK_SIZE);
  
  Res &= OrderModify(OrderSend(_Symbol, OP_BUYLIMIT, 1, Ask - TickSize, 0, 0, 0), Ask, 0, 0, 0) && (OrdersTotal() == 1) && (OrderSelect(0, SELECT_BY_POS)) && (OrderType() <= OP_SELL);
  CloseAll();  

  Res &= OrderModify(OrderSend(_Symbol, OP_BUYSTOP, 1, Ask + TickSize, 0, 0, 0), Ask, 0, 0, 0) && (OrdersTotal() == 1) && (OrderSelect(0, SELECT_BY_POS)) && (OrderType() <= OP_SELL);
  CloseAll();

  Res &= OrderModify(OrderSend(_Symbol, OP_SELLLIMIT, 1, Bid + TickSize, 0, 0, 0), Bid, 0, 0, 0) && (OrdersTotal() == 1) && (OrderSelect(0, SELECT_BY_POS)) && (OrderType() <= OP_SELL);
  CloseAll();

  Res &= OrderModify(OrderSend(_Symbol, OP_SELLSTOP, 1, Bid - TickSize, 0, 0, 0), Bid, 0, 0, 0) && (OrdersTotal() == 1) && (OrderSelect(0, SELECT_BY_POS)) && (OrderType() <= OP_SELL);
  CloseAll();

  return(Res);
}

bool Check5()
{
  bool Res = true;

  const double TickSize = SymbolInfoDouble(_Symbol, SYMBOL_TRADE_TICK_SIZE);
  
  Res &= OrderModify(OrderSend(_Symbol, OP_BUYLIMIT, 1, Ask - TickSize, 0, 0, 0), Ask, Bid, 0, 0) && !OrdersTotal();
  CloseAll();  

  Res &= OrderModify(OrderSend(_Symbol, OP_BUYSTOP, 1, Ask + TickSize, 0, 0, 0), Ask, Bid, 0, 0) && !OrdersTotal();
  CloseAll();  

  Res &= OrderModify(OrderSend(_Symbol, OP_SELLLIMIT, 1, Bid + TickSize, 0, 0, 0), Bid, Ask, 0, 0) && !OrdersTotal();
  CloseAll();  

  Res &= OrderModify(OrderSend(_Symbol, OP_SELLSTOP, 1, Bid - TickSize, 0, 0, 0), Bid, Ask, 0, 0) && !OrdersTotal();
  CloseAll();  

  return(Res);
}

bool Check6()
{
  bool Res = true;
  
  Res &= OrderSend(_Symbol, OP_BUYLIMIT, 1, Ask, 0, Bid, 0) && !OrdersTotal();
  CloseAll();

  Res &= OrderSend(_Symbol, OP_BUYSTOP, 1, Ask, 0, Bid, 0) && !OrdersTotal();
  CloseAll();

  Res &= OrderSend(_Symbol, OP_SELLLIMIT, 1, Bid, 0, Ask, 0) && !OrdersTotal();
  CloseAll();

  Res &= OrderSend(_Symbol, OP_SELLSTOP, 1, Bid, 0, Ask, 0) && !OrdersTotal();
  CloseAll();
  
  return(Res);
}


#define  TOSTRING(A) #A + " = " + (string)(A) + "\n"

void OnTick()
{
  Print(TOSTRING(Check1()) + TOSTRING(Check2()) + TOSTRING(Check3()) +
        TOSTRING(Check4()) + TOSTRING(Check5()) + TOSTRING(Check6()));

  ExpertRemove();
}


Se funcionar correctamente, deve haver

2019.12.19 00:27:59.263 2019.12.13 00:00:00   Check1() = true
2019.12.19 00:27:59.263 2019.12.13 00:00:00   Check2() = true
2019.12.19 00:27:59.263 2019.12.13 00:00:00   Check3() = true
2019.12.19 00:27:59.263 2019.12.13 00:00:00   Check4() = true
2019.12.19 00:27:59.263 2019.12.13 00:00:00   Check5() = true
2019.12.19 00:27:59.263 2019.12.13 00:00:00   Check6() = true
 
fxsaber:

Vá em frente. Mas devo salientar desde já que qualquer execução ao último preço no Testador é um erro.

Escrevi-lhe pessoalmente.

Naturalmente, uma execução de último preço não faz sentido (disparate).

 
Sergey Chalyshev:

Pode testar num futuro de acções, por exemplo, Si ?


Melhor. Em carraças reais, mas o TP é executado em barbatanas.

 
fxsaber:

Não é bom.

Não, há algo de errado com o seu testador. Como se testa em todas as carraças ou carraças reais?

Experimente em Si.

Às 9:45 o mercado ainda está fechado, qualquer coisa pode estar lá nesse momento, tem de abrir depois das 10:01.
 
Sergey Chalyshev:

Se um símbolo de troca e uma conta de compensação, só então será aceite o limite ao preço actual.

Infelizmente, todas as marcas (incluindo TP) são executadas em barbatanas de barbatanas. Por conseguinte, é melhor não utilizar os mercados no Testador.

 
E o acesso a todas as barras carregadas a partir do testador? Responda-me, por favor. Ou explicar porque é que esta restrição artificial é necessária.
 
Alexey Kravchenko:
Então e o acesso a todas as barras carregadas do testador? Responda-me, por favor. Ou explicar porque é que esta limitação artificial é necessária.

Para acelerar os testes de 99% dos EAs.

Para os restantes 1%, pode ser inserida uma muleta.

Razão: