Как получить цену от 5 секунд назад?

 
Я работаю над роботом-скальпером, и я был бы очень признателен, если бы кто-нибудь мог дать мне совет, как получить цену от 5 секунд назад, независимо от свечи и желательно без использования массива (если это возможно)!

Заранее спасибо всем за помощь!

Обнимаю!
 
А вариант совсем без кода вас не интересует?
 

Так уже создавал подобную тему:
https://www.mql5.com/ru/forum/435636

Как получить цену на 5 секунд позади TimeCurrent в M1?
Как получить цену на 5 секунд позади TimeCurrent в M1?
  • 2022.11.02
  • www.mql5.com
Я новичок в программировании советников и работаю над проектом, который анализирует разницу цен между двумя моментами времени в секундах...
 
Alexey Viktorov #:
А вариант совсем без кода вас не интересует?

Этот вариант, который вы мне дали, использует массив.

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

Вместо того, чтобы брать разницу через массив, я хочу попробовать что-то более простое, просто взяв цену 5 секунд назад с помощью iClose(NULL, PERIOD_M1, 0)...

В любом случае, большое спасибо за вашу помощь!

 
Marcelo Peres #:

Этот вариант, который вы мне дали, использует массив.

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

Вместо того, чтобы брать разницу через массив, я хочу попробовать что-то более простое, просто взяв цену 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 секунд назад: нет данных");
  }
Marcelo Peres #:

Этот вариант, который вы мне дали, использует массив.

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

Легенький безобидный массивчик на 48 байт.

 
Пять секунд назад это "прошлое". Без сохранения, где-то в памяти, не обойтись.
 
Marcelo Peres #:

Этот вариант, который вы мне дали, использует массив.

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

Вместо того, чтобы брать разницу через массив, я хочу попробовать что-то более простое, просто взяв цену 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); // получили разницу крайних значений массива
 
Вместо OnTick устанавливаете OnTimer со временем 5 секунд

В переменную записываете цену Bid. 

При следующем проходе OnTimer у Вас в переменной значение цены, полученное 5 секунд назад. 
 

Простой алгоритм.

На каждый тик делаешь простую операцию:

1. если данных нет - сохраняешь цену и сохраняешь время, когда ты ее сохранил.

2. если данные есть - проверяешь, прошло ли 5 секунд со времени сохранения. Если прошло - вот и твоя цена 5 сек назад.

3. если прошло 5 сек и более сохраняешь новую цену и новую дату.


Для получения только последней цены каждые 5 секунд - достаточно пары переменных - дата и цена.

Если нужна история 5 секундных цен - придется использовать массивы.

Реализовывать лень.

 

Вот единственный вменяемый вариант.

Таймеры не вариант:

  • ждешь, пока торговый поток освободится, после чего еще и торгуешь
  • модифицируешь несколько ордеров к ряду
  • сервер хреново ответил (долго)
  • ...
Если Когда подобная фигня случится и продлится дольше, чем период таймера в секундах - событие Timer будет пропущено. В моем примере это 1 секунда - вообще легко. Все, финиш, хранимым данным уже не 5 секунд от роду точно.
Причина обращения: