오류, 버그, 질문 - 페이지 1863

 
fxsaber :

테스터의 ACCOUNT_PROFIT는 넌센스를 보여줍니다.


나는 추가할 것이다:

1. 교환상품의 경우

Как следствие, неправильно оцениваются эквити, просадка и т.д.

2. 어드바이저의 논리는 포지션의 총 손익에 초점을 맞출 때도 잘못 작동합니다.

닫을 때 ACCOUNT_PROFIT의 판독값에 초점을 맞춥니다.

 2017.04 . 20 11 : 30 : 26.318 Core 1    2017.04 . 17 18 : 02 : 46    Профит = 333.01

닫을 때 터미널은 이익을 다시 계산하고 결과적으로

손해를 입다

 2017.04 . 20 11 : 30 : 26.318 Core 1    2017.04 . 17 22 : 02 : 08    Профит = - 338.66

결과적으로 우리는

 #include <Trade\PositionInfo.mqh>
#include <Trade\Trade.mqh>
//--- global variable
CPositionInfo  m_position;                   // trade position object
CTrade         m_trade;                       // trading object
input      string symb= "GOLD-6.17" ;
input      string symb1= "GOLD-9.17" ;
input      double   ТП  = 333 ;
datetime date1;
double i1,ask1,ask2,bid1,bid2,last1,last2,profit;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit ()
  {
//---
   double price1= SymbolInfoDouble (symb, SYMBOL_BID );
   double price2= SymbolInfoDouble (symb1, SYMBOL_BID );
   return ( INIT_SUCCEEDED );
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnDeinit ( const int reason)
  {
Comment("");
   }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+

void OnTick ()
  {
//---
      profit= AccountInfoDouble ( ACCOUNT_PROFIT );
       Comment ( "ПРофит = " ,profit);
     if ( PositionsTotal ()== 0 )
     {
      m_trade.Buy( 1.00 ,symb);
      m_trade.Buy( 1.00 ,symb1);    
     }

   if ( MathAbs (profit)>=ТП )
     {
       Print ( "Профит = " ,profit);
     CloseAll();
     }

  }  
//+------------------------------------------------------------------+
void CloseAll()
  {
   for ( int i= PositionsTotal ()- 1 ;i>= 0 ;i--) // returns the number of open positions
       if (m_position.SelectByIndex(i))
         m_trade.PositionClose(m_position.Ticket());
  }
//+------------------------------------------------------------------+

 
kaus_bonus :

나는 추가할 것이다:

SD 이해하기...
 
Slawa :
분명히, 나는 HFT에서 뭔가를 이해하지 못합니다. 내가 아는 한, "매우 빠르게" 거래할 때 이전 거래에 대해서는 신경 쓰지 않습니다.

HFT는 거래가 많은 TS를 예로 들었습니다.

일부 스캘퍼로 장기간 런을 할 수 있습니다. 가장 중요한 것은 많은 트랜잭션(수만)이 있다는 것입니다. 그러면 현재의 역사 작업 구현의 단점이 나타납니다.


지금 상황이 이렇습니다. 거래가 많으면 내역을 참조하지 마십시오.

 
fxsaber :
SD 이해하기...


이것은 멋지다.

적절한 결과를 얻으려면 LAST 가격의 사용을 제거하는 것으로 충분합니다.

 

포지션 시작 가격에서 손절매까지의 포인트에서 최소 오프셋 을 찾고 이익 수준을 취하여 시작 가격에 너무 가깝게 두지 않고 오류 10016(TRADE_RETCODE_INVALID_STOPS)이 발생하지 않도록 도와주세요. SymbolInfoInteger를 사용해 보았지만(아래 코드 참조) 이 계산은 0을 반환합니다. 누구든지 올바르게 계산하는 방법에 대한 아이디어를 줄 수 있다면.

 void OnStart ()
  {
   long stopLevel;
   if ( SymbolInfoInteger ( "EURUSD" , SYMBOL_TRADE_STOPS_LEVEL ,stopLevel))
       Print ( "stopLevel = " ,stopLevel);
  }
 
Maxim Khrolenko :

포지션 시작 가격에서 손절매까지의 포인트에서 최소 오프셋 을 찾고 이익 수준을 취하여 시작 가격에 너무 가깝게 두지 않고 오류 10016(TRADE_RETCODE_INVALID_STOPS)이 발생하지 않도록 도와주세요. SymbolInfoInteger를 사용해 보았지만(아래 코드 참조) 이 계산은 0을 반환합니다. 누구든지 올바르게 계산하는 방법에 대한 아이디어를 줄 수 있다면.


0 - 제한 없음. 그러나 SYMBOL_SESSION_PRICE_LIMIT_MIN 및 SYMBOL_SESSION_PRICE_LIMIT_MAX도 있습니다.
 
fxsaber :

0 - 제한 없음. 그러나 SYMBOL_SESSION_PRICE_LIMIT_MIN 및 SYMBOL_SESSION_PRICE_LIMIT_MAX도 있습니다.
흠, 이 경우에는 SYMBOL_TRADE_STOPS_LEVEL이 어떻게든 다르게 작동했으면 합니다. 0 - 제한이 없으면 이론적으로 .PositionOpen(...)을 서버에 보낼 때 공개 가격 에서 1포인트(5자리)에서 중지할 수 있지만 100% 오류 TRADE_RETCODE_INVALID_STOPS는 팝업. 내가 붙어있는 동안.
 
Maxim Khrolenko :
흠, 이 경우에는 SYMBOL_TRADE_STOPS_LEVEL이 어떻게든 다르게 작동했으면 합니다. 0 - 제한이 없으면 이론적으로 .PositionOpen(...)을 서버에 보낼 때 공개 가격 에서 1포인트(5자리)에서 중지할 수 있지만 100% 오류 TRADE_RETCODE_INVALID_STOPS는 팝업. 내가 붙어있는 동안.

그래서?

 if (stoplevel== 0 ) stoplevel= SymbolInfoInteger (symb, SYMBOL_SPREAD );
 
테스터에게 다시 무언가가 수행되었습니다 - 1586. 재생을 위한 Expert Advisor
 #include <MT4Orders.mqh>

// Metaquotes-Demo, RTS-6.17, 2017.04.07 - 2017.04.08, на основе реальных тиков, начальный баланс 100000
void OnTick ()
{  
   static int Type = OP_BUY ;

   MqlTick Tick;    
  
   if ( OrderSelect ( 0 , SELECT_BY_POS ) && ( OrderType () <= OP_SELL ))
     OrderClose ( OrderTicket (), OrderLots (), OrderClosePrice (), 0 );    
   else if (( OrdersTotal () == 0 ) && SymbolInfoTick ( _Symbol , Tick) && (Tick.bid != 0 ) && (Tick.ask != 0 ))
  {
     OrderSend ( _Symbol , Type + OP_BUYLIMIT , 1 , (Type == OP_BUY ) ? Tick.ask : Tick.bid, 0 , 0 , 0 );
    
    Type = OP_SELL - Type;
  }    
}

각 틱에서 현재 가격에 제한을 두거나(즉시 채워짐) 포지션을 닫습니다 . 저것들. 포지션이 많아야 합니다. 그러나 이것은 그렇지 않습니다. 왜냐하면 제한이 더 이상 적용되지 않습니다. 여기에 로그의 끝이 표시됩니다.

 2017.04 . 20 12 : 47 : 41.885 2017.04 . 07 10 : 00 : 00    sell limit 1.00 RTS- 6.17 at 114060 ( 114060 / 114180 / 113770 )
2017.04 . 20 12 : 47 : 41.885 2017.04 . 07 23 : 44 : 59    order canceled due end of test [ # 140 sell limit 1.00 RTS- 6.17 at 114060 ]
2017.04 . 20 12 : 47 : 41.885 final balance 91195.12 RUR
2017.04 . 20 12 : 47 : 41.885 RTS- 6.17 ,M1: 327182 ticks, 788 bars generated. Test passed in 0 : 00 : 00.218 .

SellLimit은 Bid에 의해 설정되었지만 결코 이행되지 않았습니다.

1585년에는 모든 것이 정상이었습니다.

 
fxsaber :
테스터에게 다시 무언가가 수행되었습니다 - 1586.

그리고 그것이 잘못되었다는 것을 이해하지만 여전히 빌드 릴리스에 대한 일종의 잘못된 접근 방식에 대한 인상이 있습니다. 이전에는 빌드 릴리스 이후에 일관되게 많은 수의 버그 보고서가 없었던 것 같습니다.