Предлага шаблон эксперта работающего с различными таймфреймами

 
#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.
Вот этот флаг isChartChanged позволяет не выполнять тело функции init() при смене параметров чарта, например таймфрейма.

Критика и предложения принимаются :)

 

На мой взгляд так организовывать функции неправильно.

Лучше сделать одну общую функцию processBar(), в качестве параметров для которой указывается период.

 
А я просто не понимаю зачем такой эксперт нужен ;)
 
SK. писал (а):

На мой взгляд так организовывать функции неправильно.

Лучше сделать одну общую функцию processBar(), в качестве параметров для которой указывается период.


processBar(int period) {
switch (period)
case :
.....
case :
.....
case :
.....
case :
.....
}

Вместо точек вы предпочтёте снова написать функции для каждого таймфрейма. то есть с моей точки зрения можно сразу разбить на processM1Bar, processM5Bar и так далее.
 
komposter писал (а):
А я просто не понимаю зачем такой эксперт нужен ;)

Это не эксперт это шаблон для написания эксперта, который работает с различными таймфреймами и даже одним чартом где можно переключать различные таймфреймы. Ведь если открыть графики для различных инструментов уже довольно много получается закладок, которые скролировать долго, а если ещё для каждого открыть и таймфрейм, то их вообще будет море. Легче переключать таймфрейм в одном графике инструмента.

komposter, а тебе не приходилось разрабатывать эксперта работающего одновременно с различными таймфреймами. Или ты запускаешь тогда эксперта на различных чартах с разными ТФ, а затем делаешь обмен данными между ними через глобальные переменные или файл?
 
elritmo:
Вместо точек вы предпочтёте снова написать функции для каждого таймфрейма. то есть с моей точки зрения можно сразу разбить на processM1Bar, processM5Bar и так далее.
Нет. Посмотри внимательнее, чем отличаются функции process*?
Правильно, только значением периода (PERIOD_*).
Делай выводы.

komposter, а тебе не приходилось разрабатывать эксперта работающего одновременно с различными таймфреймами. Или ты запускаешь тогда эксперта на различных чартах с разными ТФ, а затем делаешь обмен данными между ними через глобальные переменные или файл?

Если эксперты должны взаимодействовать, значит это один эксперт =) И он изначально делается в виде одного файла.
А если одинаковый эксперт надо запустить на 10 чартах, я предпочту именно этот вариант - на каждом графике будет видна информация о работе эксперта, стрелочки ордеров, и ещё что-то (например, объекты созданные экспертом).

Это если в реале торговать надо, конечно ;)
 
komposter писал (а):
Если эксперты должны взаимодействовать, значит это один эксперт =) И он изначально делается в виде одного файла.
А если одинаковый эксперт надо запустить на 10 чартах, я предпочту именно этот вариант - на каждом графике будет видна информация о работе эксперта, стрелочки ордеров, и ещё что-то (например, объекты созданные экспертом).

Это если в реале торговать надо, конечно ;)


Вообще то когда рисуешь объекты, то можешь указать на каких таймфреймах они должны быть видны. более того если ты хочешь чтобы какие то объекты были видны на несколкьих таймфреймах, хотя они расчитываются на каком то одном, то нет проблем при переключении периода ты их увидишь.
И стрелочки ордеров будут видны на одном чарте. в этом тоже нет проблем

komposter писал (а):
Нет. Посмотри внимательнее, чем отличаются функции 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:

Вообще то когда рисуешь объекты, то можешь указать на каких таймфреймах они должны быть видны. более того если ты хочешь чтобы какие то объекты были видны на несколкьих таймфреймах, хотя они расчитываются на каком то одном, то нет проблем при переключении периода ты их увидишь.
И стрелочки ордеров будут видны на одном чарте. в этом тоже нет проблем

Ага, 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);
}

Этот вариант не подойдет если алгоритм эксперта разный для каждого ТФ. В остальном - он лучше ;)
 
elritmo:
То еcть если передаём string как NULL то внутри функции локальная переменная как NULL уже не рабоатет.
Кто-нибудь сталкивался с такой проблемой или я что то не так делаю?
Я сталкивался. С MarketInfo.
С тех пор не выеживаюсь, и пишу Symbol() ;)
 
komposter писал (а):
elritmo писал (а):
То еcть если передаём string как NULL то внутри функции локальная переменная как NULL уже не рабоатет.
Кто-нибудь сталкивался с такой проблемой или я что то не так делаю?
Я сталкивался. С .
С тех пор не выеживаюсь, и пишу Symbol() ;)


А ну да точно можно ж Symbol функцию применить :) Но всё равно вот странная проблема
так же если
string str = NULL;
int len = StringLen(str);
len будет равно 1
А Print(str) выведет 0 в лог эксперта.
Ну да ладно фиг с этой проблемой. можно обойти в будущем

Насчёт твоего варианта шаблона. Спасибо за вариант, тоже подход хороший, но ты правильно заметил что алгоритм эксперта может отличаться для различных таймфреймов и если, скажем. выполняется какое-то условие на одном таймфрейме и на другом, то можно совершить торговую операцию.
Короче, универсального шаблона нет :)

komposter писал (а):

а
га, 20 стрелочек на одном баре - романтика ;)

А если ты открыл несколько чартов с различными таймфреймами и открываешь позиции то они видны становятся на всех чартах с таймфреймах для данного инструмента. Та же проблема. Так что не вижу минуса в моём подходе использовать один чарт с одним экспертом общим и переключать таймфреймы для просмотра. Хотя может быть ты знаешь как сделать видимыми стрелочки операций на таймфрейме. с граф объектами это возможно но не с этими.
Можно в эксперте сделать параметр что этот чарт считать универсальным или использовать только таймфрейм чарта к которому прицеплён этот эксперт.


Да и гравный бенефит общего эксперта для различных таймфреймов это то что можно тестирование и оптимизацию стратегии вести одновременно на всех таймфреймах и если конечно в тестере выбрал M1 период
Причина обращения: