Скачать MetaTrader 5
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Написал программу? Опубликуй ее в Code Base!
symstu
50
symstu 2015.10.14 17:27 

Здравствуйте, вот такая вот проблема: написал себе советник, а данные с индикатором синхронизирую через мускул. Так как советник в базу записывает значения приблизительно раз 20 секунд, хотел поставить такой же таймер в индикатор, чтобы  он лишний раз не теребонил бд. Hо EventSetTimer не запускает ивент onTimer. Потом попробовал все организовать через onStart, но забил на это дело. т.к. в доках написано, что с индикатором это не работает и взял ивент onCalculate. Он запустился, но только один раз после инициализации. Индикатор запускается через советник причем не один, а 4 штуки для каждого графика отрытого в советнике на его усмотрение. 

 

#property copyright "Maksym Stukalo"

#property link      "stukalo.maksym@gmail.com"

#property version   "1.00"

#property indicator_separate_window

 

input int order_ticket;

input string db_name;

input int CGraphUpdate = 15;

input int OrderID;

//input int chart_id;



double ExtBufferLine0[];

double ExtBufferLine1[];

double ExtBufferLine2[];

double ExtBufferLine3[];

double ExtBufferLine4[]; 

 

int OnInit()

  {

Print("1");

IndicatorBuffers(5);

Print("2");

ilep.lenOfFields = db.getTableLen();

Print("3");

SetIndexBuffer(0, ExtBufferLine0);

SetIndexBuffer(1, ExtBufferLine1);

SetIndexBuffer(2, ExtBufferLine2);

SetIndexBuffer(3, ExtBufferLine3);

SetIndexBuffer(4, ExtBufferLine4);


  return(INIT_SUCCEEDED);

  } 

 

int OnCalculate(const int rates_total,

                const int prev_calculated,

                const datetime &time[],

                const double &open[],

                const double &high[],

                const double &low[],

                const double &close[],

                const long &tick_volume[],

                const long &volume[],

                const int &spread[])

  {

 Print("9");

if(db.getTableLen() != ilep.lenOfFields){

ilep.lenOfFields++;

ilep.updateLines();

Print("10");

}

   return(rates_total);

  } 

 Никаких ошибок и вылетов нету, используемые классы работают нормально. В логи число 9 выводиться только  раз. Максимальное время работы - 10 минут. Таймер вообще не стартует (его тут в коде нету). 

MetaTrader 4, build 891 

. ... Rick D. ... .
1071
. ... Rick D. ... . 2015.10.14 18:48  
Из индикатора вам надо свой таймер запускать. Из OnInit() запускаете EventSetTimer().
symstu
50
symstu 2015.10.14 19:37  
RickD:
Из индикатора вам надо свой таймер запускать. Из OnInit() запускаете EventSetTimer().

Так и делаю. Таймер запускаю, как говорите, я снизу уточнил, что в этом коде его нету. В советнике таймер работает, а в индикаторах не запускается.
. ... Rick D. ... .
1071
. ... Rick D. ... . 2015.10.14 19:56  
Приаттачить индикатор для теста можете?
symstu
50
symstu 2015.10.14 22:15  
RickD:
Приаттачить индикатор для теста можете?
На самом деле запустить его вручную не получиться - надо мускул ставить. Могу просто кинуть исходник. Я здесь таймер не ставил, но есть ивент onCalculate, который выполняется только один раз сразу после onInit
Файлы:
symstu
50
symstu 2015.10.14 22:30  

Вот, что я видел, когда искал решение проблемы
https://www.mql5.com/ru/forum/962

Но так как у меня и  onCalculate работает неверно, и запустить задержку Sleep из индикатора я тоже не могу, решил что проблема индивидуальна.

. ... Rick D. ... .
1071
. ... Rick D. ... . 2015.10.14 23:26  

Так откуда у вас будет таймер, когда вы его не запускаете?

Из индикатора вам надо свой таймер запускать. Из OnInit() запускаете EventSetTimer().

symstu
50
symstu 2015.10.15 06:33  
RickD:

Так откуда у вас будет таймер, когда вы его не запускаете?

Из индикатора вам надо свой таймер запускать. Из OnInit() запускаете EventSetTimer().


Повторю третий раз, я знаю, что здесь таймера нету, но когда я его ставлю, он не работает, в любом случае, здесь не работает onCalculate
symstu
50
symstu 2015.10.15 06:37  
Приеду с пар-упрощу код максимально, чтобы можно было запустить и посмотреть.
. ... Rick D. ... .
1071
. ... Rick D. ... . 2015.10.15 17:36  
symstu:

Повторю третий раз, я знаю, что здесь таймера нету, но когда я его ставлю, он не работает, в любом случае, здесь не работает onCalculate

А смысл тогда приводить такой код не по существу?

Держите. Кое-что закомментировал. Кое-что добавил. OnTimer срабатывает.

Файлы:
symstu
50
symstu 2015.10.21 14:43  

При ручном запуске работает у меня тоже (только что проверил), но если запускать из советника - проходит инициализация и все.

double res = iCustom(symb[symb_id].name, CTimeFrame, "iLeprechaun", order[inc_order].current_tick, db.dbName,CGraphUpdate,inc_order, 0,0);

 Так выглядит запуск из советника 

/ /12
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий