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

 
fxsaber :

OnCalculate - 이 차트에서 실행되지 않습니다. 핸들을 만들었고 핸들이 거기에 있습니다.

이것이 아니라면 - 왜 일반적으로 오른쪽 하위 창에 (버퍼 그리기) 그리나요?

 
A100 :

표시기에서

::ChartWindowFind()는 -1을 반환합니다(즉, 작동하지 않음).


인디케이터가 초기화되지 않은 동안에는 그것이 작동하는 서브 윈도우의 번호를 알지 못합니다. 초기화에 성공해야만 창에 붙이기 때문에

즉, 인디케이터의 OnInit에서 ChartWindowFind()를 호출하는 것은 쓸모가 없습니다.

 
Slava :
즉, 인디케이터의 OnInit에서 ChartWindowFind()를 호출하는 것은 쓸모가 없습니다.

표시기의 OnInit에서 ChartWindowFind() 호출(표시기 는 동일 함)

 void OnStart ()
{
         string name = "Test_i" ;
        int sub_window = 1 ;
         ChartIndicatorAdd ( 0 , sub_window, iCustom ( NULL , PERIOD_CURRENT , name ));
}

결과: 1:참:0
2: 1 :0

모든 것이 정상이었습니다. 표시기의 OnInit 코드를 상기시켜 드리겠습니다.

 void OnInit ()
{
//...
         ResetLastError ();
         int sub_window = ChartWindowFind ();
         Print ( "2:" , sub_window , ":" , GetLastError ());
}
 
A100 :

이것이 아니라면 - 왜 일반적으로 오른쪽 하위 창에 (버퍼 그리기) 그리나요?

따라서 지표의 계산 과 그 도면 부분은 다릅니다. ChartWindowFind는 표시기 그리기를 담당하는 메커니즘에 대한 호출입니다. 저것들. 지표 자체도 아닙니다.

 
Slava :

인디케이터가 초기화되지 않은 동안에는 그것이 작동하는 서브 윈도우의 번호를 알지 못합니다. 초기화에 성공해야만 창에 붙이기 때문에

OnInit 후 ChartWindowFind() 호출(OnCalculate에서)

 //Test.mq5//Скрипт
void OnStart ()
{
         string name = "Test_i" ;
         ObjectCreate ( 0 , name, OBJ_CHART , 0 , 0 , 0 );
         long chart_id  = ObjectGetInteger ( 0 , name, OBJPROP_CHART_ID );
         int sub_window = 1 ;
         ChartIndicatorAdd ( chart_id, sub_window, iCustom ( NULL , PERIOD_CURRENT , name ));
}
 //Test_i.mq5//Индикатор
void OnInit () { Print ( __FUNCTION__ , ":end" ); }
int OnCalculate ( const int , const int , const int , const double & [] )
{
         Print ( __FUNCTION__ );
         ResetLastError ();
         int sub_window = ChartWindowFind ();
         Print ( "3:" , sub_window , ":" , GetLastError ());
         return 0 ;
}

결과: OnInit:end
OnCalculate
3: -1 :4113

즉, 인디케이터는 자신이 작동하는 서브 윈도우의 번호를 이미 알고 있지만 보고하지 않습니다.
 
A100 :

즉, 표시기는 이미 작동하는 창의 번호를 알고 있지만 보고하지 않습니다.

그는 ChartID()를 알고 있습니까?

 
fxsaber :

그는 ChartID()를 알고 있습니까?

필요하지 않음 - 매개변수가 없는 ChartWindowFind() 함수
 
A100 :
필요하지 않음 - 매개변수가 없는 ChartWindowFind() 함수

그가 ChartID()(매개변수 없이)를 모른다고 거의 확신합니다.

 
fxsaber :

그가 ChartID()(매개변수 없이)를 모른다고 거의 확신합니다.

이것은 특히 작동 불능이 다음과 같은 경우에만 나타나지 않기 때문에 명백한 결함입니다.

         ObjectCreate ( 0 , name, OBJ_CHART , 0 , 0 , 0 );
         long chart_id = ObjectGetInteger ( 0 , name, OBJPROP_CHART_ID );

하지만 또한 만약

         long chart_id = ChartOpen ( NULL , PERIOD_CURRENT );

저것들. 수동으로 차트 창을 추가하고 표시기를 첨부하면 모든 것이 정상입니다.

그리고 자동 방식인 경우 - 작동하지 않습니다.

이것은 알고리즘 거래의 개념과 모순됩니다.

 
A100 :

이것은 특히 작동 불능이 다음과 같은 경우에만 나타나지 않기 때문에 명백한 결함입니다.

하지만 또한 만약

저것들. 수동으로 차트 창을 추가하고 표시기를 첨부하면 모든 것이 정상입니다.

그리고 자동 방법이면 - 작동하지 않습니다.

이것은 알고리즘 거래의 개념과 모순됩니다.

지표의 구조가 명확해져서 매우 좋습니다. 문서에 이에 대한 내용이 거의 없다는 것이 이상합니다.

표시기의 계산된 부분과 도면 부분은 다른 요소입니다. 핸들은 계산된 부분입니다. 그리고 계산된 사람은 그림에 대해 아무것도 알지 못하며 해서는 안 됩니다.

핸들을 만들었지만 하나가 아닌 두 개의 차트에 배치했다고 가정해 보겠습니다. 분명히 하나의 지표만 있지만 ChartID와 SubWindows가 다른 두 개의 차트에 그려집니다. 그리고 핸들 표시기는 이것을 신경 쓰지 않습니다. 왜냐하면 그는 누군가가 그것을 어디에서 그리고 그것이 그려지는지 전혀 알지 못합니다. 표시기는 그리기를 책임지지 않습니다.

차트 또는 템플릿을 통해 표시기를 수동으로 배치하면 완전히 다른 작업이 발생합니다. 드로잉 파트와 함께 핸들이 생성됩니다. 동일한 입력 매개변수를 사용하여 표시기가 동일한 기호 및 기간을 가진 다른 차트에서 수동으로 실행되는 경우 드로잉 부분이 있는 다른 핸들이 생성됩니다.

MQL을 통해 완전히 다릅니다. 하나의 지표가 생성되고 두 번째 지표가 동일하면 아무 것도 다시 생성되지 않습니다. 결제 부분은 그대로 유지됩니다.

예를 들어 새 차트 또는 OBJ_CHART 에서 수동으로와 동일한 방식으로 MQL을 통해 표시기를 실행하는 유일한 방법은 LoadTemplate입니다.