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

 
거의 유치한 질문: 왜?
 void OnStart ()
{
   const double Norm = NormalizeDouble ( 8905 / 1000.0 , 3 );
   Print (Norm); // 8.904999999999999
   Print ( DoubleToString (Norm, 3 )); // 8.905
  
   const double Norm2 = ( double ) DoubleToString (Norm, 3 );
   Print (Norm2); // 8.904999999999999
   Print (Norm == Norm2); // true
}

어떤 이유에서인지 정규화 후에 DoubleToString 이 의미가 없다고 확신했습니다. 그러나 대본에서 알 수 있듯이 아닙니다. 왜 그런 겁니까?

이중 -> 문자열 캐스트가 제대로 작동하지 않는 것 같습니다.

 
PositionGet 함수는 테스터에서 매우 느리게 작동합니다. 입증하기 위해 그러한 Expert Advisor가 작성되었습니다.
 // #include <TesterBench.mqh> // https://www.mql5.com/ru/code/18804/

input int Interval = 3600 ;
input double Lots = 1 ;

void OnTick ()
{
   if (! PositionSelect ( _Symbol ))
  {
     if ( HistorySelect ( 0 , TimeCurrent ()))
    {
       const int Total = HistoryDealsTotal () - 1 ;

       MqlTradeRequest Request = { 0 };
       MqlTradeCheckResult CheckResult;
  
      Request.action = TRADE_ACTION_DEAL ;
  
      Request.symbol = _Symbol ;
      Request.type = ((Total >= 0 ) && (( ENUM_DEAL_TYPE ) HistoryDealGetInteger ( HistoryDealGetTicket (Total), DEAL_TYPE ) == DEAL_TYPE_SELL )) ?
                     ORDER_TYPE_SELL : ORDER_TYPE_BUY ;;
  
      Request.volume = Lots;
      Request.price = SymbolInfoDouble (Request.symbol, (Request.type == ORDER_TYPE_BUY ) ? SYMBOL_ASK : SYMBOL_BID );

       if ( OrderCheck (Request, CheckResult))
      {
         MqlTradeResult Result;

         const bool AntiWarning = OrderSend (Request, Result);            
      }
    }
  }
   else
  {
     // Если раскоментировать эти строки, одиночный прогон станет на 20% медленнее.
//    string Symbol = ::PositionGetString(POSITION_SYMBOL);
//    string Comment = ::PositionGetString(POSITION_COMMENT);

     if ( TimeCurrent () - PositionGetInteger ( POSITION_TIME ) >= Interval)      
    {
       MqlTradeRequest Request = { 0 };
       MqlTradeResult Result;
      
      Request.action = TRADE_ACTION_DEAL ;
      Request.position = PositionGetInteger ( POSITION_TICKET );
  
      Request.symbol = PositionGetString ( POSITION_SYMBOL );
      Request.type = ( ENUM_ORDER_TYPE )( 1 - PositionGetInteger ( POSITION_TYPE ));
  
      Request.volume = PositionGetDouble ( POSITION_VOLUME );
      Request.price = PositionGetDouble ( POSITION_PRICE_CURRENT );
          
       const bool AntiWarning = OrderSend (Request, Result);
    }
  }
}


노란색 선이 주석 처리된 경우 단일 실행 결과

Core 1    2017.07 . 17 23 : 59 : 58    Interval = 7.09 s.
Core 1   EURUSD,M1: 13369675 ticks, 47426 bars generated. Environment synchronized in 0 : 00 : 00.857 . Test passed in 0 : 00 : 09.720 (including ticks preprocessing 0 : 00 : 01.950 ).
Core 1   EURUSD,M1: total time from login to stop testing 0 : 00 : 10.577 (including 0 : 00 : 00.857 for history data synchronization)


노란색 줄이 주석 처리되지 않은 경우 단일 실행 결과

Core 1    2017.07 . 17 23 : 59 : 58    Interval = 9.336 s.
Core 1   EURUSD,M1: 13369675 ticks, 47426 bars generated. Environment synchronized in 0 : 00 : 00.062 . Test passed in 0 : 00 : 11.997 (including ticks preprocessing 0 : 00 : 01.934 ).
Core 1   EURUSD,M1: total time from login to stop testing 0 : 00 : 12.059 (including 0 : 00 : 00.062 for history data synchronization)


TesterBench 라이브러리 는 동일한 런타임 하락을 보여줍니다.


ZY Brake는 PositionGet 뿐만 아니라 OrderGet, HistoryDealGet, HistoryOrderGet도 지원합니다.

 

테스터(1629)에서 거래는 제로 가격으로 열립니다.

우리는 FIBOGroup-MT5 서버 거래 서버의 실제 틱에 테스터에서 Expert Advisor 를 시작합니다.


 

개발자 및 관심 있는 동료에게 질문합니다.

테스터의 시각화 모드 에서는 CiMA 클래스의 개체인 이동 평균이 사용됩니다.

모드 = "실제 틱을 기반으로 하는 각 틱". Visualizer의 속도가 최대에 가깝습니다.

문제는 이것입니다. 새로운 막대가 나타나면 CiMA 유형의 이동 값이 업데이트되거나 오히려 이동 버퍼의 값이 업데이트되도록 새로운 틱의 구름을 기다려야 합니다.

동시에 CiMA::Refresh(-1) 메서드를 사용하여 각 틱에서 새로 고침이 강제 실행됩니다.

테스터가 왜 그렇게 나쁘게 작동합니까?

실제로는 그러한 문제가 없습니다.

 

이상한 푸시가 이제 사라졌습니다.

uest/302788

요청/302788

짐작할 수 있듯이 후보자로 등록되어 같은 순서로 댓글을 단 사람은 저였습니다.

그러나 메시지는 코더와 같습니다)

 

문서에서

ENUM_BASE_CORNER

식별자

설명

CORNER_LEFT_UPPER

차트의 왼쪽 상단 모서리에 있는 좌표 중심

CORNER_LEFT_LOWER

차트의 왼쪽 하단 모서리에 있는 좌표 중심

CORNER_RIGHT_LOWER

차트의 오른쪽 하단 모서리에 있는 좌표 중심

CORNER_RIGHT_UPPER

차트의 오른쪽 상단 모서리에 있는 좌표 중심

질문: 테이블을 숫자 순서로 컴파일할 수 없는 이유는 무엇입니까? 1을 입력하고 예상되는 " 그래프의 왼쪽 위 모서리에 있는 좌표 중심 " 대신 " 그래프 의 오른쪽 아래에 있는 좌표 중심 "을 얻습니다.

지금은 이런 모습

1 - 그래프의 왼쪽 하단 모서리에 있는 좌표 중심
2 - 그래프의 오른쪽 하단 모서리에 있는 좌표 중심
3 - 차트 오른쪽 상단의 좌표 중심
4 - 그래프의 왼쪽 상단 모서리에 있는 좌표 중심

 
Aleksey Vyazmikin :

문서에서

ENUM_BASE_CORNER

식별자

설명

CORNER_LEFT_UPPER

차트의 왼쪽 상단 모서리에 있는 좌표 중심

CORNER_LEFT_LOWER

그래프의 왼쪽 하단 모서리에 있는 좌표 중심

CORNER_RIGHT_LOWER

차트의 오른쪽 하단 모서리에 있는 좌표 중심

CORNER_RIGHT_UPPER

차트의 오른쪽 상단 모서리에 있는 좌표 중심

질문: 테이블을 숫자 순서로 컴파일할 수 없는 이유는 무엇입니까? 1을 입력하고 예상되는 " 그래프의 왼쪽 위 모서리에 있는 좌표 중심 " 대신 " 그래프 의 오른쪽 아래에 있는 좌표 중심 "을 얻습니다.

지금은 이런 모습

1 - 차트의 왼쪽 하단 모서리에 있는 좌표 중심
2 - 차트의 오른쪽 하단 모서리에 있는 좌표 중심
3 - 그래프 오른쪽 상단의 좌표 중심
4 - 차트의 왼쪽 상단 모서리에 있는 좌표 중심

카운팅은 0부터 시작됩니다.

숫자 대신 CORNER_LEFT_UPPER 를 입력할 수 없는 이유는 무엇입니까? 이를 위해 숫자에 대해 생각할 수 없도록 전송이 이루어집니다.

 

도움으로

MT4:

고정 크기를 가진 개체의 경우: OBJ_BUTTON, OBJ_RECTANGLE_LABEL 및 OBJ_EDIT, OBJPROP_XDISTANCE 및 OBJPROP_YDISTANCE 속성은 X 및 Y 좌표(픽셀 단위)가 계산되는 차트 모서리(OBJPROP_CORNER)를 기준으로 개체의 왼쪽 위 지점 위치를 설정합니다.


MT5:

고정 크기를 가진 개체의 경우: OBJ_BUTTON, OBJ_RECTANGLE_LABEL, OBJ_EDIT 및 OBJ_CHART, OBJPROP_XDISTANCE 및 OBJPROP_YDISTANCE 속성은 X 및 Y 좌표가 시작되는 차트 모서리(OBJPROP_CORNER)를 기준으로 개체의 왼쪽 상단 지점 위치를 설정합니다. 계산.

MT4에만 OBJ_LABEL에 대한 개체의 왼쪽 점이 없습니다. 오른쪽이 있지만 이것은 내 분노를 일으키지 않았습니다. 사실 ObjectSet을 사용하는 이전 MT4 코드에서 개체를 상대적으로 배치할 수 있었습니다. 모서리(모서리) - 왼쪽에 있는 개체의 경우 픽셀은 첫 번째 문자부터 계산되고 오른쪽의 경우에는 마지막 문자부터 계산되며 새 버전은 항상 첫 번째 문자부터 들여쓰기를 계산하므로 레이블을 배치하기 어렵습니다. 텍스트 문자가 몇 개인지 항상 알 수 있는 것은 아니기 때문에 개발자들에게 텍스트 정렬 방식 선택 추가 부탁드립니다!

 //+------------------------------------------------------------------+
//|Функция вывода информации на экран -- Старый вариант              |
//+------------------------------------------------------------------+

void Label_MQL4( string _name, int _window, int _x, int _y, string _text, int _font, color _color, int corner)
  {
   ObjectDelete (_name);
   ObjectCreate (_name, OBJ_LABEL ,_window, 0 , 0 );
   ObjectSet (_name, OBJPROP_CORNER ,corner);
   ObjectSet (_name, OBJPROP_XDISTANCE ,_x);
   ObjectSet (_name, OBJPROP_YDISTANCE ,_y);
   ObjectSetText (_name,_text,_font, "Arial" ,_color);
  }
  
//+------------------------------------------------------------------+
//|Функция вывода информации на экран -- Новый вариант               |
//+------------------------------------------------------------------+
void Label_MQL5( string _name, int _window, int _x, int _y, string _text, int _font, color _color, int corner)
  {
   //corner=4;
   ObjectDelete ( 0 ,_name);
   ObjectCreate ( 0 ,_name, OBJ_LABEL ,_window, 0 , 0 );
   ObjectSetInteger ( 0 ,_name, OBJPROP_CORNER ,corner);
   ObjectSetInteger ( 0 ,_name, OBJPROP_XDISTANCE ,_x);
   ObjectSetInteger ( 0 ,_name, OBJPROP_YDISTANCE ,_y);
   ObjectSetText (_name,_text,_font, "Arial" ,_color);
  }  


MT5에서 좌우 정렬 방법을 아시는 분 계시면 해당 기능 공유 부탁드립니다!

 
Artyom Trishkin :

카운팅은 0부터 시작됩니다.

숫자 대신 CORNER_LEFT_UPPER 를 입력할 수 없는 이유는 무엇입니까? 그렇기 때문에 숫자에 대해 생각할 필요가 없도록 열거가 만들어졌습니다.

기스로부터? 음, 좋습니다. 처음부터 다시 시작합니다. 고려하지 않았지만 여전히 작동하지 않습니다!

나에게 더 명확하고 전에 사용했기 때문에 ...

 
Aleksey Vyazmikin :

기스로부터? 음, 좋습니다. 처음부터 다시 시작합니다. 고려하지 않았지만 여전히 작동하지 않습니다!

나에게 더 명확하고 전에 사용했기 때문에 ...

거기에 없는 숫자 4로 지정하려고 하는 목록 항목을 위로 이동해야 합니까? 0이 되고 모든 것이 제자리에 있습니다.