if ( orderstoploss == 0.0 || ( orderstoploss < ( bid - TrailingStop * point ) ) )
orderstoploss = 1.29211(소수점 5자리) 입찰가=1.29716(또한 5자리) 후행 정지 = 50 포인트=0.001 그런 다음 (입찰가 - TrailingStop * 포인트)=1.29216>1.29211 사실, 이것은 숫자 가 갑자기 5와 같아야 한다는 것을 요구합니다. 그리고 더 나아가
if ( orderstoploss == 0.0 || ( orderstoploss < ( bid - TrailingStop * point ) ) )
로 쉽게 교체할 수 있습니다.
if ( orderstoploss < ( bid - TrailingStop * point )) )
내가 보기에 손절매 수준이 없는지 확인하는 것은 추적할 때 필요하지 않은 것 같습니다. 사실 나 자신을 고쳐야 한다. 이익이 있을 때만 손절매를 하면 마진 콜까지 기다릴 준비가 됩니다. 다른 것을 찾지 못했습니다. 어떤 쌍에서 후행이 올바르게 작동하지 않았으며 강한 움직임이 있었습니까?
안녕하세요. 나는 비교를 위해 모든 것을 정수로 가져옵니다. 그리고 일반적으로 가능한 한 저장하고 주어진 값(배열, 변수 등)을 사용합니다. 저것들. int 유형의 변수는 -2147483648에서 2147483647 사이의 값을 가질 수 있습니다. 이 치수는 십자가에 매우 적합합니다. 따라서 1.2999와 1.3000은 12999와 13000으로 줄여서 안전하게 비교할 수 있고, 마침표가있는 쓰레기를 두려워하지 않습니다.
여기에 예를 들어 예시를 스케치했습니다. :)
int Normalize(double double_value, int digits) - приводит double в int (1.2999 в 12999)
double Restore(int int_value, int digits) - приводит полученный ранее int в double (12999 в 1.2999)
여기
//+------------------------------------------------------------------+
//| ShiftPoint.mq4 |
//| Begun |
//+------------------------------------------------------------------+
#property indicator_chart_window
#property indicator_buffers 1
#property indicator_color1 Blue
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int init()
{
return(0);
}
//+------------------------------------------------------------------+
int Normalize(double double_value, int digits)
{
return (NormalizeDouble(double_value,digits)*MathPow(10,digits));
}
double Restore(int int_value, int digits)
{
return (NormalizeDouble((int_value/MathPow(10,digits)),digits));
}
//+------------------------------------------------------------------+
int start()
{
double Test_Value = 1.29999999;
int Test_int;
double Test_double;
Test_int = Normalize(Test_Value,Digits);
Test_double = Restore(Test_int,Digits);
Print("-----------------------------");
Print("Restored value = ",DoubleToStr(Test_double,Digits));
Print("Shift Point Value = ",Test_int);
Print("Real Double Value = ",DoubleToStr(Test_Value,8));
}
//+------------------------------------------------------------------+
산출: shiftpoint EURUSD,H1: 실제 더블 값 = 1.29999999 시프트포인트 EURUSD,H1: 시프트 포인트 값 = 13000 shiftpoint EURUSD,H1: 복원된 값 = 1.3000
3명이 시청했습니다 =) Renat이 와서 실수를 손가락으로 가리켰습니다 =))) 물론 지금 확인해 보겠습니다만 아마 이게 요점이겠죠... "bid - TrailingStop * point "를 normalize 하지 않았고, 이 구성은 order 수정에 포함됩니다... 어떻게 든 우리는 부주의합니다, 여러분;)
나는 빨리 보았고 (아직 파지 않았음) 당신을 위해 계산된 point 에 대한 호소를 찾았습니다.
그것을 "던지고" 어리석게 Point를 넣어보십시오. 아마도 문제는 이것입니다(MarketInfo를 통한 포인트가 항상 필요한 방식으로 나오지 않을 수 있습니까?).
네, 항상...
정규화를 시도할 수 있지만 =)
그리고 이것이 항상 허용되는 것은 아닙니다. 전문가는 여러 쌍을 거래할 수 있으며 그 요점은 다를 수 있습니다...
orderstoploss = 1.29211(소수점 5자리)
입찰가=1.29716(또한 5자리)
후행 정지 = 50
포인트=0.001
그런 다음 (입찰가 - TrailingStop * 포인트)=1.29216>1.29211
사실, 이것은 숫자 가 갑자기 5와 같아야 한다는 것을 요구합니다.
그리고 더 나아가
로 쉽게 교체할 수 있습니다.
내가 보기에 손절매 수준이 없는지 확인하는 것은 추적할 때 필요하지 않은 것 같습니다.
사실 나 자신을 고쳐야 한다. 이익이 있을 때만 손절매를 하면 마진 콜까지 기다릴 준비가 됩니다.
다른 것을 찾지 못했습니다. 어떤 쌍에서 후행이 올바르게 작동하지 않았으며 강한 움직임이 있었습니까?
나는 비교를 위해 모든 것을 정수로 가져옵니다. 그리고 일반적으로 가능한 한 저장하고
주어진 값(배열, 변수 등)을 사용합니다.
저것들. int 유형의 변수는 -2147483648에서 2147483647 사이의 값을 가질 수 있습니다.
이 치수는 십자가에 매우 적합합니다.
따라서 1.2999와 1.3000은 12999와 13000으로 줄여서 안전하게 비교할 수 있고,
마침표가있는 쓰레기를 두려워하지 않습니다.
여기에 예를 들어 예시를 스케치했습니다. :)
여기
//+------------------------------------------------------------------+ //| ShiftPoint.mq4 | //| Begun | //+------------------------------------------------------------------+ #property indicator_chart_window #property indicator_buffers 1 #property indicator_color1 Blue //+------------------------------------------------------------------+ //| Custom indicator initialization function | //+------------------------------------------------------------------+ int init() { return(0); } //+------------------------------------------------------------------+ int Normalize(double double_value, int digits) { return (NormalizeDouble(double_value,digits)*MathPow(10,digits)); } double Restore(int int_value, int digits) { return (NormalizeDouble((int_value/MathPow(10,digits)),digits)); } //+------------------------------------------------------------------+ int start() { double Test_Value = 1.29999999; int Test_int; double Test_double; Test_int = Normalize(Test_Value,Digits); Test_double = Restore(Test_int,Digits); Print("-----------------------------"); Print("Restored value = ",DoubleToStr(Test_double,Digits)); Print("Shift Point Value = ",Test_int); Print("Real Double Value = ",DoubleToStr(Test_Value,8)); } //+------------------------------------------------------------------+산출:
shiftpoint EURUSD,H1: 실제 더블 값 = 1.29999999
시프트포인트 EURUSD,H1: 시프트 포인트 값 = 13000
shiftpoint EURUSD,H1: 복원된 값 = 1.3000
에
옵션으로.
손절매 수준이 없는지 확인하는 것은 내가 볼 때 후행할 때 필요하지 않은 것 같습니다.
안녕하세요.
나는 비교를 위해 모든 것을 정수로 가져옵니다.
2dev:
맞습니다. 이것은 근본적인 문제이며 부동 소수점 숫자를 비교하는 것은 위험합니다.
중요한 장소에서는 Normalize()를 통해 지속적으로 숫자를 일정한 정밀도로 가져옵니다.
더블(8바이트) 유형의 표준입니다.
그건 그렇고, 우리는 오류를 피하기 위해 거래 요청 에서 전송 된 모든 가격을 강제로 정규화합니다.
손절매 요청을 1.2932461로 보낼 수 있지만 1.2932가 설정됩니다.
같은 가격에 정류소 재설정 시도가 실수가 아닌지 확인 부탁드립니다.
3명이 시청했습니다 =) Renat이 와서 실수를 손가락으로 가리켰습니다 =)))
물론 지금 확인해 보겠습니다만 아마 이게 요점이겠죠... "bid - TrailingStop * point "를 normalize 하지 않았고, 이 구성은 order 수정에 포함됩니다...
어떻게 든 우리는 부주의합니다, 여러분;)
시작이 제안한 Normalize()를 의미합니까?
시작이 제안한 Normalize()를 의미합니까?
죄송합니다. 표준 NormalizeDouble 을 의미했습니다.