MetaTrader 5 전략 테스터: 오류, 버그, 개선 제안 - 페이지 42

 
fxsaber :

모든 캐릭터에 대한 플레이 지침을 사용할 수 있습니다. 질문이 있습니다. 그냥 실행하십시오.

아니요, 당신이 더 좋습니다. 당신의 코드를 알아내는 동안 내가 그것을 시작한 이유를 잊을 것입니다))

예를 들어 Si 와 같은 교환 선물에서 테스트할 수 있습니까? 테스트를 위해 교환 계정을 제공합니까?

 
Sergey Chalyshev :

아니요, 당신이 더 좋습니다. 당신의 코드를 알아내는 동안 내가 그것을 시작한 이유를 잊을 것입니다))

예를 들어 Si 와 같은 교환 선물에서 테스트할 수 있습니까? 테스트를 위해 교환 계정을 제공합니까?

거래소의 낮은 유동성과 주문 대기열의 문제가 있습니다. 따라서 모스크바 거래소 의 테스터는 정확하지 않습니다. Forex에서는 실제로 작은 로트에서 이러한 현상이 없습니다. 가끔 발생하지만.

 
Sergey Chalyshev :

테스트를 위해 교환 계정을 제공합니까?

하자. 하지만 바로 예약하겠습니다. 테스터에서 마지막 가격으로 실행하는 것은 실수입니다.

 
테스터의 정확성에 대한 인증 코드입니다.
 #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 ();
}


올바르게 수행되면 다음과 같아야 합니다.

 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 :

하자. 하지만 바로 예약하겠습니다. 테스터에서 마지막 가격으로 실행하는 것은 실수입니다.

비공개로 썼습니다.

당연히 last의 실행은 의미가 없습니다(넌센스).

 
Sergey Chalyshev :

예를 들어 Si 와 같은 교환 선물에서 테스트할 수 있습니까?


더 좋습니다. 실제 틱에 의해, 그러나 TP는 오리발에 의해 실행됩니다.

 
fxsaber :

심하게.

아니요, 테스터에 문제가 있습니다. 모든 진드기 또는 실제 진드기에 대해 어떻게 테스트합니까?

시를보십시오.

9시 45분에 시장은 여전히 닫혀 있습니다. 이 시간에는 무엇이든 있을 수 있으므로 10:01 이후에 열어야 합니다.
 
Sergey Chalyshev :

교환 기호와 상계 계정이 있는 경우에만 현재 가격 의 제한 한도가 허용됩니다.

불행히도 모든 시장(TP 포함)은 플리퍼에서 실행됩니다. 따라서 테스터에서 마켓을 사용하지 않는 것이 좋습니다.

 
그러면 테스터에서 로드된 모든 막대에 액세스하는 것은 어떻습니까? 답변 부탁드립니다. 또는 이 인위적인 제한이 필요한 이유를 설명하십시오.
 
Alexey Kravchenko :
그러면 테스터에서 로드된 모든 막대에 액세스하는 것은 어떻습니까? 답변 부탁드립니다. 또는 이 인위적인 제한이 필요한 이유를 설명하십시오.

Expert Advisors의 99% 테스트 속도를 높입니다.

나머지 1%에 대해 목발을 삽입할 수 있습니다.