| / | Форум |
|
elritmo
21.11.2006 22:38
#property copyright "" #property link "" bool isChartChanged = false; datetime lastM1BarTime, lastM5BarTime, lastM15BarTime; int init() { if(isChartChanged == true) { isChartChanged = false; return(0); } lastM1BarTime = iTime(NULL, PERIOD_M1, 0); lastM5BarTime = iTime(NULL, PERIOD_M5, 0); lastM15BarTime = iTime(NULL, PERIOD_M15, 0); return(0); } int deinit() { switch(UninitializeReason()) { case REASON_CHARTCLOSE: break; case REASON_REMOVE: break; case REASON_RECOMPILE: break; case REASON_CHARTCHANGE: isChartChanged = true; break; case REASON_PARAMETERS: break; case REASON_ACCOUNT: break; } return(0); } int start() { processM1Bar(); processM5Bar(); processM15Bar(); /*обработку баров других таймфреймов можно добавить здесь как и предыдущих трёх*/ makeOrders(); return(0); } void processM1Bar() { int newBars = iBarShift(NULL, PERIOD_M1, lastM1BarTime); if(newBars <= 0) return; Print("number of new M1 Bars: ", newBars); lastM1BarTime = iTime(NULL, PERIOD_M1, 0); } void processM5Bar() { int newBars = iBarShift(NULL, PERIOD_M5, lastM5BarTime); if(newBars <= 0) return; Print("number of new M5 Bars: ", newBars); lastM5BarTime = iTime(NULL, PERIOD_M5, 0); } void processM15Bar() { int newBars = iBarShift(NULL, PERIOD_M15, lastM15BarTime); if(newBars <= 0) return; Print("number of new M15 Bars: ", newBars); lastM15BarTime = iTime(NULL, PERIOD_M15, 0); } Вот сделал шаблон эксперта работающего с различными таймфреймами.
Другие таймфремы можно добавить по примеру М1 М5 М15. |
|
Принцип суперпозиции и интерференции финансовых инструментов Чем больше факторов влияют на поведение валютной пары, тем сложнее оценить ее поведение и сделать прогнозы на будущее. И, следовательно, если бы нам удалось из валютной пары выделить ее составляющие, меняющиеся во времени значения национальной валюты, то тем самым, мы существенно сократили степень свободы движения национальной валюты по сравнению с валютной парой, в которую она входит, и количество факторов влияющих на ее поведение. А как результат, повысили точность оценки ее поведения и прогнозирования будущих значений. Как же нам это сделать? |
|
SK.
22.11.2006 00:09
На мой взгляд так организовывать функции неправильно. |
|
komposter
22.11.2006 00:18
А я просто не понимаю зачем такой эксперт нужен ;)
|
|
elritmo
22.11.2006 11:44
SK. писал (а): На мой взгляд так организовывать функции неправильно. processBar(int period) { switch (period) case : ..... case : ..... case : ..... case : ..... } Вместо точек вы предпочтёте снова написать функции для каждого таймфрейма. то есть с моей точки зрения можно сразу разбить на processM1Bar, processM5Bar и так далее. |
|
elritmo
22.11.2006 11:51
Это не эксперт это шаблон для написания эксперта, который работает с различными таймфреймами и даже одним чартом где можно переключать различные таймфреймы. Ведь если открыть графики для различных инструментов уже довольно много получается закладок, которые скролировать долго, а если ещё для каждого открыть и таймфрейм, то их вообще будет море. Легче переключать таймфрейм в одном графике инструмента. komposter, а тебе не приходилось разрабатывать эксперта работающего одновременно с различными таймфреймами. Или ты запускаешь тогда эксперта на различных чартах с разными ТФ, а затем делаешь обмен данными между ними через глобальные переменные или файл? |
|
komposter
22.11.2006 12:54
elritmo писал (а): Нет. Посмотри внимательнее, чем отличаются функции process*?Вместо точек вы предпочтёте снова написать функции для каждого таймфрейма. то есть с моей точки зрения можно сразу разбить на processM1Bar, processM5Bar и так далее. Правильно, только значением периода (PERIOD_*). Делай выводы. komposter, а тебе не приходилось разрабатывать эксперта работающего одновременно с различными таймфреймами. Или ты запускаешь тогда эксперта на различных чартах с разными ТФ, а затем делаешь обмен данными между ними через глобальные переменные или файл? Если эксперты должны взаимодействовать, значит это один эксперт =) И он изначально делается в виде одного файла.А если одинаковый эксперт надо запустить на 10 чартах, я предпочту именно этот вариант - на каждом графике будет видна информация о работе эксперта, стрелочки ордеров, и ещё что-то (например, объекты созданные экспертом). Это если в реале торговать надо, конечно ;) |
|
elritmo
22.11.2006 14:12
komposter писал (а):
Если эксперты должны взаимодействовать, значит это один эксперт =) И он изначально делается в виде одного файла. А если одинаковый эксперт надо запустить на 10 чартах, я предпочту именно этот вариант - на каждом графике будет видна информация о работе эксперта, стрелочки ордеров, и ещё что-то (например, объекты созданные экспертом). Это если в реале торговать надо, конечно ;)
komposter писал (а):
Нет. Посмотри внимательнее, чем отличаются функции process*? Правильно, только значением периода (PERIOD_*). Делай выводы.
|
|
elritmo
22.11.2006 14:19
Кстати делаю вот так
datetime tmp_time = iTime(NULL, PERIOD_H1, 0); то получаю время начала текущего бара а если передам в функцию которую сам написал barShift(NULL, PERIOD_H1, lastTime); int barShift(string symbol, int timeframe, datetime time) { datetime tmp_time = iTime(symbol, timeframe, 0); return tmp_time; } то получаю tmp_time = 0 Если заменю symbol на NULL уже локально то работает и возврашает значение не нулевое int barShift(string symbol, int timeframe, datetime time) { datetime tmp_time = iTime(NULL, timeframe, 0); return tmp_time; } то работает То еcть если передаём string как NULL то внутри функции локальная переменная как NULL уже не рабоатет. Кто-нибудь сталкивался с такой проблемой или я что то не так делаю? |
|
komposter
22.11.2006 15:05
elritmo писал (а): Ага, 20 стрелочек на одном баре - романтика ;)Вообще то когда рисуешь объекты, то можешь указать на каких таймфреймах
они должны быть видны. более того если ты хочешь чтобы какие
то объекты были видны на несколкьих таймфреймах, хотя они расчитываются
на каком то одном, то нет проблем при переключении периода ты
их увидишь. elritmo писал (а): #property copyright "" #property link "" bool isChartChanged = false; datetime lastBarTime[9]; int init() { if(isChartChanged == true) { isChartChanged = false; return(0); } for ( int p = 1; p < 10; p ++ ) { lastBarTime[p-1] = iTime(NULL, Period_fromID(p), 0); } return(0); } int deinit() { if(UninitializeReason() == REASON_CHARTCHANGE) { isChartChanged = true; } return(0); } int start() { processBar(PERIOD_M1); processBar(PERIOD_M5); processBar(PERIOD_M15); makeOrders(); return(0); } void processBar(int period) { int newBars = iBarShift(NULL, period, lastBarTime[Period_toID(period)-1]); if(newBars 0) return; Print("number of new ", period, " Bars: ", newBars); lastBarTime = iTime(NULL, period, 0); } int Period_toID( int period ) { int Period_ID; switch ( period ) { case PERIOD_MN1: Period_ID = 9; break; case PERIOD_W1: Period_ID = 8; break; case PERIOD_D1: Period_ID = 7; break; case PERIOD_H4: Period_ID = 6; break; case PERIOD_H1: Period_ID = 5; break; case PERIOD_M30: Period_ID = 4; break; case PERIOD_M15: Period_ID = 3; break; case PERIOD_M5: Period_ID = 2; break; case PERIOD_M1: Period_ID = 1; break; } return(Period_ID); } int Period_fromID( int period_id ) { int period; switch ( period_id ) { case 9: period = PERIOD_MN1; break; case 8: period = PERIOD_W1; break; case 7: period = PERIOD_D1; break; case 6: period = PERIOD_H4; break; case 5: period = PERIOD_H1; break; case 4: period = PERIOD_M30; break; case 3: period = PERIOD_M15; break; case 2: period = PERIOD_M5; break; case 1: period = PERIOD_M1; break; } return(period); } Этот вариант не подойдет если алгоритм эксперта разный для каждого ТФ. В остальном - он лучше ;) |
|
komposter
22.11.2006 15:06
elritmo писал (а): Я сталкивался. С MarketInfo.То еcть если передаём string как NULL то внутри функции локальная переменная как NULL уже не рабоатет. Кто-нибудь сталкивался с такой проблемой или я что то не так делаю? С тех пор не выеживаюсь, и пишу Symbol() ;) |
|
elritmo
22.11.2006 15:32
komposter писал (а):
elritmo писал (а): Я сталкивался. С .То еcть если передаём string как NULL то внутри функции локальная переменная как NULL уже не рабоатет. Кто-нибудь сталкивался с такой проблемой или я что то не так делаю? С тех пор не выеживаюсь, и пишу Symbol() ;)
Насчёт твоего варианта шаблона. Спасибо за вариант, тоже подход
хороший, но ты правильно заметил что алгоритм эксперта может
отличаться для различных таймфреймов и если, скажем. выполняется
какое-то условие на одном таймфрейме и на другом, то можно совершить
торговую операцию.
А если ты открыл несколько чартов с различными таймфреймами
и открываешь позиции то они видны становятся на всех чартах
с таймфреймах для данного инструмента. Та же проблема. Так что
не вижу минуса в моём подходе использовать один чарт с одним
экспертом общим и переключать таймфреймы для просмотра. Хотя
может быть ты знаешь как сделать видимыми стрелочки операций
на таймфрейме. с граф объектами это возможно но не с этими.
Можно в эксперте сделать параметр что этот чарт считать универсальным или использовать только таймфрейм чарта к которому прицеплён этот эксперт. Да и гравный бенефит общего эксперта для различных таймфреймов это то что можно тестирование и оптимизацию стратегии вести одновременно на всех таймфреймах и если конечно в тестере выбрал M1 период |
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий