FORTS: 초보자를 돕기 위해 - 페이지 3

 

자주 사용하고 유용한 기능:  

세션 제한 가격 확인:

 //+------------------------------------------------------------------+
//| Expert Check price range function                                |
//+------------------------------------------------------------------+
bool CheckPriceRange( const string a_symbol, const double price )
{
   double min_price = SymbolInfoDouble ( a_symbol, SYMBOL_SESSION_PRICE_LIMIT_MIN );
   double max_price = SymbolInfoDouble ( a_symbol, SYMBOL_SESSION_PRICE_LIMIT_MAX );
   if ( ( price >= min_price ) && ( price <= max_price ) )
  {
     return ( true );
  }
   return ( false );
}
 

자주 사용하고 유용한 기능:  

재설계된 GetPositionPrice() 함수:

 //+------------------------------------------------------------------+
//| Expert Get position price function                               |
//+------------------------------------------------------------------+
double GetPositionPrice( const string aSymbol )
{
   double price_in = 0 ;
   double volume_in = 0 ;
   double price_out = 0 ;
   double volume_out = 0 ;
   double price = 0 ;
   double volume = 0 ;
//---  
   ulong pos_id = ulong ( PositionGetInteger ( POSITION_IDENTIFIER ) );
    
   if ( pos_id > 0 )
  {
       if ( HistorySelectByPosition ( pos_id ) )
      {
         int deals = HistoryDealsTotal ();
      
         for ( int i = 0 ; i < deals; i++ )
        {
           ulong deal_ticket = HistoryDealGetTicket ( i );
           ulong order_ticket = ulong ( HistoryDealGetInteger ( deal_ticket, DEAL_ORDER ) );
        
           if ( order_ticket > 0 )
          {
             ENUM_DEAL_ENTRY deal_entry = ENUM_DEAL_ENTRY ( HistoryDealGetInteger ( deal_ticket, DEAL_ENTRY ) );
              
             if ( deal_entry == DEAL_ENTRY_IN )
            {
              price = HistoryDealGetDouble ( deal_ticket, DEAL_PRICE );
              volume = HistoryDealGetDouble ( deal_ticket, DEAL_VOLUME );
                                
              price_in += price * volume;
              volume_in += volume;  
            }
             else
             if ( deal_entry == DEAL_ENTRY_OUT )
            {
              price = HistoryDealGetDouble ( deal_ticket, DEAL_PRICE );
              volume = HistoryDealGetDouble ( deal_ticket, DEAL_VOLUME );
                                
              price_out += price * volume;
              volume_out += volume;  
            }
          }
        }
//---  
        price = price_in - price_out;
        volume = volume_in - volume_out;
//---
         if ( volume > 0 )
        {       
           return ( NormalizeDouble ( price / volume, _Digits ) );
        }
      }
       else
      {
         Print ( "GetPositionPrice: Невозможно получить историю позиции по символу " , aSymbol );
      }
    }
     else
    {
       Print ( "GetPositionPrice: Невозможно определить идентификатор позиции по символу " , aSymbol );
    }
   return ( 0 );
} 
 

기능의 약간의 수정(보편성을 위해)

대신에:

 if ( volume_in > 0 )
{
   return ( NormalizeDouble ( price_in / volume_in, _Digits ) );
}

이렇게 하세요:

 if ( volume_in > 0 )
{
   int symb_digits = int ( SymbolInfoInteger ( aSymbol, SYMBOL_DIGITS ) );
   return ( NormalizeDouble ( price_in / volume_in, symb_digits ) );
}
 
빌드 1241. 실제 계정. 보류 중인 주문이 설정 되고 부분적으로 채워진 경우 나중에 수정될 때 주문 상태가 ORDER_STATE_PLACED로 변경되지 않고 ORDER_STATE_PARTIAL이 동일하게 유지됩니다.
 

실제 계정 을 열고 포럼에 투자 액세스를 게시하면 문제가 있을 수 있습니까? 아니면 모든 것이 깨끗한가요?


 
안녕하세요! 이 주제에 설명된 기능을 고려한 거래 시스템의 간단한 템플릿이나 FORTS 의 Expert Advisor의 예가 있습니까? FORTS 주문과 함께 올바르게 작동해야 합니다.
 

"추천 :

FORTS용 Expert Advisors를 디자인할 때 Tick 이벤트를 사용하는 것은 권장하지 않지만

BookEvent 를 사용하는 것이 좋습니다"

그것이 더 나은 이유는 설명되지 않습니다. 어떤 경우에는 더 낫고 어떤 경우에는 onTick이 더 좋습니다. 상세하게 설명할 수 있습니까?

 
Alexander :

"추천 :

FORTS용 Expert Advisors를 디자인할 때 Tick 이벤트를 사용하는 것은 권장하지 않지만

BookEvent 를 사용하는 것이 좋습니다"

그것이 더 나은 이유는 설명되지 않습니다. 어떤 경우에는 더 낫고 어떤 경우에는 onTick이 더 좋습니다. 상세하게 설명할 수 있습니까?

저자는 목욕 중이며 여기에서 곧 답변을 기다리지 않을 것입니다.

제가 생각하는 바는 다음과 같습니다.

Tick 이벤트는 Bid, Ask, Last가 변경된 경우에만 발생합니다. 또한 Tick 이벤트는 누적되며(개발자가 말했듯이) 여러 가격 변경에 대해 하나의 Tick이 올 수 있습니다.

BookEvent 이벤트는 오더북의 주문 변경 및 거래가 있을 때 발생합니다. BookEvent 이벤트는 훨씬 더 자주 발생합니다.

오더북에서 유동성을 분석할 필요가 없다면 OnTick()을 사용하는 것이 좋다.

유동성이 높은 기기에서 BookEvent 이벤트는 매우 자주 발생하며 핸들러에 계산량이 많거나 표시기가 여러 개 있는 경우 루프로 작동합니다.

EA에 다른 이벤트 핸들러(예: OnTimer)도 포함되어 있으면 이러한 이벤트를 건너뛸 수 있습니다. 저는 OnTradeTransaction OnTrade 이벤트에 대해 알지 못하며 건너뛸 수 있습니다.

도움에서:

트랜잭션 큐의 길이는 1024개 요소입니다. OnTradeTransaction()이 다음 트랜잭션을 처리하는 데 너무 오래 걸리면 대기열의 이전 트랜잭션이 새 트랜잭션에 의해 강제로 제거될 수 있습니다.

 
Sergey Chalyshev :

저자는 목욕 중이며 여기에서 곧 답변을 기다리지 않을 것입니다.

예, 오래 전에 그들은 Mikhail을 목욕탕에서 나오게했습니다 ... 여기에서 그는 자신의 아바타를 바꿨습니다.
 
Alexey Kozitsyn :
예, 오래 전에 그들은 Mikhail을 목욕탕에서 나오게했습니다 ... 여기에서 그는 자신의 아바타를 바꿨습니다.
그리고 여기 Ava? 그는 영원한 금지 인 포럼에 글을 쓸 기회가 없습니다.
사유: