//+------------------------------------------------------------------+// Custom indicator Book Event function |//+------------------------------------------------------------------+voidOnBookEvent( conststring &symbol )
{
if ( ( ( symbol == _Symbol ) || ( symbol == sec_symbol ) ) && ( !IsStopped() ) )
{
GetBars( sec_symbol, time_frame );
}
}
//+------------------------------------------------------------------+// Custom indicator Check timer function |//+------------------------------------------------------------------+bool CheckTimer( constuint start_value, constuint 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( conststring 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 buildCopyTime( 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( conststring 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 synchronizedif ( 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.2320:48:13.449 Spread (BR-8.15,M1) OnCalculate: Не получены бары по символу BR-9.152015.07.2320:48:13.449 Spread (BR-8.15,M1) OnCalculate: Не получены бары по символу BR-9.152015.07.2320:48:13.449 Spread (BR-8.15,M1) OnCalculate: Не получены бары по символу BR-9.152015.07.2320:48:13.449 Spread (BR-8.15,M1) OnCalculate: Не получены бары по символу BR-9.152015.07.2320:48:13.449 Spread (BR-8.15,M1) OnCalculate: Не получены бары по символу BR-9.15
下午好,安东!
按照你的建议 (LoadServerData() 调用 SeriesInfoInteger( a_symbol, PERIOD_M1,SERIES_SERVER_FIRSTDATE)。
也就是说,它的内容是 "按服务器上的符号计算的历史上的第一个日期,不管是什么时期"。
这个请求本身实际上不被认为是一个历史请求,也就是说,它不会导致建立一个缓存。
并不阻止符号数据的卸载。要求 SERIES_FIRSTDATE或时间序列的条数是有意义的。),
我给指标添加了一个新的函数,以防止符号数据的卸载。
在BR-8.15和BR-9.15字符上,OnBookEvent()函数经常被触发。
但结果是一样的。
那么问题出在哪里?
为什么不可能得到Bars?
OnBookEvent()函数在BR-8.15和BR-9.15字符上触发的频率很高。
但结果是一样的。
那么问题出在哪里?
为什么不可能得到Bars?
频繁的 "足够 "并不能让人产生信心。最好从GetBars()函数中添加日志输出,以便调试。
如果你想了解它,那就在servicedesk 开一个请求。附上完整的代码示例,我们将尝试重现该问题。
频繁的 "足够 "并不能让人产生信心。最好从GetBars()中添加日志输出,以便调试。
如果你想弄清楚,那就在服务台 开一个请求。附上一个完整的代码例子,让我们试着重现这个问题。
好的。请求:错误,MetaTrader 5客户端,已打开,开始:2015.07.24 18:28,#1267768
P/S "相当频繁 "是指每分钟在两个高流动性工具上有10到100个OnBookEvent()触发。
万岁!
重现了这个问题。事实上,即使定期查询,符号数据有时也会从内存中卸载。该错误将被修复。
谢谢你!
迈克尔,你是否已经设法克服了从其他符号中获取系列的这个问题?我已经厌倦了与我的指标斗争,它不断失去与其他符号的同步。
现在,演示服务器正在发放2015年6月22日的Build 1159。而且其中的多币种指标 也工作得很糟糕。你必须多次切换时期或重新启动指标,以使其正确显示。而过了一段时间,它又没有得到系列数据。我总是写在日志里。
Данные символа "Si-12.15" не синхронизированы с торговым сервером.对开发商 而言。
是不是可以做一个函数,不检查数据是否同步,而是直接同步,不从内存中卸载这些数据?
从算法优化的角度来看,节省资源是好事。但我为什么要如此狂热地将数据从内存中卸载出来?
我宁愿在我的个人电脑上多买一两千兆字节的内存,也不愿意为系列同步的这种麻烦而烦恼。
制作一个函数,在OnInit()中调用一次 ,为所需的符号加载数据,只要指标在运行,就不会被卸载。
终端应该准备好数据并监控它们的相关性,而不是让用户考虑第一次约会,我有多少酒吧和在服务器上,等等。
迈克尔,你是否设法克服了从其他符号中获取系列的这个问题?我已经厌倦了与我的指标斗争,它不断失去与其他符号的同步。
现在,演示服务器正在发布2015年6月22日的Bild 1159。而其中的多币种指标 也工作得很糟糕。你必须多次切换时期或重新启动指标,以使其正确显示。而过了一段时间,它又没有得到系列数据。我总是写在日志里。
对开发商 而言。
是不是可以做一个函数,不检查数据是否同步,而是直接同步,不从内存中卸载这些数据?
从算法优化的角度来看,节省资源是好事。但我为什么要如此狂热地将数据从内存中卸载出来?
我宁愿在我的个人电脑上多买一两千兆字节的内存,也不愿意为这种麻烦的系列同步而烦恼。
制作一个函数,在OnInit()中调用一次 ,加载所需符号的数据,直到指标运行时才会再次卸载。
终端应该准备数据并监控它们的更新,而不是让用户考虑第一次约会,我有多少条和在服务器上,等等。
下午好!
开发商已经答复说,他们将在新的版本中修复它。
目前还不知道它将于何时发布。
堡垒。我遇到一个问题,函数OrderCheck()和OrderCalcMargin()有时(!)不正确地确定交易所需的GO,结果是返回FALSE。
由于RTS-12.15(SYMBOL_MARGIN_INITIAL)所需的GO为12,500 ,该功能需要多达143,105 卢布!
同时,一切都能完美地手动打开。
我怎样才能打电话。
这样试试吧。
这是我的结果。