- Мультитаймфреймовые индикаторы
- Как получить цену на 5 секунд позади TimeCurrent в M1?
- Индикатор хранения цены во времени - не работает массив
Так уже создавал подобную тему:
https://www.mql5.com/ru/forum/435636
- 2022.11.02
- www.mql5.com
А вариант совсем без кода вас не интересует?
Этот вариант, который вы мне дали, использует массив.
Я пытался использовать его на своем роботе, но он становится слишком тяжелым, что снижает производительность.
Вместо того, чтобы брать разницу через массив, я хочу попробовать что-то более простое, просто взяв цену 5 секунд назад с помощью iClose(NULL, PERIOD_M1, 0)...
В любом случае, большое спасибо за вашу помощь!
Этот вариант, который вы мне дали, использует массив.
Я пытался использовать его на своем роботе, но он становится слишком тяжелым, что снижает производительность.
Вместо того, чтобы брать разницу через массив, я хочу попробовать что-то более простое, просто взяв цену 5 секунд назад с помощью iClose(NULL, PERIOD_M1, 0)...
В любом случае, большое спасибо за вашу помощь!
Другими словами, я хотел сравнить цену 5-секундной давности с iClose(NULL, PERIOD_M1, 0)....
Абсолютно идиотский вариант. Прикола ради. Не запускал. Погрешность равна примерно разнице между временем прихода тика и временем последнего события Timer
double timerBid[6]; int OnInit() { for(int i = 0; i < 6; i++) timerBid[i] = 0.0; EventSetTimer(1); return(INIT_SUCCEEDED); } void OnTimer() { timerBid[5] = timerBid[4]; timerBid[4] = timerBid[3]; timerBid[3] = timerBid[2]; timerBid[2] = timerBid[1]; timerBid[1] = timerBid[0]; RefreshRates(); timerBid[0] = Bid; } void OnTick() { double bigFiveSecondsAgo = timerBid[5]; if(timerBid[5] != 0.0) Alert("Bid 5 секунд назад: ", DoubleToString(bigFiveSecondsAgo, _Digits)); else Alert("Bid 5 секунд назад: нет данных"); }
Этот вариант, который вы мне дали, использует массив.
Я пытался использовать его на своем роботе, но он становится слишком тяжелым, что снижает производительность.
Легенький безобидный массивчик на 48 байт.
Этот вариант, который вы мне дали, использует массив.
Я пытался использовать его на своем роботе, но он становится слишком тяжелым, что снижает производительность.
Вместо того, чтобы брать разницу через массив, я хочу попробовать что-то более простое, просто взяв цену 5 секунд назад с помощью iClose(NULL, PERIOD_M1, 0)...
В любом случае, большое спасибо за вашу помощь!
Сокращение диапазона копирования не помогает? То есть, не за все последние 5 секунд копируйте, а от 4.5 до 5.5 секунд до текущего момента. Или уже диапазон
MqlTick mqlTick[], symbTick; // объявили переменные SymbolInfoTick(_Symbol, symbTick); // это последний тик CopyTicksRange(_Symbol, mqlTick, COPY_TICKS_ALL, symbTick.time_msc-5500, symbTick.time_msc-4500); // Получили тики, которые были в промежутке между 4.5 - 5.5 секунд до текущего момента double delta = NormalizeDouble(mqlTick[ArraySize(mqlTick)-1].bid-mqlTick[0].bid, _Digits); // получили разницу крайних значений массива
Простой алгоритм.
На каждый тик делаешь простую операцию:
1. если данных нет - сохраняешь цену и сохраняешь время, когда ты ее сохранил.
2. если данные есть - проверяешь, прошло ли 5 секунд со времени сохранения. Если прошло - вот и твоя цена 5 сек назад.
3. если прошло 5 сек и более сохраняешь новую цену и новую дату.
Для получения только последней цены каждые 5 секунд - достаточно пары переменных - дата и цена.
Если нужна история 5 секундных цен - придется использовать массивы.
Реализовывать лень.
Вот единственный вменяемый вариант.
Таймеры не вариант:
- ждешь, пока торговый поток освободится, после чего еще и торгуешь
- модифицируешь несколько ордеров к ряду
- сервер хреново ответил (долго)
- ...
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования