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

 
Vladislav Boyko #:

Абсолютно идиотский вариант. Прикола ради. Не запускал. Погрешность равна примерно разнице между временем прихода тика и временем последнего события Timer

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

Можно ли использовать это с OnTick??

 
Marcelo Peres #:

Можно ли использовать это с OnTick??

Таймер нужен только для обновления массива timerBid[].

Цену_5_секунд_назад предполагается использовать из OnTick(). Она лежит в timerBid[5], что я явно обозначил, объявив переменную bigFiveSecondsAgo.


Ну и само-собой, в тестере MT4 это работать не будет. Да и работа в тестере лишена смысла, так как время тика в тестере рандомное в виду отсутствия тиковой истории.


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;
  }

Здесь по нормальному должен быть цикл, но я поленился его писать. Да и нет смысла по тому, что в этом случае нужно явно обозначить размер массива... Тогда уже задаем количество секунд в настройках, а от этого количества секунд ресайзим массив в OnInit(). Короче, писать "по-правильному" имеет смысл только если нужно задавать количество секунд в настройках.

 
Ivan Butko #:
Вместо OnTick устанавливаете OnTimer со временем 5 секунд

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

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

Получается проверка раз у 5 секунд. Ему нужно 5 секунд назад, а не раз в 5 секунд :)

То есть вся остальная движуха теряется. Только через CopyTicksRange. Только диапазон "от и до" уменьшить

 
Yevhenii Levchenko #:

Получается проверка раз у 5 секунд. Ему нужно 5 секунд назад, а не раз в 5 секунд :)

То есть вся остальная движуха теряется. Только через CopyTicksRange. Только диапазон "от и до" уменьшить

Не только. У кольцевого буфера меньше накладных расходов.

 
Marcelo Peres #:

Можно ли использовать это с OnTick??

Пробуйте. Но я еще раз подчеркну: это шляпа. Нормальное решение примерно такое.

(MT4 эксперт)

#property strict

const double PRICE_UNDEF = 0.0;

input int inpDepth = 10; // Максимальное количество секунд

double historyBid[];
int    historyBid_Size;

int OnInit()
  {
   EventSetTimer(1);
   if(!historyBid_Init())
      return(INIT_FAILED);
   return(INIT_SUCCEEDED);
  }

void OnDeinit(const int reason)
  {
   EventKillTimer();
   Comment("");
  }

void OnTick()
  {
   string commentTotal = "";
   for(int i = 1; i <= 7; i++)
     {
      double bid = historyBid_Get(i);
      commentTotal += StringFormat("Bid %i секунд назад = %s\n", i, bid != PRICE_UNDEF ? DoubleToString(bid, _Digits) : "нет данных");
     }
   Comment(commentTotal);
  }

void OnTimer()
  {
   historyBid_Update();
  }

double historyBid_Get(int secondsAgo)
  {
   return(secondsAgo < historyBid_Size ? historyBid[secondsAgo] : PRICE_UNDEF);
  }

void historyBid_Update()
  {
   for(int i = historyBid_Size - 1; i > 0; i--)
      historyBid[i] = historyBid[i - 1];
   RefreshRates();
   historyBid[0] = Bid;
  }

bool historyBid_Init()
  {
   historyBid_Size = inpDepth + 1;
   if(!arrayResize(historyBid, historyBid_Size, __LINE__))
      return(false);
   for(int i = 0; i < historyBid_Size; i++)
      historyBid[i] = PRICE_UNDEF;
   return(true);
  }

bool arrayResize(double &array[], int newSize, int line)
  {
   ResetLastError();
   int returned = ArrayResize(array, newSize, 0);
   int error    = GetLastError();
   if(returned == newSize && error == ERR_NO_ERROR)
      return(true);
   Alert(StringFormat("ArrayResize error. New size %i, error %i, result %i, line %i.", newSize, error, returned, line));
   return(false);
  }
Как получить цену от 5 секунд назад? - Используйте массивчик на 48 байт. На каждый тик делаешь простую операцию, которая позволяет получить цену от 5 секунд назад с помощью iClose.
Как получить цену от 5 секунд назад? - Используйте массивчик на 48 байт. На каждый тик делаешь простую операцию, которая позволяет получить цену от 5 секунд назад с помощью iClose.
  • 2022.11.09
  • www.mql5.com
Если прошло 5 сек и более сохраняешь новую цену и новую дату. Для получения только последней цены каждые 5 секунд - достаточно пары переменных - дата и цена. Если нужна история 5 секундных цен - придется использовать массивы
 
Vladislav Boyko #:

Пробуйте. Но я еще раз подчеркну: это шляпа. Нормальное решение примерно такое.

(MT4 эксперт)

Запихайте, к стати, кто-нибудь в класс, пожалуйста.

Оставьте только 3 публичных метода: .init(), .update() и .get(int secondsAgo)

Ну это типа интерфейс)

Я просто не умею в ООП. Пример будет для меня полезным.

 
JRandomTrader #:

Не только. У кольцевого буфера меньше накладных расходов.

Он скальпингом занимается. Вероятнее всего ему нужно каждый текущий момент смотреть на цену, которая была 5 секунд назад

 
Vladislav Boyko #:

Запихайте, к стати, кто-нибудь в класс, пожалуйста.

Оставьте только 3 публичных метода: .init(), .update() и .get(int secondsAgo)

Ну это типа интерфейс)

Я просто не умею в ООП. Пример будет для меня полезным.

Вот пример :)
https://www.mql5.com/ru/articles/351

Основы объектно-ориентированного программирования
Основы объектно-ориентированного программирования
  • www.mql5.com
Для использования объектно-ориентированного программирования (ООП) вовсе не обязательно знать что такое полиморфизм, инкапсуляция... можно просто пользоваться его возможностями. В статье рассматриваются основные возможности ООП с примерами их использования.
 
Yevhenii Levchenko #:

Он скальпингом занимается. Вероятнее всего ему нужно каждый текущий момент смотреть на цену, которая была 5 секунд назад

Я про то же. Кольцевой буфер тоже позволяет такое, но дешевле.

https://www.mql5.com/ru/forum/6343/42842636#comment_42842636

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

Не понятно...

Нужна цена 5 секунд назад от каждой свечи?

Или 5 секунд назад от текущего времени?

Или нужно найти цену которая замирает/зависает на 5 секунд?


PS Чем пытаться уйти от массивов, лучше сосредоточиться над увеличением скорости работая с массивами.

Причина обращения: