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

 

안녕하세요. MT5의 기능을 이해하는 데 도움을 주신 모든 분들께 깊은 경의를 표합니다. 당신 없이는 이것을하기가 매우 어렵습니다 ... 혼미, 전화 끊기, 서클에서 달리기. 따라서 존중하고 존중하십시오.


문제. rate_total과 과거 막대 한도를 연결하는 가장 좋은 방법은 무엇입니까? 코드에 맞나요? 답변, 힌트, 힌트에 대한 ATP.

 //--- Проверка количества доступных баров
   if (rates_total< 24 ) return 0 ;
//--- Проверка и расчёт количества просчитываемых баров
   int limit=rates_total-prev_calculated;
   if (limit> 1 )
     
      limit=rates_total- 1 ;

//Показать историю за CountPeriods недель барах по Н1

int bars= PeriodSeconds ( PERIOD_W1 )/ PeriodSeconds ( PERIOD_H1 )*CountPeriods;   //  CountPeriods=4; В глобальных переменных

//РЕШИЛ ТАК НО ПО-МОЕМУ ЧУШЬ...

int lm= iBarShift ( NULL , PERIOD_H1 , iTime ( NULL , PERIOD_CURRENT ,limit));       //rates_total-1 в днях
int start=lm-(lm-bars);

Comment(start,"    bars    ",bars);  //Равенство значений есть

이제 새로운 시간이 다가오고 있음을 관찰했습니다. 모든 것이 정상적으로 작동합니다.

그런 다음 질문은 다음과 같습니다. 코드에서 rate_total을 사용하여 순간의 형식을 올바르게 지정했습니까?

 

Bars 기능에 대한 도움말을 주의 깊게 읽었습니다.

"

start_time 및 stop_time 매개변수가 지정된 경우 함수는 날짜 범위 의 막대 수를 반환합니다. 이러한 매개변수를 지정하지 않으면 함수는 총 막대 수를 반환합니다.

"

도움말은 시작 날짜 또는 종료 날짜를 포함해야 하는지 여부를 말하지 않으므로 결과적으로 기능에서 무엇을 기대해야 하는지 알 수 없습니다.

기능의 작업은 놀랍습니다.

   datetime          StartDt= StringToTime ( "2018.01.04 10:00" );
   datetime          StopDt= StringToTime ( "2018.01.03 23:49" );
//datetime         StopDt=StringToTime("2018.01.04 10:00");
//datetime         StopDt=StringToTime("2018.01.04 10:01");
   int               BarsGo= Bars ( Symbol (), PERIOD_CURRENT ,StartDt,StopDt);
   Print ( "BarsGo=" ,BarsGo);

주석 처리된 옵션을 포함하여 모든 옵션에서 StopDt는 값 2를 얻습니다!

이 옵션은 시작 날짜(2018.01.04 10:00)가 종료 날짜(2018.01.03 23:49)(초 단위)보다 늦은 경우 특히 놀랍습니다. 오류가 없거나 최소 1인 이유는 무엇입니까?

시작 날짜와 종료 날짜가 같으면 다시 듀스가 아닌 단위를 제공하는 것이 논리적입니다!

FORTS에서 Si 도구를 확인했는데 차트가 분입니다.

 

도와주세요 인디케이터 피스

 //+------------------------------------------------------------------+
//|  OnCalculate 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[])
  {

   ArraySetAsSeries (time, true );

   datetime Fp= 0 ,Ep= 0 ,pFp= 0 ,pEp= 0 ,Arr[];
   int Count= 0 ,bars= 0 ,dt= 0 ;

   int limit;
   if (prev_calculated== 0 || prev_calculated< 0 || prev_calculated>rates_total)
      limit=Nbar;
   else
      limit=rates_total-prev_calculated;

   for ( int i=limit;i>= 0 ;i--)
     {

       if ( CopyTime ( NULL ,TimeFrame,time[i], 1 ,Arr)> 0 )Ep=Arr[ 0 ]- 1 * PeriodSeconds ( PERIOD_CURRENT );
       else return ( 0 );

때때로 time[i] 배열이 오버플로됩니다. 예를 들어 시장이 닫히는 밤에 .

2019.01.25 00:06:35.191 i-Regr4_05i (Si Splice,H1)      array out of range in 'i-Regr4_05i.mq5' (134,38)

이 문제를 해결하는 방법은 무엇입니까?

 

공지 후 조언 부탁드립니다.

 double Price[]; 

배열 크기 는 항상 0입니까?

 
pivomoe :

공지 후 조언 부탁드립니다.

배열 크기는 항상 0입니까?

네.

 
Artyom Trishkin , 전문적이고 책임감 있는 중재자로서 Bars 기능의 동작에 대한 이론적 근거, 특히 추측이 아닌 매뉴얼에 대한 링크를 듣고 싶습니다!
 
Aleksey Vyazmikin :

도와주세요 인디케이터 피스

때때로 time[i] 배열이 오버플로됩니다. 예를 들어 시장이 닫히는 밤에 .

이 문제를 해결하는 방법은 무엇입니까?

예를 들어, Nbar 매개변수를 올바르게 계산하십시오 .

   if (prev_calculated== 0 || prev_calculated< 0 || prev_calculated>rates_total)
      limit= Nbar ;
 
Aleksey Vyazmikin :

Bars 기능에 대한 도움말을 주의 깊게 읽었습니다.

"

start_time 및 stop_time 매개변수가 지정된 경우 함수는 날짜 범위 의 막대 수를 반환합니다. 이러한 매개변수를 지정하지 않으면 함수는 총 막대 수를 반환합니다.

"

도움말은 시작 날짜 또는 종료 날짜를 포함해야 하는지 여부를 말하지 않으므로 결과적으로 기능에서 무엇을 기대해야 하는지 알 수 없습니다.

기능의 작업은 놀랍습니다.

주석 처리된 옵션을 포함하여 모든 옵션에서 StopDt는 값 2를 얻습니다!

이 옵션은 시작 날짜(2018.01.04 10:00)가 종료 날짜(2018.01.03 23:49)(초 단위)보다 늦은 경우 특히 놀랍습니다. 오류가 없거나 최소 1인 이유는 무엇입니까?

시작 날짜와 종료 날짜가 같으면 다시 듀스가 아닌 단위를 제공하는 것이 논리적입니다!

FORTS에서 Si 도구를 확인했는데 차트가 분입니다.

불일치에 대해 이야기하기 전에 차트에 함수가 반환하는 것보다 더 많은 막대가 있다는 것을 보여줄 필요가 있습니다.

나는 이 기능으로 꽤 많이 일하고 어떤 문제도 일으키지 않는다. 그리고 iBarShift와 비슷한 기능이 mql5에 들어간 이유에 매우 놀랐습니다.

그리고 프로그래머가 갑자기 혼동하면 함수가 'from'과 'to'의 시간을 변경한다는 사실은 "바보로부터 보호"의 개념에 모두 포함됩니다.

그리고 저는 또한 조언하고 싶습니다. 기능이 더 빨리 작동하도록 하려면 막대의 시작 시간을 입력하십시오. 몇 줄의 추가 라인은 발사 속도를 제공합니다. 이것은 테스터에게 특히 중요합니다.

 
Vladimir Karputov :

예를 들어, Nbar 매개변수를 올바르게 계산하십시오 .

나 자신을 위해 이미 검사를 수행했지만이 기능의 오류를 우회하기위한이 검사는 검사의 필요성에 대해 전혀 말하지 않으므로 기본 제공되어야 함을 의미합니다.

그리고 당신은 지표 확인에 대해 이야기하고 있으며 iBarShift는 내 생각에 있고 청산 및 거래 세션 으로 인해 기록에 자주 실패하지 않는 외환에만 적합하기 때문에 Bars를 사용하여 올바른 바 시작 시간을 계산합니다 하루 종일 지속하지 마십시오.

 
Alexey Viktorov :

불일치에 대해 이야기하기 전에 차트에 함수가 반환하는 것보다 더 많은 막대가 있다는 것을 보여줄 필요가 있습니다.

나는 이 기능으로 꽤 많이 일하고 어떤 문제도 일으키지 않는다. 그리고 iBarShift와 비슷한 기능이 mql5에 들어간 이유에 매우 놀랐습니다.

그리고 프로그래머가 갑자기 혼동하면 함수가 'from'과 'to'의 시간을 변경한다는 사실은 "바보로부터 보호"의 개념에 모두 포함됩니다.

그리고 저는 또한 조언하고 싶습니다. 기능이 더 빨리 작동하도록 하려면 막대의 시작 시간을 입력하십시오. 몇 줄의 추가 라인은 발사 속도를 제공합니다. 이것은 테스터에게 특히 중요합니다.

이것은 방어가 아니라 코드의 오류를 감지하는 데 장애물입니다!

또한 날짜가 일치하면 숫자 2를 반환하는 것이 전혀 논리적이지 않습니다. 그렇다면 정당성은 무엇입니까?

FORTS의 막대 시작 시간이 일치하지 않아 계산 오류가 발생할 수 있습니다. 예를 들어 막대가 14:00에 열리지 않고 14:05에 열립니다.

사유: