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

_SERG_

Активный участник
Здарова ребята. Помогите закодить элементарную функцию для совы с такими условиями:
если минимумы последних N свечей равны или отличаются на 3 пункта -- то true, если условие не соблюдается то false.


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

mobidik

-----
:) На соседнем форуме:
Один тоже пришёл к известному профессору
и заявил, что хочет изучить типа MQL и программировать рынок.
- Ты знаешь английский? - спросил профессор.
- Нет.
- А русский?
- Нет.
- А букварь в детстве учил?
- Нет, Учитель.) Но вы не волнуйтесь. Я закончил философский факультет
Беркли и только что защитил диссертацию по логике в философии Сократа.
А теперь, чтобы восполнить белые пятна в моих познаниях, я хочу
немного поучить MQL.
- Ты не готов учить MQL, - сказал профессор. - Это глубочайшая книга из
всех, написанных людьми.)) Но раз ты настаиваешь, я устрою тебе тест на
логику: справишься - буду с тобой заниматься.
Молодой человек согласился, и профессор продолжил.
- Два человека спускаются по дымоходу. Один вылезает с чистым лицом,
другой - с грязным. Кто из них пойдёт умываться?
У молодого философа глаза на лоб полезли.
- Это тест на логику?!
Профессор кивнул.
- Ну, конечно, тот, у кого грязное лицо!
- Неправильно. Подумай логически: тот, у кого грязное лицо, посмотрит на
того, у кого лицо чистое, и решит, что его лицо тоже чистое. А тот, у
кого лицо чистое, посмотрит на того, у кого лицо грязное, решит, что сам
тоже испачкался, и пойдёт умываться.
- Хитро придумано! - восхитился гость. - А ну-ка, дайте мне ещё
один тест!
- Хорошо, юноша. Два человека спускаются по дымоходу. Один вылезает с
чистым лицом, другой - с грязным. Кто из них пойдёт умываться?
- Но мы уже выяснили - тот, у кого лицо чистое!
- Неправильно. Оба пойдут умываться. Подумай логически: тот, у кого
чистое лицо, посмотрит на того, у кого лицо грязное, и решит, что его
лицо тоже грязное. А тот, у кого лицо грязное, увидит, что второй пошёл
умываться, поймёт, что у него грязное лицо, и тоже пойдёт умываться.
- Я об этом не подумал! Поразительно - я допустил логическую ошибку!
, давайте ещё один тест!
- Ладно. Два человека спускаются по дымоходу. Один вылезает с чистым
лицом, другой - с грязным. Кто из них пойдёт умываться?
- Ну: Оба пойдут умываться.
- Неправильно. Умываться не пойдёт ни один из них. Подумай логически:
тот, у кого лицо грязное, посмотрит на того, у кого лицо чистое, и не
пойдёт умываться. А тот, у кого лицо чистое, увидит, что тот, у кого
лицо грязное, не идёт умываться, поймёт, что его лицо чистое, и тоже не
пойдёт умываться.
Молодой человек пришёл в отчаяние.
- Ну поверьте, я смогу программировать! Спросите что-нибудь другое!
- Ладно. Два человека спускаются по дымоходу:
- О Господи! Ни один из них не пойдёт умываться!!!
- Неправильно. Теперь ты убедился, что знания логики Сократа
недостаточно, чтобы учить Рынок? Скажи мне, как может быть такое, чтобы
два человека спускались по одной и той же трубе, и один из них испачкал
лицо, а другой - нет?! Неужели ты не понимаешь? Весь этот вопрос -
бессмыслица, и если ты потратишь жизнь, отвечая на бессмысленные
вопросы, куда пойдет цена то все твои ответы тоже будут лишены смысла
 

egorr007

Новичок форума
Всем доброго дня!

Помогите пожалуйста сделать МА линию, что бы она отображалась через один бар.

PHP:
    for(i=limit; i>=0; i--)
   {
      Line_МА[i]=iMA(NULL, 0,Period_MA,0,MODE_EMA,PRICE_OPEN,i);// Red
       
   }

Как такое сделать ? Что бы, на одном баре она отображалась на другом нет. (через один)

п.с.

Просто визуально сразу не видно, где заканчивается и начинается МА, когда на нескольких барах она однонаправлена.
 

egorr007

Новичок форума
Допустим , что бы МА отображалась только на чётных барах от нулевого,
а на не чётных, не отображалась.

такое можно сделать?
 

HUDSON

Новичок форума
Ребят не Работает EventSetTimer в сове , выдает false , а GetLastError показывает ошибку 4051 , которая в справке - "Недопустимое значение параметра функции" , хотя передаю я в нее int значение как и положено , передавал 1 , передавал 60 , разницы нет . Вызываю таймер из OnInit() , Естественно и OnTimer не срабатывает
 

Степа

Активный участник
Custom Moving Averages (options)

возможно ли опцию (shift - сдвиг) которая имеется в стандартном Custom Moving Averages вставить в другие индикаторы ??? такие например как -
Coridor FullSSA normalize... ?!?!?!?
если да то буду признателен заполучить его с добавленной опцией (shift-сдвиг) об идеи вам будет ясно по скинам, да он еще и рисует...
 

Вложения

  • 1.png
    1.png
    70,9 КБ · Просмотры: 40
  • 2.png
    2.png
    64,8 КБ · Просмотры: 37
  • 3.png
    3.png
    63,5 КБ · Просмотры: 30
  • 4.png
    4.png
    46,3 КБ · Просмотры: 30
  • Coridor FullSSA normalize - mtf + lines 3.01 nmc.mq4
    9,1 КБ · Просмотры: 23
  • Coridor FullSSA normalize - mtf + lines 3.01 nmc.ex4
    32,7 КБ · Просмотры: 23
  • libSSA.dll
    9 КБ · Просмотры: 14

Cemen4yk1

Местный житель
Ребят не Работает EventSetTimer в сове , выдает false , а GetLastError показывает ошибку 4051 , которая в справке - "Недопустимое значение параметра функции" , хотя передаю я в нее int значение как и положено , передавал 1 , передавал 60 , разницы нет . Вызываю таймер из OnInit() , Естественно и OnTimer не срабатывает

вот вам рабочий таймер
 

HUDSON

Новичок форума

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

_SERG_

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

А логику по тикам и таймеру никак не разделить?
Или пожертвуй чем нибудь.

И что значит "пересечения двух событий .. " ?
На то они и события, что бы их обработать отдельно каждое,
ну или флаг обработки ставь, кто первый, того и тапки.
 

HUDSON

Новичок форума
А логику по тикам и таймеру никак не разделить?
Или пожертвуй чем нибудь.

И что значит "пересечения двух событий .. " ?
На то они и события, что бы их обработать отдельно каждое,
ну или флаг обработки ставь, кто первый, того и тапки.


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

mobidik

-----
А если я даже милисекундный таймер поставлю то я все равно время прихода последнего тика могу лишь с точностью не менее секунды определить

Что-то Вы сами себе противоречите, если использовать ф-цию EventSetTimer - минимальный шаг будет в 1 сек., а если использовать ф-цию EventSetMillisecondTimer - тогда можно установить период повторения в 1 миллисекунду.
 

moldsystems

Почетный гражданин
Добрый день! Обращаюсь с таким вопросом,может кто поможет!
Сделал советника по 1 стрелочнику и 1 трендовому индикаторам. Но не знаю как сделать так, чтобы он на каждой стрелке открывал по n ордеру. У меня же получается, что как появилась стрелка на каждом тике открывает столько ордеров, сколько n. Спасибо!
int ticket=0;
priceliniaGREEN = iCustom(NULL, 0, "beforexguru-2",Sensitivity, PopUp_Alert, Email_Alert,HomePage, 1, 1);
priceliniaRED = iCustom(NULL, 0, "beforexguru-2",Sensitivity, PopUp_Alert, Email_Alert, HomePage, 2, 1);
signalBuy = iCustom(NULL, 0,"1FxSoni_Entry_v3.a",tf,g_period_76,dev_long,dev_short,sc_upper,sc_lower,appliedpriceupper,
appliedpricelower,gd_84,gi_92,gi_96,gi_100, 2,1);
signalSell = iCustom(NULL, 0,"1FxSoni_Entry_v3.a",tf,g_period_76,dev_long,dev_short,sc_upper,sc_lower,appliedpriceupper,
appliedpricelower,gd_84,gi_92,gi_96,gi_100, 3,1);
//bufBuy = iCustom(NULL,0,"beforexguru-2",Sensitivity, false, false,3,1);
//bufSell = iCustom(NULL,0,"beforexguru-2",Sensitivity, false, false,4,1);
if (priceliniaGREEN != EMPTY_VALUE && CountBuy() < numberopenorders && signalBuy != -1)
{
ticket = OrderSend( Symbol(), OP_BUY, Lots, Ask, 5, 0, 0, "", Magic, 0, Blue);

if(ticket>0)
{

TP = NormalizeDouble( Ask + TakeProfit*Point, Digits);
SL = NormalizeDouble( Ask - StopLoss*Point, Digits);

if(OrderSelect(ticket,SELECT_BY_TICKET))
if(OrderModify(ticket, OrderOpenPrice(), SL, TP, 0))
Print("Ордер успешно модифицирован");

}
}

if( priceliniaRED != EMPTY_VALUE && CountSell() < numberopenorders && signalSell != -1)
{
ticket = OrderSend( Symbol(), OP_SELL, Lots, Bid, 5, 0, 0, "", Magic, 0, Red);

if(ticket>0)
{
TP = NormalizeDouble( Bid + TakeProfit*Point, Digits);
SL = NormalizeDouble( Bid - StopLoss*Point, Digits);

if(OrderSelect(ticket,SELECT_BY_TICKET))
if(OrderModify(ticket, OrderOpenPrice(), SL, TP, 0))
Print("Ордер успешно модифицирован");
}

}

}
 

HUDSON

Новичок форума
Что-то Вы сами себе противоречите, если использовать ф-цию EventSetTimer - минимальный шаг будет в 1 сек., а если использовать ф-цию EventSetMillisecondTimer - тогда можно установить период повторения в 1 миллисекунду.

MqlTick.time это переменная типа datetime которая содержит время в секундах с 1970 года , она пишет только целую часть секунды , округляя все милисекунды микросекунды наносекунды и прочее , а милисекунды это уже тысячные доли секунды . Поэтому хорошенько подумайте и поймете что толку от милисекундного таймера не будет . функция которая возвращает время прихода последнего тика тоже возвращает datetime . Здесь выход один - В момент прихода тика сброс таймера и отсчет с нуля .. и так каждый тик . Это конкретно касаемо времени прошедшего с точки прихода последнего тика . Которое как раз мне и нужно ! Хотя конечно врядли что то подобное здесь возможно ... раз даже просто таймер запустить нельзя параллельно с OnTick()
 
Последнее редактирование:

_SERG_

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

Для нескольких инструментов я использую таймер, для стратегии с одним можно и тиками обойтись.
Рекомендую написать код, который фиксирует совпадения времени таймера и тика, и для нескольких инструментов, по результатам принять решение.
Чё тут париться?

А потом и другую статистику подсобрать, в том числе и для разных ДЦ и разрядности и тд и тп.....

В общем будет весело при принятии решения. Успехов.
 
Последнее редактирование:

HUDSON

Новичок форума
Для нескольких инструментов я использую таймер, для стратегии с одним можно и тиками обойтись.
Рекомендую написать код, который фиксирует совпадения времени таймера и тика, и для нескольких инструментов, по результатам принять решение.
Чё тут париться?

А потом и другую статистику подсобрать, в том числе и для разных ДЦ и разрядности и тд и тп.....

В общем будет весело при принятии решения. Успехов.

А мне нужно чтобы работал и тик и таймер . Чего как я понял на этом языке не сделать . А вспомогательные скрипты и прочее писать не хочу.
 

mobidik

-----
А мне нужно чтобы работал и тик и таймер . Чего как я понял на этом языке не сделать . А вспомогательные скрипты и прочее писать не хочу.

А что Вам мешает создать все необходимые функции для работы с таймером, создать выполнение Вашего кода в ф-ции OnTick, которая будет работать по тикам, при этом её же вызывать из ф-ции OnTimer?

PHP:
void OnTimer()
  {
//---
    OnTick();
  }
 

_SERG_

Активный участник
А мне нужно чтобы работал и тик и таймер . Чего как я понял на этом языке не сделать . А вспомогательные скрипты и прочее писать не хочу.

Они так и так работают, а обработка прикладных событий, это всегда был головняк
программиста, а не разработчика языка.

Так что, если интересует результат, ты через не хочу попробуй.

По поводу, "сделать - не сделать", сделай на том языке, на котором считаешь полностью сможешь реализовать прикладной алгоритм, хоть на ORACLE или другом SQL сервере, или ассемблере или 1С.
А из терминала только котировки толкай, и команды управления процессом обратно в терминал.
Мешает не язык тебе, а один чел, в зеркале его и увидишь.:laugh:
 
Последнее редактирование:

AlexeyVik

Программист mql4 mql5
... По сути мне таймер нужен чисто для вспомогательных целей , если конкретно , определить сколько времени прошло после прихода последнего тика , при условии что новый тик еще не пришел .
И для чего в этом случае нужен OnTimer() достаточно использовать функцию GetTickCount() или GetMicrosecondCount()
Код:
void OnTick()
{
   static ulong start;
  ulong end = GetMicrosecondCount()-start;

// здесь код всей программы

   Comment(end);
     start = GetMicrosecondCount();
}/*******************************************************************/
 

_SERG_

Активный участник
И для чего в этом случае нужен OnTimer() достаточно использовать функцию GetTickCount() или GetMicrosecondCount()
Код:
void OnTick()
{
   static ulong start;
  ulong end = GetMicrosecondCount()-start;

// здесь код всей программы

   Comment(end);
     start = GetMicrosecondCount();
}/*******************************************************************/
Да он балуется, не парься. :laugh:
 
Верх