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

 
-Aleks- :

반올림 문제 해결 방법을 알려주세요!

나머지 없이 쉼표 수를 제거해야 합니다. 반올림하고 거듭제곱해도 전체 문제가 해결되지 않습니다. 어떻게 해야 합니까?

예를 들어 1.44430이고 144430이 필요합니다.

코드의 일부 - 있는 그대로

NormalizeDouble(Low[1],Digits)*MathPow(10,(Digits+1)*1-1)

_Point로 나누면 됩니다.
 
Alexey Viktorov :
_Point로 나누면 됩니다.

잘못된 결과 인쇄, 원본은 161188(1.61188)입니다. 귀하의 161187 인쇄 방법은 1.6119를 제공합니다(소수점 다섯 자리가 있는 경우 낮음[1]을 인쇄할 때 반올림하는 이유는 무엇입니까?), 내 버전은 161188입니다.

하지만 작업을 복잡하게 만들면


long Calc=
NormalizeDouble ( Close [ 1 ], Digits )* MathPow ( 10 ,( Digits + 1 )* 3 - 1 )+
NormalizeDouble ( High [ 1 ], Digits )* MathPow ( 10 ,( Digits + 1 )* 2 - 1 )+
NormalizeDouble ( Low [ 1 ], Digits )* MathPow ( 10 ,( Digits + 1 )* 1 - 1 );

그런 다음 숫자 161184의 마지막 부분 - 즉. 4단위 차이

이 표현식의 옵션은 유사한 값을 생성합니다.

long CalcX=
NormalizeDouble ( Close [ 1 ], Digits )* MathPow ( 10 ,( Digits + 1 )* 3 - 1 )+
NormalizeDouble ( High [ 1 ], Digits )* MathPow ( 10 ,( Digits + 1 )* 2 - 1 )+
Low [ 1 ]/ Point ;

무엇이 잘못되었고 어떻게 고칠지에 대한 생각이 있습니까?

 
-Aleks- :

잘못된 결과 인쇄, 원본은 161188(1.61188)입니다. 귀하의 161187 인쇄 방법은 1.6119를 제공합니다(소수점 다섯 자리가 있는 경우 낮음[1]을 인쇄할 때 반올림하는 이유는 무엇입니까?), 내 버전은 161188입니다.

하지만 작업을 복잡하게 만들면


long Calc=
NormalizeDouble ( Close [ 1 ], Digits )* MathPow ( 10 ,( Digits + 1 )* 3 - 1 )+
NormalizeDouble ( High [ 1 ], Digits )* MathPow ( 10 ,( Digits + 1 )* 2 - 1 )+
NormalizeDouble ( Low [ 1 ], Digits )* MathPow ( 10 ,( Digits + 1 )* 1 - 1 );

그런 다음 숫자 161184의 마지막 부분 - 즉. 4단위 차이

이 표현식의 옵션은 유사한 값을 생성합니다.

long CalcX=
NormalizeDouble ( Close [ 1 ], Digits )* MathPow ( 10 ,( Digits + 1 )* 3 - 1 )+
NormalizeDouble ( High [ 1 ], Digits )* MathPow ( 10 ,( Digits + 1 )* 2 - 1 )+
Low [ 1 ]/ Point ;

무엇이 잘못되었고 어떻게 고칠지에 대한 생각이 있습니까?

이렇게 시작합니다.

/********************Script program start function*******************/
void OnStart ()
{
   string i = DoubleToString ( SymbolInfoDouble ( _Symbol , SYMBOL_BID )/ _Point , 0 );
   Print (i);
   Print ( SymbolInfoDouble ( _Symbol , SYMBOL_BID )/ _Point );
} /*******************************************************************/
 
Alexey Viktorov :
이렇게 실행합니다.

/********************Script program start function*******************/
void OnStart ()
{
   string i = DoubleToString ( SymbolInfoDouble ( _Symbol , SYMBOL_BID )/ _Point , 0 );
   Print (i);
   Print ( SymbolInfoDouble ( _Symbol , SYMBOL_BID )/ _Point );
} /*******************************************************************/

예, 문자열 변수(이전)를 통해 올바른 숫자를 얻었지만 0이 추가되었습니다. 161188.00000000 제거하는 방법은 무엇입니까?

 
-Aleks- :

예, 문자열 변수(이전)를 통해 올바른 숫자를 얻었지만 0이 추가되었습니다. 161188.00000000 제거하는 방법은 무엇입니까?

내 코드에는 0이 없습니다. 어떻게 쓰여졌는지 보십시오.
 
Alexey Viktorov :
내 코드에는 0이 없습니다. 어떻게 쓰여졌는지 보십시오.

감사합니다. 저는 0을 놓쳤습니다.

결과는 그런 디자인이었습니다

string CalcX=
DoubleToString ( Close [ 1 ]/ _Point , 0 )+
DoubleToString ( High [ 1 ]/ _Point , 0 )+
DoubleToString ( Low [ 1 ]/ _Point , 0 );
Print ( "CalcX=" ,CalcX);

이제 이 숫자를 다시 구성 요소로 분해해야 합니다.

문자열을 숫자 로 변환하려고 할 때 161188 대신 잘못된 숫자 161184를 다시 잡습니다.

long testX = StringToDouble (CalcX);
Print ( "testX=" ,testX);

분명히 선을자를 필요가 있지만 최적으로 올바르게 수행하는 방법은 무엇입니까?


 
-Aleks- :

예, 문자열 변수(이전)를 통해 올바른 숫자를 얻었지만 0이 추가되었습니다. 161188.00000000 제거하는 방법은 무엇입니까?

구분 기호 "."를 사용하여 문자열을 구문 분석합니다.
 
Artyom Trishkin :
그래서... 템플릿을 보여주세요. 그러면 거기에 무엇이 있는지 어떻게 압니까?
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit ()
  {
//--- indicator buffers mapping
  
//---
   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[])
  {
//---
  
//--- return value of prev_calculated for next call
   return (rates_total);
  }
//+------------------------------------------------------------------+
 
추세선 의 두 번째 시간 좌표가 브레이크 아웃 또는 터치에 따라 설정되도록 표시기를 구현하는 방법을 아는 사람을 알려주십시오. 즉, 추세선이 있고 그 시작이 특정 위치에 있고 두 번째 좌표의 시간은 임의대로 설정되지만 선이 캔들과 교차하는 지점에서 끝이 나야 합니다. 그림에 표시된 표시기에서 허용하는 대로
 
-Aleks- :

감사합니다. 저는 0을 놓쳤습니다.

결과는 그런 디자인이었습니다

string CalcX=
DoubleToString ( Close [ 1 ]/ _Point , 0 )+
DoubleToString ( High [ 1 ]/ _Point , 0 )+
DoubleToString ( Low [ 1 ]/ _Point , 0 );
Print ( "CalcX=" ,CalcX);

이제 이 숫자를 다시 구성 요소로 분해해야 합니다.

문자열을 숫자 로 변환하려고 할 때 161188 대신 잘못된 숫자 161184를 다시 잡습니다.

long testX = StringToDouble (CalcX);
Print ( "testX=" ,testX);

분명히 선을자를 필요가 있지만 최적으로 올바르게 수행하는 방법은 무엇입니까?


아무 것도 구문 분석할 필요가 없습니다. 일반 숫자를 보기 위해 문자열로 변환합니다. 계산을 위해 아무것도 할 필요가 없습니다.

음, 저항할 수 없는 변태 욕구가 있는 경우 문자열을 다시 숫자 StringToDouble()로 변환하고 _Point에 필요한 문자 수(아마도 _Digits)로 정규화하여 곱합니다.