AntFX 6,474 Share Posted July 9, 2018 7 часов назад, ZeleBoba сказал: Надо в истории искать закрытый ордер по тикету. OrderCloseTime()>0 только у ордеров в истории. Quote 1 Link to post Share on other sites
ZeleBoba 662 Share Posted July 9, 2018 12 минут назад, AntFX сказал: OrderCloseTime()>0 только у ордеров в истории. Спасибо. Quote Лучше маленький профит, чем большие рога. Link to post Share on other sites
torgf 0 Share Posted July 14, 2018 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[]) { //--- if(rates_total<4) return(0); int limit=rates_total-prev_calculated; if(limit>0) { ArrayInitialize(BufferPointDn,EMPTY_VALUE); ArrayInitialize(BufferPointUp,EMPTY_VALUE); limit=rates_total-2; } ///* for(int i=limit; i>0; i--) { //код индикатора //.......... return(rates_total); } Здравствуйте. Как ограничить историю 300 бароа? Чтобы индикатор не пересчитывал их на каждом тике. Если вместо limit поставить 300, то грузит терминал. Quote Link to post Share on other sites
Ugar68 372 Share Posted July 15, 2018 Он и так не пересчитывает их на каждом тике. Он вообще ничего не считает на каждом тике. Вот так он будет считать на каждом тике только текущий бар. for(int i=limit; i>=0; i--) { //код индикатора //.......... return(rates_total); } Вот если надо что бы он на каждом тике считал 300 баров то это выглядит так if(limit<300)limit=300; for(int i=limit; i>=0; i--) { //код индикатора //.......... return(rates_total); } 1 Quote Пишу советники и индикаторы по вашим алгоритмам. Пишите в личку. Чужие программы не переделываю. Link to post Share on other sites
torgf 0 Share Posted July 18, 2018 В 15.07.2018 в 08:06, Ugar68 сказал: Вот если надо что бы он на каждом тике считал 300 баров то это выглядит так Возможно неправильно был задан вопрос. Нужно ограничить историю 300 баров и чтобы не пересчитывались на новом баре уже посчитанные. Quote Link to post Share on other sites
Ugar68 372 Share Posted July 19, 2018 Ваш код считает не на каждом тике а при появлении нового бара. И действительно он считает всю историю при появлении нового бара. Вот эта строчка заставляет считать всю историю limit=rates_total-2; Не знаю что там за индикатор что надо пересчитывать всю историю на новом баре. Обычно делают пересчёт только тех баров которые перерисовываются. После этой строчки добавляем ещё одну. if(limit>300)limit=300; Теперь индикатор будет считать только 300 баров. 1 Quote Пишу советники и индикаторы по вашим алгоритмам. Пишите в личку. Чужие программы не переделываю. Link to post Share on other sites
torgf 0 Share Posted July 20, 2018 В 19.07.2018 в 16:18, Ugar68 сказал: Не знаю что там за индикатор что надо пересчитывать всю историю на новом баре Не нужно пересчитывать всё что уже посчитано. Только новый бар, при этом ограничить историю указанным ранее количеством баров. Quote Link to post Share on other sites
Ugar68 372 Share Posted July 20, 2018 1 час назад, torgf сказал: Не нужно пересчитывать всё что уже посчитано. Только новый бар, при этом ограничить историю указанным ранее количеством баров. В 14.07.2018 в 11:20, torgf сказал: 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[]) { //--- if(rates_total<4) return(0); int limit=rates_total-prev_calculated; if(limit>300)limit=300; ///* for(int i=limit; i>0; i--) { //код индикатора //.......... return(rates_total); } 1 Quote Пишу советники и индикаторы по вашим алгоритмам. Пишите в личку. Чужие программы не переделываю. Link to post Share on other sites
torgf 0 Share Posted July 23, 2018 В 20.07.2018 в 20:16, Ugar68 сказал: Спасибо. Это можно выкинуть, для чего это делается? ArrayInitialize(BufferPointDn,EMPTY_VALUE); ArrayInitialize(BufferPointUp,EMPTY_VALUE); Quote Link to post Share on other sites
Ugar68 372 Share Posted July 23, 2018 1 час назад, torgf сказал: Спасибо. Это можно выкинуть, для чего это делается? ArrayInitialize(BufferPointDn,EMPTY_VALUE); ArrayInitialize(BufferPointUp,EMPTY_VALUE); Эти строчки заполняют буферы пустыми значениями перед тем как полностью пересчитать их. Очистка перед пересчётом. 1 Quote Пишу советники и индикаторы по вашим алгоритмам. Пишите в личку. Чужие программы не переделываю. Link to post Share on other sites
torgf 0 Share Posted July 28, 2018 (edited) В 23.07.2018 в 08:55, Ugar68 сказал: Спасибо. Как узнать номер свечи открытой в 11:15 вчера или позавчера. mql5? Edited July 28, 2018 by torgf Quote Link to post Share on other sites
Ugar68 372 Share Posted July 29, 2018 15 часов назад, torgf сказал: Спасибо. Как узнать номер свечи открытой в 11:15 вчера или позавчера. mql5? Недавно метаквоты пообещали добавить в MQL5 функцию iBarHift. И добавили, это упростило поиск бара по времени. Теперь он ничем не отличается от того же на MQL4. 1 1 Quote Пишу советники и индикаторы по вашим алгоритмам. Пишите в личку. Чужие программы не переделываю. Link to post Share on other sites
torgf 0 Share Posted July 29, 2018 (edited) 8 часов назад, Ugar68 сказал: Недавно метаквоты пообещали добавить в MQL5 функцию iBarHift. И добавили, это упростило поиск бара по времени. Теперь он ничем не отличается от того же на MQL4. Отлично, но меня это не спасает. Чтобы не писать дату текстом, как сюда, в time программно, поставить время которое написано ? datetime time=D'2018.07.27 11:15'; barIndex = iBarShift(NULL,PERIOD_M1, time,false ); Edited July 29, 2018 by torgf Quote Link to post Share on other sites
AntFX 6,474 Share Posted July 29, 2018 (edited) 11:15 это в формате datetime = 15 * 60 + 11 * 3600 (60 - число секунд в минуте, 3600 - число секунд в часе). Итого, 11:15 вчера - это iTime(Symbol(), PERIOD_D1, 1) + 15 * 60 + 11 * 3600. 11:15 позавчера - это iTime(Symbol(), PERIOD_D1, 2) + 15 * 60 + 11 * 3600. Правда, выходные и праздники не учитываются. П.С. iTime - время открытия бара (дневного в данном случае). Для символов, у которых торговый день начинается не в 00:00, не подходит... Edited July 29, 2018 by AntFX 1 Quote 1 Link to post Share on other sites
torgf 0 Share Posted July 30, 2018 3 часа назад, AntFX сказал: 11:15 это в формате datetime = 15 * 60 + 11 * 3600 (60 - число секунд в минуте, 3600 - число секунд в часе). Итого, 11:15 вчера - это iTime(Symbol(), PERIOD_D1, 1) + 15 * 60 + 11 * 3600. 11:15 позавчера - это iTime(Symbol(), PERIOD_D1, 2) + 15 * 60 + 11 * 3600. Правда, выходные и праздники не учитываются. П.С. iTime - время открытия бара (дневного в данном случае). Для символов, у которых торговый день начинается не в 00:00, не подходит... Спасибо. Хочу поставить линию на цену открытия свечи в 11:15 каждый вчерашний день в истории. Не получается. Что неправильно? if(!TrendCreate(0,"__"+time[i+1],0,iTime(NULL,PERIOD_D1,i+1),iOpen(NULL,PERIOD_CURRENT,i+iBarShift(NULL,PERIOD_CURRENT, iTime(Symbol(), PERIOD_D1,i+ 1) + 15 * 60 + 11 * 3600,false )),iTime(NULL,PERIOD_D1,i),0,clrRed,STYLE_SOLID,2,false,false,false,false,0)){continue;} Quote Link to post Share on other sites
DVargo 210 Share Posted July 30, 2018 Для начала бы неплохо научится писать код так, чтобы он был читабельным. Введите переменные даты и цены и распринтуйте их. тогда сами найдете ошибку. А в TrendCreate ставте переменные даты и цены. 4 часа назад, AntFX сказал: Для символов, у которых торговый день начинается не в 00:00, не подходит... Что мешает сравнивать текущее время со временем начала дня? А дату D'2018.07.27 11:15' собирать из вычисленного дня и '11:15' Тогда и субботу с воскресеньем исключить просто. Quote А не пойти ли бы вам Link to post Share on other sites
AntFX 6,474 Share Posted July 30, 2018 12 часов назад, DVargo сказал: Что мешает сравнивать текущее время со временем начала дня? Ничего не мешает Quote 1 Link to post Share on other sites
torgf 0 Share Posted July 30, 2018 (edited) 15 часов назад, DVargo сказал: Для начала бы неплохо научится писать код так, чтобы он был читабельным. Введите переменные даты и цены и распринтуйте их. тогда сами найдете ошибку. Не найду. На 11:15 пятницы, ставит линию правильно, четверг уже неправильно дальше в историю неправильно. Куда искать? datetime dat1,dat2,dat3; double prise; int index; //+------------------------------------------------------------------+ //| Custom indicator iteration function | //+------------------------------------------------------------------+ 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[]) { //--- //--- Проверка на минимальное колиество баров для расчёта if(rates_total<4) return 0; int limit=rates_total-prev_calculated; if(limit>1000) { limit=1000;//rates_total-20; } //--- Цикл расчёта индикатора for(int i=limit; i>=0; i--) { dat1=iTime(NULL,PERIOD_D1,i+1); dat2=iTime(NULL,PERIOD_D1,i); dat3=iTime(Symbol(), PERIOD_D1,i+ 1) + 15 * 60 + 11 * 3600; index=iBarShift(NULL,PERIOD_CURRENT, dat3,false ); prise=iOpen(NULL,PERIOD_CURRENT,i+index); if(!TrendCreate(0,"__"+time[i+1],0,dat1,prise,dat2,0,clrLime,STYLE_SOLID,2,false,false,false,false,0)) { continue; } //Comment(""); } /// //--- return value of prev_calculated for next call return(rates_total); } Edited July 30, 2018 by torgf Quote Link to post Share on other sites
AntFX 6,474 Share Posted July 30, 2018 3 минуты назад, torgf сказал: index=iBarShift(NULL,PERIOD_CURRENT, dat3,false ); prise=iOpen(NULL,PERIOD_CURRENT,i+index); index - это не смещение относительно i, это смещение относительно нулевого бара. Quote 1 Link to post Share on other sites
Pirojoque Project 3,173 Share Posted July 30, 2018 (edited) 21 час назад, torgf сказал: Чтобы не писать дату текстом, как сюда, в time программно, поставить время которое написано? Нужно создать структуру типа MqlDateTime, присвоить её полям необходимые значения и далее использовать там, где необходимо. В вашем случае нужно сконвертировать структуру в простой тип времени datetime и уже эту переменную применять в iBarShift(). Пример: MqlDateTime mqltime; // Время-структура mqltime.year = 2018; // Устанавливаем год mqltime.mon = 7; // Устанавливаем месяц mqltime.day = 30; // Устанавливаем день mqltime.hour = 11; // Устанавливаем час mqltime.min = 15; // Устанавливаем минуту datetime time = StructToTime(mqltime); // Конвертируем время-структуру в обычное время int n = iBarShift(_Symbol, _Period, time); // Получаем номер бара, захватывающего искомое время Если нужно организовать какой-либо сдвиг относительно текущего момента, то можно пойти таким путём: MqlDateTime mqltime; // Время-структура datetime basetime = TimeCurrent(); // Время, от которого будем отсчитывать сдвиг (здесь — текущее время сервера) TimeToStruct(basetime, mqltime); // Конвертируем базовое время в структуру mqltime.day--; // Модифицируем структуру (здесь — ровно день назад) datetime targettime = StructToTime(mqltime); // Конвертируем время-структуру в искомое время простого формата int n = iBarShift(_Symbol, _Period, targettime); // Получили номер искомого бара (который был ровно день назад) Думаю, идея понятна. Edited July 30, 2018 by Pirojoque Project 2 Quote Link to post Share on other sites
torgf 0 Share Posted July 30, 2018 1 час назад, AntFX сказал: index - это не смещение относительно i, это смещение относительно нулевого бара. Спасибо. Убрала i+ , линии на правильной цене. Quote Link to post Share on other sites
torgf 0 Share Posted July 30, 2018 35 минут назад, Pirojoque Project сказал: Думаю, идея понятна. Вы пишете конкретную дату и время, как взять только время для каждого ЗАКРЫТОГО бара - дня, непонятно. Quote Link to post Share on other sites
nasdaq 19 Share Posted July 31, 2018 Как остановить оптимизацию из функции OnTester() ? Quote Быть честным хочется, но меньше, чем богатым. Link to post Share on other sites
AntFX 6,474 Share Posted July 31, 2018 13 минут назад, nasdaq сказал: Как остановить оптимизацию из функции OnTester() ? Остановка оптимизации из эксперта не предусмотрена разработчиками терминала. Функция OnTester нужна для вычисления пользовательского критерия оптимизации, а не управления её ходом Quote 1 Link to post Share on other sites
Pirojoque Project 3,173 Share Posted July 31, 2018 20 часов назад, torgf сказал: Вы пишете конкретную дату и время, как взять только время для каждого ЗАКРЫТОГО бара - дня, непонятно. Не понимаю проблему. Опишите подробней. Quote Link to post Share on other sites
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.