초보자의 질문 MQL5 MT5 MetaTrader 5 - 페이지 1345

 
Vitaly Muzichenko # :

다시 말하지만 다음 복사본을 로드할 때 접두사를 변경해야 합니까?

그리고 말의 목표는 무엇입니까?

버튼은 창에서 생성하고 제어할 수 없습니다.


무엇이 될까요?

 
Igor Makanu # :

그리고 말의 목표는 무엇입니까?

버튼은 창에서 생성하고 제어할 수 없습니다.


무엇이 될 것인가?

잘 모르겠지만 다음과 같이 해야 합니다. 하위 창에서 만들고 클릭하면 이 하위 창의 번호를 가져옵니다. 아무 것도 그릴 필요가 없으며 클릭하면 하위 창 번호에 대한 경고 정보가 표시되는 버튼만 있으면 됩니다.

 
Vitaly Muzichenko # :

잘 모르겠지만 다음과 같이 해야 합니다. 하위 창에서 만들고 클릭하면 이 하위 창의 번호를 가져옵니다. 아무 것도 그릴 필요가 없으며 클릭하면 하위 창 번호에 대한 경고 정보가 표시되는 버튼만 있으면 됩니다.

내 첫 번째 소스에서 테스트:

 #property indicator_separate_window
#property indicator_buffers 1
#property indicator_plots    1
//--- plot Label1
#property indicator_label1    "Label1"
#property indicator_type1    DRAW_LINE
#property indicator_color1    clrRed
#property indicator_style1    STYLE_SOLID
#property indicator_width1    2
#include <Controls\Button.mqh>
CButton button;

//--- indicator buffers
double          Label1Buffer[];
input int MASlow = 21 ; // Период медленной МА
input int MAFast = 8 ;   // Период быстрой МА
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit ()
{
//--- indicator buffers mapping
   string short_name = MQLInfoString ( MQL_PROGRAM_NAME ) + "=Set (" + ( string )MASlow + "/" + ( string )MAFast + ")" ;
   IndicatorSetString ( INDICATOR_SHORTNAME , short_name);

   // IndicatorSetString(INDICATOR_SHORTNAME, "IndicatorSetString() Demo");
   SetIndexBuffer ( 0 , Label1Buffer, INDICATOR_DATA );
   srand ( GetTickCount ());
   long c_id = ChartID ();
   int c_wf = ChartWindowFind ();
   Print (c_id, " / " , c_wf);
   button.Create(c_id, "button" + ( string ) rand (), c_wf, 10 , 10 , 100 , 100 );
   button.Text( "Button" );
//---
   return ( INIT_SUCCEEDED );
}
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
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[])
{
   for ( int i = prev_calculated == 0 ? 0 : prev_calculated - 1 ; i < rates_total; i++)
   {
      Label1Buffer[i] = close[i];
   }
   return (rates_total);
}
//+------------------------------------------------------------------+


아아, 모든 것이 작성하는 대로입니다. 기본 매개변수로 이 표시기의 여러 복사본을 실행하면 버튼은 하위 창의 첫 번째 표시기에만 표시됩니다.

시작할 때 매개변수를 변경하면 모든 것이 정상입니다.


일반적으로 이해할 수 없는 상황

 
Igor Makanu # :

내 첫 번째 소스에서 테스트:

아아, 모든 것이 작성하는 대로 입니다. 기본 매개변수로 이 표시기의 여러 복사본을 실행하면 버튼은 하위 창의 첫 번째 표시기에만 표시됩니다.

시작 시 매개변수를 변경하면 모든 것이 정상입니다.

일반적으로 이해할 수 없는 상황

다음은 질문입니다. 설정에 들어가지 않고 매개변수를 자동으로 변경하는 방법은 무엇입니까?

지금까지 아무것도 작동하지 않습니다 ...

---

PS 이상적으로는, 하지만 아아

 input long MASlow = TimeLocal (); //
 
Vitaly Muzichenko # :

지금까지 아무것도 작동하지 않습니다 ...

작동하지 않습니다.

추가:

 int OnInit ()
{
   Print ( __FUNCTION__ );

표시기를 스케치합니다. 로그에 OnInit가 표시되지만 다음 표시기는 이미 무음입니다. 실제로 표시기의 복사본 하나만 실행되고 나머지 표시기는 그래픽 쉘일 뿐입니다.

 
Igor Makanu # :

작동하지 않습니다.

추가:

표시기를 스케치합니다. 로그에 OnInit가 표시되지만 다음 표시기는 이미 무음입니다. 실제로 표시기의 복사본 하나만 실행되고 나머지 표시기는 그래픽 쉘일 뿐입니다.

그렇다니까. MT5 아키텍처가 곡선인 것 같습니다. MT4에서는 모든 것이 완벽하게 작동합니다.

MT5에서 이 작업을 수행하기로 결정하면 동일한 입력 매개변수를 사용하여 표시기의 복사본을 시작하는 것을 금지할 것입니다. 그렇지 않으면 있는 것처럼 보이지만 실제로는 그렇지 않습니다.

 
Vitaly Muzichenko # :

그렇다니까. MT5 아키텍처가 곡선인 것 같습니다. MT4에서는 모든 것이 완벽하게 작동합니다.

MT5에서 이 작업을 수행하기로 결정하면 동일한 입력 매개변수를 사용하여 표시기의 복사본을 시작하는 것을 금지할 것입니다. 그렇지 않으면 있는 것처럼 보이지만 실제로는 그렇지 않습니다.

표시기의 계산된 부분은 그래픽 부분과 동일하지 않습니다. 따라서 그들 모두에 대한 계산은 동일합니다. 여러 그래픽.

하나의 표시기에서 모든 하위 창을 간단히 검색하고 하위 창 번호가 있는 레이블을 넣을 수 있습니까? 동시에 타이머의 차트 하위 창 수를 파악합니다. 증가 - 새 하위 창에 레이블을 추가합니다. 그러나 어떤 종류의 표시기가 배치되어 있는지 찾아보십시오. 다른 경우 추가하지 마십시오...

검증되지 않은 아이디어일 뿐입니다.

추신. 나는 "곡률"에 대해 동의하지 않습니다. 20개의 동일한 지표에 대해 하나의 계산된 부분이 20개의 동일한 지표에 대한 20개의 계산된 부분보다 낫습니다.

 
Artyom Trishkin # :

표시기의 계산된 부분은 그래픽 부분과 동일하지 않습니다. 따라서 그들 모두에 대한 계산은 동일합니다. 여러 그래픽.

하나의 표시기에서 모든 하위 창을 간단히 검색하고 하위 창 번호가 있는 레이블을 넣을 수 있습니까? 동시에 타이머의 차트 하위 창 수를 파악합니다. 증가 - 새 하위 창에 레이블을 추가합니다. 그러나 어떤 종류의 표시기가 배치되어 있는지 찾아보십시오. 다른 경우 추가하지 마십시오...

검증되지 않은 아이디어일 뿐입니다.

추신. 나는 "곡률"에 대해 동의하지 않습니다. 20개의 동일한 지표에 대해 하나의 계산된 부분이 20개의 동일한 지표에 대한 20개의 계산된 부분보다 낫습니다.

버튼에 대한 반응이 없습니다 - 복사의 OnChartEvent가 작동하지 않고 하위 창의 번호를 이해하지 못합니다.

일반적으로 이것은 작동하지 않으며 나머지 코드와 함께

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

초보자의 질문 MQL5 MT5 MetaTrader 5

이고르 마카누 , 2021.09.12 21:53

작동하지 않습니다.

추가:

 int OnInit ()
{
   Print ( __FUNCTION__ );

표시기를 스케치합니다. 로그에 OnInit가 표시되지만 다음 표시기는 이미 무음입니다. 실제로 표시기의 복사본 하나만 실행되고 나머지 표시기는 그래픽 쉘일 뿐입니다.


 
Vitaly Muzichenko # :

했는데, 버튼에 반응이 없습니다 - OnChartEvent 사본이 작동하지 않고 하위 창의 번호를 이해하지 못합니다.

일반적으로 이것은 작동하지 않으며 나머지 코드와 함께


하지만!!! "Debug.tpl"이라는 이름으로 이러한 표시기 중 2-3개를 사용하여 템플릿을 만들고 표시기 디버깅을 시작하면 OnInit()가 예상대로 작동합니다.

기본적으로 다음과 같은 실험을 했습니다.

인디케이터가 생성될 때까지 OnInit()가 실행되고 인디케이터의 짧은 이름은 창의 인디케이터 수에 따라 만들어질 것으로 예상하여 #property를 최대 OnInit()으로 옮겼습니다.

 #property indicator_separate_window
#property indicator_buffers 1
#property indicator_plots    1
//--- plot Label1
//#property indicator_label1  "Label1"
//#property indicator_type1   DRAW_LINE
//#property indicator_color1  clrRed
//#property indicator_style1  STYLE_SOLID
//#property indicator_width1  2
//--- indicator buffers
double          Label1Buffer[];
input int MASlow = 21 ; // Период медленной МА
input int MAFast = 8 ;   // Период быстрой МА
//input string shortName = "1";  // Префикс…
long chart_id = ChartID ();
string short_name = "" ;
/********************************************************************\
|           Custom indicator initialization function                 |
\********************************************************************/
int OnInit ()
 {
//--- indicator buffers mapping
   long windows_total = ChartGetInteger (chart_id, CHART_WINDOWS_TOTAL );
  short_name = ( string )windows_total;
   Print (short_name);
   PlotIndexSetInteger ( 0 , PLOT_DRAW_TYPE , DRAW_LINE );
   PlotIndexSetInteger ( 0 , PLOT_LINE_COLOR , clrRed );
   PlotIndexSetInteger ( 0 , PLOT_LINE_STYLE , STYLE_SOLID );
   PlotIndexSetInteger ( 0 , PLOT_LINE_WIDTH , 2 );
   PlotIndexSetString ( 0 , PLOT_LABEL , "Label1" );
   IndicatorSetString ( INDICATOR_SHORTNAME , short_name);
   SetIndexBuffer ( 0 , Label1Buffer, INDICATOR_DATA );
   return ( INIT_SUCCEEDED );
 } /******************************************************************/

그러나 도움이되지 않았습니다.

첫 번째 복사본 실행

지표명 2 … …

두 번째 사본을 시작합니다. 표시기의 이름은 두 표시기 모두에 대해 여전히 2입니다.

나는 디버깅을 시작하고 내가 보는 것을 !!! 아직 로드되지 않은 표시기가 이미 인쇄 중입니다... 두 번째 및 세 번째 줄을 읽으십시오...

어떻게 될 수 있습니까?


또한 OnInit() 입구에서 디버깅이 중지되고 windows_total 변수에 가비지가 포함되어 있고 short_name은 여전히 빈 문자열입니다...

안녕하세요………하지만 이 모든 것이 이미 인쇄되었습니다… 어때요???

그리고 short_name은 이미 변경되었습니다.

결과적으로 표시기가 디버그 모드에서 완전히 로드된 후 표시기 이름은 다음과 같습니다.

아마도 우리는 그러한 버그에 개발자의 관심을 끌 필요가 있습니다 ...

 
안녕하세요 친구 여러분, 제가 주제를 벗어났을 수도 있지만 "초보자 MQL5 MT5 MetaTrader 5의 질문"이라는 제목의 섹션을 참조하십시오. 따라서 질문은 다음과 같습니다. 테스트를 위해 마켓에서 데모 어드바이저를 다운로드했습니다. MT 5를 하지 않았는데 문제 없이 Demo.MT4를 다운로드할 수 없습니다. MT 5 아니요 이유가 무엇입니까?
사유: