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

 
Mikhail Mishanin:

Улыбнуло) не должно)

Если битва за - торгануть с нормальным спредом, просто вынести его "предел" в input и просто игнорить торговлю если спред выше предела.

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

У меня спред плавает довольно таки немало, от 10 единиц до 45

нужно ждать чтобы скринить  45

При этом функция считает средним 17, что вполне устраивает. 

1 час после ролловера он подымается до 100-140, погоняю код и погляжу, как себя поведёт дальше.

 
Vitaly Muzichenko:

Впрочем, можно прописать так:

Вроде правильно должно работать.

Что-то не нравится мне такая логика.

Первый вход в функцию:

res = 0;

Следовательно условие

if(dt.hour==22 && res<_sp)

не выполнено.

А дальше вникать что-то нет желания. Для чего вдруг такое условие?

   if(tc>LONG_MAX-1)
в общем вся логика мне не понятна.
 
Alexey Viktorov:

Что-то не нравится мне такая логика.

Первый вход в функцию:

res = 0;

Следовательно условие

if(dt.hour==22 && res<_sp)

не выполнено.

А дальше вникать что-то нет желания. Для чего вдруг такое условие?

   if(tc>LONG_MAX-1)
в общем вся логика мне не понятна.

1. Это условие только на время 1 час после ролловера, когда время 22 часа. Но это только при первом запуске, а терминал то работает с советником всегда, значит пустая она единожды.

Возможно её нужно объявить так-же static, на случай смены таймфрейма

2. if(tc>LONG_MAX-1) = обнуляем переменную tc, если вышли за допустимые пределы long. Это вряд-ли произойдёт, так-как терминал иногда перегружается, на тех-же выходных, к примеру.

---

Изменил код, это наверное окончательно:

void OnTick()
{
 int sp = SymbolInfoInteger(Symbol(),SYMBOL_SPREAD);
   if(CheckSpr(sp)) {
      // Здесь код отправки
   }
}

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
MqlDateTime dt;
bool CheckSpr(int _sp)
{
   static int ts=0;
   static ulong tc=0;
   static int res=0;
   TimeGMT(dt);
   if(res<_sp && (dt.hour==22||dt.hour==23)) { // Если 2 часа после Rollover спред упадёт до нормального - торгуем
      Comment("Rollover: Спред: ",_sp,", Средний: ",res,", Тиков: ",tc);
      return(false);
   }
   tc++;
   ts += _sp;
   res =ts/tc;
   if(tc<500) {
      Comment("Тиков менее 500: ",tc,", Спред: ",_sp,", Средний: ",res);
      return(false);
   }
   if(res>_sp) {
      Comment("Торгуем: Спред: ",_sp,", Средний: ",res,", Тиков: ",tc);
      return(true);
   }
   Comment("Не торгуем - спред завышен: Спред: ",_sp,", Средний: ",res,", Тиков: ",tc);
   return(false);
}

P.S. Поставил на тест

P.S.S. Подправил код

----

P.S.S.S. Добавил ещё 1 час времени после ролловера, иначе писал очень высокий спред на некоторых дилингах.

Итоговый вариант отработал 20 часов и результат просто прекрасный 

Средний дневной спред 10-45 пп, но в основном 10-17, средний посчитан как 19

Всем спасибо за участие, если есть что добавить - пишите!

 
Vitaly Muzichenko:

Возможно её нужно объявить так-же static, на случай смены таймфрейма

Проникся, вроде должно работать, "не должно" беру обратно), теперь действительно нужно просто разобраться с моментами обнуления/присвоения.

 

Встречал на форуме обсуждение, но не могу найти.

Нужно ограничиться одной позицией на баре, которая может быть открыта в любую минуту, сейчас такой вариант, но он на мой взгляд "тяжёлый"

if(Bars(Symbol(), PERIOD_CURRENT, Buy.LastOpenTime, TimeCurrent())==0) return; // Открывать не более 1 на баре

Чем это можно заменить, чтобы облегчить?

 
Vitaly Muzichenko:

Встречал на форуме обсуждение, но не могу найти.

Нужно ограничиться одной позицией на баре, которая может быть открыта в любую минуту, сейчас такой вариант, но он на мой взгляд "тяжёлый"

Чем это можно заменить, чтобы облегчить?

"Нужно ограничиться одной позицией на баре, которая может быть открыта в любую минуту..."

слишком общая формулировка, имеется ввиду что один раз в бар в данном символе можно отправить OrderSend?

 
Mikhail Mishanin:

"Нужно ограничиться одной позицией на баре, которая может быть открыта в любую минуту..."

слишком общая формулировка, имеется ввиду что один раз в бар в данном символе можно отправить OrderSend?

Да. Советник работает на тайме Н1 и может открыть позицию в 10:17, нужно чтобы до 11:00, то есть на текущем баре - он больше не открывал.

 
Vitaly Muzichenko:

Да. Советник работает на тайме Н1 и может открыть позицию в 10:17, нужно чтобы до 11:00, то есть на текущем баре - он больше не открывал.

ёпрст, опять не полные условия на мой взгляд, "дьявол в мелочах", по простому если текстом

открыл позицию - поставил "флаг запрета" и/или сохранил "время"(без разницы какое лишь бы одно и тоже(источник) для сравнения)

открылся новый бар - снял "флаг запрета" ...

Вопрос: а если позиция была как-то изменена?

Пример как определяю новый бар - doTB делитель в секундах, для H1 - 3600.0

BARii[].time - время баров с M1, а может быть произвольное и с любым разрывом, если больше или равно 1 значит "время" из разных "баров"

if(MathFloor(BARii[0].time/doTB)-MathFloor(BARii[1].time/doTB)>=1.0)//если бар закрылся
Совершение сделок - Торговые операции - Справка по MetaTrader 5
Совершение сделок - Торговые операции - Справка по MetaTrader 5
  • www.metatrader5.com
Торговая деятельность в платформе связана с формированием и отсылкой рыночных и отложенных ордеров для исполнения брокером, а также с управлением...
 
Mikhail Mishanin:

ёпрст, опять не полные условия на мой взгляд, "дьявол в мелочах", по простому если текстом

открыл позицию - поставил "флаг запрета" и/или сохранил "время"(без разницы какое лишь бы одно и тоже(источник) для сравнения)

открылся новый бар - снял "флаг запрета" ...

Вопрос: а если позиция была как-то изменена?

Пример как определяю новый бар - doTB делитель в секундах, для H1 - 3600.0

BARii[].time - время баров с M1, а может быть произвольное и с любым разрывом, если больше или равно 1 значит "время" из разных "баров"

Чем-то меня вариант на флагах тогда не устроил, уже не помню чем, но заменил на 

if(Bars(Symbol(), PERIOD_CURRENT, Buy.LastOpenTime, TimeCurrent())==0) return; // Открывать не более 1 на баре

Ладно, ещё подумаю над другой реализацией

 
Vitaly Muzichenko:

Чем-то меня вариант на флагах тогда не устроил, уже не помню чем, но заменил на 

Ладно, ещё подумаю над другой реализацией

А чем эта реализация тормозит? Аналогично моему коду определяет два времени в одном "баре" или в разных. Просто в моем варианте "истина" когда в разных "барах", в Вашем варианте "истина" когда в одном баре, просто обхожу сравнение == с "0" особенно целым, во, и мне наверное можно условие заменить на >0.0 или >0.9, нужно подумать...

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