FORTS 도와주세요 - 페이지 29

 

좋은 오후, 안톤!

귀하의 조언에 따라 ( LoadServerData()는 SeriesInfoInteger( a_symbol, PERIOD_M1, SERIES_SERVER_FIRSTDATE )를 호출합니다.

저것들. "기간에 관계없이 서버의 기호로 기록의 첫 번째 날짜"를 읽습니다.

자체적으로 이 쿼리는 실제로 기록 쿼리로 간주되지 않습니다. 캐시 구축을 일으키지 않으며,

심볼 데이터가 언로드되는 것을 방지하지 않습니다. SERIES_FIRSTDATE 또는 시계열의 막대 수를 요청하는 것이 좋습니다. ),

기호 데이터가 덤프되는 것을 방지하기 위해 표시기에 새 기능을 추가했습니다.

 //+------------------------------------------------------------------+
// Custom indicator Book Event function                              |
//+------------------------------------------------------------------+
void OnBookEvent ( const string &symbol )
{
   if ( ( ( symbol == _Symbol ) || ( symbol == sec_symbol ) ) && ( ! IsStopped () ) )
  {
    GetBars( sec_symbol, time_frame );
  }  
}

 //+------------------------------------------------------------------+
// Custom indicator Check timer function                             |
//+------------------------------------------------------------------+
bool CheckTimer( const uint start_value, const uint per_value )
{
   uint end_value = GetTickCount ();
  
   if ( end_value < start_value )
  {
     if ( ( start_value - end_value ) >= per_value ) return ( true );
  } 
   else
  {
     if ( ( end_value - start_value ) >= per_value ) return ( true );
  }
   return ( false );
}
//+------------------------------------------------------------------+
//| Custom indicator Get local data function                         |
//+------------------------------------------------------------------+
int GetLocalData( const string a_symbol, ENUM_TIMEFRAMES a_period )
{
   long first_date;
   int fail_cnt = 0 ;
//---  
   while ( ( fail_cnt < 3 ) && ! IsStopped () )
  {
    first_date = long ( SeriesInfoInteger ( a_symbol, PERIOD_M1 , SERIES_TERMINAL_FIRSTDATE ) );
//---    
     if ( first_date > 0 )
    {
       int f_cnt = 0 ;
       datetime times[ 1 ];
       long a_bars = 0 ;
//---  
       while ( ( f_cnt < 5 ) && ! IsStopped () )
      {
         if ( bool ( SeriesInfoInteger ( a_symbol, PERIOD_M1 , SERIES_BARS_COUNT , a_bars ) ) )
        {
           if ( a_bars > 0 )
          {
             if ( bool ( SeriesInfoInteger ( a_symbol, a_period, SERIES_BARS_COUNT , a_bars ) ) )
               if ( a_bars > 0 ) return ( int ( a_bars ) );
          }
        }
         else
        {
//--- force timeseries build
           CopyTime ( a_symbol, a_period, 0 , 1 , times );
           uint start_tick = GetTickCount ();
//---        
           while ( !CheckTimer( start_tick, 5 ) )
          {
            f_cnt--;
            f_cnt++;
          }  
        }
        f_cnt++;
      } 
   //    Print( "GetLocalData: Таймсерия не построена!" );
    }
     else
    {
       uint start_tick = GetTickCount ();
//---        
       while ( !CheckTimer( start_tick, 5 ) )
      {
        fail_cnt--;
        fail_cnt++;
      }
    }
//---   
    fail_cnt++;
  }
//  Print( "GetLocalData: Нет данных в терминале!" );
   return ( 0 );
}
//+------------------------------------------------------------------+
//| Custom indicator Get server data function                        |
//+------------------------------------------------------------------+
int LoadServerData( const string a_symbol, ENUM_TIMEFRAMES period )
{
   int fail_cnt = 0 ;
//---
   while ( ( fail_cnt < 5 ) && ! IsStopped () )
  {   
     long first_date = long ( SeriesInfoInteger ( a_symbol, PERIOD_M1 , SERIES_SERVER_FIRSTDATE ) );
//---
     if ( first_date > 0 )
    {
       if ( SymbolIsSynchronized ( a_symbol ) )
      {
   //      Print( "LoadServerData: Первая дата на сервере есть. Пробуем получить локальные данные..." );
         return ( GetLocalData( a_symbol, period ) );
      }  
    }
     else
    {
       uint start_tick = GetTickCount ();
//---        
       while ( !CheckTimer( start_tick, 10 ) )
      {
        fail_cnt--;
        fail_cnt++;
      }
    }    
    fail_cnt++;
  }
 // Print( "LoadServerData: Первой даты на сервере нет!" );
   return ( 0 );  
}
//+------------------------------------------------------------------+
//| Custom indicator Get bars function                               |
//+------------------------------------------------------------------+
int GetBars( string symbol, ENUM_TIMEFRAMES period )
{
   if ( ! IsStopped () )
  {
     int a_bars = Bars ( symbol, period );
//---
     if ( a_bars > 0 )
    {
       return ( a_bars ); 
    }
     else
    {
   //    Print( "GetBars: Бары не получены проверяем синхронизации..." );
//---Check symbol is synchronized  
       if ( SymbolIsSynchronized ( symbol ) )
      {
     //    Print( "GetBars: Символ сихронизирован. Проверяем таймсерию..." );
//---Check series is synchronized
         if ( bool ( SeriesInfoInteger ( symbol, period, SERIES_SYNCHRONIZED ) ) )
        {
     //     Print( "GetBars: Серия синхронизирована. Пробуем получить бары..." );
          a_bars = Bars ( symbol, period );  
//---           
           if ( a_bars > 0 )
          {
             return ( a_bars );
          }
           else
          {
             return ( GetLocalData( symbol, period ) );
          }  
        }
         else
        {
       //    Print( "GetBars: Серия не сихронизирована. Пробуем получить данные из терминала..." );
           return ( GetLocalData( symbol, period ) );
        }    
      }  
       else
      {
     //    Print( "GetBars: Символ не синхронизирован. Пробуем получить данные с сервера..." );
         return ( LoadServerData( symbol, period ) );
      }  
    }   
  }  
   return ( 0 );
}

OnBookEvent() 함수는 BR-8.15 및 BR-9.15 문자에서 매우 자주 실행됩니다.

하지만 결과는 동일합니다.

 2015.07 . 23 20 : 48 : 13.449 Spread (BR- 8.15 ,M1)     OnCalculate : Не получены бары по символу BR- 9.15
2015.07 . 23 20 : 48 : 13.449 Spread (BR- 8.15 ,M1)     OnCalculate : Не получены бары по символу BR- 9.15
2015.07 . 23 20 : 48 : 13.449 Spread (BR- 8.15 ,M1)     OnCalculate : Не получены бары по символу BR- 9.15
2015.07 . 23 20 : 48 : 13.449 Spread (BR- 8.15 ,M1)     OnCalculate : Не получены бары по символу BR- 9.15
2015.07 . 23 20 : 48 : 13.449 Spread (BR- 8.15 ,M1)     OnCalculate : Не получены бары по символу BR- 9.15

그래서 무슨 거래?

바를 얻을 수 없는 이유는 무엇입니까?

 
Михаил :

OnBookEvent() 함수는 BR-8.15 및 BR-9.15 문자에서 매우 자주 실행됩니다.

하지만 결과는 동일합니다.

그래서 무슨 거래?

바를 얻을 수 없는 이유는 무엇입니까?

"충분히 자주"의 주기는 자신감을 불러일으키지 않습니다. GetBars() 함수에서 로그에 출력을 추가하는 것이 디버깅에 더 좋습니다.

그것을 알아내고 싶다면 서비스 데스크에서 요청을 여십시오 . 본격적인 코드 예제를 첨부하여 문제를 재현해 보도록 하겠습니다.

 
Anton :

"충분히 자주"의 주기는 자신감을 불러일으키지 않습니다. GetBars() 함수에서 로그에 출력을 추가하는 것이 디버깅에 더 좋습니다.

그것을 알아내고 싶다면 서비스 데스크에서 요청을 여십시오 . 본격적인 코드 예제를 첨부하여 문제를 재현해 보도록 하겠습니다.

좋은. 응용 프로그램: 오류 , MetaTrader 5 클라이언트 , 열기 , 시작됨: 2015.07.24 18:28 , #1267768

P/S "매우 자주"는 2개의 고액성 기기에 대해 MINUTE당 10~100개의 OnBookEvent() 활성화를 의미합니다.

 

만세!

지원팀 2015.07.29 16:29

문제를 재현했습니다. 실제로 주기적인 요청이 있는 경우에도 기호 데이터가 메모리에서 스왑되는 경우가 있었습니다. 오류가 수정됩니다.

고맙습니다!

 
Михаил :

Michael , 다른 캐릭터의 시리즈를 가져와서 이 문제를 극복했습니까? 나는 내 지표와 싸우는 데 지쳐서 다른 캐릭터와 지속적으로 동기화를 잃어 버렸습니다.


이제 데모 서버는 2015년 6월 22일자 빌드 1159를 발행합니다. 그리고 그 안에서 다중 통화 지표 도 끔찍하게 작동합니다. 기간을 여러 번 전환하거나 표시기를 다시 시작해야 올바르게 그려집니다. 그리고 잠시 후 그는 다시 시리즈의 데이터를 받지 못합니다. 잡지에 항상 글을 쓴다

Данные символа "Si-12.15" не синхронизированы с торговым сервером.

개발자 :

데이터의 동기화 여부를 확인하지 않고 이 데이터를 메모리에서 언로드하지 않고 직접 동기화하는 기능을 만드는 것이 정말 불가능한가요?

알고리즘 최적화 측면에서 자원을 절약하는 것이 좋습니다. 그러나 왜 메모리에서 데이터를 언로드하는 그러한 광적인 접근 방식을 취해야 할까요?

차라리 컴퓨터에 기가바이트 또는 두 개의 메모리를 추가로 구입하고 싶지만 시리즈를 동기화하기 위해 이 치질로 고통받지는 않을 것입니다.

원하는 기호에 대한 데이터를 로드하기 위해 OnInit()에서 한 번 호출하는 함수를 만들고 표시기가 실행되는 동안 더 이상 언로드되지 않습니다.

관련성에 대한 데이터 준비 및 모니터링은 터미널에서 수행해야 하며 사용자가 첫 번째 날짜가 무엇인지, 서버에 얼마나 많은 막대가 있는지 등을 어리둥절하게 하는 것이 아닙니다...

SynchronizeSymbol( "RTS-12.15" );
SynchronizeSymbol( "BR-10.15" );
SynchronizeSymbol( "Si-12.15" );
 
demonsn :

Michael , 다른 기호에서 시리즈를 가져와서 이 문제를 극복했습니까? 나는 내 지표와 싸우는 데 지쳐서 다른 캐릭터와 지속적으로 동기화를 잃어 버렸습니다.


이제 데모 서버는 2015년 6월 22일자 빌드 1159를 발행합니다. 그리고 그 안에서 다중 통화 지표 도 끔찍하게 작동합니다. 기간을 여러 번 전환하거나 표시기를 다시 시작해야 올바르게 그려집니다. 그리고 잠시 후 그는 다시 시리즈의 데이터를 받지 못합니다. 잡지에 항상 글을 쓴다

개발자 :

데이터의 동기화 여부를 확인하지 않고 이 데이터를 메모리에서 언로드하지 않고 직접 동기화하는 기능을 만드는 것이 정말 불가능한가요?

알고리즘 최적화 측면에서 자원을 절약하는 것이 좋습니다. 그러나 왜 메모리에서 데이터를 언로드하는 그러한 광적인 접근 방식입니까?

차라리 컴퓨터에 기가바이트 또는 두 개의 메모리를 추가로 구입하고 싶지만 시리즈를 동기화하기 위해 이 치질로 고통받지는 않을 것입니다.

원하는 기호에 대한 데이터를 로드하기 위해 OnInit()에서 한 번 호출하는 함수를 만들고 표시기가 실행되는 동안 더 이상 언로드되지 않습니다.

관련성에 대한 데이터 준비 및 모니터링은 터미널에서 수행해야 하며 사용자가 첫 번째 날짜가 무엇인지, 서버에 얼마나 많은 막대가 있는지 등을 어리둥절하게 하는 것이 아닙니다...

안녕하세요!

개발자들은 새 빌드에서 수정하겠다고 답했습니다.

언제 출시될지는 아직 알려지지 않았습니다.

 
3년을 기다림)
 

요새. 문제가 발생했습니다. OrderCheck() 및 OrderCalcMargin() 함수는 때때로(!) 거래에 필요한 GO를 잘못 결정하고 결국 FALSE를 반환합니다.

RTS-12.15( SYMBOL_MARGIN_INITIAL )에 필요한 GI는 12,500 루블입니다. 이 기능에는 143,105 루블이 필요합니다!

동시에 모든 것이 수동으로 열립니다.

어떻게 전화합니까:

 MqlTradeRequest MtRequest = { 0 }; 

MqlTradeRequest .action = TRADE_ACTION_DEAL ;
MqlTradeRequest .magic  = 0 ;
MqlTradeRequest .order  = 0 ;
MqlTradeRequest .symbol = "RTS-12.15" ;
MqlTradeRequest .volume = 1.00 ;
MqlTradeRequest .price  = 86470 ;
MqlTradeRequest .stoplimit = 0 ;
MqlTradeRequest .sl = 0 ;
MqlTradeRequest .tp = 0 ;
MqlTradeRequest .deviation = 50 ;
MqlTradeRequest .type = ORDER_TYPE_SELL ;
MqlTradeRequest .type_filling = ORDER_FILLING_FOK ;
MqlTradeRequest .type_time = gtc;
MqlTradeRequest .expiration = 0 ;
MqlTradeRequest .comment = NULL ;

MqlTradeCheckResult MtCheckResult = { 0 };

OrderCheck (MtRequest,MtCheckResult);

Получаю в ответ False и такую структуру:

MqlTradeCheckResult.retcode:      10019 (There is not enough money to complete the request)
MqlTradeCheckResult.balance:      132727.37
MqlTradeCheckResult.equity:       130772.91
MqlTradeCheckResult.profit:       0.00
MqlTradeCheckResult.margin:       143104.55
MqlTradeCheckResult.margin_free: -12331.64
MqlTradeCheckResult.margin_level: 91.38
MqlTradeCheckResult.comment:      No money

 

다음과 같이 시도하십시오.

   MqlTradeRequest MtRequest = { 0 }; 
   MqlTradeCheckResult MtCheckResult = { 0 };
//---
  MtRequest.action = TRADE_ACTION_DEAL ;
  MtRequest.magic  = 7777777777 ;
  MtRequest.symbol = "RTS-12.15" ;
  MtRequest.volume = 1.00 ;
  MtRequest.price  = 86470 ;
  MtRequest.type = ORDER_TYPE_SELL ;
  MtRequest.type_filling = ORDER_FILLING_FOK ;
  MtRequest.type_time = ORDER_TIME_DAY ;
//---
 if ( OrderCheck ( MtRequest, MtCheckResult ) )
 {
   Print ( "retcode = " , MtCheckResult.retcode );
   Print ( "balance = " , MtCheckResult.balance );
   Print ( "equity = " ,  MtCheckResult.equity );
   Print ( "profit = " , MtCheckResult.profit );
   Print ( "margin = " , MtCheckResult.margin );
   Print ( "margin_free = " , MtCheckResult.margin_free  );
   Print ( "margin_level = " , MtCheckResult.margin_level );
 }

내 결과는 다음과 같습니다.

 2015.10 . 22 15 : 38 : 39.520 LastPrice (RTS- 12.15 ,M1)        margin_level = 979.8676728569379
2015.10 . 22 15 : 38 : 39.334 LastPrice (RTS- 12.15 ,M1)        margin_free = 112198.35
2015.10 . 22 15 : 38 : 39.151 LastPrice (RTS- 12.15 ,M1)        margin = 12751.73
2015.10 . 22 15 : 38 : 38.973 LastPrice (RTS- 12.15 ,M1)        profit = 0.0
2015.10 . 22 15 : 38 : 38.797 LastPrice (RTS- 12.15 ,M1)        equity = 124950.08
2015.10 . 22 15 : 38 : 38.623 LastPrice (RTS- 12.15 ,M1)        balance = 124950.08
2015.10 . 22 15 : 38 : 38.397 LastPrice (RTS- 12.15 ,M1)        retcode = 0
 
고맙습니다. 병렬 검사로 옵션을 추가했습니다. 이제 적절한 순간을 포착하십시오.