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

 

그랬더니 "<="가 있는데 스토캐스틱 값이 아주 잘 변합니다. 틱마다 강하게 - 소수점 이하 값에는 소수점 이하 네 자리가 더 있습니다. 한 틱에서 값은 (예를 들어) 75.0003에서 74.0900으로 변경될 수 있습니다.

시작 가격에서는 더욱 그렇습니다 ... / 그래서 "=" 기호는 두려움 없이 건너뛸 수 있습니다. 그러나 물론 생각하지 않기 위해-아마도 그렇게 할 것입니다.

 
나는 전문가를 보았습니다. 모든 것이 올바른 것 같습니다. 확인할 수 없습니다. 표시가 없습니다.
OrderClose 전에 Print를 추가하고 닫기 신호가 발생하는지 확인하십시오.
 

만들어진. 추가되었습니다. 아니, ..... ㄴ! 로그 클로징 노트에 나타나지 않습니다.

 //********* Закрытие позиций ****************************************
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 () == MagicNum )   { 
//-----------------------------------------------------                  
if ( OrderType () == OP_BUY ) { 
      if ( Stochast_1 >= 75 && Stochast_0 < 75 )     {
         Print ( OrderClose ( OrderTicket () , OrderLots () , Bid , 3 , Green )) ; // закрываем позицию
                 return ( 0 ) ; // выходим
         
              }       
     }  
 //--------------------------------------------------------
if ( OrderType () == OP_SELL ) { 
      if ( Stochast_1 <= 25 && Stochast_0 > 25 )    {
               Print  ( OrderClose ( OrderTicket () , OrderLots () , Ask , 3 , Green )) ; // закрываем позицию
                 return ( 0 ) ; // выходим
       
              }       
     }  
 //-------------------------------------------------------                       
    }  // Symbol()  
  } // select
 } //total
} //Close_ 
 //****************************************************************************

나는 아무것도 이해하지 못한다! 이 블록을 다른 Expert Advisor에 삽입했습니다. 그리고 세 번째에서. ... . 하지만 상황은 변하지 않았습니다! 포지션이 마감되지 않았습니다 . 드물기는 하지만 드물게(역사상 1~2회 = 1년) 시각적 차트에서 닫는 녹색 삼각형이 깜박입니다. 하지만 그렇게 되어서는 안됩니다! 코드로 판단되는 포지션은 재봉틀 셔틀처럼 닫아야 한다!

다운로드에서 - 표시기 NOnLagMA

파일:
 

아니면 이 블록이 작동하지 않아야 합니까? 결국, 코드를 열면 정지가 제공됩니다. - 손실을 중지하고 이익을 얻습니다. 이러한 이유로 다른 모든 닫기 조건이 무시될 수 있습니까?

티켓= OrderSend (Symbol(),0,Lots,Ask,Slippage,Bid-SL_long*Point,Ask+TP_long*Point,NULL,MagicNum,0,CLR_NONE);

그리고 어떻게든 대처해야 합니다.

 
rid :

나는 아무것도 이해하지 못한다!

포지션 마감 블록이 "if ( OrdersTotal () == 0)" 조건 안에 있었습니다.
조심하셔야 합니다 ;)

다음은 테스트 케이스의 start() 함수입니다(SL 및 TP 없음, 올바른 메시지 및 불필요한 슬립 없음):
 int start ()
  {
 
 if ( Time [ 0 ] <= prevtime ) 
       return ( 0 ) ;
 prevtime = Time [ 0 ] ;
  if ( UseTrailing ) TrailPositions () ;   
//----
   double NLg_Signal_0 = iCustom ( NULL , 0 , " NonLagMA_v5 " , 0 , NLg_Signal , 1 , 0 , 0 , 0 , 0 , 0 , 0 ) ; 
   double NLg_Signal_1 = iCustom ( NULL , 0 , " NonLagMA_v5 " , 0 , NLg_Signal , 1 , 0 , 0 , 0 , 0 , 0 , 1 ) ; 
   double NLg_long0    = iCustom ( NULL , 0 , " NonLagMA_v5 " , 0 , NLg_buy , 0 , 0 , 0 , 0 , DV_buy , 0 , 0 ) ;
   double NLg_short0   = iCustom ( NULL , 0 , " NonLagMA_v5 " , 0 , NLg_sell , 0 , 0 , 0 , 0 , DV_sell , 0 , 0 ) ;
 
  if ( OrdersTotal ()   == 0 ) //если нет открытых позиций
  { 
//---------проверяем условие на покупку-----------------      
       if   ( 
              ( NLg_Signal_1 <= NLg_long0 )  &&
              ( NLg_Signal_0 > NLg_long0 )  )
       { 
              ticket = OrderSend ( Symbol () , OP_BUY , Lots , Ask , Slippage , 0.0 , 0.0 , NULL , MagicNum , 0 , CLR_NONE ) ;
              if ( ticket < 0 )  { Print ( " Ошибка # " , GetLastError () , " при открытии ордера BUY " ) ; prevtime = Time [ 1 ] ; }
       }
    //---------проверяем условие на продажу----------------- 
         if  (   
              ( NLg_Signal_1 >= NLg_short0 )  &&
              ( NLg_Signal_0 < NLg_short0 )  )
       { 
              ticket = OrderSend ( Symbol () , OP_SELL , Lots , Bid , Slippage , 0.0 , 0.0 , NULL , MagicNum , 0 , CLR_NONE ) ;
              if ( ticket < 0 )  { Print ( " Ошибка # " , GetLastError () , " при открытии ордера SELL " ) ; prevtime = Time [ 1 ] ; }
       }
   }
//------------------------------------------------------------------
//********* Закрытие позиций ****************************************
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 () == MagicNum )   { 
    //-----------------------------------------------------                  
    if ( OrderType () == OP_BUY ) { 
          if ( Stochast_1 > 75 && Stochast_0 < 75 )     {
               OrderClose ( OrderTicket () , OrderLots () , Bid , 3 , Green ) ; // закрываем позицию
                     return ( 0 ) ; // выходим
                    }       
         }  
     //--------------------------------------------------------
    if ( OrderType () == OP_SELL ) { 
          if ( Stochast_1 < 25 && Stochast_0 > 25 )    {
                     OrderClose ( OrderTicket () , OrderLots () , Ask , 3 , Green ) ; // закрываем позицию
                     return ( 0 ) ; // выходим
                    }       
         }  
 //-------------------------------------------------------                       
    }  // Symbol()  
  } // select
 } //total
} //Close_ 
 //****************************************************************************   
   return ( 0 ) ;
      }



그러나 내가 당신이라면 이 전문가 고문을 실제 계정에 사용하지 않을 것입니다. 원할 경우 질서 또는 "전투 준비태세"를 갖추어야 합니다.)
 

그렇지. 도와주셔서 감사합니다! 내 실수에 대한 귀하의 의견을 이해합니다.

그리고 나는 당신의 제안을 기록했습니다. 실제 거래까지 갈 길이 멀다…

ps/ 모든 것이 성공했습니다 ....! 그리고 어떻게!

 
물론 그러한 폐쇄로 인한 이익은 증가하지 않습니다. 그러나 여기에 단점이 있습니다..... 그것은 종종 크게 감소합니다.
 
komposter :
코드를 보지 않았습니다.
하지만 한 가지는 확실히 고칠 것입니다. "if(Stochast_1>75 && Stochast_0<75)" 대신 "if(Stochast_1>75 && Stochast_0 <= 75)"를 수행합니다.

그리고 그것은 더 좋지 않을 것입니다. int 및 double 유형의 불필요한 변환을 피하기 위해 if(Stochast_1-75.0>0 && Stochast_0-75.0 <= 0).
 
그리고 불필요한 int와 double을 피하는 방법. ? 나는 그렇게 생각하지 않는다. 또한 숫자 대신 외부 매개변수를 입력해야 하는 이유가 있습니다. extern int Up_lim = 80; 외부 int Low_lim = 20;
 
rid :
그리고 불필요한 int와 double을 피하는 방법. ? 나는 그렇게 생각하지 않는다. 또한 숫자 대신 외부 매개변수를 입력해야 하는 이유가 있습니다. extern int Up_lim = 80; 외부 int Low_lim = 20;

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

'실수 비교'