찻주전자의 질문 - 페이지 62

 
x100intraday :
그러한 예는 ...

다음과 같은 것(구조가 아니라 클래스):

 class TBuffer
{
public :
   double   MABuffer[ ];
};

//---------------------------------------------------------------------
TBuffer*  Buffer_Array[ ];
//---------------------------------------------------------------------

//---------------------------------------------------------------------
   ArrayResize ( Buffer_Array, NUMBER );
   for ( int i = 0 ; i < NUMBER; i++ )
  {
    Buffer_Array[ i ] = new TBuffer;
     SetIndexBuffer ( i, Buffer_Array[ i ].MABuffer, INDICATOR_DATA );
  }

어디에 무엇을 삽입할 것인지는 분명하다고 생각합니다.

마지막으로 잊지 마세요:

   for ( int i = 0 ; i < NUMBER; i++ )
  {
     delete ( Buffer_Array[ i ] );
  }
 
Yedelkin :

재정비하겠습니다. 함수를 정의할 때 가능한지 궁금하신가요?

구조 자체의 이름 표시를 무시하고 구조 유형의 변수만형식 매개변수 로 지정하시겠습니까? 저것들. 예를 들어 void funcName(MqlTradeRequest & req)이 아니라 단순히 void funcName(& req)?

네. 모든 간단한 구조에 대해 일반 함수가 필요합니다. --- 메서드가 없습니다. dyn. 배열. 등. --- 정의된 데이터 유형의 순수한 시퀀스입니다.

왜냐하면 스크립트의 구성은 내가 미리 결정하고 내가 처리할 구조의 수를 명시적으로 설정할 수 있습니다.

 struct Data1
  {
   double param[ 1000000 ];
  };
struct Data2
  {
   int     temp;
   double k;
  };
struct Data3
  {
   int     temp;
   double k;
  };

그러나 이러한 구조를 단일 이름의 함수에 전달하려면 오버로드를 사용해야 합니다.

 void funWrite(Data1 &dd[])
  {
    .....
    Один тип обработки для всех структур
    .....
     FileWriteArray ( 1 , dd);
  }
void funWrite(Data2 &dd[])
  {
    .....
    Один тип обработки для всех структур
    .....
     FileWriteArray ( 1 , dd);
  }
void funWrite(Data3 &dd[])
  {
    .....
    Один тип обработки для всех структур
    .....
     FileWriteArray ( 1 , dd);
  }

여기서 어려움이 발생합니다.

1. 구조의 수가 제한되어 있기 때문에 더 많은 수의 요소로 오버로딩하면 작업이 느려집니다.

2. 과부하 함수를 복사할 때 나 자신도 실수할 수 있다.

PS// funWrite() 함수는 특정 계산을 수행하고 특정 시퀀스와 계산된 매개변수(어떤 인덱스에서 쓰기 시작, 몇 개를 읽을지)로 FileWriteArray() 를 실행합니다.

 
rlx :

네. 모든 간단한 구조에 대해 일반 함수가 필요합니다. --- 메서드가 없습니다. dyn. 배열. 등. --- 정의된 데이터 유형의 순수한 시퀀스입니다.

왜냐하면 스크립트의 구성은 내가 미리 결정하고 내가 처리할 구조의 수를 명시적으로 설정할 수 있습니다.

그러나 이러한 구조를 단일 이름 의 함수에 전달하려면 오버로드를 사용해야 합니다.

분명한. 얼마 전에 함수를 정의할 때 배열의 유형을 지정하지 않는 것이 가능한지 여부에 대해 비슷한 질문을 했습니다. 조금 더 낮은 곳에서 Rosh는 과부하를 조언했습니다.

따라서 일부 매개변수가 void 유형으로 지정된 FileWriteArray() 와 같은 "내장" 함수 자체가 오버로드된 함수라는 결론에 도달했습니다. 우리는 그들의 구현을 볼 수 없습니다.

 
Yedelkin :

분명한. 얼마 전에 함수를 정의할 때 배열의 유형을 지정하지 않는 것이 가능한지 여부에 대해 비슷한 질문을 했습니다. 조금 더 낮은 곳에서 Rosh는 과부하를 조언했습니다.

따라서 일부 매개변수가 void 유형으로 지정된 FileWriteArray() 와 같은 "내장" 함수 자체가 오버로드된 함수라는 결론에 도달했습니다. 우리는 그들의 구현을 볼 수 없습니다.

내장 함수는 본격적인 프로그래밍 언어로 작성됩니다.

예를 들어 C에서는 임의의 수의 변수를 전달할 수 있으며 이미 함수에서 전달된 매개변수 목록을 가져와 고려할 수 있습니다.

 void fun(...)
  {
}

MQL5에는 그러한 가능성이 없습니다. 특히 간단한 데이터 유형 및 구조에 대한 참조 및 포인터가 누락되었습니다...

 

아마도 보안과 관련이 있을 것입니다. 데이터 접근. 샌드박스 종료 .

그러나 여전히 이러한 기능이 MQL5에서 구현되기를 바랍니다.

 
rlx :

아마도 보안과 관련이 있을 것입니다. 데이터 접근. 샌드박스 종료 .

그러나 여전히 이러한 기능이 MQL5에서 구현되기를 바랍니다.

서비스 데스크에 소원을 작성하는 것이 좋습니다. 그런 다음 포럼에서 빠르게 손실됩니다.
 
Dima_S :

다음과 같은 것(구조가 아니라 클래스):

어디에 무엇을 삽입할 것인지는 분명하다고 생각합니다.

마지막으로 잊지 마세요:

이것이 내가 이해하는 도움입니다. 실제적이고 매우 구체적입니다. 덕분에. 플러스는 어디에?

그건 그렇고 ... 나는 그것을 알아 냈습니다.이 옵션은 저에게 충분합니다. 하지만 형식주의자로 남고 싶지는 않습니다... 그래서 호기심에 2차원 배열을 구성하는 것이 나쁘지 않을 것이라고 결정했습니다. MQL은 지난 10년 동안 안전하게 잊고 있었던 C/C++를 다소 연상시킵니다. 이제 나는 이것을하려고했습니다 (여기에는주기없이 - 특별히 단순화했습니다).

 class TBuffer
{
public :
   double MABuffer[][ 1 ];
};

//---------------------------------------------------------------------
TBuffer* Buffer_Array[][ 1 ];
//---------------------------------------------------------------------
int OnInit ()
  {
   ArrayResize (Buffer_Array, 1 );
   Buffer_Array[ 0 ][ 0 ] = new TBuffer;
   SetIndexBuffer ( 0 ,Buffer_Array[ 0 ][ 0 ].MABuffer, INDICATOR_DATA );
// --- [...]
   delete (Buffer_Array[ 0 ][ 0 ]);
   return ( 0 );
  }

컴파일러에서 "'MABuffer' - 매개변수 변환이 허용되지 않음" 오류가 발생합니다.

내가 뭘 잘못하고 있는지 궁금해? 내가 틀리지 않았다면 다차원 배열 로 클래스를 선언할 때 차원 중 하나를 숫자로 지정해야 하므로 정적으로 만들어야 합니까? 한편 ArrayResize는 첫 번째 차원의 새 크기를 설정합니다.

 

x100intraday :

내가 뭘 잘못하고 있는지 궁금해?

1) SetIndexBuffer 는 동일한 차원의 이중 배열과 함께 작동합니다.

2 ) TBuffer * 를 사용하는 이유가 명확하지 않습니다. 필요하지 않은 곳에서 역학을 사용합니까?

3) (TIP) 예제에서는 약간의 메모리와 몇 백 사이클을 절약하기 위해 클래스가 아닌 구조로 충분히 가능했습니다.

 

mql5 :

3) (TIP) 예제에서는 약간의 메모리와 몇 백 사이클을 절약하기 위해 클래스가 아닌 구조로 충분히 가능했습니다.

확인되나요??
 

Expert Advisor는 다른 시간대의 지표를 사용합니다. Advisor의 테스트에서 표시기의 잘못된 데이터가 나타납니다.

고문 자체는 M5에서 작동하고 표시기는 H4에서 작동합니다. 동일한 시간 프레임(M5)에 호출된 표시기는 올바른 값을 반환합니다.

반환된 값은 지표 값과 유사하지만 가격 차트 창에 지표가 중첩될 때 보이는 실제 값과 다릅니다.

문제가 무엇입니까?

표시기 호출 코드의 예:

 int W_handle;
int OnInit ()
  {
   W_handle= iCustom ( NULL , PERIOD_H4 , "WW" );
  }

void OnNewBar() // моя функция
{
 double wave[ 10 ];
 ArraySetAsSeries (wave, true );

 CopyBuffer (W_handle, 0 , 0 , 2 ,wave);
 if (wave[ 1 ] > 0 ) Buy(); 
// по замыслу в wave[1] должно лежать значение индикатора на предыдущем баре H4
// но так получается только на нескольких первых обращениях, потом результат начинает расходиться с реальностью
}
Способы вызова индикаторов в MQL5
Способы вызова индикаторов в MQL5
  • 2010.03.09
  • KlimMalgin
  • www.mql5.com
C появлением новой версии языка MQL, не только изменился подход к работе с индикаторами, но и появились новые способы создания индикаторов. Кроме того, появилась дополнительная гибкость при работе с индикаторными буферами - теперь вы можете самостоятельно указать нужное направление индексации и получать ровно столько значений индикатора, сколько вам требуется. В этой статье рассмотрены базовые методы вызова индикаторов и получения данных из индикаторных буферов.