FORTS Lütfen yardım edin - sayfa 29

 

İyi günler, Anton!

Tavsiyenize göre ( LoadServerData(), SeriesInfoInteger( a_symbol, PERIOD_M1, SERIES_SERVER_FIRSTDATE ) çağırır),

onlar. "dönemden bağımsız olarak sunucudaki sembolle tarihteki ilk tarih" okur.

Kendi başına, bu sorgu aslında bir geçmiş sorgusu olarak kabul edilmez, yani. önbellek oluşturmaya neden olmaz,

sembol verilerinin boşaltılmasını engellemez. SERIES_FIRSTDATE veya zaman serisindeki çubuk sayısını istemek mantıklıdır. ),

Sembol verilerinin atılmasını önlemek için göstergeye yeni bir işlev ekledim:

 //+------------------------------------------------------------------+
// 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() işlevi, BR-8.15 ve BR-9.15 karakterlerinde oldukça sık etkinleşir,

ama sonuç aynı:

 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

Anlaşma nedir?

Bar almak neden imkansız?

 
Михаил :

OnBookEvent() işlevi, BR-8.15 ve BR-9.15 karakterlerinde oldukça sık etkinleşir,

ama sonuç aynı:

Anlaşma nedir?

Bar almak neden imkansız?

Periyodiklik "çoğu zaman" güven uyandırmaz. GetBars() işlevinden günlüğe çıktı eklemek hata ayıklama için daha iyidir.

Bunu çözmek istiyorsanız , servis masasında bir talep açın. Tam teşekküllü bir kod örneği ekleyin, sorunu yeniden oluşturmaya çalışacağız.

 
Anton :

Periyodiklik "çoğu zaman" güven uyandırmaz. GetBars() işlevinden günlüğe çıktı eklemek hata ayıklama için daha iyidir.

Bunu çözmek istiyorsanız , servis masasında bir talep açın. Tam teşekküllü bir kod örneği ekleyin, sorunu yeniden oluşturmaya çalışacağız.

İyi. Uygulama: Hatalar , MetaTrader 5 İstemcisi , Açık , Başlangıç: 2015.07.24 18:28 , #1267768

P/S "Oldukça sık", iki yüksek düzeyde sıvı enstrüman için DAKİKA başına 10 ila 100 OnBookEvent() aktivasyonu anlamına gelir.

 

Yaşasın!

Destek Ekibi 2015.07.29 16:29

Sorunu yeniden üretti. Gerçekten de, periyodik talepler olduğunda bile sembol verileri bazen bellekten değiştiriliyordu. Hata düzeltilecektir.

Teşekkür ederim!

 
Михаил :

Michael , diğer karakterlerden dizi alarak bu sorunu aşmayı başardın mı? Göstergemle savaşmaktan, diğer karakterlerle sürekli senkronizasyonu kaybetmekten yoruldum.


Şimdi Demo sunucusu, 22 Haziran 2015 tarihli Yapı 1159'u yayınladı. Ve içinde, çok para birimi göstergeleri de çok iyi çalışıyor. Doğru çizilebilmesi için periyotları birkaç kez değiştirmeniz veya göstergeyi yeniden başlatmanız gerekir. Ve bir süre sonra yine serinin verilerini almıyor. Her zaman dergiye yazar

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

Geliştiriciler :

Verilerin senkronize olup olmadığını kontrol etmek için değil, doğrudan senkronize etmek ve bu verileri bellekten boşaltmamak için işlevler yapmak gerçekten imkansız mı?

Algoritmaları optimize etmek açısından kaynak tasarrufu iyidir. Ama neden bellekten veri boşaltmak için bu kadar fanatik bir yaklaşım.

Bir bilgisayarda ek bir gigabayt veya iki bellek satın almayı tercih ederim, ancak seriyi senkronize etmek için bu hemoroidlerden muzdarip olmam.

İstenen sembol için verileri yüklemek üzere OnInit() içinde bir kez çağırdığınız bir işlev yapın ve gösterge çalışırken artık bunlar boşaltılmaz.

Veri hazırlama ve uygunluklarının izlenmesi, kullanıcı tarafından ilk tarihin ne olduğunu, kaç tane çubuğum olduğunu ve sunucuda vb.

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

Michael , diğer sembollerden seri alarak bu sorunu aşmayı başardın mı? Göstergemle savaşmaktan, diğer karakterlerle sürekli senkronizasyonu kaybetmekten bıktım.


Şimdi Demo sunucusu, 22 Haziran 2015 tarihli Yapı 1159'u yayınladı. Ve içinde, çok para birimi göstergeleri de çok iyi çalışıyor. Doğru çizilebilmesi için periyotları birkaç kez değiştirmeniz veya göstergeyi yeniden başlatmanız gerekir. Ve bir süre sonra yine serinin verilerini almıyor. Her zaman dergiye yazar

Geliştiriciler :

Verilerin senkronize olup olmadığını kontrol etmek için değil, doğrudan senkronize etmek ve bu verileri bellekten boşaltmamak için işlevler yapmak gerçekten imkansız mı?

Algoritmaları optimize etmek açısından kaynak tasarrufu iyidir. Ama neden bellekten veri boşaltmak için bu kadar fanatik bir yaklaşım.

Bir bilgisayarda ek bir gigabayt veya iki bellek satın almayı tercih ederim, ancak seriyi senkronize etmek için bu hemoroidlerden muzdarip olmam.

İstenen sembol için verileri yüklemek üzere OnInit() içinde bir kez çağırdığınız bir işlev yapın ve gösterge çalışırken artık bunlar boşaltılmaz.

Veri hazırlama ve uygunluklarının izlenmesi, kullanıcı tarafından ilk tarihin ne olduğunu, kaç tane çubuğum olduğunu ve sunucuda vb.

Tünaydın!

Geliştiriciler, yeni yapıda düzelteceklerini söylediler.

Ne zaman piyasaya sürüleceği henüz bilinmiyor.

 
Üç yıl bekleme sözü verdi)
 

FORTS. Bir sorunla karşılaştım, OrderCheck() ve OrderCalcMargin() işlevleri bazen (!) bir anlaşma için gereken GO'yu yanlış bir şekilde belirler ve sonunda FALSE döndürür.

12.500 ruble RTS-12.15 ( SYMBOL_MARGIN_INITIAL ) için gerekli GI ile. işlev 143.105 rubleye kadar gerektirir!

Aynı zamanda, her şey manuel olarak açılır.

Nasıl ararım:

 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

 

Şu şekilde deneyin:

   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 );
 }

İşte sonucum:

 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
 
Teşekkür ederim. Seçeneğiniz paralel kontrol olarak eklendi. Şimdi doğru anı yakalamak için.