첨부 이미지
그림1
늘 수고 하십니다.
수식을 작성하다 문의가 있어서 이렇게 글을 올립니다.
<질문사항>
1. MessageBox가 별도의 창에 띄워지지 않고, 디버깅창에만 출력이 됩니다.
(제 컴퓨터 OS Window7 64)
2. 부동소수점 관련해서 아래 샘플 수식에서 처럼 어떤 수식을 계산해서 값의 차이가
선물 1틱(0.05) 이면 이라는 수식을 작성해서 주문을 낸다고 가정했을때, 실제 많은
로그에서 0.0499000000 이런식으로 찍힌다던가해서 실제로 조건이 만족을해도 주문이 나
가지 않는 경우가 있습니다.
아래처럼 toFixed(2)를 사용해서 조건을 비교하면 정상적으로 비교할 수 있으나,
toFixed 를 사용할때 가끔 값이 빈 Null이 발생할때 오류 보고창에 에러가 발생하는데,
(1) 원래 의도한 0.05 보다 작은 0.0499000000 이런식으로 계산이 되는 이유와 해결책
(선물의 가격을 단순히 차감한 가격에서 오류가 안났으면 합니다)
(2) toFixed를 사용했을때 값이 없을때의 오류처리 구문
function Main_OnStart()
{
var diff;
Main.MessageBox("HI"); // 박스로 띄워지지가 않음
// 부동소수점문제 Test
diff = 256.25 -Futures.current ; // 당시 선물 현재가 256.20
Main.MessageList("선물현재",Futures.current,"Test시세",256.15,"차이",diff);
Main.MessageList("선물현재",Futures.current,"Test시세",256.15,"차이",diff.toFixed(2));
if(diff == 0.05)
{
Main.MessageList("결과값 만족 ") ;
}
if(diff.toFixed(2) == 0.05)
{
Main.MessageList("결과값 만족 toFixed") ;
}
}
답변 1
예스스탁
예스스탁 답변
2013-09-11 14:50:12
안녕하세요
예스스탁입니다.
1.
현재 MessageBox의 기능이 MessageLog와 같도록 변경이 되어
스팟에서 박스를 띄우지 못하게 되었습니다.
스팟에서 수식에 MessageBox에 의해 박스가 뜨면 다른 스팟식도
해당 박스의 확인버튼을 클릭할때 까지 이벤트를 받지 못해
기능에서 삭제가 되었습니다.
2.
말씀하신 오류는 랭귀지 자체의 오류는 아니며
컴퓨터의 실수연산시 발생하는 오류입니다.
인터넷에서 부동소수점 오류로 검색하시면 많은 글 보실수 있습니다.
이문제는 근본적으로 프로세서가 실수를 부동소수점형태의
테이터 표현방식을 사용함으로 인해서 소수를 이진수로 변환하는 과정에서 생기는 문제로
대부분의 컴퓨터에서 동일하게 일어나는 문제입니다.
해당 부분은 따로 해결방법이 없습니다.
식 작성시에 값확인하시고 부동소숫점 오류가 있으면 toFixed 함수나 수학함수 등을
이용해 오류를 없애고 식을 만들어 가셔야 합니다.
function Main_OnStart()
{
var Diff = 21.45/1.1;
Main.MessageList(Diff);
Main.MessageList(Diff.toFixed(2));
Main.MessageList(Math.round(Diff*100)/100);
}
toFixed를 실행하기 전에 변수값이 숫자인지 아닌지를 판단하고 하셔야 합니다.
isNaN() 함수는 true/false 값을 반환하는데,
참(true)을 반환하면 "숫자가 아니라는 뜻이고", 거짓(false)을 반환하면 숫자라는 뜻입니다.
function Main_OnStart()
{
var Diff1 = 254.50-254.55;
var Diff2;
if (isNaN(Diff1) == false)
{
Main.MessageList(isNaN(Diff1),Diff1.toFixed(2));
}
else
{
Main.MessageList(isNaN(Diff1),"숫자아님");
}
if (isNaN(Diff2) == false)
{
Main.MessageList(isNaN(Diff2),Diff1.toFixed(2));
}
else
{
Main.MessageList(isNaN(Diff2),"숫자아님");
}
}
즐거운 하루되세요
> 히말라야 님이 쓴 글입니다.
> 제목 : MessageBox
> 늘 수고 하십니다.
수식을 작성하다 문의가 있어서 이렇게 글을 올립니다.
<질문사항>
1. MessageBox가 별도의 창에 띄워지지 않고, 디버깅창에만 출력이 됩니다.
(제 컴퓨터 OS Window7 64)
2. 부동소수점 관련해서 아래 샘플 수식에서 처럼 어떤 수식을 계산해서 값의 차이가
선물 1틱(0.05) 이면 이라는 수식을 작성해서 주문을 낸다고 가정했을때, 실제 많은
로그에서 0.0499000000 이런식으로 찍힌다던가해서 실제로 조건이 만족을해도 주문이 나
가지 않는 경우가 있습니다.
아래처럼 toFixed(2)를 사용해서 조건을 비교하면 정상적으로 비교할 수 있으나,
toFixed 를 사용할때 가끔 값이 빈 Null이 발생할때 오류 보고창에 에러가 발생하는데,
(1) 원래 의도한 0.05 보다 작은 0.0499000000 이런식으로 계산이 되는 이유와 해결책
(선물의 가격을 단순히 차감한 가격에서 오류가 안났으면 합니다)
(2) toFixed를 사용했을때 값이 없을때의 오류처리 구문
function Main_OnStart()
{
var diff;
Main.MessageBox("HI"); // 박스로 띄워지지가 않음
// 부동소수점문제 Test
diff = 256.25 -Futures.current ; // 당시 선물 현재가 256.20
Main.MessageList("선물현재",Futures.current,"Test시세",256.15,"차이",diff);
Main.MessageList("선물현재",Futures.current,"Test시세",256.15,"차이",diff.toFixed(2));
if(diff == 0.05)
{
Main.MessageList("결과값 만족 ") ;
}
if(diff.toFixed(2) == 0.05)
{
Main.MessageList("결과값 만족 toFixed") ;
}
}