Любые вопросы новичков по MQL4 и MQL5, помощь и обсуждение по алгоритмам и кодам - страница 1384

 
Mikhail Mishanin:

Если заменить "значение времени" на разницу между пришедшим(новым) временем и последним рассчитанным? подойдет?

Т.е. будем знать что пришло новое время:

-из нового дня

-из новой недели

-или с разницей больше указанной

Не представляю, как это применить!


На скрине ролловер и расширение спреда в 22-00, в большинстве других дилингов в 00-00, именно 1 час после - расширение спреда.

Как выяснить программно когда ролловер, не ограничивая программу временем во входных параметрах?

---

P.S. Данный код хорошо себя ведет, но при условии, что он запущен за 500 тиков до ролловера

bool CheckSpr(int _sp)
{
   static int ts=0, res=0;
   static long tc=0;
  // Comment( res,"=",tc );
   if(tc>500 && res*3<_sp) return(false); // если уже собрали 500 тиков и есть средний спред - смотрим на расширенный spr*3
   tc++;
   ts += _sp;
   res =ts/tc;
   if(tc>LONG_MAX-1) {
      tc=0;
      ts=0;
   }
   // Comment( res,"=",tc );
   if(tc<500) return(false);
   return(res>_sp?true:false);
}
 
Vitaly Muzichenko:

Не представляю, как это применить!


На скрине ролловер и расширение спреда в 22-00, в большинстве других дилингов в 00-00, именно 1 час после - расширение спреда.

Как выяснить программно когда ролловер, не ограничивая программу временем во входных параметрах?

---

P.S. Данный код хорошо себя ведет, но при условии, что он запущен за 500 тиков до ролловера

Причина расширения спреда дилингами - открытие торговой сессии, т.е. "вываливание" на обработку большого числа ордеров, а соответственно неопределенность чем(на какой цене) всё "устаканится". Дилинг страхуется и расширяет спред. Просто нужно отступить время от конца/начала торговой сессии.

 
Mikhail Mishanin:

Причина расширения спреда дилингами - открытие торговой сессии, т.е. "вываливание" на обработку большого числа ордеров, а соответственно неопределенность чем(на какой цене) всё "устаканится". Дилинг страхуется и расширяет спред. Просто нужно отступить время от конца/начала торговой сессии.

Да, но его нет в спецификации инструментов

Это там, где ролловер в 22-00

А это ролловер в 00-00


 
Vitaly Muzichenko:

Да, но его нет в спецификации инструментов

TimeCurrent()-TimeGMT()
 

Надеюсь, итоговый вариант будет учитывать всё

MqlDateTime dt;
bool CheckSpr(int _sp)
{
  TimeGMT(dt);
  static int ts=0, res=0;
  static long tc=0;
   if(dt.hour==22) return(false);
   tc++;
   ts += _sp;
   res =ts/tc;
   if(tc>LONG_MAX-1) {
      tc=0;
      ts=0;
   }
   // Comment( res,"=",tc );
   if(tc<500) return(false);
   return(res>_sp?true:false);
}
 
Vitaly Muzichenko:

Надеюсь, итоговый вариант будет учитывать всё

 две переменных 

datetime daLAST=0;

datetime daOLD=0;


В каждой функции которая может "торговать", т.е. может получить время тика

daOLD =  daLAST;

daLAST= "время тика"

если (  daLAST - daOLD > "зазор времени") - началась новая сессия, был какой-то разрыв времени

{

//сохраните, используйте и отмените это как Вам удобнее

}

 
Mikhail Mishanin:

 две переменных 

datetime daLAST=0;

datetime daOLD=0;


В каждой функции которая может "торговать", т.е. может получить время тика

daOLD =  daLAST;

daLAST= "время тика"

если (  daLAST - daOLD > "зазор времени") - началась новая сессия, был какой-то разрыв времени

{

//сохраните, используйте и отмените это как Вам удобнее

}

Есть некоторые пары и дилинги, на которых в азиатскую сессию может не быть тика до нескольких минут, при этом время ролловера с 21-59 до 22-01, то есть быстрее, чем приход тика на Азии.

 
Vitaly Muzichenko:

Есть некоторые пары и дилинги, на которых в азиатскую сессию может не быть тика до нескольких минут, при этом время ролловера с 21-59 до 22-01, то есть быстрее, чем приход тика на Азии.

вернемся тогда на исходную.

в чем задача? пропустить торговые операции с расширенным непомерно спредом - так?

тогда наверное время вообще можно проигнорировать, анализируем сам спред.

если Ask - Bid > "порог" - включаем отслеживание/накопление какое то.

если Ask - Bid < "порог" - выключаем или тоже накапливаем.

Такая "корова" похоже и мне пригодится, что-то такое соберу, будет собирать статистику...


И если нет тика свежего несколько минут, то первый(несколько) разумнее будет пропустить в торговле.

Статистику нужно собирать по конкретным парам и дилингам, т.к. любая "кривизна" может сработать как в "-" так и в "+"

 
Mikhail Mishanin:

вернемся тогда на исходную.

в чем задача? пропустить торговые операции с расширенным непомерно спредом - так?

тогда наверное время вообще можно проигнорировать, анализируем сам спред.

если Ask - Bid > "порог" - включаем отслеживание/накопление какое то.

если Ask - Bid < "порог" - выключаем или тоже накапливаем.

Такая "корова" похоже и мне пригодится, что-то такое соберу, будет собирать статистику...


И если нет тика свежего несколько минут, то первый(несколько) разумнее будет пропустить в торговле.

Статистику нужно собирать по конкретным парам и дилингам, т.к. любая "кривизна" может сработать как в "-" так и в "+"

Всё что описали, делает код выложенный ранее, за исключением выделенного жёлтым - считаю лишним и не совсем корректным. Как-то ни разу не встречал, чтобы ролловер был у кого-то в другое время, всегда у всех в одно и тоже - в 22-00 по GMT, хотя могу и ошибаться.

Но часто встречал разную длительность ролловера, у одних 5 минут, а у других чуть больше минуты.

---

Проверочный код, может что измените:

//+------------------------------------------------------------------+
void OnTick(void)
{
   int sp = SymbolInfoInteger(Symbol(),SYMBOL_SPREAD);
   static int ts=0;

   if(CheckSpr(sp)) {
      // Здесь код отправки
      Comment( sp,"=",ts++,"=",res );
   } else Comment( "false: ",sp,"=",ts++,"=",res );
}

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
MqlDateTime dt;
int res=0;
bool CheckSpr(int _sp)
{
  TimeGMT(dt);
  static int ts=0;
  static long tc=0;
   if(dt.hour==22) return(false);
   tc++;
   ts += _sp;
   res =ts/tc;
   if(tc>LONG_MAX-1) {
      tc=0;
      ts=0;
   }
   // Comment( res,"=",tc );
   if(tc<500) return(false);
   return(res>_sp?true:false);
}
 
Vitaly Muzichenko:

у всех в одно и тоже - в 22-00 по GMT, хотя могу и ошибаться.

Не ошибаешься.

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