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

在BR-8.15和BR-9.15字符上,OnBookEvent()函数经常被触发。

但结果是一样的。

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

那么问题出在哪里?

为什么不可能得到Bars?

 
Михаил:

OnBookEvent()函数在BR-8.15和BR-9.15字符上触发的频率很高。

但结果是一样的。

那么问题出在哪里?

为什么不可能得到Bars?

频繁的 "足够 "并不能让人产生信心。最好从GetBars()函数中添加日志输出,以便调试。

如果你想了解它,那就在servicedesk 开一个请求。附上完整的代码示例,我们将尝试重现该问题。

 
Anton:

频繁的 "足够 "并不能让人产生信心。最好从GetBars()中添加日志输出,以便调试。

如果你想弄清楚,那就在服务台 开一个请求。附上一个完整的代码例子,让我们试着重现这个问题。

好的。请求:错误MetaTrader 5客户端已打开开始:2015.07.24 18:28#1267768

P/S "相当频繁 "是指每分钟在两个高流动性工具上有10到100个OnBookEvent()触发。

 

万岁!

支持团队2015.07.29 16:29

重现了这个问题。事实上,即使定期查询,符号数据有时也会从内存中卸载。该错误将被修复。

谢谢你!

 
Михаил:

迈克尔,你是否已经设法克服了从其他符号中获取系列的这个问题?我已经厌倦了与我的指标斗争,它不断失去与其他符号的同步。


现在,演示服务器正在发放2015年6月22日的Build 1159。而且其中的多币种指标 也工作得很糟糕。你必须多次切换时期或重新启动指标,以使其正确显示。而过了一段时间,它又没有得到系列数据。我总是写在日志里。

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

对开发商 而言。

是不是可以做一个函数,不检查数据是否同步,而是直接同步,不从内存中卸载这些数据?

从算法优化的角度来看,节省资源是好事。但我为什么要如此狂热地将数据从内存中卸载出来?

我宁愿在我的个人电脑上多买一两千兆字节的内存,也不愿意为系列同步的这种麻烦而烦恼。

制作一个函数,在OnInit()中调用一次 ,为所需的符号加载数据,只要指标在运行,就不会被卸载。

终端应该准备好数据并监控它们的相关性,而不是让用户考虑第一次约会,我有多少酒吧和在服务器上,等等。

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

迈克尔,你是否设法克服了从其他符号中获取系列的这个问题?我已经厌倦了与我的指标斗争,它不断失去与其他符号的同步。


现在,演示服务器正在发布2015年6月22日的Bild 1159。而其中的多币种指标 也工作得很糟糕。你必须多次切换时期或重新启动指标,以使其正确显示。而过了一段时间,它又没有得到系列数据。我总是写在日志里。

对开发商 而言。

是不是可以做一个函数,不检查数据是否同步,而是直接同步,不从内存中卸载这些数据?

从算法优化的角度来看,节省资源是好事。但我为什么要如此狂热地将数据从内存中卸载出来?

我宁愿在我的个人电脑上多买一两千兆字节的内存,也不愿意为这种麻烦的系列同步而烦恼。

制作一个函数,在OnInit()中调用一次 ,加载所需符号的数据,直到指标运行时才会再次卸载。

终端应该准备数据并监控它们的更新,而不是让用户考虑第一次约会,我有多少条和在服务器上,等等。

下午好!

开发商已经答复说,他们将在新的版本中修复它。

目前还不知道它将于何时发布。

 
要花三年时间才能得到承诺的东西)。
 

堡垒。我遇到一个问题,函数OrderCheck()和OrderCalcMargin()有时(!)不正确地确定交易所需的GO,结果是返回FALSE。

由于RTS-12.15(SYMBOL_MARGIN_INITIAL)所需的GO为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
 
谢谢你。添加了你的选项作为平行检查。现在只是一个抓住正确时机的问题。