На мой взгляд так организовывать функции неправильно.
Лучше сделать одну общую функцию processBar(), в качестве параметров
для которой указывается период.
На мой взгляд так организовывать функции неправильно.
Лучше сделать одну общую функцию processBar(), в качестве параметров
для которой указывается период.
processBar(int period) {
switch (period)
case :
.....
case :
.....
case :
.....
case :
.....
}
Вместо точек вы предпочтёте снова написать функции для каждого таймфрейма. то есть с моей точки зрения можно сразу разбить на processM1Bar, processM5Bar и так далее.
Это не эксперт это шаблон для написания эксперта, который работает с различными таймфреймами и даже одним чартом где можно переключать различные таймфреймы. Ведь если открыть графики для различных инструментов уже довольно много получается закладок, которые скролировать долго, а если ещё для каждого открыть и таймфрейм, то их вообще будет море. Легче переключать таймфрейм в одном графике инструмента.
komposter, а тебе не приходилось разрабатывать эксперта работающего одновременно с различными таймфреймами. Или ты запускаешь тогда эксперта на различных чартах с разными ТФ, а затем делаешь обмен данными между ними через глобальные переменные или файл?
Вместо точек вы предпочтёте снова написать функции для каждого таймфрейма. то есть с моей точки зрения можно сразу разбить на processM1Bar, processM5Bar и так далее.
Правильно, только значением периода (PERIOD_*).
Делай выводы.
komposter, а тебе не приходилось разрабатывать эксперта работающего одновременно с различными таймфреймами. Или ты запускаешь тогда эксперта на различных чартах с разными ТФ, а затем делаешь обмен данными между ними через глобальные переменные или файл?
Если эксперты должны взаимодействовать, значит это один эксперт =) И он изначально делается в виде одного файла.А если одинаковый эксперт надо запустить на 10 чартах, я предпочту именно этот вариант - на каждом графике будет видна информация о работе эксперта, стрелочки ордеров, и ещё что-то (например, объекты созданные экспертом).
Это если в реале торговать надо, конечно ;)
Если эксперты должны взаимодействовать, значит это один эксперт =) И он изначально делается в виде одного файла.
А если одинаковый эксперт надо запустить на 10 чартах, я предпочту именно этот вариант - на каждом графике будет видна информация о работе эксперта, стрелочки ордеров, и ещё что-то (например, объекты созданные экспертом).
Это если в реале торговать надо, конечно ;)
Вообще то когда рисуешь объекты, то можешь указать на каких
таймфреймах они должны быть видны. более того если ты хочешь
чтобы какие то объекты были видны на несколкьих таймфреймах,
хотя они расчитываются на каком то одном, то нет проблем при
переключении периода ты их увидишь.
И стрелочки ордеров будут видны на одном чарте. в этом тоже нет
проблем
Нет. Посмотри внимательнее, чем отличаются функции process*?
Правильно, только значением периода (PERIOD_*).
Делай выводы.
Андрей, модифицируй мой код исходя из своих утверждений и я
сразу же пойму о чём ты.
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 уже не рабоатет.
Кто-нибудь сталкивался с такой проблемой или я что то не так делаю?
Вообще то когда рисуешь объекты, то можешь указать на каких таймфреймах
они должны быть видны. более того если ты хочешь чтобы какие
то объекты были видны на несколкьих таймфреймах, хотя они расчитываются
на каком то одном, то нет проблем при переключении периода ты
их увидишь.
И стрелочки ордеров будут видны на одном чарте. в этом тоже нет
проблем
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); }
Этот вариант не подойдет если алгоритм эксперта разный для каждого ТФ. В остальном - он лучше ;)
То еcть если передаём string как NULL то внутри функции локальная переменная как NULL уже не рабоатет.
Кто-нибудь сталкивался с такой проблемой или я что то не так делаю?
С тех пор не выеживаюсь, и пишу Symbol() ;)
То еcть если передаём string как NULL то внутри функции локальная переменная как NULL уже не рабоатет.
Кто-нибудь сталкивался с такой проблемой или я что то не так делаю?
С тех пор не выеживаюсь, и пишу Symbol() ;)
А ну да точно можно ж Symbol функцию применить :) Но всё равно вот
странная проблема
так же если
string str = NULL;
int len = StringLen(str);
len будет равно 1
А Print(str) выведет 0 в лог эксперта.
Ну да ладно фиг с этой проблемой. можно обойти в будущем
Насчёт твоего варианта шаблона. Спасибо за вариант, тоже подход
хороший, но ты правильно заметил что алгоритм эксперта может
отличаться для различных таймфреймов и если, скажем. выполняется
какое-то условие на одном таймфрейме и на другом, то можно совершить
торговую операцию.
Короче, универсального шаблона нет :)
Можно в эксперте сделать параметр что этот чарт считать универсальным или использовать только таймфрейм чарта к которому прицеплён этот эксперт.
Да и гравный бенефит общего эксперта для различных таймфреймов это то что можно тестирование и оптимизацию стратегии вести одновременно на всех таймфреймах и если конечно в тестере выбрал M1 период
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Вот сделал шаблон эксперта работающего с различными таймфреймами. Другие таймфремы можно добавить по примеру М1 М5 М15.
Вот этот флаг isChartChanged позволяет не выполнять тело функции init() при смене параметров чарта, например таймфрейма.
Критика и предложения принимаются :)