MT5와 속도 - 페이지 18

 
Renat Fatkhullin :

상태 5000과 unlim이 두 개뿐입니까?

당신은 당신 자신의 행복의 건축가입니다.

예, 완전한 통제 또는 피상적 인 통제가 필요합니다. 나는 중간 옵션의 요점을 보지 못합니다.
 
Renat Fatkhullin :

이론적으로 그렇습니다.

동기화 프로세스를 잊지 마십시오. 플랫폼의 수많은 프로세스가 비동기식입니다.

예를 들어, 거래소 또는 유동성 공급자가 있는 통합 게이트웨이는 몇 초 또는 몇 분의 지연이 있는 트랜잭션에 대한 보고서를 보낼 수 있습니다. 종종 api는 확인을 위해 기록에 대한 액세스를 전혀 제공하지 않지만 느리고 비실시간 보고서 생성기를 제공합니다.

개장 시 또는 예상치 못한 게이트웨이 재접속으로 인해 보고가 지연될 수 있습니다. 그것들은 서버의 히스토리에 복제되고 터미널에 비동기식으로 즉시 전송됩니다. 날짜순으로 정렬되어 있기 때문에 올바른 위치에 삽입되며 이때 새로운 거래를 열 수 있습니다.

대부분의 통합 API는 문맹이고 작동하지 않기 때문에 보장된 게이트웨이를 만드는 것이 거의 불가능합니다. 이것이 개발자의 고의적인 방해 행위의 산물이라는 의견이 있지만.

선택할 권리를 줄 수 있습니까? 물리적 스냅이 필요한 사람과 해당 위험이 있는 지수로 작업해야 하는 사람.

 
이 주제와 관련이 없는 댓글은 " MQL5 MT5 MetaTrader 5 초보자의 질문 "으로 이동되었습니다.
 
fxsaber :

선택할 권리를 줄 수 있습니까? 물리적 스냅이 필요한 사람과 해당 위험이 있는 지수로 작업해야 하는 사람.

그리고 Expert Advisor에 로컬 캐시를 유지하고 마지막 업데이트 시간을 기준으로 선택하면 어떤 문제가 있습니까? 나는 이것을 하고 브레이크는 이것으로 결코 일어나지 않았다. 내 네트워크 기능은 동기 구현으로 인해 전체 인터페이스의 속도를 늦추므로 WebRequestAsync 를 즉시 사용하는 것이 좋을 것입니다. 비록 이미 DLL이나 C ++ 래퍼가 있는 파이썬 무리를 많이 찾고 있기 때문입니다. 파이썬에는 거래 API가 있습니다 :)

그러나 로컬 캐싱 없이 많은 양의 데이터로 작업하는 것은 매우 이상합니다.

추신. 일반적으로 해시맵과 캐싱은 다중 통화에서 큰 수요가 있으므로 이 스레드의 위 상자에서 일반(빠른 읽기) 해시맵을 요청했습니다.
Документация по MQL5: Сетевые функции / WebRequest
Документация по MQL5: Сетевые функции / WebRequest
  • www.mql5.com
Для использования функции WebRequest() следует добавить адреса серверов в список разрешенных URL во вкладке "Советники" окна "Настройки". Порт сервера выбирается автоматически на основе указанного протокола - 80 для "http://" и 443 для "https://". Функция WebRequest() является синхронной, это означает, что она приостанавливает выполнение...
 
Andrey Pogoreltsev :

그리고 Expert Advisor에 로컬 캐시를 유지 하고 마지막 업데이트 시간을 기준으로 선택 하는 문제는 무엇입니까?

스크립트 가 이 작업을 수행합니다.

로컬 캐시의 경우 히스토리는 MT4Orders에서 구현됩니다 .

 
fxsaber :

로컬 캐시의 경우 히스토리는 MT4Orders에서 구현됩니다 .

2년 전의 대본이 이렇게 될 줄은 몰랐습니다.

거래, 자동 거래 시스템 및 거래 전략 테스트에 관한 포럼

OrderCloseTime 전문가 고문 MQL5

fxsaber , 2018.07.06 00:49

 #include <MT4Orders.mqh> // https://www.mql5.com/en/code/16006

void LastTimeMQL4( datetime &OpenTime, datetime &CloseTime )
{
   for ( int i = OrdersHistoryTotal() - 1 ; i >= 0 ; i--)
     if ( OrderSelect (i, SELECT_BY_POS, MODE_HISTORY) && (OrderType() <= OP_SELL))
    {
      OpenTime = OrderOpenTime();
      CloseTime = OrderCloseTime();
      
       break ;
    }
}

void LastTimeMQL5( datetime &OpenTime, datetime &CloseTime )
{
   if ( HistorySelect ( 0 , INT_MAX ))
  {
     for ( int i = HistoryDealsTotal () - 1 ; i >= 0 ; i--)
    {
       const ulong Ticket = HistoryDealGetTicket (i);
  
       if ( HistoryDealGetInteger (Ticket, DEAL_ENTRY ) == DEAL_ENTRY_OUT )
      {
        CloseTime = ( datetime ) HistoryDealGetInteger (Ticket, DEAL_TIME );

         if ( HistorySelectByPosition ( HistoryDealGetInteger (Ticket, DEAL_POSITION_ID )))
          OpenTime = ( datetime ) HistoryDealGetInteger ( HistoryDealGetTicket ( 0 ), DEAL_TIME );
          
         break ;
      }
    }
  }
}

typedef void (*GetLastTime)( datetime &, datetime & );

void Bench( GetLastTime LastTime, const int Amount = 10000 )
{
   datetime OpenTime, CloseTime;
   datetime Tmp = 0 ;

   for ( int i = 0 ; i < Amount; i++)
  {
    LastTime(OpenTime, CloseTime);
    
    Tmp += CloseTime - OpenTime;        
  }
  
   Print (Tmp);
}

#define BENCH(A)                                                              \
{                                                                             \
   const ulong StartTime = GetMicrosecondCount ();                              \
  A;                                                                          \
   Print ( "Time[" + #A + "] = " + ( string )( GetMicrosecondCount () - StartTime)); \
}

#define PRINT(A) Print ( #A + " = " + ( string )(A))

void OnStart ()
{  
   if ( HistorySelect ( 0 , INT_MAX ))
    PRINT( HistoryDealsTotal ());

  BENCH(Bench(LastTimeMQL4))
  BENCH(Bench(LastTimeMQL5))  
}


그런 브레이크를 보여줄 것입니다!

 // Первый запуск
2020.08 . 28 22 : 01 : 12.941 HistoryDealsTotal () = 9435
2020.08 . 28 22 : 01 : 13.198 2046.04 . 30 00 : 13 : 20
2020.08 . 28 22 : 01 : 13.198 Time[Bench(LastTimeMQL4)] = 257277
2020.08 . 28 22 : 01 : 43.982 2046.04 . 30 00 : 13 : 20
2020.08 . 28 22 : 01 : 43.982 Time[Bench(LastTimeMQL5)] = 30783493

// Второй запуск
2020.08 . 28 22 : 03 : 31.474 HistoryDealsTotal () = 9435
2020.08 . 28 22 : 03 : 31.724 2046.04 . 30 00 : 13 : 20
2020.08 . 28 22 : 03 : 31.724 Time[Bench(LastTimeMQL4)] = 250491
2020.08 . 28 22 : 04 : 02.011 2046.04 . 30 00 : 13 : 20
2020.08 . 28 22 : 04 : 02.011 Time[Bench(LastTimeMQL5)] = 30286258

순수 MQL5는 부분(HistorySelectByPosition만) 캐싱보다 100배 느립니다.

 
테스트는 일반적으로 허용되지 않습니다.

MQL5 스타일의 전체 깊이에 대해 10,000개의 HistorySelect 선택 을 구체적으로 테스트했습니다. 예, 사이클이 추가로 감겨졌습니다.

조건에 대한 명확한 초기 설명, 명백한 편견에 대한 설명 및 충격적인 숫자 발행이 없으면 이것은 순수한 속임수 및 사기입니다.

늑대 티켓 전시와 같은 더러운 게임을 위해.
 
Renat Fatkhullin :
테스트는 일반적으로 허용되지 않습니다.

MQL5 스타일의 전체 깊이에 대해 10,000개의 HistorySelect 선택을 구체적으로 테스트했습니다. 예, 사이클이 추가로 감겨졌습니다.

조건에 대한 명확한 초기 설명, 명백한 편견에 대한 설명 및 충격적인 숫자 발행이 없으면 이것은 순수한 속임수 및 사기입니다.

늑대 티켓 전시와 같은 더러운 게임을 위해.

글쎄, 당신의 인식은 잘못되었습니다. 속도 저하가 없도록 자신을 캐시하는 것이 올바른 것으로 표시됩니다.

내가 올바르게 이해했다면이 구현 후에

거래, 자동 거래 시스템 및 거래 전략 테스트에 관한 포럼

MT5와 속도

레나트 팻쿨린 , 2020.08.27 22:58

우리는 이미 가져오기 작업을 많이 최적화했으며 이제 최적의 캐시 업데이트에 대해 생각하고 있습니다. 실제로 가져오기의 99%가 완전히 쓸모없고 실제로 건너뛸 때입니다.

즉, 샘플 제한을 의도적으로 무작위화하지 않으면 캐시에 100%에 가까운 적중이 표시됩니다.

아마도 다음 주에 효과적인 해결책이 나올 것입니다.


이 예제는 훨씬 빠르게 실행됩니다.


ЗЫ 스크립트는 거래 내역에서 마지막 포지션의 개장/마감 시간을 계산합니다.

 
fxsaber :

속도 저하가 없도록 자신을 캐시하는 것이 올바른 것으로 표시됩니다.

이와 같이 "캐시"하면 매우 빠릅니다 .

 void LastTimeMQL5( datetime &OpenTime, datetime &CloseTime )
{
   static ulong PrevTicketIn = 0 ;   // Хранит тикет входа позиции с последнего вызова.
   static ulong PrevTicketOut = 0 ; // Хранит тикет выхода позиции с последнего вызова.
  
   if ( HistorySelect ( 0 , INT_MAX ))
  {
     for ( int i = HistoryDealsTotal () - 1 ; i >= 0 ; i--)
    {
       const ulong Ticket = HistoryDealGetTicket (i);
      
       if (Ticket == PrevTicketOut)            
      {
        OpenTime = ( datetime ) HistoryDealGetInteger (PrevTicketIn, DEAL_TIME );
        CloseTime = ( datetime ) HistoryDealGetInteger (PrevTicketOut, DEAL_TIME );        
        
         break ;
      }
       else if ( HistoryDealGetInteger (Ticket, DEAL_ENTRY ) == DEAL_ENTRY_OUT )
      {
        PrevTicketOut = Ticket;
        
        CloseTime = ( datetime ) HistoryDealGetInteger (Ticket, DEAL_TIME );

         if ( HistorySelectByPosition ( HistoryDealGetInteger (Ticket, DEAL_POSITION_ID )))
        {
          PrevTicketIn = HistoryDealGetTicket ( 0 );
          OpenTime = ( datetime ) HistoryDealGetInteger (PrevTicketIn, DEAL_TIME );
        }
          
         break ;
      }
    }
  }
}

누가 그렇게 글을 쓰나요?

 
fxsaber :

이와 같이 "캐시"하면 매우 빠릅니다.

누가 그런 글을 쓰나요?

C 프로그래머.