Ваши вопросы по языку MQL4

expforex

Программиров
Алексей, перечитай сообщение внимательно.

Там ничего про OnTimer() не написано.
А то, что окончание одного временнОго интервала является началом следующего, таки я с этим тожэ согласен.:laugh:
Можно не на 59 секунде закрывать, а на нулевой.:laugh:
Я на время, здесь внимание акцентирую.

Приветствую,
эту функцию я выложил потому, что мне часто заказывают такую фишку:
я знаю как с ней работать не по наслышке а по опыту,
советник запускается по тику! если нет тиков, то даже Таймер иногда не поможет, потому что сервер вернет ошибку реквот или нет цен. Даже если делать Рефреш тиков перед отправкой.

Бывают брокеры, которые оооочень редко дают тики, и график выглядит корявой дорогой. - в таких ситуациях сервер очень часто дает неправильные цены как ошибку при запросе открыть ордер.

Есть масса программ которые работают по таймеру, причина естественна: Вы ставите эксперта на EURUSD , и тут надо обработать пару USDJPY . Но по EURUSD нет тиков - эксперт не запускается, тогда в помощь приходит Таймер.
так вот, если рынок по USDJPY стал. или у брокера проблемы - в таком случае сервер просто вернет ошибку открытия, мол реrвот, цена изменилась и так далее.

Если делать закрытие на 59 секунде - она может просто не наступить! ее нет, нет тиков, рынок стал, сервер заглючил ...............

Еще один вариант, который я рассказываю из личного опыта.
в МКЛ - нет понятия 59 секунд, есть понятие 59, 000000000001 секунды. ДАДАДА - нормализация, и так далее тут не поможет, и такая особенность языка есть не только в МКЛ, это нормально. Но оно может выстрельнуть в самый неподходящий момент.
Так вот, когда Вы будете сравнивать время в таймере по типу:



if(MathMod(Period()*60-1,TimeCurrent()-Time[0])==0) // по идее вы ловите именно 1 сек до закрытия бара.
так вот результат MathMod(Period()*60-1,TimeCurrent()-Time[0]) может быть не 0 а например 0.00000000001 = в итоге условие не выполнилось!

второй вариант Поставить таймер на Period()*60 ? типо каждый новый бар делать проверку на закрытие, есть такой прикол, что таймер выполняется, и после выполнения считается новый отчет, так вот в таком случае время может сдвинуться на пару секунд!!! - вот например на м1 и примерно 1 сутках могут дать расхождение в 10-15 минут.
Да и запускать таймер Вам надо будет на 1 секунде нового бара!!!! И не факт что этот тик придет именно на 1 секунде, он может прийти на 2-5-15 секунде, как итог таймер в топку,

Поэтому говоря "по опыту" я рекомендую все таки использовать первый тик следующего бара. в 99% - это будет цена открытия = цене закрытия предыдущего бара и условие будет выполнено.



Редко стал писать на форумах, извините, отвык. надеюсь ВЫ меня поймете правильно.
 
Последнее редактирование:

_SERG_

Активный участник
Приветствую,
эту функцию я выложил потому, что мне часто заказывают такую фишку:
я знаю как с ней работать не по наслышке а по опыту,
советник запускается по тику! если нет тиков, то даже Таймер иногда не поможет, потому что сервер вернет ошибку реквот или нет цен. Даже если делать Рефреш тиков перед отправкой.

Бывают брокеры, которые оооочень редко дают тики, и график выглядит корявой дорогой. - в таких ситуациях сервер очень часто дает неправильные цены как ошибку при запросе открыть ордер.
Есть масса программ которые работают по таймеру, причина естественна: Вы ставите эксперта на EURUSD , и тут надо обработать пару USDJPY . Но по EURUSD нет тиков - эксперт не запускается, тогда в помощь приходит Таймер.
так вот, если рынок по USDJPY стал. или у брокера проблемы - в таком случае сервер просто вернет ошибку открытия, мол реrвот, цена изменилась и так далее.

Если делать закрытие на 59 секунде - она может просто не наступить! ее нет, нет тиков, рынок стал, сервер заглючил ...............

Еще один вариант, который я рассказываю из личного опыта.
в МКЛ - нет понятия 59 секунд, есть понятие 59, 000000000001 секунды. ДАДАДА - нормализация, и так далее тут не поможет, и такая особенность языка есть не только в МКЛ, это нормально. Но оно может выстрельнуть в самый неподходящий момент.
Так вот, когда Вы будете сравнивать время в таймере по типу:



if(MathMod(Period()*60-1,TimeCurrent()-Time[0])==0) // по идее вы ловите именно 1 сек до закрытия бара.
так вот результат MathMod(Period()*60-1,TimeCurrent()-Time[0]) может быть не 0 а например 0.00000000001 = в итоге условие не выполнилось!

второй вариант Поставить таймер на Period()*60 ? типо каждый новый бар делать проверку на закрытие, есть такой прикол, что таймер выполняется, и после выполнения считается новый отчет, так вот в таком случае время может сдвинуться на пару секунд!!! - вот например на м1 и примерно 1 сутках могут дать расхождение в 10-15 минут.
Да и запускать таймер Вам надо будет на 1 секунде нового бара!!!! И не факт что этот тик придет именно на 1 секунде, он может прийти на 2-5-15 секунде, как итог таймер в топку,

Поэтому говоря "по опыту" я рекомендую все таки использовать первый тик следующего бара. в 99% - это будет цена открытия = цене закрытия предыдущего бара и условие будет выполнено.
Редко стал писать на форумах, извините, отвык. надеюсь ВЫ меня поймете правильно.

Приветствую!
Да против опыта не попрёшь, но пройдёмся по тезисам:
....советник запускается по тику! если нет тиков, то даже Таймер иногда не поможет, потому что сервер вернет ошибку реквот или нет цен. Даже если делать Рефреш тиков перед отправкой.
Я обычно сразу при запуске советника ордера не открываю, поэтому, что "скажет сервер" в этот торжественный момент, не интересно.
В OnInit() предварительно строиться информация необходимая для работы советника, если её недостаточно добираю её после окончания OnInit(), и только после этого рассмтриваю возможность работы с ордерами.
Для работы OnInit() тики не нужны.

Что касаетсяРефреш:
Рефреш = Marketinfo(SY, 9);
Рефреш = Marketinfo(SY, 10);
....
перед выполняемой операцией и не надо морочиться, какие символы обновились или не обновились., и т.д.

Бывают брокеры, которые оооочень редко дают тики, и график выглядит корявой дорогой. - в таких ситуациях сервер очень часто дает неправильные цены как ошибку при запросе открыть ордер.
Торговать советником надо не везде, как вышеприведенной ситуации, либо торговать очень быстро. Если брокер позволит.
Иными словами учитывать реальные условия эксплуатации кода, а не только чисто гипотетическую стратегию, которая при тереносе в реальные условия вдруг становиться убыточно, и по ушам чешут:"Рынок поменялся" :laugh:. (Эт так сжато.Проскальзывание, задержки при операциях с ордерами ....)

Есть масса программ которые работают по таймеру, причина естественна: Вы ставите эксперта на EURUSD , и тут надо обработать пару USDJPY . Но по EURUSD нет тиков - эксперт не запускается, тогда в помощь приходит Таймер.
так вот, если рынок по USDJPY стал. или у брокера проблемы - в таком случае сервер просто вернет ошибку открытия, мол реквот, цена изменилась и так далее.
Я давнёхо всякими мульти... балуюсь, поэтому не критично.
Про реквот и условия эксплуатации написал выше.
Сейчас буду пробовать брокера у которого в среднем в секунду приходит 3-4 котировки на инструмент в активном рынке, там и посмотрю сколько реквотов будет где то на 27 инструментах.
Само собой напрашивается, измененине алгоритма открытия позиций.Не функций, а именно алгоритма.

Если делать закрытие на 59 секунде - она может просто не наступить! ее нет, нет тиков, рынок стал, сервер заглючил ...............
Тут следует разобраться, 59 секунда не наступит:laugh:, или закрытие отработать нельзя будет? оО ИХМО, если жуть как надо закрыть, так можно и подождать, доделав дело до конца. Время ожидания аффтор кода определяет в меру своей испорченности.


Еще один вариант, который я рассказываю из личного опыта.
в МКЛ - нет понятия 59 секунд, есть понятие 59, 000000000001 секунды. ДАДАДА - нормализация, и так далее тут не поможет, и такая особенность языка есть не только в МКЛ, это нормально. Но оно может выстрельнуть в самый неподходящий момент.
Так вот, когда Вы будете сравнивать время в таймере по типу:
59,000000000001, не сосем просёк мысль, но тип для времени интовый int Seconds(), даже если милисекундные счётчики использовать.
Даблы во времени никогда не использую. Кроме тех случаем когда в дабловом массиве храню значение. Но при звлечении интю их. (int) ARR[j][k]
Про массив структур в MQL просто молчу.:facepalm:

if(MathMod(Period()*60-1,TimeCurrent()-Time[0])==0) // по идее вы ловите именно 1 сек до закрытия бара.
так вот результат MathMod(Period()*60-1,TimeCurrent()-Time[0]) может быть не 0 а например 0.00000000001 = в итоге условие не выполнилось!
Я так понимаю, что "СЕКУНДА" это некое понятие, которое может и не состояться вообще, поэтому важен результат, а способов его достижения существует много. Главное чтобы этот способ радовал аффтора. :laugh:
Грубо :
if ( <тут часть условия связанное с продолжительностью периода> && Seconds()==59){
...каляки маляки...
}
Да и смысл в комбинации времени котировки с временем открытия бара и периодом, если надо просто выполнить операцию с ордером в некое время?
(В чём подвох?)

второй вариант Поставить таймер на Period()*60 ? типо каждый новый бар делать проверку на закрытие, есть такой прикол, что таймер выполняется, и после выполнения считается новый отчет, так вот в таком случае время может сдвинуться на пару секунд!!! - вот например на м1 и примерно 1 сутках могут дать расхождение в 10-15 минут.
Да и запускать таймер Вам надо будет на 1 секунде нового бара!!!!
Тут не проверку делать надо, тут крыть надо, если есть что.
На первой секунде бара? С какого перепугу?!!
Что касается "на м1 и примерно 1 сутках могут дать расхождение в 10-15 минут", это сам проверял, или "так думаю"?

И не факт что этот тик придет именно на 1 секунде, он может прийти на 2-5-15 секунде, как итог таймер в топку,
Не придёт тик, отработает OnTimer() с условием проверки времени.

Поэтому говоря "по опыту" я рекомендую все таки использовать первый тик следующего бара. в 99% - это будет цена открытия = цене закрытия предыдущего бара и условие будет выполнено.
За рекомендацию спасибо.
Опыт это сила.
Если чем обидел, заранее прошу прощения.
 
Последнее редактирование:

AlexeyVik

Программист mql4 mql5
Алексей, перечитай сообщение внимательно.

Там ничего про OnTimer() не написано.
А то, что окончание одного временнОго интервала является началом следующего, таки я с этим тожэ согласен.:laugh:
Можно не на 59 секунде закрывать, а на нулевой.:laugh:
Я на время, здесь внимание акцентирую.
Правильно, Влад не говорил об OnTimer, это моё дополнение.
И ещё дополнение: проверять и/или сравнивать время в OnTimer используя TimeCurrent ... мягко выражаясь не правильно. Потому, что TimeCurrent возвращает последнее известное время сервера, а оно меняется только с приходом тика.
 
Последнее редактирование:

alexshell

Элитный участник
Правильно, Влад не говорил об OnTimer, это моё дополнение.
И ещё дополнение: проверять и/или сравнивать время в OnTimer используя TimeCurrent ... мягко выражаясь не правильно. Потому, что TimeCurrent возвращает последнее известное время сервера, а оно меняется только с приходом тика.

Поправочка : это последнее время по любому из выбранных в обзоре рынка символов. Так что применять OnTimer для TimeCurrent вполне уместно . даже если нет тика на нужном символе.
 

mobidik

-----
Поправочка : это последнее время по любому из выбранных в обзоре рынка символов. Так что применять OnTimer для TimeCurrent вполне уместно . даже если нет тика на нужном символе.

И еще дополню, что бы чаще обновлялось время брокера - в "Обзор рынка" показать все инструменты.
 

_SERG_

Активный участник
Правильно, Влад не говорил об OnTimer, это моё дополнение.
И ещё дополнение: проверять и/или сравнивать время в OnTimer используя TimeCurrent ... мягко выражаясь не правильно. Потому, что TimeCurrent возвращает последнее известное время сервера, а оно меняется только с приходом тика.

TimeCurrent() - обычно в применении к одному инструменту, но заменив его на тот же MarketInfo(SY, 5), легко получить больше удовольствия независимо от прихода тика.:laugh:
 

Игoрь

Новичок форума
Дорогие, программисты! Есть ли такой индикатор (или кто напишет): один буфер -Х-непрерывных тиков вверх - прибавляем 1, ещё Х именно непрерывных тиков вверх ещё +1 и тд. Второй буфер Х непрерывных тиков Вниз минус 1, ещё Х непрерывных тиков,ещё -1 и тд. Х - можно менять в параметрах.
 

seronn

Новичок форума
Такой вопрос ещё возник, кто знает, помогите пожалуйста!) Как заставить советник подхватывать свои ордера после деинициализации? Допустим, закомментил пару строк в работающем сове, компилируем - получаем на графике новый ордер(если выполняются условия открытия в момент установки на график), старый он уже не видит(( То же самое при удалении советника с графика и обратной его установке.
Настройки советника(магик) не меняется.
 
Последнее редактирование:

Cemen4yk1

Местный житель
Такой вопрос ещё возник, кто знает, помогите пожалуйста!) Как заставить советник подхватывать свои ордера после деинициализации? Допустим, закомментил пару строк в работающем сове, компилируем - получаем на графике новый ордер(если выполняются условия открытия в момент установки на график), старый он уже не видит(( То же самое при удалении советника с графика и обратной его установке.
Настройки советника(магик) не меняется.

считать ордера не пробовали, говорят помогает, если система торгует серией ордеров то проверяйте расстояние от предыдущего или время открытия предыдущего ордера
 

seronn

Новичок форума
Пересчет нужно вставить в OnTick? Прошу проверить, так ли в общем виде должен выглядеть тогда OnTick:

for(int i=OrdersTotal()-1; i>=0; i--)

{
if(OrderSelect(i, SELECT_BY_POS) && OrderSymbol()==Symbol() && OrderMagicNumber() == Magic)
{
Условия открытия и закрытия новых и существующих позиций
}
return(0);
}
 
Последнее редактирование:

_SERG_

Активный участник
Такой вопрос ещё возник, кто знает, помогите пожалуйста!) Как заставить советник подхватывать свои ордера после деинициализации? Допустим, закомментил пару строк в работающем сове, компилируем - получаем на графике новый ордер(если выполняются условия открытия в момент установки на график), старый он уже не видит(( То же самое при удалении советника с графика и обратной его установке.
Настройки советника(магик) не меняется.

Сова видит то, что ты покажешь.
Не сказал, "смотреть свои старые ордера", вот и не смотрит.
Как сделать?
Да как тебе удобно.
Анализируй причины перезапуска советника, и ищи по характерным признакам ордера. ( Заметь, это для тебя задача. ):laugh:
Веди в сове список открываемых, открытых, закрыьых ордеров.
Сохраняй состояние в файл, потом перечитывай.

По скрипи мозгом :facepalm:, понаблюдай оО, код-то твой.

Пересчет нужно вставить в OnTick? Прошу проверить, так ли в общем виде должен выглядеть тогда OnTick:

for(int i=OrdersTotal()-1; i>=0; i--)

{
if(OrderSelect(i, SELECT_BY_POS) && OrderSymbol()==Symbol() && OrderMagicNumber() == Magic)
{
Условия открытия и закрытия новых и существующих позиций
}
return(0);

}

Проверку надо делать до начала работы основного кода,
а сохранение данных после.
А в процессе работы сопровождать эти данные - добавлять, удалять, модифицировать.
В общем всё как обычно.:laugh::laugh::laugh:
Перебор ордеров он и в Африке перебор.
Перебирать можно до посинения, вопрос чЁ с результатами перебора делать?
Эт про операции сравнения, чего с чем, и откуда его взять.
Продумай алгоритм этого процесса, и напиши.
 
Последнее редактирование:

МП 19

Прохожий
Здравствуйте . У меня есть индикатор, который в определённые моменты рисует горизонтальные линии . А мне нужно ,чтобы это были лучи . Подскажите , как обозначаются и те и другие на языке mql4 .
 

Rennela

Новичок форума
Парни объясните-пытаюсь понять и никак не врубаюсь-почему нормализованная цена на пятизнаке в алерте выдает четыре знака после запятой?
PHP:
double A,B;
double SellLine=0;
double BuyLine=0;
int Delta=100;
void OnStart()
  {
  RefreshRates();
  B=NormalizeDouble(Bid,Digits);
  A=NormalizeDouble(Ask,Digits); 
  SellLine=NormalizeDouble(B-Delta*Point,Digits);
  BuyLine=NormalizeDouble(A+Delta*Point,Digits); 
  Alert(" SL",SellLine," BL",BuyLine," A=",A," B=",B);
  }
 

_SERG_

Активный участник
Парни объясните-пытаюсь понять и никак не врубаюсь-почему нормализованная цена на пятизнаке в алерте выдает четыре знака после запятой?
PHP:
double A,B;double SellLine=0;double BuyLine=0;int Delta=100;void OnStart()  {  RefreshRates();  B=NormalizeDouble(Bid,Digits);  A=NormalizeDouble(Ask,Digits);   SellLine=NormalizeDouble(B-Delta*Point,Digits);  BuyLine=NormalizeDouble(A+Delta*Point,Digits);   Alert(" SL",SellLine," BL",BuyLine," A=",A," B=",B);  }
Сравнить - это одно, показать - это другое.
Подумать.
Alert(" SL",DoubleToStr(SellLine, _Digits)," BL",DoubleToStr(BuyLine,_Digits)," A=",...A," B=",...B);
 
Последнее редактирование:

DomovenokBrest

♔♕♖♗♘♙
Приветствую всех.
Подскажите, есть ли возможность прописать в индикаторе минимум/максимум окна с точность 5 знаков после запятой?
В коде прописываю:

//--- максимальные и минимальные значения в подоконе
IndicatorSetInteger(INDICATOR_DIGITS,5);
IndicatorSetDouble(INDICATOR_MINIMUM,-0.00009);
IndicatorSetDouble(INDICATOR_MAXIMUM, 0.00009);

Все равно возвращает значение 0.0001 и -0.0001

Спасибо.
 

Ugar

Гуру форума
Приветствую всех.
Подскажите, есть ли возможность прописать в индикаторе минимум/максимум окна с точность 5 знаков после запятой?
В коде прописываю:

//--- максимальные и минимальные значения в подоконе
IndicatorSetInteger(INDICATOR_DIGITS,5);
IndicatorSetDouble(INDICATOR_MINIMUM,-0.00009);
IndicatorSetDouble(INDICATOR_MAXIMUM, 0.00009);

Все равно возвращает значение 0.0001 и -0.0001

Спасибо.
Что именно возвращает? Чем смотришь?
 

Picasso

Местный знаток
Приветствую всех.
Подскажите, есть ли возможность прописать в индикаторе минимум/максимум окна с точность 5 знаков после запятой?
В коде прописываю:

//--- максимальные и минимальные значения в подоконе
IndicatorSetInteger(INDICATOR_DIGITS,5);
IndicatorSetDouble(INDICATOR_MINIMUM,-0.00009);
IndicatorSetDouble(INDICATOR_MAXIMUM, 0.00009);

Все равно возвращает значение 0.0001 и -0.0001

Спасибо.

Боролся с этим только увеличивая показания индюка. Множил буферы на одинаковый коэффициент.
 

sergey1234567890

Интересующийся
здравствуйте уважаемые програмисты. скажите пожалуста --мне на почту постоянно приходит отчот о моих зделках от ДЦ. Можно ли както от них скрыть свои сделки ??? Спасибо. Наверное наивный вопрос .
 
Верх