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

 
-Aleks- :

도와주세요! (MQL4)

지표의 경우 각 막대를 고려하여 M15 차트 에서 하루의 시작 시간을 가져와야 합니다.

현재 막대(0)를 고려하여 초 단위로 계산하기로 결정했지만 실수를 했습니다.

D_Shift=(Open_time-pos*15*60-(Open_time-Open_timeTF))/1440*60;

지표의 경우:

 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             temp_day;
   MqlDateTime     dt_struct;
   TimeToStruct (time[ 0 ],dt_struct);
   temp_day=dt_struct.day;

   for ( int i= 0 ;i<rates_total- 1 ;i++)
     {
       TimeToStruct (time[i],dt_struct);
       if (dt_struct.day<temp_day)
        {
         Print ( "Start day " ,time[i- 1 ]);
         break ;
        }
     }

//--- done
   return (rates_total);
  }

하지만: 이 코드는 OnCalculate()를 입력할 때마다 실행됩니다. 여기에서 필요에 따라 bool 플래그를 추가하거나 코드를 별도의 함수로 이동합니다.

 
Karputov Vladimir :

지표의 경우:

하지만: 이 코드는 OnCalculate()를 입력할 때마다 실행됩니다. 여기에서 필요에 따라 bool 플래그를 추가하거나 코드를 별도의 함수로 이동합니다.

감사합니다. 하지만 매 틱마다 다시 계산하는 것은 좋지 않습니다. 코드를 이해해야 하지만, 내 코드가 작동하지 않는 이유를 이해하고 싶지만 이상한 숫자가 로그에 반환됩니다.

Open_timeTF 1454715900
Open_time 1454284800
Delta_1S 431100
Delta_M15 479

오늘의 첫 번째 막대와 현재 막대 사이에 479개의 막대 차이가 있는 것으로 나타났습니다. 그 이유는 무엇입니까?

 
-Aleks- :

감사합니다. 하지만 매 틱마다 다시 계산하는 것은 좋지 않습니다. 코드를 이해해야 하지만, 내 코드가 작동하지 않는 이유를 이해하고 싶지만 이상한 숫자가 로그에 반환됩니다.

Open_timeTF 1454715900
Open_time 1454284800
Delta_1S 431100
Delta_M15 479

오늘의 첫 번째 막대와 현재 막대 사이에 479개의 막대 차이가 있는 것으로 나타났습니다. 그 이유는 무엇입니까?

결국, 나는 내가 심령이 아니므로 다음과 같이 표시했습니다.

하지만: 이 코드는 OnCalculate()를 입력할 때마다 실행됩니다 . 여기에서 필요에 따라 bool 플래그를 추가 하거나 코드를 별도의 함수로 이동합니다 .

 
Karputov Vladimir :

결국, 나는 내가 심령이 아니므로 다음과 같이 표시했습니다.

그리고 여기서 왜 초능력이 필요한가? 위의 코드에는 변수가 있습니다. 이 변수가 숫자로 무엇을 반환하는지 보여주고 코드에 따라 이것이 왜 그렇게 되고 그렇지 않은지 질문했습니다.
 
Karputov Vladimir , 귀하의 코드를 이해하지 못합니다. 저는 이 사업의 초보자이기 때문에 이전에 OnCalculate 함수를 전혀 사용하지 않았기 때문에 여기서 rate_total 이 계산된 것을 이해할 수 없으며 가장 중요한 것은 어디에 나중에 반품하려면? 이 모든 것을 별도의 함수로 변환하는 방법을 여전히 이해하지 못합니다. 주석 없이는 어렵습니다.
 
-Aleks- :
Karputov Vladimir , 귀하의 코드를 이해하지 못합니다. 저는 이 사업의 초보자이기 때문에 이전에 OnCalculate 함수를 전혀 사용하지 않았기 때문에 여기서 rate_total 이 계산된 것을 이해할 수 없으며 가장 중요한 것은 어디에 나중에 반품하려면? 이 모든 것을 별도의 함수로 변환하는 방법을 여전히 이해하지 못합니다. 주석 없이는 어렵습니다.

표시기의 전체 MQL4 코드는 다음과 같습니다.

 //+------------------------------------------------------------------+
//|                                                    Start day.mq4 |
//|                        Copyright 2016, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2016, MetaQuotes Software Corp."
#property link        "https://www.mql5.com"
#property version    "1.00"
#property strict
#property indicator_chart_window
//--- input parameters
input int       timer= 10 ; // seconds
//--- parameter
bool            IsDefineTime= true ; // true -> you can define time
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit ()
  {
//--- indicator buffers mapping
   EventSetTimer (timer);
//---
   IsDefineTime= true ;
//---
   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[])
  {
//---
   int             temp_day;
   MqlDateTime     dt_struct;
   TimeToStruct (time[ 0 ],dt_struct);
   temp_day=dt_struct.day;

   if (IsDefineTime)
     {
       for ( int i= 0 ;i<rates_total- 1 ;i++)
        {
         TimeToStruct (time[i],dt_struct);
         if (dt_struct.day<temp_day)
           {
             Print ( "Start day " ,time[i- 1 ]);
            IsDefineTime= false ;
             break ;
           }
        }
     }
//--- return value of prev_calculated for next call
   return (rates_total);
  }
//+------------------------------------------------------------------+
//| Timer function                                                   |
//+------------------------------------------------------------------+
void OnTimer ()
  {
//---
   IsDefineTime= true ; // true -> you can define time
  }
//+------------------------------------------------------------------+

작동 알고리즘: 표시기가 시작되면 타이머의 시간 간격(예: 10초)을 설정합니다. 이는 타이머가 10초마다 실행됨을 의미합니다.

 //+------------------------------------------------------------------+
//| Timer function                                                   |
//+------------------------------------------------------------------+
void OnTimer ()
  {
//---
   IsDefineTime= true ; // true -> you can define time
  }

IsDefineTime 변수는 true 로 설정됩니다. 무엇을 위한 것입니까? IsDefineTime=true이면 OnCalculate()에서 하루의 시작 시간을 결정하기 위한 루프를 입력할 수 있습니다.

   if (IsDefineTime)
     {
       for ( int i= 0 ;i<rates_total- 1 ;i++)
        {
         TimeToStruct (time[i],dt_struct);
         if (dt_struct.day<temp_day)
           {
             Print ( "Start day " ,time[i- 1 ]);
            IsDefineTime= false ;
             break ;
           }
        }
     }

이 루프에서 가장 오른쪽 막대(인덱스는 "0"과 같음)에서 time[] 배열(이 배열은 여는 시간의 값을 저장함)을 탐색하기 시작합니다. 하루의 시작을 찾으면 그 값을 출력하고 IsDefineTime 변수를 false 로 설정합니다. 이렇게 하면 타이머가 다시 작동할 때까지 시작 루프에 들어가는 것을 방지할 수 있습니다.

파일:
Start_day.mq4  3 kb
 

Karputov Vladimir , 설명 감사합니다. 그러나 이것이 어떻게 문제를 해결합니까?

대략적으로 말하면, 하루의 시작의 막대에 해당하는 현재 TF의 막대를 찾는 것이 필요합니다. 각 막대에서 찾아서 그에 따라 표시기의 계산 및 그리기를 수행하십시오.

 
-Aleks- :

Karputov Vladimir , 설명 감사합니다. 그러나 이것이 어떻게 문제를 해결합니까?

대략적으로 말하면, 하루의 시작의 막대에 해당하는 현재 TF의 막대를 찾는 것이 필요합니다. 각 막대에서 찾아서 그에 따라 표시기의 계산 및 그리기를 수행하십시오.

요청한대로 그들은 당신에게 대답했습니다 :). 그리고 이 날의 첫 번째 막대의 시간이 필요하지 않고 이 막대의 인덱스가 필요한 경우 하루의 시작을 인쇄할 때 다음과 같습니다.

.
.
.
Print ( "Start day " ,time[i- 1 ]);
.
.
.

인덱스 [i-1]을 사용합니다. 이것은 오늘의 첫 번째 막대 번호입니다.

 
Karputov Vladimir :

요청한대로 그들은 당신에게 대답했습니다 :). 그리고 이 날의 첫 번째 막대의 시간이 필요하지 않고 이 막대의 인덱스가 필요한 경우 하루의 시작을 인쇄할 때 다음과 같습니다.

인덱스 [i-1]을 사용합니다. 이것은 오늘의 첫 번째 막대 번호입니다.

동의 - 혼란스럽게 물었다.

응용 프로그램에 내가 만든 표시기가 있지만 올바르게 계산되지 않습니다. 나는 매우 어리석고 이해가 되지 않습니다. 당신 쪽에서 설명을 들어도 하루 시작의 첫 번째 막대에 해당하는 인덱스를 올바르게 결정하도록 만들 수 있습니다.

뻔뻔하게 해서 죄송합니다. 하지만 귀하의 코드와 제 코드를 결합하는 방법을 알려주실 수 있습니까?

 

-Aleks- :

하루 시작의 첫 번째 막대에 해당하는 인덱스를 올바르게 결정하도록 하려면 어떻게 해야 합니까?

어떻게 든 FSE가 실행 중입니다) 다음과 같습니다.

 datetime Day00= 86400 *( TimeCurrent ()/ 86400 ); //начало дня
int bar_shift= iBarShift ( _Symbol , PERIOD_CURRENT ,Day00); //индекс первого бара текущего дня
사유: