Как отследить изменение в MarketWatch - страница 2

 

Собирать тики нужно не из эксперта, а из индикаторов. Они не пропустят ни одного тика.

А вот запускать индикаторы, да и открывать графики для них, можно из эксперта или из скрипта.

Единственный минус - много открытых графиков = лишние занятые ресурсы. Но при 5000 барах в окне это не должно быть проблемой. Попробуйте.

 
Andrey Khatimlianskii:

Собирать тики нужно не из эксперта, а из индикаторов. Они не пропустят ни одного тика.

А вот запускать индикаторы, да и открывать графики для них, можно из эксперта или из скрипта.

Единственный минус - много открытых графиков = лишние занятые ресурсы. Но при 5000 барах в окне это не должно быть проблемой. Попробуйте.

Уже пробовал

При запуске по всем символам (71 шт) эксперт сделанный по вашей модели с 71 индикаторами, перегружает эксперт. По каждому символу отлавливается 1 - 5 тиков в минуту, а иногда и не одного.

Т.е. этот вариант имеет чрезмерную ресурсоемкость.

 
elibrarius:

Уже пробовал

Т.е. этот вариант имеет чрезмерную ресурсоемкость.

Это не то, EventChartCustom не нужен.

Просто собирайте и пишите тики из индикатора, а индикаторы запускайте из советника. 

 
Andrey Khatimlianskii:

Это не то, EventChartCustom не нужен.

Просто собирайте и пишите тики из индикатора, а индикаторы запускайте из советника. 

Думаете потянет 71 индикатор? Мне кажется там много скрытой работы происходит при открытии и перерасчете каждого индикатора.

Сейчас запущен сборщик на таймере, если буду недоволен его работой, то может попробую такой вариант.

Спасибо!

Если у вас есть такой сборщик, может попробуете потестировать на большом количестве пар? Чтобы сравнить ресурсоемкость...

 
elibrarius:

Думаете потянет 71 индикатор? Мне кажется там много скрытой работы происходит при открытии и перерасчете каждого индикатора.

Сейчас запущен сборщик на таймере, если буду недоволен его работой, то может попробую такой вариант.

Спасибо!

Если у вас есть такой сборщик, может попробуете потестировать на большом количестве пар? Чтобы сравнить ресурсоемкость...

Тут нечего проверять.

Во-первых, советник работает в одном потоке, поэтому пары перебираются последовательно. Индикаторы будут работать каждый в своем потоке, и для современных процессоров с 4-8-32 ядрами и всякими гипер-технологиями это даст ускорение чисто за счет распараллеливания.
Во-вторых, даже работая с одним инструментом, советник может пропускать тики (разработчики об этом прямым текстом говорят)!
А в-третьих, пустой индикатор (без просчета истории) ресурсов (и процессора, и памяти) практически не использует.

Поэтому шаг первый - поставить 5000 баров в окне, открыть все графики, перезапустить терминал, и посмотреть на использование ресурсов. Если устраивает, написать простой индикатор записи тиков и подцепить его на все чарты.

Для открытия всех графиков можно использовать что-то типа этого (код записывает шаблон и открывает заданное кол-во графиков. нужно подправить, чтоб он перебирал маркет-вотч и открывал графики разных инструментов):

void OpenCharts()
{
        if ( ChartsCount <= 0 ) return;

        Print( "Open ", ChartsCount, " charts with TradeBooster..." );

        string file_name = "TradeBooster.tpl";
        int handle = FileOpen( file_name, FILE_TXT | FILE_WRITE | FILE_ANSI );

        if ( handle < 0 )
        {
                Print( "FileOpen( \"", file_name, "\", FILE_TXT | FILE_WRITE | FILE_ANSI ) - Error #", GetLastError() );
                return;
        }

        string string_template = "";
        StringAdd( string_template, "<chart>\n" );
        StringAdd( string_template, "period=43200\n" );
        StringAdd( string_template, "leftpos=1\n" );
        StringAdd( string_template, "graph=1\n" );
        StringAdd( string_template, "fore=0\n" );
        StringAdd( string_template, "grid=0\n" );
        StringAdd( string_template, "volume=0\n" );
        StringAdd( string_template, "scroll=0\n" );
        StringAdd( string_template, "shift=0\n" );
        StringAdd( string_template, "ohlc=0\n" );
        StringAdd( string_template, "one_click=0\n" );
        StringAdd( string_template, "askline=0\n" );
        StringAdd( string_template, "days=0\n" );
        StringAdd( string_template, "descriptions=0\n" );
        StringAdd( string_template, "\n" );

        StringAdd( string_template, "window_left=1\n" );
        StringAdd( string_template, "window_top=1\n" );
        StringAdd( string_template, "window_right=100\n" );
        StringAdd( string_template, "window_bottom=100\n" );
        StringAdd( string_template, "window_type=1\n" );
        StringAdd( string_template, "background_color=0\n" );
        StringAdd( string_template, "foreground_color=16711935\n" );
        StringAdd( string_template, "barup_color=0\n" );
        StringAdd( string_template, "bardown_color=0\n" );
        StringAdd( string_template, "bullcandle_color=0\n" );
        StringAdd( string_template, "bearcandle_color=0\n" );
        StringAdd( string_template, "chartline_color=0\n" );
        StringAdd( string_template, "volumes_color=0\n" );
        StringAdd( string_template, "grid_color=0\n" );
        StringAdd( string_template, "askline_color=0\n" );
        StringAdd( string_template, "stops_color=0\n" );
        StringAdd( string_template, "\n" );

        StringAdd( string_template, "<window>\n" );
        StringAdd( string_template, "height=200\n" );
        StringAdd( string_template, "<indicator>\n" );
        StringAdd( string_template, "name=main\n" );
        StringAdd( string_template, "</indicator>\n" );
        StringAdd( string_template, "</window>\n" );
        StringAdd( string_template, "\n" );

        StringAdd( string_template, "<expert>\n" );
        StringAdd( string_template, "name=TradeBooster\n" );
        StringAdd( string_template, "flags=343\n" );
        StringAdd( string_template, "window_num=0\n" );
        StringAdd( string_template, "<inputs>\n" );
        StringAdd( string_template, "Expert_Properties=\n" );
        StringAdd( string_template, "NumberOfTries=" + (string)NumberOfTries + "\n" );
        StringAdd( string_template, "Slippage=" + (string)Slippage + "\n" );
        StringAdd( string_template, "Pause_Ms=" + (string)Pause_Ms + "\n" );
        StringAdd( string_template, "ChartsCount=0\n" );
        StringAdd( string_template, "</inputs>\n" );
        StringAdd( string_template, "</expert>\n" );
        StringAdd( string_template, "</chart>\n" );

        FileWrite( handle, string_template );
        FileClose( handle );
        
        long MainChart = ChartID();

        for( int c = 0; c < ChartsCount; c ++ )
        {
                long chart_id = ChartOpen( _Symbol, PERIOD_MN1 );
                if ( chart_id <= 0 )
                {
                        Alert( "ChartOpen error #", GetLastError(), "!" );
                        break;
                }
                if ( !ChartApplyTemplate( chart_id, "\\Files\\TradeBooster.tpl" ) )
                {
                        Alert( "ChartApplyTemplate error #", GetLastError(), "!" );
                        break;
                }
        }
        ChartSetInteger( MainChart, CHART_BRING_TO_TOP, 0, true );
}
 
Andrey Khatimlianskii:

Тут нечего проверять.

Во-первых, советник работает в одном потоке, поэтому пары перебираются последовательно. Индикаторы будут работать каждый в своем потоке, и для современных процессоров с 4-8-32 ядрами и всякими гипер-технологиями это даст ускорение чисто за счет распараллеливания.
Во-вторых, даже работая с одним инструментом, советник может пропускать тики (разработчики об этом прямым текстом говорят)!
А в-третьих, пустой индикатор (без просчета истории) ресурсов (и процессора, и памяти) практически не использует.

Поэтому шаг первый - поставить 5000 баров в окне, открыть все графики, перезапустить терминал, и посмотреть на использование ресурсов. Если устраивает, написать простой индикатор записи тиков и подцепить его на все чарты.

Для открытия всех графиков можно использовать что-то типа этого (код записывает шаблон и открывает заданное кол-во графиков. нужно подправить, чтоб он перебирал маркет-вотч и открывал графики разных инструментов):


Рассчитывать на много ядер не приходится, т.к. VPS приемлемы по цене только - 1 или 2-х ядерные. А сутками, месяцами и годами домашний комп нет жеания гонять, да и со связью проблемы чаще чем у VPS.

Что-то ваш код слишком большой...

Я делал вот так

string simbol[];
void OnInit(){

      int num=SymbolsTotal(true);      // true – только символы в MarketWatch
      for (int i=0;i<num;i++){ iCustom(SymbolName(i, true),PERIOD_CURRENT,"history_multi");}

}

Вот так запускаются индикаторы для всех символов. Индикаторы были пустыми и скрытыми и они пергружали 2-х ядерный VPS.

int OnCalculate (const int rates_total,const int prev_calculated,const int begin,const double& price[]){
   EventChartCustom(chart_id,0,n_symbol,0.0,_Symbol);
   return(rates_total);
}

Либо по какой то другой причине не происходило OnChartEvent

 

Думаю есть вариант попроще.

Можно использовать функцию CopyTicks, зачем собирать тики когда сервер и терминал сам их собирает. 

Из советника можно запрашивать новые тики, по любому инструменту, раз в минуту, или раз в 5 минут, и скидывать их в файл.

 
elibrarius:


Рассчитывать на много ядер не приходится, т.к. VPS приемлемы по цене только - 1 или 2-х ядерные. А сутками, месяцами и годами домашний комп нет жеания гонять, да и со связью проблемы чаще чем у VPS.

Ну, как всегда... нужно сделать ферму по сбору информации без потерь, но бюджет на нее - $10/в месяц ;)

 

elibrarius:

Что-то ваш код слишком большой...

Я делал вот так

string simbol[];
void OnInit(){

      int num=SymbolsTotal(true);      // true – только символы в MarketWatch
      for (int i=0;i<num;i++){ iCustom(SymbolName(i, true),PERIOD_CURRENT,"history_multi");}

}

Вот так запускаются индикаторы для всех символов. Индикаторы были пустыми и скрытыми и они пергружали 2-х ядерный VPS.

int OnCalculate (const int rates_total,const int prev_calculated,const int begin,const double& price[]){
   EventChartCustom(chart_id,0,n_symbol,0.0,_Symbol);
   return(rates_total);
}

Либо по какой то другой причине не происходило OnChartEvent

Мой код занимается совсем другим, поэтому и больше.

Хотя, ваш вариант тоже должен работать. Но не факт, что индикаторы, вызванные однажды, не "отваливаются" через какое-то время.
Я использовал отдельные графики, потому что в моей задаче нужны были именно советники (их не вызовешь скрытыми).

Тормоза могут быть и от EventChartCustom, но это надо проверять. Я бы сделал запись из индикатора.

 

Sergey Chalyshev:

Думаю есть вариант попроще.

Можно использовать функцию CopyTicks, зачем собирать тики когда сервер и терминал сам их собирает. 

Из советника можно запрашивать новые тики, по любому инструменту, раз в минуту, или раз в 5 минут, и скидывать их в файл.

Кстати, да. Если уже нормально работает. 

 
Andrey Khatimlianskii:

Тормоза могут быть и от EventChartCustom, но это надо проверять. Я бы сделал запись из индикатора.

Сделал запись из индикатора - работает без задержек. Т.е. проблема в EventChartCustom  - при болшом количестве вызовов она начинает пропускать и тормозить.

При записи из индикатора нагрузка процессора 60% (запуск по 71 символу). Такая же и при работе советника с таймером.

Сравнил результаты записи из индикаторов с результатами советника с таймером (запуск по 71 символу). Различий практически нет.

Иногда советник с таймером определяет тиковые объемы с задержкой, т.е. от предыдущего тика:
2016.02.05 12:21:18,1.11917,1.11911,54
2016.02.05 12:21:19,1.11917,1.11910,55
2016.02.05 12:21:19,1.11916,1.11910,55
2016.02.05 12:21:20,1.11917,1.11910,57

Объем получаю через CopyTickVolume (через CopyRates думаю будет больше тормозов, жаль что нету такого SymbolInfoDouble(simbol,TICK_VOLUME)). В индикаторе объемы определяются чётко.

Т.o. вариант записи в файл в самом индикаторе оказался самым лучшим.

Andrey Khatimlianskii:

Но не факт, что индикаторы, вызванные однажды, не "отваливаются" через какое-то время.
А что, такое возможно? Если да, то все плюсы работы через индикаторы, этим перечеркнутся.
 
elibrarius:


А что, такое возможно? Если да, то все плюсы работы через индикаторы, этим перечеркнутся.

Тоже нужно проверить. Вообще, МТ следит за тем, чтоб старые кэши не держались зря в памяти. Но тут не совсем тот случай.

Просто понаблюдайте несколько часов - если не отвалятся, значит все ок. 

Причина обращения: