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

 
fxsaber :
자손에게도 비공개로 하는 것이 좋을 것입니다. 더 나은 이해를 위해. 간단히 말해서 요점이 아닙니다.
자손에서는 그것을 호출해야합니다. )
 
Sergei Vladimirov :
자손에서는 그것을 호출해야합니다. )
요점은 그럴 필요가 없다는 것입니다. 내 예를 참조하십시오.
 
fxsaber :
요점은 그럴 필요가 없다는 것입니다. 내 예를 참조하십시오.
귀하의 예는 다르지만 본질은 동일합니다. 기본 클래스의 가상 메소드가 하위 클래스에서 재정의됩니다. 좋습니다. 일반적으로 모든 사람에게 모든 것이 명확합니다.
 

표시기 버퍼 오류

 #property indicator_chart_window
#property indicator_buffers 1
#property indicator_plots    1

class BUFFER
{
public :
   double Buffer[];
  
  BUFFER()
  {
    :: SetIndexBuffer ( 0 , this .Buffer);
  }
};

BUFFER* Buf;

void OnInit ()
{
  Buf = new BUFFER;
}

void OnDeinit ( const int Reason )
{
   delete (Buf);
}

void Restart()
{
   OnDeinit ( REASON_PARAMETERS );
   OnInit ();
}

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

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[] )
{
   static bool Flag = false ;
  
   if (Flag)
    Restart();
  
  Flag = true ;
  
  PRINT( ArraySize (Buf.Buffer));
  
  Buf.Buffer[ 0 ] = 0 ; // array out of range
  
   return (rates_total);
}

로그의 결과

2016.09.12 17:21:54.851 Test (RTS-9.16,H1)      array out of range in 'Test.mq5' (56,13)
2016.09.12 17:21:54.851 Test (RTS-9.16,H1)      ArraySize(Buf.Buffer) = 0
2016.09.12 17:21:54.828 Test (RTS-9.16,H1)      ArraySize(Buf.Buffer) = 2067

디버거는 Buf.Buffer가 항상 dynamic array[0], I라고 주장합니다. 저것들. 표시 버퍼. 그러나 크기가 0입니다.

디버거가 릴리스보다 로그에 더 많이 쓰는 것으로 나타났습니다. 릴리스는 그런 것을 말하지 않습니다

 2016.09 . 12 17 : 25 : 08.706 Test (RTS- 9.16 ,M1)      Indicator buffer # 0 detached
인디케이터 버퍼는 MT5에서 한번만 설정할 수 있나요?
 

그리고 비밀이 아니라면 왜 그러한 어려움이 있습니까? 물론 연구에 대한 관심을 제외하고.

이것 대신(그런데 원칙적으로 잘못된 것은 시작 시뿐만 아니라 작동 중에 재초기화가 필요할 수 있기 때문입니다):

   static bool Flag = false ;
  
   if (Flag)
    Restart();
  
  Flag = true ;

다음과 같이:

 if (prev_calculated == 0 )
   ArrayInitialize (Buf.Buffer, 0.0);
 
Sergei Vladimirov :

그리고 왜 그러한 어려움이 비밀이 아니라면? 물론 연구에 대한 관심을 제외하고.

표시기 버퍼로 고정된 동적 배열이 삭제되는 경우가 있습니다. 그런 다음 동적 질량을 다시 생성하고 이를 표시기 버퍼로 할당해야 합니다. 디버거는 할당되었음을 보여줍니다. 그러나 그 크기만 0입니다. 그건 실수야.

문제는 오래된 것으로 밝혀졌습니다.

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

"Indicator buffer #x detached" 메시지를 숨기는 방법

콘스탄틴 이바노프 , 2015.02.17 21:18

내 표시기에서 버퍼 배열을 개체 인스턴스에 저장합니다.
OnDeinit()에서 객체를 삭제할 때 버퍼(SetIndexBuffer())에 바인딩된 모든 배열에 대한 메시지가 표시됩니다.

" 표시기 버퍼 #x 분리됨"

이러한 메시지 없이 버퍼에서 배열을 분리하는 방법은 무엇입니까?
또는 이 메시지를 숨기는 방법은 무엇입니까?

http://forum.mql4.com/63975 지점을 찾았지만 전역 컨텍스트에서 버퍼를 저장하는 제안된 옵션이 저에게 적합하지 않습니다 .


그리고 전역 컨텍스트에서 버퍼를 저장하는 옵션도 저에게 적합하지 않습니다. 흥미롭게도 모든 것이 MT4에서 작동합니다.

 

기사 초보자를 위한 MQL5에서 Expert Advisors 작성에 대한 단계별 가이드 사용 가능한 코드:


세 기호로 나눌 필요가 없습니까?

 
Aleksey Rodionov :

기사 초보자를 위한 MQL5에서 Expert Advisors 작성에 대한 단계별 가이드 사용 가능한 코드:


세 기호로 나눌 필요가 없습니까?

EURUSD(5자리)와 USDJPY(3자리)의 흔적입니다. 실수는 없지만 특히 초보자에게는 이것을하지 않는 것이 좋습니다.
 
상속된 모든 클래스에 대해 단일 인터페이스를 정의해야 합니다. 항상 Init 메서드를 포함해야 합니다. 그러나 Init는 생성자의 복제본과 같아서 입력 매개변수에 대한 옵션을 미리 결정할 수 없습니다. 그러한 인터페이스를 정의하는 방법은 무엇입니까?
 
MK, 가져온 함수 에 대해 다음 구문을 유효하게 만들지 않겠습니까?
 #import ...
 int send(SOCKET s, void &buf[], int len, int flags);
 int send(SOCKET s, void &buf, int len, int flags);
#import

이제 우리는 추한 것들을 차단해야 합니다.

 #import ...
 int send(SOCKET s, char &buf[], int len, int flags);
 int send(SOCKET s, int &buf, int len, int flags);
 int send(SOCKET s, char &buf, int len, int flags);
 int send(SOCKET s, Cpoint &buf[], int len, int flags);
 ...
#import

내부 인라인 함수에는 제안하지 않지만 가져온 함수에는 안전해야 합니다.