클로징 포지션. 지표에 따르면. - 페이지 3

 
goldtrader :

IMHO, 첫째, 실제 Stochast_와 정수 75를 비교하는 것이 옳지 않고, 둘째, 그 차이를 0과 비교하는 것이 더 정확합니다.

이 상황에서 소수점 8자리의 오차는 결과에 영향을 미치지 않을 것이라고 생각합니다.
 

또 다른 문제는 블록 닫기 위치 에서 발생합니다. 저는 이 블록을 제가 가장 좋아하는 Expert Advisor에 삽입했습니다. 어느 쪽은 추세의 방향으로만 엄격하게 거래를 엽니다(그에게 고개를 숙입니다...)

그러나 추세의 강도에 따라 Expert Advisor는 여러 거래를 지속적으로 열 수 있습니다. 이것은 표시기의 신호에서 포지션을 닫기 위해 블록이 필요한 곳입니다. 그러나 여기에 문제가 있습니다! - 추세를 따라 여러 위치가 열리고 추세에 대한 수정이 시작되면 마감 블록의 표시기가 - 신호를 제공합니다. 내가 필요로 하는 대로.

그러나 동시에 어떤 이유로 인해 ALL OPEN 위치가 전혀 닫히지 않습니다. 그리고 기본적으로 - 가장 이른 것뿐입니다. 나중에 열린 것은 닫는 신호에 반응하지 않고 계속 움직입니다. 그리고 더 나아가 - "역사는 희극처럼 반복된다"! 각 닫기 신호와 함께 하나만 닫힙니다. 가장 빠른 오픈 위치와 나머지는 계속 움직입니다! 모든 직책의 제비는 영구적입니다.

다음은 비주얼 모드 그래프입니다. 표시기의 신호가 닫히면 녹색 삼각형으로 표시됩니다. 신호에서 한 위치만 닫힐 때마다 분명히 알 수 있습니다. 그리고 나는 모든 열린 문을 닫고 싶습니다! 말씀해 주세요. 여기서 문제가 무엇입니까?

나는 코드를 기억한다:

 /********* Закрытие позиций ****************************************
if (AutoClose) {  
//----------------------------------------------------------------------
if (ExpertOrder(MagicLong)) {   //есть открытые ордера на покупку
      if(Stochast_1>=Up_lim && Stochast_0<Up_lim)     {
        OrderClose(OrderTicket(),OrderLots(),Bid,3,Green);//закрываем позицию
                 return(0); // выходим         
              }  }
 //--------------------------------------------------------
if (ExpertOrder(MagicShort)) {   //есть открытые ордера на продажу
      if(Stochast_1<=Low_lim && Stochast_0>Low_lim)    {
        OrderClose(OrderTicket(),OrderLots(),Ask,3,Green);//закрываем позицию
                 return(0); // выходим
              }  } 
 //-------------------------------------------------------                       
}  //if (AutoClose)
 
rid :

포지션 클로징 블록에 또 다른 문제가 발생합니다...

그리고 OrdersTotal ()의 루프는 어디에 있습니까?
 
granit77 :
그리고 OrdersTotal ()의 루프는 어디에 있습니까?
존재하더라도 0에서 OrdersTotal()-1까지이지만 그 반대여야 합니다. ;)
 

아니요, 여기가 아닙니다. 주문이 정의됩니다. 그렇지 않은 경우:

 //---------------------------------------------------------------------------------+
//---- Функция проверки наличия ордеров эксперта ----------------------------------+
//---------------------------------------------------------------------------------+
// false - ордеров данного эксперта нет;                                           |
// true  - есть ордера данного эксперта;                                           |
//---------------------------------------------------------------------------------+
bool ExpertOrder ( int VersionID ){
bool result = false ;
int  _OrdersTotal = OrdersTotal () ;
if ( _OrdersTotal > 0 ) { for ( int jk = 0 ; jk < _OrdersTotal ; jk ++ ) {    
      if ( OrderSelect ( jk , SELECT_BY_POS , MODE_TRADES )) {
        if ( OrderMagicNumber () == VersionID ) 
          { result = true ;  break ; } //Найден ордер принадлежащий эксперту
        else  { result = false ; } 
       } } } else { result = false ; }  
//---------------------        
return ( result ) ; }

그리고 이 버전의 코드가 더 편리합니다! 나는 길고 짧은 위치를 가지고 있기 때문에 서로 독립적으로 열립니다.

 //---------проверяем условие на покупку----------------------------
if ( LONG ) {     //если  "выключатель" включен
 if  ( ... ... ...      )
   {
  ticket = OrderSend ( Symbol () , 0 , Lot , Ask , Slippage , Bid - SL * Point ,
                                        Ask + TP * Point , NULL , MagicLong , 0 , CLR_NONE ) ; 
 

그러나 표준 마감 시 - 모두 동일한 기록입니다. ...

 if ( AutoClose ) {  
//----переменные для закрытия позиций ----
double Stochast_0 = iStochastic ( NULL , 0 , Stochastic_period , 3 , 3 , MODE_SMA , 0 , MODE_MAIN , 0 ) ;
double Stochast_1 = iStochastic ( NULL , 0 , Stochastic_period , 3 , 3 , MODE_SMA , 0 , MODE_MAIN , 1 ) ;
//----------------------------------------------------------------------
  for ( int v = 0 ; v < OrdersTotal () ; v ++ )                             {       
      if ( OrderSelect ( v , SELECT_BY_POS , MODE_TRADES ))               {           
        if ( OrderSymbol () == Symbol () && OrderMagicNumber () == Magic )   { 
//-----------------------------------------------------                  
if ( OrderType () == OP_BUY ) { 
      if ( Stochast_1 >= Up_lim && Stochast_0 < Up_lim )     {
         OrderClose ( OrderTicket () , OrderLots () , Bid , 3 , Green ) ; // закрываем позицию
                 return ( 0 ) ; // выходим         
              }       
             }  
 //--------------------------------------------------------
if ( OrderType () == OP_SELL ) { 
      if ( Stochast_1 <= Low_lim && Stochast_0 > Low_lim )    {
               OrderClose ( OrderTicket () , OrderLots () , Ask , 3 , Green ) ; // закрываем позицию
                 return ( 0 ) ; // выходим       
              }       
             }  
 //-------------------------------------------------------                       
    }  // Symbol()  
  } // select
 } //total
} //Close_
 
rid :

그러나 표준 마감 시 - 모두 동일한 기록입니다. ...

 if ( AutoClose ) {  
//----переменные для закрытия позиций ----
double Stochast_0 = iStochastic ( NULL , 0 , Stochastic_period , 3 , 3 , MODE_SMA , 0 , MODE_MAIN , 0 ) ;
double Stochast_1 = iStochastic ( NULL , 0 , Stochastic_period , 3 , 3 , MODE_SMA , 0 , MODE_MAIN , 1 ) ;
//----------------------------------------------------------------------
  for ( int v = 0 ; v < OrdersTotal () ; v ++ )                             {       
      if ( OrderSelect ( v , SELECT_BY_POS , MODE_TRADES ))               {           
        if ( OrderSymbol () == Symbol () && OrderMagicNumber () == Magic )   { 
//-----------------------------------------------------                  
if ( OrderType () == OP_BUY ) { 
      if ( Stochast_1 >= Up_lim && Stochast_0 < Up_lim )     {
         OrderClose ( OrderTicket () , OrderLots () , Bid , 3 , Green ) ; // закрываем позицию
                 return ( 0 ) ; // выходим         
              }       
             }  
 //--------------------------------------------------------
if ( OrderType () == OP_SELL ) { 
      if ( Stochast_1 <= Low_lim && Stochast_0 > Low_lim )    {
               OrderClose ( OrderTicket () , OrderLots () , Ask , 3 , Green ) ; // закрываем позицию
                 return ( 0 ) ; // выходим       
              }       
             }  
 //-------------------------------------------------------                       
    }  // Symbol()  
  } // select
 } //total
} //Close_

그러나 여전히 OrdersTotal 에서 0으로 반대로 순환할 수 있습니다. 도움이 될 것입니다.
 

하지만 어떻게 해야 할까요? 별로 부담이 되지 않는다면 적어주세요. 그건 그렇고, 여기 차트가 있습니다 - 위의 "표준": 모든 것이 동일합니다. 칠면조 신호에서 단 하나의 위치만 닫힙니다.

 
rid :

하지만 어떻게 해야 할까요?

komposter와 Vinin에 따르면 다음 대신:
for (int v=0; v< OrdersTotal (); v++)

쓰다:
(int v=OrdersTotal()-1; v>0; v--)

나를 위해 작동합니다.
 
granit77 :
제거 :

하지만 어떻게 해야 할까요?

komposter와 Vinin에 따르면 다음 대신:
for (int v=0; v< OrdersTotal (); v++)

쓰다:
(int v=OrdersTotal()-1; v>0; v--)

나를 위해 작동합니다.

맞아요. KimV에는 이 모든 것을 구현하는 스크립트와 라이브러리가 있습니다. 살펴볼 가치가 있습니다. 그리고 아마도 그의 포럼에서.