포럼을 어지럽히 지 않도록 모든 초보자 질문. 프로, 놓치지 마세요. 너 없이는 아무데도 - 6. - 페이지 66

 
Roger :

사실 후행이라고 하는 것은 다른 방식으로 계산되며 그 동작이 비논리적일 수 있습니다.


용어의 개념이 일치하지 않도록 하십시오. 하지만 저를 이해하십니까?

해결된 문제는 다음과 같습니다.

 double getLots( double newSL) {
   int opnTime = 0 ; // время открытия трейда для цикла пересчета позиций
   double lotSum = 0 ; 
   for ( int i = 0 ; i <= OrdersTotal ()- 1 ; i++) {
       OrderSelect (i, SELECT_BY_POS);     
       if ((OrderOpenTime() > opnTime) && (OrderType() == OP_BUY) || (OrderType() == OP_SELL)) { 
         opnTime = OrderOpenTime(); 
         if (OrderType() == OP_BUY)    { lotSum += OrderLots() * (newSL - OrderOpenPrice()) / Point ; }
         if (OrderType() == OP_SELL)   { lotSum -= OrderLots() * (newSL - OrderOpenPrice()) / Point ; }
      }
   }   
   return (lotSum);
}

이 기능은 모든 미결 거래를 고려하지 않았기 때문에 주기 조건을 변경해야 했습니다. 이제 다음과 같이 보입니다.

 double AcountProfitEx( double Price) {
   double    ProfitSum   = 0 ;
   for ( int i = OrdersTotal ()- 1 ; i >= 0 ; i--) {
       OrderSelect (i, SELECT_BY_POS);
       if (OrderType() == OP_BUY)
      ProfitSum -= (OrderOpenPrice() - Price) * OrderLots() / Point ;
       if (OrderType() == OP_SELL)
      ProfitSum += (OrderOpenPrice() - Price) * OrderLots() / Point ;
   }
   return (ProfitSum);
}

이 함수는 지정된 가격 수준에서 모든 공개 거래의 이익 금액을 계산합니다. 그러나 확산을 고려하지 않는다는 인용된 의견이 있는데 동의합니다. 이 의견의 저자는 이 솔루션을 제안했습니다.

 double getLots( double newSL)
{
   double TickValue, delta;
   double lotSum;
   string SymbolName ;
   
   SymbolName = Symbol ();
   TickValue = MarketInfo( SymbolName , MODE_TICKVALUE) / Point ;
   delta = ( newSL - Bid ) * TickValue;

   lotSum = 0.0 ; 
   for ( int i = 0 ; i <= OrdersTotal ()- 1 ; i++)
   {
       OrderSelect (i, SELECT_BY_POS);     
       if ( OrderSymbol() == SymbolName )
      { 
         if (OrderType() == OP_BUY)    { lotSum += OrderProfit() + OrderLots() * delta; }
         if (OrderType() == OP_SELL)   { lotSum += OrderProfit() - OrderLots() * delta; }
      }
   }   
   return (lotSum);
}

그러나 솔직히 말해서 나는 그가 다음과 같이 썼듯이 그를 이해하지 못합니다.

스프레드는 고려되지 않습니다. 이는 현재 가격에서 결과를 계산하여 수정할 수 있습니다.
그가 제안한 알고리즘을 내가 이해하지 못하는 것, 거기에서 스프레드가 어떻게 고려됩니까? 누군가 설명할 수 있습니까?
 
Mepkypuu :

그러나 솔직히 말해서 나는 그가 다음과 같이 썼듯이 그를 이해하지 못합니다.

그가 제안한 알고리즘을 내가 이해하지 못하는 것, 거기에서 스프레드가 어떻게 고려됩니까? 누군가 설명할 수 있습니까?

OrderProfit()은 현재 Ask에서 매도 포지션에 대해 계산되며, 여기에서 현재 스프레드의 값이 고려됩니다. 스프레드가 변경되지 않으면 가격이 현재 Bid의 값에서 newSL로 변경될 때 한 로트의 포지션 이익(해당 부호가 있는 매수 또는 매도)은 델타 값만큼 변경됩니다. 연산자는 다음과 같이 작성됩니다.

델타 = ( newSL - 입찰가 ) * TickValue;

간단히 말해서 OrderProfit()은 스프레드를 고려하여 모든 것을 계산하고, 우리는 OrderProfit()을 사용하여 특정 시점( 현재 가격 )의 결과를 수정합니다. 또한 가격 변동만 모니터링할 수 있습니다.

 
Mislaid :

OrderProfit()은 현재 Ask에서 매도 포지션에 대해 계산되며, 여기에서 현재 스프레드의 값이 고려됩니다. 스프레드가 변경되지 않으면 가격이 현재 Bid의 값에서 newSL로 변경될 때 한 로트의 포지션 이익(해당 부호가 있는 매수 또는 매도)은 델타 값만큼 변경됩니다. 연산자는 다음과 같이 작성됩니다.

델타 = ( newSL - 입찰가 ) * TickValue;

간단히 말해서 OrderProfit()은 스프레드를 고려하여 모든 것을 계산하고, 우리는 OrderProfit()을 사용하여 특정 시점(현재 가격)의 결과를 수정합니다. 또한 가격 변동만 모니터링할 수 있습니다.

나는 이해하기 시작했다고 생각합니다. 아마도 다음과 같이 더 정확할 것입니다.

 if (OrderType() == OP_BUY)    { lotSum += OrderProfit() + OrderLots() * ((newSL - Bid) / Point * MarketInfo( SymbolName , MODE_TICKVALUE)); }
if (OrderType() == OP_SELL)   { lotSum += OrderProfit() - OrderLots() * ((newSL - Ask ) / Point * MarketInfo( SymbolName , MODE_TICKVALUE)); }

결국 매도 포지션에 대한 OrderProfit은 매도호가에서 계산됩니다. 맞죠?

그건 그렇고, MarketInfo( SymbolName , MODE_TICKVALUE) 는 EURUSD 쌍, USD 예금 통화 에 대해 329.02를 제공하므로 이 함수는 모든 것을 나에게 필요한 대로 고려하지 않습니다.

 

지금까지 나는 속임수를 쓰기로 결정했다. 다른 방법으로 MarketInfo( SymbolName , MODE_TICKVALUE) :

 double GetTickValue( string CurrentQuote) {
   string AccountCurr = AccountCurrency();
   string BaseCurr = StringSubstr (CurrentQuote, 0 , 3 );
   string CurrentCurr = StringSubstr (CurrentQuote, 3 , 3 );
   
   if (CurrentCurr == AccountCurr)  
       return (MarketInfo(CurrentQuote, MODE_LOTSIZE) * MarketInfo(CurrentQuote, MODE_TICKSIZE));
   if (BaseCurr == AccountCurr)
       return (MarketInfo(CurrentQuote, MODE_LOTSIZE) * MarketInfo(CurrentQuote, MODE_TICKSIZE) / MarketInfo(CurrentQuote, MODE_BID));
   if ((CurrentCurr != AccountCurr) && (BaseCurr != AccountCurr))  
       return (MarketInfo(CurrentQuote, MODE_LOTSIZE) * MarketInfo(CurrentQuote, MODE_TICKSIZE) * MarketInfo( StringConcatenate (BaseCurr,AccountCurr), MODE_BID) / MarketInfo(CurrentQuote, MODE_BID));
}
 
Mepkypuu :

지금까지 나는 속임수를 쓰기로 결정했다. 다른 방법으로 MarketInfo( SymbolName , MODE_TICKVALUE) :

쓰여진대로 맞습니다. Bid가 이동하는 만큼, Ask는 스프레드가 변경되지 않은 상태에서 동일한 양만큼 이동합니다.
 
Mislaid :
쓰여진대로 맞습니다. Bid가 이동하는 만큼, Ask는 스프레드가 변경되지 않은 상태에서 동일한 양만큼 이동합니다.

개인 연습에서 확산은 일반적으로 가변적이며 매우 강력합니다). 급격한 움직임으로 5개 기호 에서 스프레드가 8에서 80으로 증가하는 것을 관찰했습니다.
 
이중 정점 을 (안정적으로) 인코딩할 수 있습니까?
 
001 :
이중 정점을 (안정적으로) 인코딩할 수 있습니까?
할 수 있다.
 

Advisor를 테스트 할 때 로그에 오류가 나타납니다.

2013.08.07 12:35:41 2012.06.06 05:29 Puria - 1.452 - SQ EURUSD,M30: 오류 4002 발생(배열 인덱스 - 범위를 벗어남)

2013.08.07 12:35:41 2012.06.06 05:29 Puria - 1.452 - SQ EURUSD,M30: 매수 주문을 열려고 합니다. 답변중입니다..

따라서 주문이 열리지 않습니다. 오류를 수정하는 방법? 그 발생 이유는 무엇입니까?

기꺼이 도와드리겠습니다.

 
alexey1979621 :

어드바이저를 테스트할 때 로그에 오류가 나타납니다.

2013.08.07 12:35:41 2012.06.06 05:29 Puria - 1.452 - SQ EURUSD,M30: 오류 4002 발생(배열 인덱스 - 범위를 벗어남)

2013.08.07 12:35:41 2012.06.06 05:29 Puria - 1.452 - SQ EURUSD,M30: 매수 주문을 열려고 합니다. 답변중입니다..

따라서 주문이 열리지 않습니다. 오류를 수정하는 방법? 그 발생 이유는 무엇입니까?

기꺼이 도와드리겠습니다.

터미널 메시지만으로는 명확하지 않으며 어드바이저 코드를 게시하지 않으면 도움이 되는 사람도 거의 없습니다. 배열의 어딘가에 존재하지 않는 데이터 배치를 가정 중 하나로 작성하지만 추측은 내 프로필이 아닙니다.