초보자의 질문 MQL5 MT5 MetaTrader 5 - 페이지 714

 
dimnik :

OnTradeTransaction 을 사용 하여 최적화 시간이 이상하게 변경되었습니다. 15M 시스템, 매우 간단, 1년 기록, 1회 실행 시간은 0.3~0.4초입니다.

최적화를 시작한 후 처음 200-300회 실행은 1초 미만의 속도로 실행되고 다음 실행은 최대 15-20초(50배!)로 느려집니다.

프로세서 과열 및 조절이 없으며 메모리의 절반 이상이 사용 가능합니다(16GB 중).

OnTradeTransaction 핸들러를 사용하기 전에는 이와 같은 것이 없었습니다. 짧은 기간에 더 복잡한 Expert Advisors는 거의 동일한 속도로 최적화되었습니다.

HistoryDealSelect가 속도에 많은 영향을 줍니까? 브레이크를 어떻게 없앨 수 있습니까?

void OnTradeTransaction ( const MqlTradeTransaction &trans,
                         const MqlTradeRequest &request,
                         const MqlTradeResult &result)
  {
   if ( trans.type != TRADE_TRANSACTION_DEAL_ADD ) return ;
   ENUM_TRADE_TRANSACTION_TYPE type=trans.type;
   long      deal_type         = 0 ;
   double    deal_volume       = 0 ;
   long      deal_magic        = 0 ;
   if ( HistoryDealSelect (trans.deal))
     {
      deal_type         = HistoryDealGetInteger (trans.deal, DEAL_TYPE );
      deal_volume       = HistoryDealGetDouble (trans.deal, DEAL_VOLUME );
      deal_magic        = HistoryDealGetInteger (trans.deal, DEAL_MAGIC );
     }
   else
       return ;
   if (deal_type == DEAL_TYPE_BUY && deal_magic == MagicNumber) current_position += deal_volume;
   if (deal_type == DEAL_TYPE_SELL && deal_magic == MagicNumber) current_position -= deal_volume;
      
  }


모든 코드를 표시합니다.
 

여기요!

누가 알겠습니까? 표시기에 막대를 표시하는 방법은 0 막대 오른쪽에 있으며 그 중 최대 개수는 몇 개입니까? (가격 예측)

 
dimnik :

HistoryDealSelect가 속도에 많은 영향을 줍니까? 브레이크를 어떻게 없앨 수 있습니까?

개발자는 히스토리 캐싱을 통해 히스토리 함수(비싼)의 호출을 최소화할 것을 권장합니다.

코드 베이스(MT4Orders)에 이러한 작업 솔루션을 게시했지만 아마도 작동하지 않을 것입니다.

캐싱을 사용한 후 브레이크가 관찰되지 않았습니다.

위협 하지만 OnTradeTransaction 에서 최적으로 작성되지는 않았지만 속도가 느려서는 안 됩니다.

 
Renat Akhtyamov :

여기요!

누가 알겠습니까? 표시기에 막대를 표시하는 방법은 0 막대 오른쪽에 있으며 그 중 최대 개수는 몇 개입니까? (가격 예측)

마지막 막대 의 여는 시간에 PeriodSeconds()를 추가하고 거기에 그래픽 개체로 초를 그립니다. 오른쪽에 보이는 만큼. 그러나 출력이 떨어지면 어떻게 표시되는지 확인하지 않았습니다. 아마도 고려되어야 할 것입니다.
 
Alexey Viktorov :
마지막 막대 의 여는 시간에 PeriodSeconds()를 추가하고 거기에 그래픽 개체로 초를 그립니다. 최대값은 오른쪽에 표시됩니다. 그러나 출력이 떨어지면 어떻게 표시되는지 확인하지 않았습니다. 아마도 고려되어야 할 것입니다.
센크스가 해냈다!
 
Alexey Viktorov :
마지막 막대 의 여는 시간에 PeriodSeconds()를 추가하고 거기에 그래픽 개체로 초를 그립니다. 오른쪽에 보이는 만큼. 그러나 출력이 떨어지면 어떻게 표시되는지 확인하지 않았습니다. 아마도 고려되어야 할 것입니다.

차트에는 계속 표시되지만 불행히도 표시기 창에는 표시되지 않습니다.

물론 제가 틀릴수도...

어떻게 생각하십니까? 제로 바를 넘어 오른쪽으로 표시선을 계속할 수 있습니까?

 
누가 알겠습니까? 제로 바를 넘어 오른쪽으로 표시선을 계속할 수 있습니까?
 
Renat Akhtyamov :
누가 알겠습니까? 제로 바를 넘어 오른쪽으로 표시선을 계속할 수 있습니까?
할 수 있다. 시프트를 설정할 수는 있지만 존재하지 않는 값을 사용하여 계산을 수행하는 것은 작동하지 않을 수 있으며 표시기의 표시에 시간이 사용되지 않습니다. 이것이 내가 그래픽 요소가 있는 막대 표시에 대해 이야기한 이유입니다. ObjectCreate() 는 창(하위 창) 번호와 시간을 모두 포함합니다. 따라서 그래픽 요소를 만드는 데 문제가 없어야 합니다.
 
Alexey Viktorov :
할 수 있다. 시프트를 설정할 수 있지만 존재하지 않는 값을 사용하여 계산을 수행하는 것은 작동하지 않을 수 있으며 표시기의 표시에 시간이 사용되지 않습니다. 이것이 내가 그래픽 요소가 있는 막대 표시에 대해 이야기한 이유입니다. ObjectCreate()는 창(하위 창) 번호와 시간을 모두 포함합니다. 따라서 그래픽 요소를 만드는 데 문제가 없어야 합니다.

차트 창에서 타임스탬프를 사용하여 미래의 암시적 막대를 참조할 수 있습니다. 일어난.

그러나 표시기 창에서는 동일한 작업을 수행할 수 없습니다. 즉, 인덱스가 -1, -2 등인 인디케이터 버퍼에 값을 쓰는 것은 불가능합니다.

질문은 이것입니다.

기본적으로 이해할 수 있습니다. 탈출구는 그래픽 개체를 사용하여 지표를 구축하는 것입니다.

 
Renat Akhtyamov :

차트 창에서 타임스탬프를 사용하여 미래의 암시적 막대를 참조할 수 있습니다. 일어난.

그러나 표시기 창에서는 동일한 작업을 수행할 수 없습니다. 즉, 인덱스가 -1, -2 등인 인디케이터 버퍼에 값을 쓰는 것은 불가능합니다.

질문은 이것입니다.

기본적으로 이해할 수 있습니다. 탈출구는 그래픽 개체를 사용하여 지표를 구축하는 것입니다.

예를 들어("미래"를 표시하기 위해 10개의 막대를 계산해야 하는 경우) 정상 값에서 두 번째 버퍼를 계산한 다음 Buff[9] -- Buff[8] -- Buff[ n] -- Buff[0] , 0이 아닌 오프셋으로 이 버퍼를 출력합니다. 미래 에 필요한 막대 수 만큼 버퍼 오프셋을 설정합니다(이 경우 10).
사유: