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

 
Roman :

메모리 수준에서 코드가 어떻게 실행되는지, 초기화 및 값 반환에 대해 미리 생각할 필요가 있습니다.

아무 것도 생각할 필요가 없습니다. 매뉴얼이 이러한 일을 처리하며 MQL의 메모리 할당에 대한 매뉴얼은 없었고 개발자의 메시지만 있었고 종종 구현이 변경될 수 있다는 설명이 있었습니다.

좋아, 대화는 누가 프로그래밍에 관한 책을 읽었는지에 대한 것으로 요약됩니다. 저는 학교 때부터 읽었고 지난 30년 동안 이 책을 읽었습니다.

 
Igor Makanu :

아무 것도 생각할 필요가 없습니다. 매뉴얼이 이러한 일을 처리하며 MQL의 메모리 할당에 대한 매뉴얼은 없었고 개발자의 메시지만 있었고 종종 구현이 변경될 수 있다는 설명이 있었습니다.

좋아, 대화는 누가 프로그래밍에 관한 책을 읽었는지에 대한 것으로 요약됩니다. 저는 학교 때부터 읽었고 지난 30년 동안 이 책을 읽었습니다.

물론 컴파일러가 모든 것을 스스로 수행하는 이유에 대해 생각할 필요는 없습니다. ))
C가 아닌 C#

__inline의 경우 비디오를 참조하십시오.
차이점이 없는 사람들을 위해 메모리의 기능이 어떻게 작동하는지 설명합니다.

 
Vladimir Karputov :

먼저 그림을 그리고 shift 매개변수가 있는 표시기에 대해 "0 막대"를 표시합니다.

나는 그렸다. 제로 바는 수직선으로 표시됩니다.


 
RickD :

나는 그렸다. 제로 바는 수직선으로 표시됩니다.


코드 예:

 //+------------------------------------------------------------------+
//|                                        iMA Values on a Chart.mq5 |
//|                              Copyright © 2019, Vladimir Karputov |
//|                                           http://wmua.ru/slesar/ |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2019, Vladimir Karputov"
#property link        "http://wmua.ru/slesar/"
#property version    "1.00"
//--- input parameters
input int                   Inp_MA_ma_period     = 12 ;           // MA: averaging period
input int                   Inp_MA_ma_shift      = 5 ;           // MA: horizontal shift
input ENUM_MA_METHOD        Inp_MA_ma_method     = MODE_SMA ;     // MA: smoothing type
input ENUM_APPLIED_PRICE    Inp_MA_applied_price = PRICE_CLOSE ; // MA: type of price
//---
int     handle_iMA;                           // variable for storing the handle of the iMA indicator
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit ()
  {
//--- create handle of the indicator iMA
   handle_iMA= iMA ( Symbol (), Period (),Inp_MA_ma_period,Inp_MA_ma_shift,
                  Inp_MA_ma_method,Inp_MA_applied_price);
//--- if the handle is not created
   if (handle_iMA== INVALID_HANDLE )
     {
       //--- tell about the failure and output the error code
       PrintFormat ( "Failed to create handle of the iMA indicator for the symbol %s/%s, error code %d" ,
                   Symbol (),
                   EnumToString ( Period ()),
                   GetLastError ());
       //--- the indicator is stopped early
       return ( INIT_FAILED );
     }
//---
   return ( INIT_SUCCEEDED );
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit ( const int reason)
  {
//---

  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick ()
  {
//---
   double array_ma[];
   ArraySetAsSeries (array_ma, true );
   int start_pos= 0 ,count= 3 ;
   if (!iGetArray(handle_iMA, 0 ,start_pos,count,array_ma))
       return ;

   string text= "" ;
   for ( int i= 0 ; i<count; i++)
      text=text+ IntegerToString (i)+ ": " + DoubleToString (array_ma[i], Digits ()+ 1 )+ "\n" ;

   Comment (text);
  }
//+------------------------------------------------------------------+
//| Get value of buffers                                             |
//+------------------------------------------------------------------+
bool iGetArray( const int handle, const int buffer, const int start_pos,
               const int count, double &arr_buffer[])
  {
   bool result= true ;
   if (! ArrayIsDynamic (arr_buffer))
     {
       PrintFormat ( "ERROR! EA: %s, FUNCTION: %s, this a no dynamic array!" , __FILE__ , __FUNCTION__ );
       return ( false );
     }
   ArrayFree (arr_buffer);
//--- reset error code
   ResetLastError ();
//--- fill a part of the iBands array with values from the indicator buffer
   int copied= CopyBuffer (handle,buffer,start_pos,count,arr_buffer);
   if (copied!=count)
     {
       //--- if the copying fails, tell the error code
       PrintFormat ( "ERROR! EA: %s, FUNCTION: %s, amount to copy: %d, copied: %d, error code %d" ,
                   __FILE__ , __FUNCTION__ ,count,copied, GetLastError ());
       //--- quit with zero result - it means that the indicator is considered as not calculated
       return ( false );
     }
   return (result);
  }
//+------------------------------------------------------------------+

결과:


보시다시피 탬버린과 함께 춤을 추지 않고 조용히 복사됩니다.

파일:
 
Vladimir Karputov :

코드 예:

결과:


보시다시피 탬버린과 함께 춤을 추지 않고 조용히 복사됩니다.

코드 예. 지표를 기반으로 합니다. 표시기가 버퍼 메모리 언스풀링에 참여하고 있습니다.

 #property copyright "Copyright 2019"
#property link        ""
#property version    "1.00"

#property indicator_chart_window
#property indicator_buffers 1
#property indicator_plots    0

//---

input int                   MA_period = 12 ;
input int                   MA_shift = 5 ;
input ENUM_MA_METHOD        MA_method = MODE_SMA ;
input ENUM_APPLIED_PRICE    MA_applied_price = PRICE_CLOSE ;

int start_pos = 0 ;

//---

double MA_Calc_Buf[];

int hMA = INVALID_HANDLE ;


int OnInit ()
{
   SetIndexBuffer ( 0 , MA_Calc_Buf, INDICATOR_CALCULATIONS ); 
   ArraySetAsSeries (MA_Calc_Buf, true );
 
  hMA = iMA ( NULL , 0 , MA_period, MA_shift, MA_method, MA_applied_price);   
   if (hMA == INVALID_HANDLE )
  {
     int LErr = GetLastError ();
     PrintFormat ( "iMA create failed (%d)" , LErr);
     return ( INIT_FAILED );
  }
 
   return ( INIT_SUCCEEDED );
}

void OnDeinit ( const int reason)
{
   if (hMA != INVALID_HANDLE )
  {
     IndicatorRelease (hMA);
    hMA = INVALID_HANDLE ;
  }
}

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[])
{ 
   int copied;
  copied = CopyBuffer (hMA, 0 , start_pos, rates_total, MA_Calc_Buf);
   if (copied == - 1 )
  {
     int LErr = GetLastError ();
     PrintFormat ( "CopyBuffer(hMA) failed (%d)" , LErr);
     return (prev_calculated);
  }
 
   if (copied == 0 )
  {
     PrintFormat ( "CopyBuffer(hMA) copied 0 bars" );
     return (prev_calculated);
  } 
 
   string text = "" ;
   for ( int i= 0 ; i< 15 ; i++)
    text = text + IntegerToString (i) + ": " + DoubleToString (MA_Calc_Buf[i], Digits ()+ 1 ) + "\n" ;
 
   Comment (text);

   return (rates_total);
}

start_pos = 0이면 차트의 0번째 막대에 해당하는 값이 5번째 위치에 표시됩니다. 1.017041 전문가 고문의 0 위치에 있습니다. 확인.


하지만 이 값을 0번 위치에서 가져와야 합니다.

start_pos = 5로 설정했습니다. 원하는 결과를 얻지 못했습니다. 다시, 원하는 값은 5번째 위치에 있습니다.


start_pos = -5로 설정했습니다. 원하는 결과를 얻지 못하고 있습니다. 다시, 원하는 값은 5번째 위치에 있습니다.


start_pos = -10으로 설정했습니다. 그리고 이제 원하는 결과를 얻고 있습니다.


 
RickD :

코드 예. 지표를 기반으로 합니다. 표시기가 버퍼 메모리 언스풀링에 참여하고 있습니다.

start_pos = 0이면 차트의 0번째 막대에 해당하는 값이 5번째 위치에 표시됩니다. 1.017041 전문가 고문의 0 위치에 있습니다. 확인.


하지만 이 값을 0 위치에서 가져와야 합니다.

start_pos = 5로 설정했습니다. 원하는 결과를 얻지 못했습니다. 다시, 원하는 값은 5번째 위치에 있습니다.


start_pos = -5로 설정했습니다. 원하는 결과를 얻지 못하고 있습니다. 다시, 원하는 값은 5번째 위치에 있습니다.


start_pos = -10으로 설정했습니다. 그리고 이제 원하는 결과를 얻고 있습니다.


FROM Advisor와 FROM Indicator의 차이점을 이해해야 합니다. 표시기에서 작업하려면 도움말( iMA )의 예를 사용하십시오.

Документация по MQL5: Технические индикаторы / iMA
Документация по MQL5: Технические индикаторы / iMA
  • www.mql5.com
//|                                                     Demo_iMA.mq5 | //|                        Copyright 2011, MetaQuotes Software Corp. | //|                                             https://www.mql5.com | //| Перечисление способов создания хэндла                            |  Creation             type=Call_iMA;                ...
 
Vladimir Karputov :

FROM Advisor와 FROM Indicator의 차이점을 이해해야 합니다. 표시기에서 작업하려면 도움말( iMA )의 예를 사용하십시오.

따라서 iMA 도움말에서 예를 들어 추가합니다.

   ArraySetAsSeries (iMABuffer, true );
   comm = ( string ) DoubleToString (iMABuffer[ 0 ], Digits ());
   ArraySetAsSeries (iMABuffer, false );

   Comment (comm);   

값이 Expert Advisor의 출력 값과 정확히 ma_shift 막대만큼 다른지 확인하십시오.

array_ma[0]의 전문가와 마찬가지로 iMABuffer[0]의 표시기에서 값을 가져와야 합니다.

적어도 현재로서는 Expert Advisors용 CopyBuffer와 지표용 CopyBuffer의 동작이 다르다는 것을 알 수 있습니다. FROM Expert Advisor와 FROM 표시기 작업 시 CopyBuffer의 차이점을 이해하는 경우 연구용 문서의 관련 섹션을 참조하십시오.

 

나는 질문을 단순화하려고 노력할 것이다. 이 MA 값을 표시기의 버퍼로 어떻게 가져올 수 있습니까(빨간색 수직선 에서 왼쪽으로 시작)? 예시를 써주실 수 있나요?


 
RickD :

나는 질문을 단순화하려고 노력할 것이다. 이 MA 값을 표시기의 버퍼로 어떻게 가져올 수 있습니까(빨간색 수직선 에서 왼쪽으로 시작)? 예시를 써주실 수 있나요?


화면에서 버퍼 표시가 오른쪽으로 5칸 이동합니다. 따라서 표시기 버퍼의 다섯 번째 막대(인덱스 4 포함)를 가져오고 목록을 왼쪽으로 더 내려가려면 어디에서 가져와야 합니까? Buffer[4]에서 더 왼쪽으로.

이론에 의하면. 실제로, 나는 오랫동안 지표의 코드를 열지 않았고 거의 1 년 동안 그들과 함께 일하지 않았습니다. 그것을 시도하십시오.

 
Artyom Trishkin :


이론에 의하면. 실제로, 나는 오랫동안 지표의 코드를 열지 않았고 거의 1 년 동안 그들과 함께 일하지 않았습니다. 그것을 시도하십시오.

스킬을 마실 수 없습니다.

사유: