mql4 언어의 기능, 미묘함 및 작업 방법 - 페이지 29

 
Vladimir Karputov :

그리고 " 데이터 창 "에서 시간은 동일합니까?

네.

 
Andrey Khatimlianskii :

네.

알았습니다. 그래서 정말 바 시간입니다. 다만 ' 정확한 시간 척도 ' 설정이 의심스러웠을 뿐이다.

Настройки платформы - Начало работы - Справка по MetaTrader 5
Настройки платформы - Начало работы - Справка по MetaTrader 5
  • www.metatrader5.com
Торговая платформа обладает множеством настроек, что позволяет организовать работу в ней так, как это удобно именно вам. Выполните команду " Настройки" меню "Сервис" или нажмите "Ctrl+O". Графики — общая настройка отображения ценовых графиков, а также настройка параметров управления объектами: выделение объектов после их создания, немедленная...
 

안녕하세요!
"for" 루프에서 "double"을 사용하는 올바른 방법은 무엇입니까? 도움말에서 "더블"의 사용에 대한 금지는 없는 것 같습니다. "i"를 정규화해야 한다는 것을 이해하지만 할 수 없습니다.

 double expr1= 1.0 ;
double expr2= 2.8 ;
double step= 0.2 ;
double i;
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart ()
  {
   int count= 0 ;
   for (i=expr1; i<=expr2; i+=step)
     {
       NormalizeDouble (i, 1 );
      count++;
       Print ( " i: " ,DoubleToStr(i, 8 ), " step: " ,DoubleToStr(step, 8 ));
     }
   int MaxPass=( int ) NormalizeDouble (((expr2-expr1)/step), 0 )+ 1 ;
   Print ( " MaxPass: " ,MaxPass, " count: " ,count, " i: " ,i);
  }
//+------------------------------------------------------------------+

"expr2=2.6 "이면 9회 반복에 대해 모든 것이 정상이지만 이미 "expr2=2.8"을 사용하면 9회 반복(정확히 10회)이 잘못 표시됩니다.

 
Nauris Zukas :

안녕하세요!
"for" 루프에서 "double"을 사용하는 올바른 방법은 무엇입니까? 도움말에서 "더블"의 사용에 대한 금지는 없는 것 같습니다. "i"를 정규화해야 한다는 것을 이해하지만 할 수 없습니다.

"expr2=2.6 "이면 9회 반복에 대해 모든 것이 정상이지만 이미 "expr2=2.8"을 사용하면 9회 반복(정확히 10회)이 잘못 표시됩니다.

값을 정규화해야 할 수도 있습니다.

 
Alexey Viktorov :

값을 정규화해야 할 수도 있습니다.

이런 식으로 의미했다면 도움이되지 않았습니다.

 double expr1= 1.0 ;
double expr2= 2.8 ;
double step= 0.2 ;
double i;
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart ()
  {
   int count= 0 ;
   for (i= NormalizeDouble (expr1, 1 ); i<= NormalizeDouble (expr2, 1 ); i+= NormalizeDouble (step, 1 ))
     {
       NormalizeDouble (i, 1 );
      count++;
       Print ( " i: " ,DoubleToStr(i, 8 ), " step: " ,DoubleToStr(step, 8 ));
     }
   int MaxPass=( int ) NormalizeDouble (((expr2-expr1)/step), 0 )+ 1 ;
   Print ( " MaxPass: " ,MaxPass, " count: " ,count, " i: " ,i);
  }
 
Nauris Zukas :

당신이 이런 식으로 의미했다면 그것은 어느 쪽도 도움이되지 않았습니다.

아니요. 최소한 최적화는 해야 합니다.

 double expr1= 1.0 ;
double expr2= 2.8 ;
double step= 0.2 ;
double i;
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart ()
  {
   int count= 0 ;
   for (i= NormalizeDouble (expr1, 1 ); i<= NormalizeDouble (expr2, 1 ); NormalizeDouble ( i+=step , 1 ))
     {
       NormalizeDouble (i, 1 );
      count++;
       Print ( " i: " ,DoubleToStr(i, 8 ), " step: " ,DoubleToStr(step, 8 ));
     }
   int MaxPass=( int ) NormalizeDouble (((expr2-expr1)/step), 0 )+ 1 ;
   Print ( " MaxPass: " ,MaxPass, " count: " ,count, " i: " ,i);

잘못된 값을 제공하기 때문입니다. 나머지는 필요하지 않을 수 있습니다.

 
Nauris Zukas :

안녕하세요!
"for" 루프에서 "double"을 사용하는 올바른 방법은 무엇입니까? 도움말에서 "더블"의 사용에 대한 금지는 없는 것 같습니다. "i"를 정규화해야 한다는 것을 이해하지만 할 수 없습니다.

"expr2=2.6 "이면 9회 반복에 대해 모든 것이 정상이지만 이미 "expr2=2.8"을 사용하면 9회 반복(정확히 10회)이 잘못 표시됩니다.

나는 그것을 찾았고 Nikolay의 게시물을 읽었으며 그는 매우 상세하고 매우 높은 품질의 작업을 두 번 설명했습니다. https://www.mql5.com/ru/forum/1111/page2623#comment_14473837

자료가 처음 동화되지 않은 경우 코드에서 Print()를 printf()로 대체하여 최소 15번째 문자까지 이중 출력을 시도 하십시오 https://www.mql5.com/en/forum/1111/ page2623#comment_14474138

아마 그러면 당신은 이유를 알게 될 것입니다

 
Alexey Viktorov :

아니요. 최소한 최적화는 해야 합니다.

잘못된 값을 제공하기 때문입니다. 나머지는 필요하지 않을 수 있습니다.

감사합니다. 그러나 귀하의 예에서도 올바른 결과를 얻지 못했습니다. printf 에서 정규화가 일어나지 않는 것을 볼 수 있습니다:

0 10:29:31.595 Test_Double_For EURCHF,H4: i = 1.00000000000000000000000000000000000000000000000000000000
0 10:29:31.595 Test_Double_For EURCHF,H4: i = 1.199999999999999955591079014993738383054733276367187500000000
0 10:29:31.595 Test_Double_For EURCHF,H4: i = 1.39999999999999911182158029987476766109466552734375000000000
0 10:29:31.595 Test_Double_For EURCHF, H4: i = 1.59999999999999986773237044981215149164199829101562500000000
0 10:29:31.595 Test_Double_For EURCHF,H4: i = 1.799999999999999822364316059974953532218933105468750000000000
0 10:29:31.595 Test_Double_For EURCHF,H4: i = 1.999999999999999777955395074968691915273666381835937500000000
0 10:29:31.595 Test_Double_For EURCHF,H4: i = 2.199999999999999733546474089962430298328399658203125000000000
0 10:29:31.595 Test_Double_For EURCHF,H4: i = 2.399999999999999911182158029987476766109466552734375000000000
0 10:29:31.595 Test_Double_For EURCHF,H4: i = 2.600000000000000008817841970012523233890533447265625000000000
0 10:29:31.595 Test_Double_For EURCHF,H4: MaxPass: 10 카운트: 9
0 10:29:31.595 Test_Double_For EURCHF,H4: 마지막 i = 2.800000000000000266453525910037569701671600341796875000000000

 
Igor Makanu :

나는 그것을 찾았고 Nikolay의 게시물을 읽었으며 그는 매우 상세하고 매우 높은 품질의 작업을 두 번 설명했습니다. https://www.mql5.com/ru/forum/1111/page2623#comment_14473837

자료가 처음 동화되지 않은 경우 코드에서 Print()를 printf()로 대체하여 최소 15번째 문자까지 이중 출력을 시도 하십시오 https://www.mql5.com/en/forum/1111/ page2623#comment_14474138

아마 그러면 당신은 이유를 알게 될 것입니다

감사합니다. 왜 이런 일이 발생하는지 이해합니다. 그래서 정규화를 시도했습니다. 나는 성공하지 못했다. Alexey Viktorov 변종도 상황을 수정하지 않았으며 값은 비정규화 상태로 유지됩니다. 그래서 질문이 남습니다. 루프에서 "이중"을 사용하고 항상 정확한 반복 횟수를 얻을 수 있습니까?

 
Nauris Zukas :

따라서 문제는 루프에서 "더블"을 사용할 수 있다는 것입니다.

~할 수 있다

나우리스 주카스 :

항상 정확한 반복 횟수를 얻으시겠습니까?

이중 값은 항상 정확하지만 보거나 얻으려는 위치 십진법과 일치하지 않습니다.

나우리스 주카스 :

감사합니다. 왜 이런 일이 발생하는지 이해합니다. 그래서 정규화를 시도했습니다. 나는 성공하지 못했다. Alexey Viktorov, 변종도 상황을 수정하지 않았으며 값은 비정규화 상태로 유지됩니다.

이중 변환을 사용한 조작에는 항상 제한이 있습니다. 이 작업이 귀하의 예와 같은 방식으로 해결되는지 의심됩니다.

신뢰할 수 있는 결정을 내리십시오. 루프에서 int를 사용하고 결과 값을 두 배로 계산하는 공식을 사용하고 루프에서 반복할 때 결과로 이중 덧셈을 사용하지 마십시오. Nikolay와의 대화에서 제 예를 다시 살펴보세요.