MetaTrader 4 클라이언트 터미널 387 및 MetaTrader 4 데이터 센터 빌드 387의 새 버전 - 페이지 4

 
AlexSTAL :

나는 서신을 삭제했지만 그것이 없어도 최적화가 무엇인지 완벽하게 이해합니다 ...

분명히, 최소한의 코드의 도움으로 두려운 것을 공식화하지만 현실에서 재현하지 못한 것을 ...

대화는 완전히 어리석은 것으로 판명되었습니다 ... 표시기 중 어느 것도 각 틱에서 버퍼를 다시 초기화하도록 요구하지 않습니다 ...

그래서 무슨 내용인지 알아보려고 하는데....


Zhunko에게: 나중에 내가 쓴 것을 피우려고 할 것입니다.


훨씬 더 명확하게, 나는 다음과 같이 계산한다고 썼습니다.

1) 새로운 막대가 나타날 때

2) 가격이 이미 계산된 바의 일부를 초과하는 경우(높거나 낮은 경우)

3) 3개 또는 4개의 마지막 빔이 계산됩니다.

이것은 우리의 서신에 있었습니다. 당신은 이것이 이해할 수 있다고 말했다 .... 아니면 내가 헛되이 썼습니까?

각 틱 에 재초기화가 있는 경우, 즉 버퍼가 0으로 채워지면 각 틱에서 다시 계산해야 합니다. 이것은 다음으로 이어질 것입니다. 이제 Putnika는 여러 차트의 한 터미널에 최대 100개의 ZUP 사본을 보유하고 있습니다. 동시에 빠른 시장에서도 터미널은 크게 느려지지 않습니다. 그리고 각 틱에서 다시 계산해야 하는 경우 동시에 활성화된 표시기의 수가 10배 감소합니다. 사용 가능한 전체 기록에 대한 계산이 있는 경우 컴퓨터는 일반적으로 표시기의 한 인스턴스만 견딜 것입니다.

이것으로 충분하지 않습니까?

 
nen :

각 틱에 재초기화가 있는 경우, 즉 버퍼가 0으로 채워지면 각 틱에서 다시 계산해야 합니다. 이것은 다음으로 이어질 것입니다. 이제 Putnika는 여러 차트의 한 터미널에 최대 100개의 ZUP 사본을 보유하고 있습니다. 동시에 빠른 시장에서도 터미널은 크게 느려지지 않습니다. 그리고 각 틱에서 다시 계산해야 하는 경우 동시에 활성화된 표시기의 수가 10배 감소합니다. 사용 가능한 전체 기록에 대한 계산이 있는 경우 컴퓨터는 일반적으로 표시기의 한 인스턴스만 견딜 것입니다.

그리고 어디에 쓰여 있습니까? 결국, 먼저 확인하고 나서야 무서워할 수 있습니다.
 
nen :


훨씬 더 명확하게, 나는 다음과 같이 계산한다고 썼습니다.

1) 새로운 막대가 나타날 때

2) 가격이 이미 계산된 바의 일부를 초과하는 경우(높거나 낮은 경우)

3) 3개 또는 4개의 마지막 빔이 계산됩니다.

이것은 우리의 서신에 있었습니다. 당신은 이것이 이해할 수 있다고 말했다 .... 아니면 내가 헛되이 썼습니까?

각 틱에서 재초기화가 수행되는 경우, 즉 버퍼가 0으로 채워지면 각 틱에서 다시 계산해야 합니다 . 이것은 다음으로 이어질 것입니다. 이제 Putnika는 여러 차트의 한 터미널에 최대 100개의 ZUP 사본을 보유하고 있습니다. 동시에 빠른 시장에서도 터미널은 크게 느려지지 않습니다. 그리고 각 틱에서 다시 계산해야 하는 경우 동시에 활성화된 표시기의 수가 10배 감소합니다. 사용 가능한 전체 기록에 대한 계산이 있는 경우 컴퓨터는 일반적으로 표시기의 한 인스턴스만 견딜 것입니다.

이것으로 충분하지 않습니까?

만, 그래, 만 ... 그런 문제는 없다! Zhunko는 완전히 다른 문제를 가지고 있습니다. 당황하기 전에 자신을 점검해야 합니다. 위의 몇 가지 게시물을 확인하고 코드를 게시했습니다.
 
Rosh :
그리고 어디에 쓰여 있습니까? 결국, 먼저 확인하고 나서야 두려워 할 수 있습니다.

+10000

모든 경우에 전문적인 접근이 있어야 합니다....

 
start()
 {
   if (glowBar<=iLow( NULL , gtf, 0 ) && ghighBar>=iHigh( NULL , gtf, 0 ) && gtimelast==iTime( NULL , gtf, 0 )) return ( 0 );

  glowBar=iLow( NULL , gtf, 0 ); ghighBar=iHigh( NULL , gtf, 0 );                   // обновляем сразу, а не после длительного расчета
... // здесь код основного расчета.

  gcurrentBars=iBars( NULL , gtf);       // обновляем в конце, чтобы не накапливались непосчитанные бары за время расчета
                                         // и не срабатывал полный пересчет на следующем тике в случае длительного расчета
 }

Полный код секции старт


//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start()
  {
   int i, j;

   gtf= Period ();
   gRecalculation= 1 ;

   while (gRecalculation> 0 )
     {
       if (gcurrentBars<iBars( NULL , gtf)- 1 )
        {
         Print ( "Время полного пересчета = " ,TimeToStr(Time[ 0 ],TIME_DATE|TIME_MINUTES));
         glowBar= 0 ; ghighBar= 0 ; gtimelast= 0 ; gsave_wr0= 0 ;
         ArrayInitialize (gsave_tLast, 0 ); ArrayInitialize (gsave_hl, 0 ); ArrayInitialize (gsave_lastlow, 0 ); ArrayInitialize (gsave_lasthigh, 0 );
         ArrayInitialize (gt_hi, 0 ); ArrayInitialize (gt_li, 0 ); ArrayInitialize (gt_end, 0 );

         gTheExternalBar=false; 
         history=true;
//      if(_PrimarySelectionOfExtremums==2 || _PrimarySelectionOfExtremums==3) delete_objects();
         delete_objects();
         g_addnewextremum=true;
         gbar=iBars( NULL , gtf);

         ArrayInitialize (gtime_gbar, 0 ); ArrayInitialize (gL2LTime, 0 ); ArrayInitialize (gL2HTime, 0 ); 

         ArrayInitialize (LowestBuffer1, 0 ); ArrayInitialize (HighestBuffer1, 0 );
         ArrayInitialize (LowestBuffer2, 0 ); ArrayInitialize (HighestBuffer2, 0 ); 
         ArrayInitialize (LowestBuffer3, 0 ); ArrayInitialize (HighestBuffer3, 0 ); 
         ArrayInitialize (LowestBuffer4, 0 ); ArrayInitialize (HighestBuffer4, 0 ); 

         ArrayInitialize (last_h, 0 ); ArrayInitialize (last_l, 0 ); ArrayInitialize (last_t, 0 );

         ArrayInitialize (tL1, 0 ); ArrayInitialize (tL2, 0 ); ArrayInitialize (tL3, 0 ); ArrayInitialize (tL4, 0 ); ArrayInitialize (tL5, 0 );
         ArrayInitialize (tL6, 0 ); ArrayInitialize (tL7, 0 ); ArrayInitialize (tL8, 0 ); ArrayInitialize (tL9, 0 ); ArrayInitialize (tL10, 0 );
         ArrayInitialize (tL11, 0 );

         ArrayInitialize (cL1, 0 ); ArrayInitialize (cL2, 0 ); ArrayInitialize (cL3, 0 ); ArrayInitialize (cL4, 0 ); ArrayInitialize (cL5, 0 );
         ArrayInitialize (cL6, 0 ); ArrayInitialize (cL7, 0 ); ArrayInitialize (cL8, 0 ); ArrayInitialize (cL9, 0 ); ArrayInitialize (cL10, 0 );
         ArrayInitialize (cL11, 0 );
         ArrayInitialize (cH1, 0 ); ArrayInitialize (cH2, 0 ); ArrayInitialize (cH3, 0 ); ArrayInitialize (cH4, 0 ); ArrayInitialize (cH5, 0 );
         ArrayInitialize (cH6, 0 ); ArrayInitialize (cH7, 0 ); ArrayInitialize (cH8, 0 ); ArrayInitialize (cH9, 0 ); ArrayInitialize (cH10, 0 );
         ArrayInitialize (cH11, 0 );
         if (filterZigZag== 1 )
           {
             ArrayResize (cLz1,gbar); ArrayResize (cHz1,gbar); ArrayResize (tLz1,gbar);

             ArrayInitialize (tLz1, 0 ); ArrayInitialize (tLz2, 0 ); ArrayInitialize (tLz3, 0 ); ArrayInitialize (tLz4, 0 ); ArrayInitialize (tLz5, 0 );
             ArrayInitialize (tLz6, 0 ); ArrayInitialize (tLz7, 0 ); ArrayInitialize (tLz8, 0 ); ArrayInitialize (tLz9, 0 ); ArrayInitialize (tLz10, 0 );
             ArrayInitialize (tLz11, 0 );

             ArrayInitialize (cLz1, 0 ); ArrayInitialize (cLz2, 0 ); ArrayInitialize (cLz3, 0 ); ArrayInitialize (cLz4, 0 ); ArrayInitialize (cLz5, 0 );
             ArrayInitialize (cLz6, 0 ); ArrayInitialize (cLz7, 0 ); ArrayInitialize (cLz8, 0 ); ArrayInitialize (cLz9, 0 ); ArrayInitialize (cLz10, 0 );
             ArrayInitialize (cLz11, 0 );
             ArrayInitialize (cHz1, 0 ); ArrayInitialize (cHz2, 0 ); ArrayInitialize (cHz3, 0 ); ArrayInitialize (cHz4, 0 ); ArrayInitialize (cHz5, 0 );
             ArrayInitialize (cHz6, 0 ); ArrayInitialize (cHz7, 0 ); ArrayInitialize (cHz8, 0 ); ArrayInitialize (cHz9, 0 ); ArrayInitialize (cHz10, 0 );
             ArrayInitialize (cHz11, 0 );
           }
Print ( "" );
        }
       else
        {
         if (_PrimarySelectionOfExtremums< 2 )
           {
            gbar=iBarShift( NULL , gtf, gtime_gbar[ 0 ], true)+ 2 ;
           }
        }

       if (_PrimarySelectionOfExtremums== 4 && gtimelast==iTime( NULL , gtf, 0 )) return ( 0 );
       if (tL1[ 0 ]> 0 )
        {
         if (glowBar<=iLow( NULL , gtf, 0 ) && ghighBar>=iHigh( NULL , gtf, 0 ) && gtimelast==iTime( NULL , gtf, 0 )) return ( 0 );
         if (gtimelast<iTime( NULL , gtf, 0 ) &&(_PrimarySelectionOfExtremums== 2 || _PrimarySelectionOfExtremums== 3 ))
           {
            gTheExternalBar=false; delete_objects();
           }
        }
      glowBar=iLow( NULL , gtf, 0 ); ghighBar=iHigh( NULL , gtf, 0 );                   // обновляем сразу, а не после длительного расчета

       // Поиск экстремумов для первого уровня
      glevel= 0 ;
      SamplingCreationExtremums();

       if (history)
        {

         if (ShowPrimaryLevel== 0 )
           {
            VisiblePrimarySelections(cL1, cH1, tL1, cLz1, cHz1, tLz1, LowestBuffer1, HighestBuffer1); // визуализация
           }

         // Создание следующих уровней и визуализация
         SelectionArrayForNextLevels();
         gtimelast=iTime( NULL , gtf, 0 ); // эта переменная используется в промежуточных расчетах, поэтому ее обновляем после расчетов
         history=false;

//*
         // Обрезка массивов
         if (QuantityExtremums> 0 )
           {
             for (i= 1 ;i< 11 ;i++)
             {
               int k=ScrapOfArrays(i);
               if (k!= 0 ) Print ( "размер массива уровня " ,i- 1 , " = " ,k);
               if (k== 0 ) break ;
//              if(ScrapOfArrays(i)==0) break;
             }
          }
//*/
        }
       else
        {
         WriteNewExtremums(cL1, cH1, tL1, cLz1, cHz1, tLz1);

         // Создание следующих уровней и визуализация
         SelectionArrayForNextLevels();

         gtimelast=iTime( NULL , gtf, 0 ); // эта переменная используется в промежуточных расчетах, поэтому ее обновляем после расчетов
        }
       if (gRecalculation> 0 ) gRecalculation--;
     }

   gcurrentBars=iBars( NULL , gtf);       // обновляем в конце, чтобы не накапливались непосчитанные бары за время расчета
                                         // и не срабатывал полный пересчет на следующем тике в случае длительного расчета

Err( 371 );

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

작은 코드 조각. 그리고 모든 지표에서 일부 변형과 거의 동일합니다.

버퍼가 다시 초기화되는 상당히 넓은 영역이 있음에 유의하십시오. 모든 ArrayInitialize 함수는 정확히 이런 종류의 재초기화를 수행합니다. 그러나 이것은 강제가 아닌 필요에 따라 발생합니다.

 

개발자가 6절의 의미를 설명하기 위해 첫 페이지에 썼습니다.

터미널: 기록 데이터를 다시 읽을 때 사용자 지정 표시기 에 대한 버퍼 초기화를 추가했습니다.

지금까지 그들 측의 설명은 없었다. 그리고 여기에서 우리는 찻잔에 폭풍을 만들고 있습니다. 하지만 여기 뿐만이 아닙니다. 내 지표를 사용하여 387 빌드 업로드를 보류하는 모든 사람에게 경고했습니다.

 
토론이 끝났습니다.
 
Zhunko :

나는 콤플렉스가 작동하지 않는 이유를 알아 냈습니다. 최적화 안녕 :-(

이제 각 틱에 대해 버퍼를 다시 채워야 합니다. 배려라고...

변경 없음 - 초기화 없음! 적어도 생각해보십시오!

버퍼의 기록 데이터를 읽지 않습니다. 하위 창에서 세로 스캔에만 사용합니다. 왜 항상 채워야 합니까? 다시 작성해야 하는 경우는 세 가지뿐입니다(첫 실행, 확대/축소, 그래프 이동). 그래서 MT4는 간신히 요동을 쳤고 여기에 또 다른 브레이크가 있습니다.


변경 없음 - 초기화 없음. 모든 것이 맞습니다. 초기화는 기록 데이터를 다시 읽은 후에만 수행됩니다. 이것은 이전에 제공되었지만 의도한 대로 작동하지 않았습니다. 정상적인 조건에서 막대 다음 막대(또는 연결 끊긴 후 여러 막대)가 이동하면 버퍼 초기화가 수행되지 않습니다.
 

2 터미널: 사용자 지정 지표 를 계산할 때 고정 견적 카운터 계산 .

기록 데이터의 변경 횟수를 추정하는 중에 오류가 발생했습니다. 많은 변경 사항으로 인해 데이터 계산 이 잘못 호출되고 재계산이 호출되지 않았습니다. 이것은 데이터가 극적으로 변경되고 ZigZag가 다시 계산되지 않은 ZigZag 표시기에 특히 영향을 미쳤습니다.

 
VBAG :

그것은 경이 롭다! 개발자가 4가지 점수를 매기지 않았지만 지원하고 개선하기까지 합니다. 이것은 빌드 번호인 387로 간단히 증명됩니다!

내가 마지막으로 본 것은 229였습니다. 그리고 즉시 - 387 (코 프로세서가 연결되었을 수도 있습니까? 이런 ...)! 시원한!

가장 중요한 것은 동시에 외과 의사 프로그래머의 주요 계명이 준수된다는 것입니다. "해를 끼치 지 마십시오!"

MetaTrader 4 플랫폼은 서버, 데이터 센터, 시세 및 뉴스 피더, 클라이언트 터미널, 관리자 및 관리자 터미널, API, API를 사용하여 작성된 구성 요소에 대한 표준 애드온 등 많은 구성 요소의 조합입니다. 이러한 구성 요소는 다양한 방식으로 발전했습니다.

따라서 모든 현재 구성 요소에 380이라는 번호가 할당되어 빌드 번호가 동일하게 지정되었습니다. 순전히 성형외과.