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

 
papaklass :

...

확인. 당신의 입장은 분명합니다.
 

그런 조언자가 실생활에서 하나의 코어의 힘이 부족하다는 것은 상상하기조차 어렵습니다. 예를 들어 테스터에서 Expert Advisor가 하루에 하나의 심볼에 대한 연간 기록을 한 번만 통과하면(이것은 엄청난 양입니다! 아마도 코드를 다시 작성해야 할 것입니다!), 실제로는 다음과 같이 프로세서를 로드합니다. 평균 1/250 전력 = 0.4%

10개 기호에 대한 어드바이저의 경우 평균 부하는 4%입니다. 다른 커널을 로드하는 데에는 별 의미가 없습니다.

 

Konstantin ( Lizar )의 아이디어에 관해서는 제 생각에는 나쁘지 않습니다. 그러나 이러한 결정의 경우 차트에서 직접 발생하는 이벤트와 사용자 지정으로 생성된 이벤트를 분리하는 것은 문제가 되지 않습니다. 저것들. 두 개의 이벤트 대기열과 그에 따라 두 개의 핸들러(사용자 지정 이벤트의 경우 OnUserEvents와 같은 것)가 있으면 좋을 것입니다.

또한 사용자 지정 이벤트에 대한 흥미로운 추가 기능은 우선 순위(예: 0에서 9까지)를 명시적으로 지정하는 기능으로 사용자가 특정 이벤트의 선점 및 처리를 제어할 수 있도록 합니다. 예를 들어, 이러한 기회는 더 낮은 값으로 이벤트를 실행하고 더 큰 값으로 대기열에서 제거할 수 있도록 합니다(대기열이 더 중요한 이벤트로 가득 차 있으면 새 이벤트는 대기열에 추가되지 않음).

papaklass :

나는 소프트웨어 개발을 해본 적이 없어서 소프트웨어 개발자의 기술 언어를 말할 수 없습니다. 4코어 컴퓨터와 MT5에서 얻고자 하는 것을 설명하겠습니다. 일반적으로 다음과 같습니다.


1. 현재에도 여러 도구를 처리하는 것이 가능하며 여기에서 개발자는 완전히 실행 가능한 솔루션을 만들었습니다.

2. 테스터의 작업과 많은 코어를 희생합니다. 이것은 특수한 경우이며, 이 메커니즘을 실제 거래와 비교하는 것은 기본적으로 옳지 않습니다. 테스터로 문제를 해결하는 핵심은 전문가(또는 오히려 한 명의 전문가 + 일련의 고유한 매개변수)에 대한 여러 옵션이 있으므로 사용 가능한 모든 코어/에이전트에 계산을 배포하는 것이 매우 합리적이라는 것입니다. 따라서 전체 작업 세트에 대해 비동기식을 얻지만 단일 에이전트의 관점에서는 모든 것이 동기화됩니다.

3. 멀티스레딩의 경우 여러 기호를 동시에 처리하는 것이 아니라 한 번에 여러 이벤트를 처리하는 것입니다(특정 개별 Expert Advisor의 프레임워크 내에서). 하나 이상의 터미널 버전에 없는 것.

개발자도 이해할 수 있습니다. 오버헤드 비용이 너무 높거나 사용자 구성이 너무 "다양함"이며 "다중 스레드" Expert Advisor가 액세스할 수 있는 데이터 동기화 문제가 너무 많습니다.

반면에 사건이 있는 아이디어는 논리적으로 끝나지 않습니다. "멀티스레딩"은 구현하기에 비용이 많이 들고 문제가 있지만 터미널 자체 내에서 프로세스와 정보 흐름을 최대한 병렬화할 수 있으며 최대 작업 수를 해결하기에 충분한 핸들러 세트를 생성할 수 있습니다. ).

 
papaklass :

2010년 1월 4일 - 2011년 9월 1일 기간 동안 M5에 대한 나의 전문가 고문은 12개 통화에 대해 1436초(24분) 동안 단일 패스를 만들고 동시에 5687개의 거래를 만듭니다. 이 경우 하나의 코어만 로드되고 나머지 3개는 유휴 상태입니다. 즉, 플랫폼이 컴퓨터의 전원을 사용하지 않기 때문에 각 단일 패스에서 시간의 3/4을 잃게 됩니다. 전략을 디버깅할 때 이는 플랫폼의 중요한 단점입니다. 커널은 최적화를 위해서만 완전히 사용됩니다. 그러나 최적화는 단일 실행보다 훨씬 드뭅니다. 그리고 단일 실행에서는 많은 시간이 낭비됩니다.

"잃어버린 시간의 3/4" 접근 방식은 귀하가 생각하는 바를 나타냅니다. 멀티스레딩 사용은 갑자기 놓친 기회일 뿐이며 개발자의 명확한 감독입니다.

불행히도 순차 작업에 대한 멀티스레딩(테스터의 단일 패스는 순차 작업임)은 무료가 아닙니다. 실제로 멀티스레딩은 프로세스 동기화에 막대한(때로는 여러) 손실이 있습니다. 사실, 공유 리소스에 대한 모든 액세스는 동기화 장치와 연결되어야 합니다.

테스터가 차단 없이 테스트 시간의 거의 99%에서 하나의 스레드에서 작동할 수 있도록 의도적으로 테스터를 터미널에서 별도의 프로세스로 옮겼습니다. 이로 인해 속도가 크게 향상되었습니다.

"모든 전문가에게 멀티태스킹을 밀어 넣자"라는 문장은 이 경우 멀티스레딩의 비용(전체 속도 저하)과 결과(속도 저하 + 비전문 개발자의 99%에 대한 지붕 철거)에 대한 완전한 오해에서 비롯된 것입니다.


터미널 및 테스터에서 멀티태스킹 사용 문제를 효과적으로 해결하고 원격 에이전트 및 MQL5 클라우드 네트워크 모드에서 거의 무제한에 가까운 전력 확장 모드를 활성화했습니다.


나는 당신의 터미널에 대해 모른다. 저에게 12개의 차트를 열고 하나의 지표를 매달면 어떤 시점에서 터미널이 느려지기 시작하는지 육안으로 알 수 있습니다. 포럼의 메시지로 판단하면 이것은 나에게만 일어나는 것이 아닙니다. 따라서 이들은 하나의 표시기가 있는 12개의 도구입니다. 그리고 계기와 표시기의 수를 늘려야 하는 경우 터미널이 다운됩니다. 동시에 하나의 코어가 사용되고 나머지는 나머지 코어가 사용됩니다. 그렇다면 다른 코어를 로드하는 것이 의미가 있습니까? 코어에 터미널 프로세스 를 배포할 때, 즉 컴퓨터 성능을 최대한 활용하면 다른 수준의 문제를 해결할 수 있습니다. 그게 내가 말하는거야.

다른 기호가 있는 12개의 다른 차트가 있는 경우 각 차트의 기호는 분명히 다른 항목에 영향을 주지 않고 자체 스트림에서 작동합니다.

차트가 느려지기 시작하면 그 이유는 진부합니다. 지표 중 하나는 매우 비경제적입니다. 이 경우 루트는 효율성에 신경 쓰지 않고 이마에 표시기를 쓰는 프로그래머의 작업 결과에 있기 때문에 멀티 태스킹이 도움이되지 않습니다.

 

역 차트를 얻을 수 없습니다. 이해할 수 없는 부분이 있습니다. 새 막대 가 이 옵션에 버그가 있습니다.

바라보고 있던 오리지날 인디케이터를 동봉

 int OnCalculate ( const int rates_total,
                 const int prev_calculated,
                 const datetime &time[],
                 const double &open[],
                 const double &high[],
                 const double &low[],
                 const double &close[],
                 const long &tick_volume[],
                 const long &volume[],
                 const int &spread[])
  {
//---- проверка количества баров на достаточность для расчета
   for ( int numb= 0 ; numb< 8 ; numb++) if ( BarsCalculated (RSI_Handle[numb])<rates_total) return (RESET);
   if (rates_total<min_rates_total) return (RESET);

//---- объявления локальных переменных 
   int to_copy;

//---- расчеты необходимого количества копируемых данных
   if (prev_calculated>rates_total || prev_calculated<= 0 ) // проверка на первый старт расчета индикатора
      to_copy=rates_total- 1 ;                   // стартовый номер для расчета всех баров
   else to_copy=rates_total-prev_calculated+ 1 ; // стартовый номер для расчета новых баров
   
//---- копируем вновь появившиеся данные в массивы
   if ( CopyBuffer (RSI_Handle[ 0 ], 0 , 0 ,to_copy,Buffer1)<= 0 ) return (RESET);
   if ( CopyBuffer (RSI_Handle[ 1 ], 0 , 0 ,to_copy,Buffer2)<= 0 ) return (RESET);
   if ( CopyBuffer (RSI_Handle[ 2 ], 0 , 0 ,to_copy,Buffer3)<= 0 ) return (RESET);
   if ( CopyBuffer (RSI_Handle[ 3 ], 0 , 0 ,to_copy,Buffer4)<= 0 ) return (RESET);
   if ( CopyBuffer (RSI_Handle[ 4 ], 0 , 0 ,to_copy,Buffer5)<= 0 ) return (RESET);
   if ( CopyBuffer (RSI_Handle[ 5 ], 0 , 0 ,to_copy,Buffer6)<= 0 ) return (RESET);
   if ( CopyBuffer (RSI_Handle[ 6 ], 0 , 0 ,to_copy,Buffer7)<= 0 ) return (RESET);
   if ( CopyBuffer (RSI_Handle[ 7 ], 0 , 0 ,to_copy,Buffer8)<= 0 ) return (RESET);
   
   //мой кусок отсель   
   if (Reverse)
      {
         int start=prev_calculated;
         for ( int i=start;i<rates_total;i++)
            {
               Buffer1[i]= 100 -Buffer1[i];
               Buffer2[i]= 100 -Buffer2[i];
               Buffer3[i]= 100 -Buffer3[i];
               Buffer4[i]= 100 -Buffer4[i];
               Buffer5[i]= 100 -Buffer5[i];
               Buffer6[i]= 100 -Buffer6[i];
            }
         Buffer1[ 0 ]= 100 -Buffer1[ 0 ];
         Buffer2[ 0 ]= 100 -Buffer2[ 0 ];
         Buffer3[ 0 ]= 100 -Buffer3[ 0 ];
         Buffer4[ 0 ]= 100 -Buffer4[ 0 ];
         Buffer5[ 0 ]= 100 -Buffer5[ 0 ];
         Buffer6[ 0 ]= 100 -Buffer6[ 0 ];
       }  
   //досель    

//----     
   return (rates_total);
  }
//+------------------------------------------------------------------+

파일:
Multi_RSI.mq5  15 kb
 

무엇이 문제인지 말해줘

다중 통화 쓰기

MA 표시기 핸들 가져오기

maHandle_EURUSD= iMA ( "EURUSD" , PERIOD_H1 ,MA_Period_EURUSD,MA_Shift_EURUSD, MODE_SMA , PRICE_CLOSE );

maHandle_GBPUSD= iMA ( "GBPUSD" , PERIOD_H1 ,MA_Period_GBPUSD,MA_Shift_GBPUSD, MODE_SMA , PRICE_CLOSE ); 

나는 챔피언십에서 허용된 다른 10개 통화에 대해 동일한 작업을 수행하지만 테스트할 때 즉시 오류 4801이 발생하고 12개 통화가 모두 기록에 있습니다(일종의)

EURUSD 차트에서 테스트를 실행합니다.

고문이 GBPUSD 쌍 을 테스트 중입니다(최적화를 위해 설정에서 설정했습니다)

 
Lazarev :

무엇이 문제인지 말해줘

다중 통화 쓰기

MA 표시기 핸들 가져오기

나는 챔피언십에서 허용된 다른 10개 통화에 대해 동일한 작업을 수행하지만 테스트할 때 즉시 오류 4801이 발생하고 12개 통화가 모두 기록에 있습니다(일종의)

EURUSD 차트에서 테스트를 실행합니다.

고문이 GBPUSD 쌍을 테스트 중입니다(최적화를 위해 설정에서 설정).

"시장 감시" SymbolSelect 에 기호를 추가해야 합니다.
 

papaklass :

이제 이 간단한 질문에 답해 주세요....

예의가 아니더라도 더 간단하게 답변해 드리겠습니다.

불행히도, 당신은 절대적으로 접촉하지 않고 프로세스에 대한 피상적인 아이디어만 보여주는 진술을 합니다.

동기화의 기본 문제와 그 제공의 손실도 이해되지 않는 것처럼 우리의 기술적인 주장의 대부분이 이해되지 않을까봐 두렵습니다.

추신: "당신이 우리에게 주장에 대해 이야기하면 우리는 추론할 것입니다"라고 요청할 필요가 없으며 상황은 절대적으로 분명합니다.

 

초보자에게 다음 질문에 대한 답을 찾지 못했습니다.

1) 동적 배열 에 다음 요소를 추가할 때 ArrayResize를 사용하여 확장해야 합니까?

2) MQL5에 동적 배열 i(예: 배열 중간)에서 요소를 제거하는 기능이 있습니까? 그렇지 않다면 언어를 사용하여 이를 수행하는 가장 좋은 방법은 무엇입니까?

Документация по MQL5: Основы языка / Типы данных / Объект динамического массива
Документация по MQL5: Основы языка / Типы данных / Объект динамического массива
  • www.mql5.com
Основы языка / Типы данных / Объект динамического массива - Документация по MQL5
 
Fia :

초보자에게 다음 질문에 대한 답을 찾지 못했습니다.

1) 동적 배열 에 다음 요소를 추가할 때 ArrayResize를 사용하여 확장해야 합니까?

약간의 여백을 두고 배열의 크기를 만들고 한계에 가까워지면 크기를 늘립니다. 크기가 자동으로 증가하고 끝에 추가되지 않습니다. ArrayInitialize () 함수의 예를 참조하십시오.