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

 
Swan :

모든 막대에 대해 표시기는 한 번 계산됩니다. 거대한 역사를 시작할 때 약간 느려질 수 있습니다.

앞으로 몇 가지 값이 다시 계산됩니다.

프로그래머는 프로그래밍에서 자유 시간에 시간 프레임을 수동으로 건너뛰는 것을 좋아하는 사람들이기도 합니다. 그리고 각각의 새로운 TF는 표시기의 전체 해부학의 또 다른 초기화 해제-초기화이며 모든 계산은 새 항목에서 수행됩니다. 따라서 다음 TF에서 TF로 이동할 때마다 ArrayInitialize() 가 트리거됩니다. 표시기가 다시 초기화해야 하는 여러 버퍼로 복잡하면 지연이 무자비하게 누적되며 자동 할당된 메모리의 남용에 대해서는 언급조차 하지 않습니다.

나는 얼마나 순진한 동지인가!.. 결국, 나는 항상 OnInit() 에서 초기화를 수행하고 이 단계에서 고통을 겪고 OnCalculate() 로 더 시급한 작업으로 뛰어드는 것으로 충분하다고 확신합니다. 하지만 아니, 나에게 파이프. 그건 그렇고, 일반적으로 복잡한 표시기의 다소 성공적인 작성은 ArrayInitialize()OnCalculate() 에 정확히 포함되어야 하는 이유를 명확하게 이해하지 못했습니다. OnInit() 에서 초기화. 경험적으로, 이 옵션을 거부하면 즉시 문제가 드러났지만 나중에 더 자세히 설명하는 경우만 찾았습니다. 그 동안 코드 논리가 아닌 단순하고 명백한 인간 논리의 관점에서 OnCalculate()ArrayInitialize()

 if (prev_calculated< 7 ) // или < чего-то там...
처음 시작할 때 두 번 이상 작동합니다. 즉, 새로운 프랙탈이 나타나지만 조건은 침묵합니다. 그래서 OnCalculate() 에서 도대체 무엇을 합니까?!

나는 내 믿음에 훨씬 더 순진하다.

handle= iFractals ( _Symbol , _Period );

아마도 배열의 정리 를 자동으로 상속해야 하고, 원래 Fractals.mq5 의 경제적인 알고리즘 효과 도 상속해야 하지만 약간 다른 형태로 존재합니다. 그러나 - 계속해서 파이프! 나는 두 번 생각하고 내가 사용하는 표시기의 복사-붙여넣기로 내 코드를 부풀려야 했습니다. 내가 처음 지표의 코드를 연구하기 시작했을 때 슬럼프에 빠졌을 때 Fractals.mq5와 도움말의 iFractals 예제를 비교할 때 두 번째 코드가 첫 번째 코드보다 크다는 것을 알고 당황했습니다(심지어 최대 감소). 모르겠어. 나에게 모자를 던지지만 일반적으로 프로그래머는 전체 라이브러리를 참조하는 한 줄에 코드에 무언가를 포함하기 위해 무언가를 기대하고 있습니다. 클래스 또는 다른 방대한 것이 있지만 여기에 ...

이제 앞에서 언급한 문제의 본질을 밝힐 것입니다. 상위 프랙탈로 단순화된 iFractals 표시기 코드를 첨부합니다. 원래 예에서 버퍼는 전체 기록에 대해 채워집니다. 상황을 바꾸자 - 이야기의 일부만 복사하십시오. 복사된 값의 첫 번째 계산에 대한 할당을 주석 처리하고 값을 더 작은 값으로 설정해 보겠습니다.

values_to_copy= 100 ; // то же, что amount
이제 시간 프레임을 뛰어 넘어 나타난 프랙탈 인공물에 소름 끼치도록 합시다. 프랙탈이 필요하지 않은 기록 부분을 정리하기 위해 Fractals.mq5에서 자동으로 상속되지 않은 정리 코드 블록을 복사하여 붙여넣는 것보다 더 좋은 것은 없습니다.
   if (bars_calculated< 7 )
   {
       ArrayInitialize (FractalUpBuffer, EMPTY_VALUE );
       Print ( "the condition is true; ArraySize(FractalUpBuffer)=" , ArraySize (FractalUpBuffer));
   }
이제 모든 것 ( 많은 초과!! )이 완벽하게 정리되었으며, 동시에 Print() 는 재초기화 작업이 작동하는 시기와 횟수를 표시하고 버퍼 크기를 표시합니다. 우리는 크기가 100과는 거리가 멀지만 훨씬 더 크다고 확신합니다. 테이블에 먼지가 필요하면 아파트 전체를 청소하는 것이 아니라 테이블에 먼지를 제거합니다. 아니면 어떤 대가를 치르더라도 메모리와 시간을 과도하게 소비하는 것이 사소한 일이라고 확신시키는 것이 트릭입니다. 문제를 간접적으로 해결하고 내 손에 의존하지 않는 자원의 노골적인 소비에주의를 기울이지 않는 방법을 찾을 수 있습니까?


백조 :

하나의 fi, 약간의 크기가 설정되어야 합니다.. 같은 경계로 직선으로 할 수 있는데 왜 다른 경계로 곡선 주기를 만드나요?)

주기의 크기를 설정하고 배열의 크기에 춤을 추지 않는 것이 정통입니다. 그렇지 않으면 표시기가 목발을 기준으로 합니다.

솔직히 로드하고 싶지는 않았지만 전체 코드를 파헤치는 경로를 동조자들이 따를 것이라는 것을 미리 알고 있었습니다. Chapai와 Petka에 대한 농담에서 Vasily Ivanovich가 돌아와서 삽을 요구했을 때 - 그것은 부러진 것으로 판명되었습니다. 그들은 말을 묻었습니다. Chapai가 없는 동안 백인들은 마을을 공격했습니다. 다른 사람 코드의 종소리와 휘파람을 파헤치고 싶어하는 사람이 없을 것이라는 사실을 깨닫고 추가 로드 없이 표시기의 결과만 참조할 수 있습니다. 표시기는 결국 표시됩니다(브레이크 및 기타 단점): https://www.mql5.com /en/forum/1111/page577#comment_119227 . 이제 생각하고 말해보십시오. 모든 것이 간단하고 겉보기에 명백한 솔루션을 제공한다고 믿을 가치가 있습니까?

특정 부분에 대해 묻기 전에 코드를 단순화하고 제한하는 것은 헛된 것이 아닙니다. 그러므로 나는 당신이 아마추어가없는 한 전체 말을 발굴하지 말고 이것으로 제한하기를 요청합니다 ...

일반적으로 네 번째 특수 버퍼는 원칙적으로 처음 세 버퍼보다 길고(길이가 서로 동일) SetIndexBuffer() 로 인해 전체 기록에 대해 늘어납니다! 주기의 경계가 네 번째 버퍼로 확장되고 동시에 처음 세 개의 배열의 크기가 조정되면 주기의 요소 수가 최소한 증가하여 완전히 왼쪽으로 빗질하는 데 필요한 예상 시간이 늘어납니다. 버퍼 요소의 세그먼트. 이것은 이 버전의 알고리즘에서 나타날 문제가 있는 빙산의 일각일 뿐입니다. 음, 무엇보다도 다른 버퍼의 크기가 더 커졌기 때문에 다른 버퍼의 재초기화 시간도 늘어납니다. 네 번째 특수 배열은 else에서 EMPTY_VALUE로 명시적으로 채워질 수 없습니다. 표시기는 특정 알고리즘에 따라 다른 시간 프레임의 프랙탈을 가장 심하게 재배열하기 때문에 처음 세 버퍼와 네 번째 버퍼 사이의 인덱스 사이에는 대응 관계가 없습니다. ...

백조 :

//및 EMPTY_VALUE 값은 0과 1 배열 요소, mm.. 및 마지막 세 막대에 할당됨)

어때요? 왜 모든 것이 아닌가? 이것은 내가 이해하지 못한 것입니다. 설명하다? 일반적으로 이것은 실제(유효) 값만 할당하는 것이 아니라 전체 버퍼의 불가피한 결합에 관한 것입니다. ArrayInitialize() 는 다른 많은 배열 함수와 마찬가지로 최종 MQL 프로그래머에게 암시적인 루프를 기반으로 합니다.

메모리 오버런 문제는 여전히 유효하며, 개발자 에게 ArrayInitialize() 에 추가 매개변수를 도입하는 것에 대해 생각해 달라는 요청이 있습니다. 이 매개변수는 버퍼 재초기화의 양과 더 나아가 더 나은 범위를 설정합니다 .

추신: OnInit()ArrayInitialize() 가 여기에서 효율적이지 않은 이유를 추측하는 것 같습니다. 버퍼는 동적이며 크기가 변경되며 OnInit() 에서는 현재 길이에 대해 한 번만 값으로 초기화되며 OnCalculate() 에서 버퍼의 실제 크기를 아직 인식하지 못합니다.

파일:
cleanup.mq5  2 kb
 
papaklass :

시각화 도우미의 표시기가 작동하지 않습니다.

온라인 터미널에서는 잘 작동합니다.

세부정보를 제공하시겠습니까? 지표는 어떻게 시각화 차트에 올랐습니까?
 
papaklass :

EA 코드에 다음 줄을 삽입합니다.

이 세 가지 지표를 깨끗한 차트에 걸어 놓고 전문가 이름으로 템플릿을 저장합니다. 내 이전 게시물의 온라인 사진.

시각화 도우미에서 전문가를 시작합니다.

1. 저장된 템플릿 보기

2. 템플릿 없이 시각화를 실행해 봅니다(즉, 먼저 해당 tpl 파일을 삭제). 최신 555 빌드에서 자동으로 추가된 사용자 지정 표시기가 올바르게 표시되어야 합니다.

 
papaklass :

모든 것이 작동합니다. 고맙습니다.

템플릿을 삭제했습니다. OnInit()의 Expert Advisor에서 다음과 같이 썼습니다.

템플릿을 보여주세요. 표시기는 템플릿과 함께 정상적으로 표시되어야 합니다(즉, 문제가 있고 해결되어야 함).
 
papaklass :

*.tpl 파일 보내기

이제 템플릿으로 다시 시도했지만 작동하지 않습니다. 템플릿을 삭제합니다. 작동합니다.

고맙습니다. 우리가 알아낼 것입니다.
 

x100intraday :

이제 생각하고 말해보십시오. 모든 것이 간단하고 겉보기에 명백한 솔루션을 제공한다고 믿을 가치가 있습니까?

fse 독창적 - 간단합니다.

나머지는 작동하지 않았습니다. 포럼의 질문에 대한 일화, 편도선 제거 방법을 상기시켜줍니다 :)

정통 지표 프랙탈 의 예는 제한적입니다. 아마도 도움이 될 것입니다..

 //+------------------------------------------------------------------+
//|                                                     Fractals.mq5 |
//+------------------------------------------------------------------+
//---- indicator settings
#property indicator_chart_window
#property indicator_buffers 2
#property indicator_plots   2
#property indicator_type1   DRAW_ARROW
#property indicator_type2   DRAW_ARROW
#property indicator_color1  clrGray
#property indicator_color2  clrGray
#property indicator_label1   "Fractal Up"
#property indicator_label2   "Fractal Down"
//--- input parameters
input int BarsCount= 100 ;
//---- indicator buffers
double ExtUpperBuffer[];
double ExtLowerBuffer[];
//--- 10 pixels upper from high price
int     ExtArrowShift=- 10 ;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
void OnInit ()
  {
//---- indicator buffers mapping
   SetIndexBuffer ( 0 ,ExtUpperBuffer, INDICATOR_DATA );
   SetIndexBuffer ( 1 ,ExtLowerBuffer, INDICATOR_DATA );
   IndicatorSetInteger ( INDICATOR_DIGITS , _Digits );
//---- sets first bar from what index will be drawn
   PlotIndexSetInteger ( 0 , PLOT_ARROW , 217 );
   PlotIndexSetInteger ( 1 , PLOT_ARROW , 218 );
//---- arrow shifts when drawing
   PlotIndexSetInteger ( 0 , PLOT_ARROW_SHIFT ,ExtArrowShift);
   PlotIndexSetInteger ( 1 , PLOT_ARROW_SHIFT ,-ExtArrowShift);
//---- sets drawing line empty value--
   PlotIndexSetDouble ( 0 , PLOT_EMPTY_VALUE , EMPTY_VALUE );
   PlotIndexSetDouble ( 1 , PLOT_EMPTY_VALUE , EMPTY_VALUE );
//---- initialization done
  }
//+------------------------------------------------------------------+
//|  Fractals                                                        |
//+------------------------------------------------------------------+
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 &TickVolume[],
                 const long &Volume[],
                 const int &Spread[])
  {
   int i,limit;
//---
   if (rates_total< 5 ) return ( 0 );
//---
   if (prev_calculated< 7 )
     {
      limit= 2 ;
       if (rates_total-2>BarsCount) limit=rates_total-BarsCount;
       PlotIndexSetInteger ( 0 , PLOT_DRAW_BEGIN ,limit); //отрисовываются и расчитываются только значения на последних BarsCount барах
       PlotIndexSetInteger ( 1 , PLOT_DRAW_BEGIN ,limit);

      for (i=rates_total- 2 ;i<rates_total;i++) //Последним двум барам присваивается EMPTY_VALUE. Исправил циферку в соответствии с iFractal(там фрактал может быть на 2ом баре)
         {
         ExtUpperBuffer[i]= EMPTY_VALUE ;
         ExtLowerBuffer[i]= EMPTY_VALUE ;
         }
     }
   else
      {
      limit=prev_calculated- 3 ; //Здесь от prev_calculated правильнее считать..
      
       //---Добавленным с появлением нового бара элементам массивов присваиваем значение EMPTY_VALUE//Возможно всё будет нормально и без этого.
       if (rates_total>prev_calculated)
         {
         for (i=prev_calculated;i<rates_total;i++)
            {
            ExtUpperBuffer[i]= EMPTY_VALUE ;
            ExtLowerBuffer[i]= EMPTY_VALUE ;
            }
         }
       //---
      }
//---
   for (i=limit;i<rates_total- 2 && ! IsStopped ();i++) //Исправил циферку
     {
       //---- Upper Fractal
       if (High[i]>High[i+ 1 ] && High[i]>High[i+ 2 ] && High[i]>=High[i- 1 ] && High[i]>=High[i- 2 ])
         ExtUpperBuffer[i]=High[i];
       else ExtUpperBuffer[i]= EMPTY_VALUE ;
       //---- Lower Fractal
       if (Low[i]<Low[i+ 1 ] && Low[i]<Low[i+ 2 ] && Low[i]<=Low[i- 1 ] && Low[i]<=Low[i- 2 ])
         ExtLowerBuffer[i]=Low[i];
       else ExtLowerBuffer[i]= EMPTY_VALUE ;
     }
//--- OnCalculate done. Return new prev_calculated.
   return (rates_total);
  }
//+------------------------------------------------------------------+
Fractals
Fractals
  • 투표: 8
  • 2010.01.26
  • MetaQuotes Software Corp.
  • www.mql5.com
Фракталы (Fractals) — это один из пяти индикаторов торговой системы Билла Вильямса, позволяющий обнаруживать дно или вершину.
 
Swan :

fse 독창적 - 간단합니다.

나머지는 작동하지 않았습니다. 포럼의 질문에 대한 일화, 편도선 제거 방법을 상기시켜줍니다 :)

정통 지표 프랙탈 의 예는 제한적입니다. 아마도 도움이 될 것입니다..

사실, 핸들을 통해 표시기를 씁니다. 하지만 EMPTY_VALUE 값을 명시적으로 수동으로 채우는 대신 ArrayInitialize() 를 포기하는 아이디어가 마음에 들었습니다. 고마워, 나는 이것에 대해 새로운 난장판을 만들려고 노력할 것이고, 나중에 얽히지 않아도되기를 바랍니다. 여기에 미묘함과 불편함이 있을 수 있지만, 미리 예상하고 있습니다... 하지만 오 글쎄요.
 

다음 코드:

 struct Pos
{
   int x;
   int y;
};

class Test
{
public :
   Test( const Pos& other)
      : pos(other)
   {
       Print ( "other = {" , other.x, ", " , other.y, "}" );
       Print ( "pos = {" , pos.x, ", " , pos.y, "}" );
   }
   
public :
   Pos pos;
};

int OnInit ()
{
   Pos pos = { 123 , 456 };
   Test test(pos);
   
   return ( 0 );
}

문제:

2011.12.05 22:01:28 RectLabel (EURUSD,H1) pos = {12, 176314750}
2011.12.05 22:01:28 RectLabel (EURUSD,H1) 기타 = {123, 456}

즉, 초기화 목록이 작동하지 않고 구조에 쓰레기가 있습니다. 이게 버그인지 아닌지

 

클라우드에서 두 에이전트의 연결을 끊었지만 여전히 30초마다 클라우드 서버에 연결합니다.

MO 0 네트워크 00:00:17 2.agents.mql5.com에 연결됨(프록시 서버 192.168.0을 통해)
LK 0 네트워크 00:00:47 2.agents.mql5.com에 연결됨(프록시 서버 192.168.0을 통해)
RG 0 네트워크 00:01:17 2.agents.mql5.com에 연결됨(프록시 서버 192.168.0.을 통해)
NS 0 네트워크 00:01:48 2.agents.mql5.com에 연결됨(프록시 서버 192.168.0을 통해)
RO 0 네트워크 00:02:18 2.agents.mql5.com에 연결됨(프록시 서버 192.168.0을 통해)
OK 0 네트워크 00:02:48 2.agents.mql5.com에 연결됨(프록시 서버 192.168.0을 통해)
MG 0 네트워크 00:03:18 2.agents.mql5.com에 연결됨(프록시 서버 192.168.0을 통해)
DR 0 네트워크 00:03:48 2.agents.mql5.com에 연결됨(프록시 서버 192.168.0을 통해)
DN 0 네트워크 00:04:18 2.agents.mql5.com에 연결됨(프록시 서버 192.168.0을 통해)
EJ 0 네트워크 00:04:48 2.agents.mql5.com에 연결됨(프록시 서버 192.168.0을 통해)
GF 0 네트워크 00:05:18 2.agents.mql5.com에 연결됨(프록시 서버 192.168.0을 통해)
RR 0 네트워크 00:05:48 2.agents.mql5.com에 연결됨(프록시 서버 192.168.0을 통해)
NN 0 네트워크 00:06:18 2.agents.mql5.com에 연결됨(프록시 서버 192.168.0을 통해)
KJ 0 네트워크 00:06:48 2.agents.mql5.com에 연결됨(프록시 서버 192.168.0을 통해)
QF 0 네트워크 00:07:18 2.agents.mql5.com에 연결됨(프록시 서버 192.168.0을 통해)
HQ 0 네트워크 00:07:48 2.agents.mql5.com에 연결됨(프록시 서버 192.168.0을 통해)
PM 0 네트워크 00:08:18 2.agents.mql5.com에 연결됨(프록시 서버 192.168.0을 통해)
QI 0 네트워크 00:08:48 2.agents.mql5.com에 연결됨(프록시 서버 192.168.0.을 통해)
KE 0 네트워크 00:09:18 2.agents.mql5.com에 연결됨(프록시 서버 192.168.0을 통해)
NQ 0 네트워크 00:09:51 2.agents.mql5.com에 연결됨(프록시 서버 192.168.0을 통해)
OM 0 네트워크 00:10:18 2.agents.mql5.com에 연결됨(프록시 서버 192.168.0을 통해)
RI 0 네트워크 00:10:48 2.agents.mql5.com에 연결됨(프록시 서버 192.168.0.를 통해)
LE 0 네트워크 00:11:18 2.agents.mql5.com에 연결됨(프록시 서버 192.168.0을 통해)
EP 0 네트워크 00:11:48 2.agents.mql5.com에 연결됨(프록시 서버 192.168.0을 통해)
IL 0 네트워크 00:12:18 2.agents.mql5.com에 연결됨(프록시 서버 192.168.0을 통해)
HH 0 네트워크 00:12:48 2.agents.mql5.com에 연결됨(프록시 서버 192.168.0.을 통해)
FD 0 네트워크 00:13:18 2.agents.mql5.com에 연결됨(프록시 서버를 통해

 
Konstantin83 :

클라우드에서 두 에이전트의 연결을 끊었지만 여전히 30초마다 클라우드 서버에 연결합니다.

서비스 데스크로 가자.

어떻게 껐는지 설명해주실 수 있나요? 제거(중지)된 서비스? 문제가 있는 에이전트의 로그를 첨부합니다.

로그에 이상한 프록시 설정 이 있습니다. 에이전트 구성에서 프록시 설정을 지정했습니까? 에이전트 관리자의 common.ini를 애플리케이션에 첨부하십시오.