MQL4 및 MQL5에 대한 초보자 질문, 알고리즘 및 코드에 대한 도움말 및 토론 - 페이지 1041

 
Igor Makanu :

다른 방식으로 질문을 시도하십시오. 질문이 명확하지 않을 수 있습니다.

나는 설명하려고 노력할 것이다. 하지만 저는 프로그래밍에 있어서는 사실상 제로라는 점을 명심하십시오.

입찰가를 기반으로 곡선을 작성하는 눈금 표시기가 있습니다.

 #property   indicator_separate_window
#property indicator_buffers 1
#property indicator_color1 Aqua
double x[];
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int init()
  {
   IndicatorBuffers( 1 );
   SetIndexStyle( 0 , DRAW_LINE );
   SetIndexBuffer ( 0 ,x);
   SetIndexDrawBegin( 0 , 0 );
   SetIndexLabel( 0 , "x" );
   SetIndexShift( 0 , 0 );
   return ( 0 );
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int start()
  {
   double b=MarketInfo( Symbol (),MODE_BID);
   x[ 0 ]=b;
   for ( int j= ArraySize (x)- 1 ;j>= 1 ;j--){x[j]=x[j- 1 ];}
   return ( 0 );
  }
//+------------------------------------------------------------------+

이제 내가 하고 싶은 것.

차트에 표시기를 걸고 있습니다. 첫 번째 틱에서bid1의 첫 번째 값을 얻습니다. 우리는 그것을 기억합니다(저는 이것을 했습니다: 두 번째 버퍼 y[0]에 입력하고 그 값을 init()에 등록했습니다.

두 번째 틱에서bid2의 두 번째 값을 얻습니다.

다음으로 포인트의 차이를 구해야 합니다. delta=bid1-bid2(저는 이렇게 했습니다: delta=x[0]-x[1]).

이제 이전에 기록된 값 y[0]에 델타를 추가하고 실제로 bid2 값에 해당하는 y[1] 값을 얻습니다.

지표 곡선은 원하는 지표와 동일해야하지만 구성은 입찰 차이의 계산 된 값을 기반으로합니다.

이 지표는 후속 계산을 위한 템플릿으로 필요합니다.

돌을 던지지 마십시오. 어떻게 설명할 수 있을까요?

고맙습니다.

 
Oleg Bondarev :

나는 설명하려고 노력할 것이다. 하지만 저는 프로그래밍에 있어서는 사실상 제로라는 점을 명심하십시오.

입찰가를 기반으로 곡선을 작성하는 눈금 표시기가 있습니다.

이제 내가 하고 싶은 것.

차트에 표시기를 걸고 있습니다. 첫 번째 틱에서bid1의 첫 번째 값을 얻습니다. 우리는 그것을 기억합니다(저는 이것을 했습니다: 두 번째 버퍼 y[0]에 입력하고 그 값을 init()에 등록했습니다.

두 번째 틱에서bid2의 두 번째 값을 얻습니다.

다음으로 포인트의 차이를 구해야 합니다. delta=bid1-bid2(저는 이렇게 했습니다: delta=x[0]-x[1]).

이제 이전에 기록된 값 y[0]에 델타를 추가하고 실제로 bid2 값에 해당하는 y[1] 값을 얻습니다.

지표 곡선은 원하는 지표와 동일해야하지만 구성은 입찰 차이의 계산 된 값을 기반으로합니다.

이 지표는 후속 계산을 위한 템플릿으로 필요합니다.

돌을 던지지 마십시오. 어떻게 설명할 수 있을까요?

고맙습니다.

당신이하고 싶은 것이 명확하지 않습니다

일반적으로 정확한 문제는 무엇입니까? 표시기 버퍼를 틱(Bid)을 저장하기 위한 배열로 사용하고 표시기 버퍼의 크기는 터미널 자체에 의해 변경되며 또한 터미널 자체가 표시기 버퍼를 이동합니다 새로운 막대가 나타날 때

따라서 틱을 저장하려면 배열을 사용하고 표시기 버퍼를 사용하여 그리기만 하면 됩니다.

여기에서 나는 배열에 틱을 저장하는 당신과 비슷한 코드를 스케치했습니다.

 #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    1
//--- input parameters
input int       TickCount= 10 ;   //Размер массива тиков
//--- indicator buffers
double          Label1Buffer[];
double TickArr[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit ()
  {
//--- indicator buffers mapping
   SetIndexBuffer ( 0 ,Label1Buffer, INDICATOR_DATA );
   ArrayResize (TickArr,TickCount);                                   //изменим размер массива
   ArrayInitialize (TickArr, SymbolInfoDouble ( _Symbol , SYMBOL_BID ));     // проинициализируем массив значением текущего Bid
//---
   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= ArraySize (TickArr)- 1 ;i> 0 ;i--)
   {
      TickArr[i] = TickArr[i- 1 ]; // сдвинули массив
   }
   TickArr[ 0 ] = SymbolInfoDouble ( _Symbol , SYMBOL_BID ); // в 0-й элемент массива запомнили новый Bid
   
   
//--- return value of prev_calculated for next call
   return (rates_total);
  }
//+------------------------------------------------------------------+

이제 이 코드에 계산을 추가하고 아이디어에 따라 표시기 버퍼 Label1Buffer로 그려야 합니다.

 
다른 지표의 속성을 프로그래밍 방식으로 변경할 수 있는 기능을 추가하면 좋을 것입니다. 대략적으로 말하면 차트에 다른 표시기를 (프로그래밍 방식으로) 추가한 후 색상, 스타일 및 선 두께 를 설정할 수 있습니다.
 
Igor Makanu :

당신이하고 싶은 것이 명확하지 않습니다

일반적으로 정확한 문제는 무엇입니까? 표시기 버퍼를 틱(Bid)을 저장하기 위한 배열로 사용하고 표시기 버퍼의 크기는 터미널 자체에 의해 변경되며 또한 터미널 자체가 표시기 버퍼를 이동합니다 새로운 막대가 나타날 때

따라서 틱을 저장하려면 배열을 사용하고 표시기 버퍼를 사용하여 그리기만 하면 됩니다.

여기에서 나는 배열에 틱을 저장하는 당신과 비슷한 코드를 스케치했습니다.

이제 이 코드에 계산을 추가하고 아이디어에 따라 표시기 버퍼 Label1Buffer로 그려야 합니다.

대답 해줘서 고마워. 좀 더 괴롭혀줄게.

여기에 계산 추가?

 int OnCalculate ()

여기 내 계산이 있습니다.

   if (TickArr[ 0 ]>TickArr[ 1 ])
     {
      Label1Buffer[ 0 ]=Label1Buffer[ 1 ]+(TickArr[ 0 ]-TickArr[ 1 ]);
     }
   if (TickArr[ 0 ]<TickArr[ 1 ])
     {
      Label1Buffer[ 0 ]=Label1Buffer[ 1 ]-(TickArr[ 0 ]-TickArr[ 1 ]);
     }
   if (TickArr[ 0 ]==TickArr[ 1 ])
     {
      Label1Buffer[ 0 ]=Label1Buffer[ 1 ];
     }

아무것도 추가하지 않았습니다.

 
Yevhenii Levchenko :
다른 지표의 속성을 프로그래밍 방식으로 변경할 수 있는 기능을 추가하면 좋을 것입니다. 대략적으로 말하면 차트에 다른 표시기를 (프로그래밍 방식으로) 추가한 후 색상, 스타일 및 선 두께 를 설정할 수 있습니다.

Canvas를 사용하고 최소한 만화를 그립니다.

 

사진을 첨부하겠습니다.

인도

 
Oleg Bondarev :

아무것도 추가하지 않았습니다.

그래서 작동하지 않습니다)))

MQL에서 표시기 버퍼 를 사용하여 그리려면 표시기 버퍼에서 의미합니다. 내 예에서는 이것이 Label1Buffer입니다. 값을 입력합니다(값 할당).

귀하의 예에서는 조건이 충족될 때만 값을 할당하지만 조건이 충족되지 않으면 어떻게 될까요? - 그래서 아무것도 표시되지 않습니다.


글쎄, 다시 한 번, 나는 TickArr 배열이 Bid 틱 값을 포함하는 "빈"을 만들었습니다. 그리고 당신은 당신의 조건에서 표시기 버퍼의 이전 값을 사용합니다 - 그리고 누가 이 버퍼에 어떤 값을 넣습니까?


IMHO, 바로 작동하지 않습니다. 표시기 버퍼로 선을 그린 다음 눈금을 비교합니다.

 
Oleg Bondarev :

사진을 첨부하겠습니다.


코너가 반전되면? 계산은 어떻게 될까요?

 
Oleg Bondarev :

사진을 첨부하겠습니다.


프로그래밍에서 거의 0이라고 말하면 왜 그런 비표준 작업을 수행합니까? 간단한 작업으로 시작합니까? 글쎄, 또는 기본 지식을 강화? 여기에서 하는 것이 더 쉽습니다. 네.
 
Igor Makanu :

그래서 작동하지 않습니다)))

MQL에서 표시기 버퍼 를 사용하여 그리려면 표시기 버퍼에서 의미합니다. 내 예에서는 이것이 Label1Buffer입니다. 값을 입력합니다(값 할당).

귀하의 예에서는 조건이 충족될 때만 값을 할당하지만 조건이 충족되지 않으면 어떻게 될까요? - 그래서 아무것도 표시되지 않습니다.


글쎄, 다시 한 번, 나는 TickArr 배열이 Bid 틱 값을 포함하는 "빈"을 만들었습니다. 그리고 당신은 당신의 조건에서 표시기 버퍼의 이전 값을 사용합니다 - 그리고 누가 이 버퍼에 어떤 값을 넣습니까?


IMHO, 바로 작동하지 않습니다. 표시기 버퍼로 선을 그린 다음 눈금을 비교합니다.

나는 "집합 농부"라고 경고했다)

그가 그렇게 했습니다.

 #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    1
//--- input parameters
input int       TickCount= 100000 ;   //Размер массива тиков
input int       TickCountb= 100000 ;
//--- indicator buffers
double Label1Buffer[];
double TickArr[];

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit ()
  {
//--- indicator buffers mapping
   SetIndexBuffer ( 0 ,Label1Buffer);
   ArrayResize (TickArr,TickCount);
   ArrayResize (Label1Buffer,TickCountb);                                   //изменим размер массива
   ArrayInitialize (TickArr,MarketInfo( Symbol (),MODE_BID));     // проинициализируем массив значением текущего Bid

//---
   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= ArraySize (TickArr)- 1 ;i> 0 ;i--)
   {
      TickArr[i] = TickArr[i- 1 ]; // сдвинули массив
   }
   TickArr[ 0 ] = MarketInfo( Symbol (),MODE_BID); // в 0-й элемент массива запомнили новый Bid
   
   for ( int j= ArraySize (TickArr)- 1 ;j> 0 ;j--)
   {
      Label1Buffer[j] = Label1Buffer[j- 1 ]; // сдвинули массив
   }
   
   Label1Buffer[ 0 ]= TickArr[ 0 ];   
//--- return value of prev_calculated for next call
   return (rates_total);
  }
//+------------------------------------------------------------------+

이제 눈금 차트를 그리지만 일부 줄 바꿈이 있습니다.

4에서 합니다.