Zero Divide(문제를 찾았지만 그 이유는 무엇입니까?) - 페이지 2

 
RaptorUK :

이 간단한 문제를 분류하는 데 며칠을 보내고 싶다면 언제든지 부담 없이 지내십시오. . . . 나는하지 않을 것이다.

백 테스트 중에 언제 발생하는지 안다면 쉽게 찾을 수 있습니다. . . 백 테스트가 발생한 날짜 하루 전에 백 테스트를 시작합니다. . . 언제 일어날지 정확히 알아내십시오. . . 코드의 모든 구분에 대해 . . . 예, 모두, 제수를 인쇄하는 나눗셈이 포함된 줄 앞에 Print()를 추가하고 해당 코드 줄에 대한 참조를 추가합니다. . .

예를 들어:

코드가 0으로 나누기 오류로 종료되면 로그 파일을 확인하고 마지막 몇 인쇄에서 오류를 생성한 코드 행과 0으로 설정된 변수를 보여주는 인쇄가 표시됩니다. . .

. . . 더 똑똑하게 일하는 법을 배우고 문제를 논리적이고 효율적으로 찾아내십시오.


이 문제를 처리하는 방법에 대한 올바른 방향을 알려주고 도와주셔서 감사합니다! 문제를 찾았습니다(오랜 시간 동안 여기저기서 지문을 긁어모은 후!)

그것은 실제로 내 브로커(ILQ)가 개념적 피드를 사용하고 이에 관한 내 스레드에서 이 포럼 회원의 도움을 받는다는 사실에서 비롯됩니다. 간단히 말해서 이것은 아래 코드입니다. ILQ를 사용하면 1단위만큼 낮게 거래할 수 있습니다. MT4 트랜잭션 창 내에서 원하는 정확한 단위 크기를 입력합니다(예: 0.01 || 874 단위).

이 공식의 어떤 부분이 내가 화살표를 놓은 부분에서 잘못되고 있는지 이해하는 데 도움을 줄 수 있습니까? 내가 봐도 수학이 좋아보이네?

 //+------------------------------------------------------------------+
//| Order Enter Function                                             |
//+------------------------------------------------------------------+
void OrderEntry( int direction)
{
   //Padding for the stop and padding for the entry too. 
   double ATR_Pad = iATR ( NULL , 60 , 14 , 1 )/ 2 ;
       if (ATR_Pad == 0.0 ) Print ( " ATR_Pad = " , ATR_Pad); 
   double Buy_Pad = NormalizeDouble (ATR_Pad, Digits );
   double Sell_Pad = NormalizeDouble (ATR_Pad, Digits );
   
   //Get Highest Price in our lookback range and set buy price above it.
   int iTBT = iBarShift( NULL , 60 , triggerBarTime, true ),
   iHH = iHighest( NULL , 60 , MODE_HIGH, iTBT + CandlesBeforeBiasObtained, 0 );
   double Buy_Here = High[iHH] + Buy_Pad;
   double buyPrice= NormalizeDouble (Buy_Here, Digits );

   //Get Lowest Price in our lookback range and set sell price below it.
   int iTBT_1 = iBarShift( NULL , 60 , triggerBarTime, true ),
   iLL = iLowest( NULL , 60 , MODE_LOW, iTBT_1 + CandlesBeforeBiasObtained, 0 );
   double Sell_Here =Low[iLL] - Sell_Pad;
   double sellPrice = NormalizeDouble (Sell_Here, Digits );
   
   //Stop calculations.    
   double ATR = iATR ( NULL , 60 , 14 , 1 );
   double MA = iMA ( NULL , 60 ,MA_Period, 0 , 1 , 0 , 1 );
   double BuyStopPriceMath = MA - ATR;
   double SellStopPriceMath = MA + ATR;
   double BuyStopPrice = NormalizeDouble (BuyStopPriceMath, Digits );
   double SellStopPrice = NormalizeDouble (SellStopPriceMath, Digits );

   //get our buystop price from below the ma and our takeprofit based on our r:r ratio.
   double pips_to_bsl = buyPrice-BuyStopPrice;
   double buy_tp_price=(pips_to_bsl*RewardRatio)+buyPrice;
   double buy_takeprofit_price= NormalizeDouble (buy_tp_price, Digits );

   //get our sellstop price from below the ma and our takeprofit based on our r:r ratio.
   double pips_to_ssl=SellStopPrice-sellPrice;
   double sell_tp_price=sellPrice-(pips_to_ssl*RewardRatio);
   double sell_takeprofit_price= NormalizeDouble (sell_tp_price, Digits );
   
   //Lot calculation - Facilitates Notional and Lots within MT4 - As well as find the tick value relative to the account denomination.   
   double risk_amount = AccountEquity( )*RiskPercent/ 100 ;
       if ( risk_amount == 0.0 ) Print ( " risk_amount = " , risk_amount);
   double Lot_Step = MarketInfo( Symbol (), MODE_LOTSTEP);
   double ts = MarketInfo( Symbol (), MODE_TICKSIZE);
   double tv = MarketInfo( Symbol (), MODE_TICKVALUE);
   double minlot = MarketInfo( Symbol (), MODE_MINLOT);
         
   double loss_for_1_lot = pips_to_bsl/ ts * tv ; //<<<<<<<<<<<<<<<<<<<<<<<<<<< This is giving me a "0" randomly sometimes?
       if ( loss_for_1_lot == 0.0 ) Print ( " loss_for_1_lot = " , loss_for_1_lot);
   //Alert(loss_for_1_lot);
   double LotSize_Buy = MathFloor ( risk_amount / loss_for_1_lot/ Lot_Step) * Lot_Step ;
       if ( LotSize_Buy == 0.0 ) Print ( " LotSize_Buy = " , LotSize_Buy);
   //Alert(LotSize_Buy);
      
   double loss_for_1_lot1 = pips_to_ssl/ ts * tv ;   //<<<<<<<<<<<<<<<<<<<<<<<<<<< This is giving me a "0" randomly sometimes?
       if ( loss_for_1_lot1 == 0.0 ) Print ( " loss_for_1_lot1 = " , loss_for_1_lot1);
   //Alert(loss_for_1_lot1);
   double LotSize_Sell = MathFloor ( risk_amount / loss_for_1_lot1/ Lot_Step) * Lot_Step ;
       if ( LotSize_Sell == 0.0 ) Print ( " LotSize_Sell = " , LotSize_Sell);
   //Alert(LotSize_Sell);
 
DomGilberto :


이 문제를 처리하는 방법에 대한 올바른 방향을 알려주고 도와주셔서 감사합니다! 문제를 찾았습니다(오랜 시간 동안 지문을 여기저기에 두드린 후!)

그것은 실제로 내 브로커(ILQ)가 개념적 피드를 사용하고 이에 관한 내 스레드에서 이 포럼 회원의 도움을 받는다는 사실에서 비롯됩니다. 간단히 말해서 아래 코드입니다. ILQ를 사용하면 1단위만큼 낮게 거래할 수 있습니다. MT4 트랜잭션 창 내에서 원하는 정확한 단위 크기를 입력합니다(예: 0.01 || 874 단위).

이 공식의 어느 부분이 내가 화살표를 넣은 부분에서 잘못되고 있는지 이해하는 데 도움을 줄 수 있습니까? 내가 봐도 수학이 좋아보이네?

알겠습니다. 대체 로트 크기 계산에 대한 귀하의 다른 스레드를 간략하게 읽었지만 충분히 자세히 설명하지는 않았지만 일반적으로 이 문제를 해결하기 위해 이것이 제가 할 수 있는 일입니다. . .

문제의 원인은 무엇입니까? 쉿? 티비? 아니면 둘다 ? 둘 중 하나가 0.0이면 ts와 tv의 곱은 0.0이 됩니다. . . bt 가끔 하나만 0.0으로 반환되는 경우 그 중 하나만 문제를 해결하면 됩니다. . .


TickSize는 변경되지 않습니다(내가 아는 한). . . 계속 읽을 필요는 없습니다. init()에서 읽을 수 있지만 반환된 값 0.0을 얻지 못하는지 확인하거나 원하는 경우 계속 읽으나 0.0이 아닌 경우 반환된 값만 사용하세요.

TickValue는 변경될 수 있지만 절대 0.0이 되어서는 안 됩니다. 따라서 이 값을 읽고 0.0이면 값을 업데이트하지 마십시오. . . 또는 다시 시도한 다음 업데이트하십시오.

로켓 과학이 아닙니다. . .

 

나는 당신이 이것에 대해 계속 질문해야 하는 이유를 이해하지 못합니다. 단순한 상식은 Raptor가 방금 말한 대로 해야 합니다. ts*tv가 문제가 아닌 것으로 판명되면 구분자로 사용되는 다른 모든 변수를 출력하십시오.

 

@SDC - 이미 했어 ㅋㅋㅋㅋ? 나는 그것이 어디에서 왔는지 이미 확인했습니다. 단지 내가 말한 것은 로트 크기 조정 공식이 나에게 좋아 보인다는 것입니다. 그리고 내가 누락된 것이 있는지 확인하기 위해 코드를 게시했습니다.

코드 "<<<<"에서 "0" 또는 0 나누기 를 출력하는 내용을 알 수 있습니다....

@ RaptorUK - 친구에게 감사합니다. 문제를 해결해 주셔서 감사합니다. 말씀하신 내용을 바탕으로 문제를 해결하는 방법을 알고 있다고 생각합니다. 잠시 후에 문제가 해결되었는지 확인하기 위해 다시 보고하겠습니다. :)

 
"0"을 반환하는 "TickValue"입니다.

"static double tv = 0;"을 사용해 보았습니다. 그런 다음 "int init" 내에 틱 값을 할당하고 "tv==0"인 경우 모든 새 H1 양초에서 정적 이중을 업데이트하지만 여전히 "0"보다 높은 값은 생성하지 않습니까? 문제의 통화 쌍은 GBPJPY입니다(이것은 모두 Strategy Tester 내에 있습니다).

제가 느리다면 죄송합니다...?
 
DomGilberto :
"0"을 반환하는 "TickValue"입니다.

"static double tv = 0;"을 사용해 보았습니다. 그런 다음 "int init" 내에 틱 값을 할당하고 "tv==0"인 경우 모든 새 H1 양초에서 정적 이중을 업데이트하지만 여전히 "0"보다 높은 값은 생성하지 않습니까? 문제의 통화 쌍은 GBPJPY입니다(이것은 모두 전략 테스터 내에 있습니다)

제가 느리다면 죄송합니다...?
TICKVALUE가 잘못된 값 0.0을 반환한 경우 왜 tv 값을 업데이트합니까? TICKVALUE가 0이 아닌 값을 반환하는 경우에만 tv를 업데이트해야 합니다. . .
 

죄송합니다. 저는 기본적으로 두 가지 방법을 모두 시도해 보았습니다. 그래서 나는 "tv = MarketInfo(Symbol(), MODE_TICKVALUE);" "int init" 섹션 내에서... (및 "static double tv = 0;")

기본적으로 눈금 값은 항상 "0"입니까? (당연히 인쇄를 하고 있습니다!)

마찬가지로 EURUSD에서 백테스트로 넘겼을 때 틱 값도 "0"이라고 표시되지만 2001년부터 2013년까지 0분할 오류 없이 전체 백테스트를 성공적으로 실행할 수 있습니까?

업데이트: 그래서 많은 기반 피드가 있는 라이브 시장에서 일반 브로커에 대한 테스트를 실행했으며 틱 값은 > 0 수치를 반환했습니다. 그러나 동일한 스크립트를 동일한 라이브 시장 브로커에 드롭했을 때 명목 피드, 틱 값이 "0"으로 반환됩니까? 개념적 피드 옵션(최저 1단위로 거래)을 사용할 때 이 로트 크기 조정 오류를 해결하는 방법에 대한 아이디어가 있습니까?

 
DomGilberto :

죄송합니다. 저는 기본적으로 두 가지 방법을 모두 시도해 보았습니다. 그래서 나는 "tv = MarketInfo(Symbol(), MODE_TICKVALUE);" "int init" 섹션 내에서... (및 "static double tv = 0;")

기본적으로 눈금 값은 항상 "0"입니까? (당연히 인쇄를 하고 있습니다!)

마찬가지로 EURUSD에서 백테스트로 넘겼을 때 틱 값도 "0"이라고 표시되지만 2001년부터 2013년까지 0분할 오류 없이 전체 백테스트를 성공적으로 실행할 수 있습니까?

당신이 보여준 코드에서. . . 표시한 기능 을 호출하지 않는 한 불가능합니다. . .

   double ts = MarketInfo( Symbol (), MODE_TICKSIZE);
   double tv = MarketInfo( Symbol (), MODE_TICKVALUE);
   double minlot = MarketInfo( Symbol (), MODE_MINLOT);
         
   double loss_for_1_lot = pips_to_bsl/ ts * tv ;

TICKVALUE가 항상 0.0이면 tv는 0.0이므로 ts * tv = 0.0이므로 항상 0으로 나누기 오류가 발생합니다. . .

터미널이 브로커에 연결되어 있습니까? 아니면 연결이 끊긴 상태에서 실행하고 있습니까?

 

내가 만든 이 비디오(40초 정도)가 내가 말하고 있는 내용을 설명하기를 바랍니다.

비디오: http://screencast.com/t/uMHY5DpM

스크립트를 라이브 차트(실제 계정)에 놓으면 틱 값과 틱 크기가 해당 "명목 계정"에서 "0"을 반환하는 첫 번째 부분을 볼 수 있습니다.

두 번째 부분은 동일한 브로커를 사용하지만 로트 기반 피드에 있으며 이번에는 틱 값과 틱 크기를 반환합니다. 다시 말하지만, 나는 당신이 제비를 사용하여 거래한다는 것을 설명합니다....

그래서 전략 테스터와 관련하여 나는 그것이 왜 효과가 있었고 때로는 그렇지 않았는지 전혀 모릅니다. 백 테스트도 실행하는 동안 계정이 연결되었습니다(데모 명목 공급 계정(단위)에서).

내 다음 질문은 이것이 내가 명목 Fed 계정에서 얻을 수 있는 일반적인 응답이라면 이 상황에서 내 포지션 규모 계산을 수정하는 방법을 제안할 수 있습니까? 그것은 많은 기반 피드에 완벽하게 작동합니다 ... 그것이 조금 더 잘 설명되기를 바라십니까?

 
DomGilberto :
"0"을 반환하는 "TickValue"입니다.

"static double tv = 0;"을 사용해 보았습니다. 그런 다음 "int init" 내에 틱 값을 할당하고 "tv==0"인 경우 모든 새 H1 양초에서 정적 이중을 업데이트하지만 여전히 "0"보다 높은 값은 생성하지 않습니까? 문제의 통화 쌍은 GBPJPY입니다(이것은 모두 전략 테스터 내에 있습니다).

제가 느리다면 죄송합니다...?


TickValue를 어떻게 인쇄하고 있습니까?

GBPJPY의 Digits는 일반적으로 3이므로 소수 자릿수가 충분하지 않기 때문에 TickValue가 0을 인쇄할 가능성이 큽니다.

절대적으로 확실하려면 인쇄된 소수점 이하 자릿수를 확장하는 것이 좋습니다.

DoubleToStr(MarketInfo( Symbol (),MODE_TICKVALUE), 8 )

참고

 double loss_for_1_lot = pips_to_bsl/ ts * tv ; //<<<<<<<<<<<<<<<<<<<<<<<<<<< This is giving me a "0" randomly sometimes?

pips_to_bsl이 0인 경우에도 0이 됩니다. 이게 가능해?

사유: