АвторСообщение
Автор




Пост N: 124
Зарегистрирован: 21.05.06
Откуда: Украина, Днепропетровск
ссылка на сообщение  Отправлено: 06.02.08 12:23. Заголовок: Вопросы по Учебнику.


С момента опубликования Учебника по программированию на MQL4 мне стали приходить письма от читателей с вопросами. Предлагаю всем заинтересованным начинающим программистам продолжить общение здесь. Я постараюсь ответить на ваши вопросы.

Спасибо: 0 
ПрофильЦитата Ответить
Ответов - 61 , стр: 1 2 3 4 5 6 7 All [только новые]


Автор




Пост N: 622
Зарегистрирован: 21.05.06
Откуда: Украина, Днепропетровск
ссылка на сообщение  Отправлено: 25.03.10 11:08. Заголовок: Собственно бары можн..


Собственно бары можно раскрасить только через настройки терминала (F8), программным способом их перекрасить нельзя.
Но можно на каждый бар поставить графический объект (трендовую линию) соотв. ширины.
Пример см. здесь http://book.mql4.com/ru/functions/strings

Спасибо: 0 
ПрофильЦитата Ответить





Пост N: 7
Зарегистрирован: 22.05.09
Откуда: UA, Северодонецк
ссылка на сообщение  Отправлено: 14.04.10 15:34. Заголовок: Здравствуйте, Сергей..


Здравствуйте, Сергей!
У меня вопрос - описано ли где-то, какие функции при своем исполнении общаются с сервером (как OrderSend), а какие исполняются "не отходя от кассы". Например, MarketInfo( ), или функции, дающие информацию об открытых позициях. Мне кажется это необходимо знать при написании программ, чтобы излишне не грузить сервер, но и актуальность используемых данных не терять.

Надеюсь, смысл вопроса понятно изложил

А еще вопрос - Вы как человек "приближенный" - не знаете ли, когда будет "внедряться" в практику MT5 & MQL5.

А еще вопрос - пишется ли учебник по MQL5, и если ДА, то когда можно будет к нему "приобщиться"

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник


Пост N: 64
Зарегистрирован: 03.09.09
ссылка на сообщение  Отправлено: 14.04.10 17:20. Заголовок: Здравствуйте. "..


Здравствуйте.

"Общение" с сервером в МТ4 разделяется на два потока. Один - торговый поток. Через него проводятся все торговые операции. В этом смысле обращение к серверу производят только торговые функции:
  • OrderSend
  • OrderModify
  • OrderClose
  • OrderDelete
    и только в случае прохождения проверки корректности параметров самим терминалом. Загрузить этот поток вы сможете слишком частым использованием перечисленных функций. Что такое "слишком часто" каждый ДЦ определяет для себя индивидуально. В настройках сервера для этого есть соответствующий параметр.

    Второй поток служит для обновления истории котировок терминала (в том числе и новых котировок). Его вы загрузить вряд ли сможете. Обращение к серверу через этот поток вы сможете инициировать в случае, если в текущей истории котировок не хватает нужных данных. Например, текущий график Н1, а вам потребовались данные с графика Н4, но они еще не загружены. В этом смысле обращение к серверу будут производить функции:
  • iLow
  • iHigh
  • iTime
  • iClose
  • iOpen
  • iVolume

    После того, как данные загружены, вторичное обращение к данному участку истории не будет вызывать обращений к серверу.

  • Спасибо: 1 
    ПрофильЦитата Ответить
    Автор




    Пост N: 631
    Зарегистрирован: 21.05.06
    Откуда: Украина, Днепропетровск
    ссылка на сообщение  Отправлено: 14.04.10 18:00. Заголовок: BorodaN пишет: Здра..


    BorodaN пишет:

     цитата:
    Здравствуйте, Сергей!
    У меня вопрос - описано ли где-то, какие функции при своем исполнении общаются с сервером (как OrderSend), а какие исполняются "не отходя от кассы". Например, MarketInfo( ), или функции, дающие информацию об открытых позициях. Мне кажется это необходимо знать при написании программ, чтобы излишне не грузить сервер, но и актуальность используемых данных не терять.

    Надеюсь, смысл вопроса понятно изложил

    А еще вопрос - Вы как человек "приближенный" - не знаете ли, когда будет "внедряться" в практику MT5 & MQL5.

    А еще вопрос - пишется ли учебник по MQL5, и если ДА, то когда можно будет к нему "приобщиться"



    1. Игорь правильно ответил на Ваш вопрос. Могу только добавить, что по ходу жизни технологии могут меняться. Например, если торговый приказ сформирован программой некорректно, он не уйдёт на сервер из терминала. Ошибка вернётся в программу терминалом. Раньше этого не было, теперь так. Т.е. на сервер уходят только корректные торговые приказы.

    2. Учебник пишется. Ожидается к концу лета. A МТ 5 разойдётся как разойдётся. Компания MetaQuotes не публикует список своих потребителей, поэтому точно сказать нелья, может какой-то ДЦ уже и даёт МТ 5.

    Спасибо: 1 
    ПрофильЦитата Ответить



    Не зарегистрирован
    Зарегистрирован: 21.10.10
    ссылка на сообщение  Отправлено: 21.10.10 09:29. Заголовок: Здравствуйте. Подска..


    Здравствуйте. Подскажите начинающему.
    В одном из разделов учебника говорится о том, что существую эксперты с контролем открытия баров, и тестировать их правильно методом - по ценам открытия. Такой алгоритм реализован например в стандартном советнике Moving Average. И там все понятно с кодом.
    Не могу разобраться с известным шаблоном Complex_Expert.mq4. http://www.megaupload.com/?d=T82URWPT<\/u><\/a>
    Там есть такой блок в функции start
    // - 2 - == Контроль открытия нового бара ==============================================
    if (LastBar == Time[0]) //Если время посчитанного бара равно времени текущего бара
    return(0); // то это означает, что новый бар еще не открылся
    Означает ли это тоже контроль открытия баров и тестировать его правильно по ценам открытия.
    p.s. возможно немного не в тему, но пытаюсь изучить сейчас mql по вашему учебнику и совсем запутался, как разобраться где есть явный контроль баров, а где нет, т.е. по тикам.
    с ув. алексей

    Спасибо: 0 
    ПрофильЦитата Ответить
    Автор




    Пост N: 754
    Зарегистрирован: 21.05.06
    Откуда: Украина, Днепропетровск
    ссылка на сообщение  Отправлено: 21.10.10 10:51. Заголовок: Контроль баров - это..


    Контроль баров - это очень просто.
    Каждый бар характеризуется временем открытия. Это - время первого тика в этом баре. В период развития бара (когда поступают новые тики) время открытия бара не изменяется. На этом и свойстве и строится алгоритм контроля факта образования нового бара.

    Вот простая функция:
    void Fun_New_Bar() // Ф-ия обнаружения ..
    { // .. нового бара
    static datetime New_Time=0; // Время текущего бара
    New_Bar=false; // Нового бара нет
    if(New_Time!=Time[0]) // Сравниваем время
    {
    New_Time=Time[0]; // Теперь время такое
    New_Bar=true; // Поймался новый бар
    }
    }

    Переменная New_Bar - должна быть объявлена в основной программе как глобальная. Она принимает одно из двух значений - Истина или Ложь. В момент образования нового бара время открытия бара Time[0] будет иным (например 12345058), не таким как в предыдущих вычислениях (например, 12345000). При исполнении функии в статической переменной New_Time запоминается это время (12345058) и переменная New_Bar получает значение Истина. В основной программе нужно обработать значение New_Bar: если оно истинно, то нужно сделать вычисления, поставленные в соответствие этому событию.

    В процессе развития бара поступают тики, каждый в своё время (12345062, 12345066 и т.д), при этом время открытия бара остаётся неизменным (12345058), а переменная New_Bar всё это время будет иметь значение Ложь (т.е. новый бар на этом тике не образовался). И лишь когда какой-то очередной тик будет принадлежать действительно новому бару, терминал подставит иное значение для Time[0] (например, уже 12345120). В результате в строке if(New_Time!=Time[0]) будет обнаружено несовпадение значений, что свидетельствует о факте образования нового бара. В переменную New_Time будет запомнено новое время образования нового бара (2345120), а переменная New_Bar обретёт значение Истина.

    И так далее, в течение всего периода исполнения программы. Нужно только функцию Fun_New_Bar() вызывать на каждом тике и тут же анализировать значение New_Bar, напимер так:
    Fun_New_Bar(); // Обращение к ф-ии
    if (New_Bar==false) // Если бар не новый..
    return; // ..то уходим
    ... // вычисления на новом баре

    Если в эксперте все вычиления делаются только на каждом новом баре (на первом тике нового бара), то тестировать его нужно по ценам открытия. Вообще говоря, не будет ошибки, если тестировать по всем тикам, но в этом нет смысла, т.к. на всег других тиках кроме барообразующих советник попросту будет сразу заканчивать вычисления и результат в целом будет тот же. Тестирование по ценам открытия позволит ускорить тестирование, т.к. в этом случае эксперт будет вызываться для работы в тестере только 1 раз на каждом баре (а не 4 раза - OHLC).

    Но если эксперт делает полезные вычисления на всех барах (например, торговые решения вычисляет только на новых барах, а в промежутке строит графику, вычисляет какие-то данные и пр.), то тестировать нужно по всем тикам.

    Спасибо: 0 
    ПрофильЦитата Ответить



    Пост N: 1
    Зарегистрирован: 21.10.10
    ссылка на сообщение  Отправлено: 21.10.10 20:20. Заголовок: Огромное спасибо!!! ..


    Огромное спасибо!!! Можно еще уточнить, после исполнения приведенной вами функции, далее я могу использовать любые вычисления или "вычисления, поставленные в соответствие этому событию" обязательно должны содержать массивы-таймсерии Open[1] или Close[1], или High[1], или Low[1]?
    Т.е. если в функции есть массив-таймсерия Time[0], то далее обязательно в вычислениях должен быть использован какой-то из вышеприведенных массивов-таймсерий?

    Спасибо: 0 
    ПрофильЦитата Ответить
    Автор




    Пост N: 756
    Зарегистрирован: 21.05.06
    Откуда: Украина, Днепропетровск
    ссылка на сообщение  Отправлено: 21.10.10 23:13. Заголовок: Мне кажется, Вы не п..


    Мне кажется, Вы не поняли суть.

    Легко понять, что характеристики баров формируются на основании цен и времён тиков.
    Предположим, что на минутном таймфрейме нулевой (самый правый бар) образовался на основе таких пяти тиков:
    1. Время - 13час 27мин 03сек, цена 1.2015
    2. Время - 13час 27мин 18сек, цена 1.2017
    3. Время - 13час 27мин 22сек, цена 1.2008
    4. Время - 13час 27мин 37сек, цена 1.2013
    5. Время - 13час 27мин 55сек, цена 1.2014

    Время первого тика (произошедшего в период с 13.27.00 по 13.27.59 включительно) - 13.27.03. Это - время образования бара. Последующие тики не могут изменить это время. Это - постоянная характеристика этого бара. Это время начала бара сохраняется за ним постоянно, и в период пока бар формируется, и в период следующих новых баров и потом, всегда. С точки зрения MQL время Time[0] будет неизменным в течение указанных пяти тиков.

    Любой тик, произошедший после 13.27.59 (например, в 13.28.01) означает, что этот бар закончился и образовался новый. Новым временем теперь уже нового нулевого бара является время 13.28.01. Бар, только что закончивший формироваться, полyчит индекс 1, а новый (развивающийся) бар имеет индекс 0. Это значит, что если запросить значение Time[0], то оно теперь же бyдет соответствовать времени 13.28.01.

    Для обнаржения факта образования нового бара в программе всегда анализирется значение Time[0]. Текyщее значение Time[0] сравнивается с тем, что было запомнено при последнем образовани нового бара. И если обнарyжена разница, то это свидетельствет об образовании нового бара.

    Это - просто механизм распознавания факта нового бара. Это механизм не имеет никакого отношения к "обязательствам" программиста - "то далее обязательно в вычислениях должен быть использован какой-то из вышеприведенных массивов-таймсерий". НЕТ. Не должен. Никто ничего никомy не должен. Просто в программировании прикладных программ должен присyтствовать здравый смысл.
    Например:

    1. Предположим, что торговля ведётся по некоторомy индикаторy, а yсловие формирования торгового сигнала звyчит так: "если индикаторная линия на только что сформировавшемся (теперь yже первом) баре ниже, чем на предыдyщем, то.." В этом слyчае вычисления, касающиеся торгового критерия, выполняются на том тике, который окрывает новый бар. При этом вычисляются показания индикатора на 1м и 2м барах. А на всех тиках нyлевого бара эти расчёты не нyжны, т.к. на них новый бар не образyется, а если бы эти расчёты на этих тиках выполнялись, то резyльтат был всякий раз одним и тем же, ведь обращение было бы к данным на 1 и 2 барах.

    2. То же самое происходит, если yсловием является расстояние в пyнктах от некой трендовой линии до текyщей цены. Например, "если расстояние на 1м баре больше расстояния на 2м баре ..", тоже нет смысла делать вычисления на каждом тике.

    То же касается и тестирования. Если торговый критерий (и следющий за ним торговый приказ) вычисляется только на новом баре, то нет необходимости проводить тестирование по всем тикам. А тестирование по ценам открытия позволит сэкономить время тестирования вчетверо в сравнении с тестрованием по всем тикам.
    Под фразой "вычисления, поставленные в соответствие этому событию" имелось ввидy вычисление торгового критерия и формирование торгового приказа (открытие, закрытие, модификация ордеров).

    Спасибо: 0 
    ПрофильЦитата Ответить



    Пост N: 2
    Зарегистрирован: 21.10.10
    ссылка на сообщение  Отправлено: 22.10.10 08:22. Заголовок: Все понятно, теперь ..


    Все понятно, теперь с вашей помощью разобрался [img src=/gif/smk/sm12.gif]
    Видимо с самого начала не правильно подошел к этому вопросу, рассматривая только однотипный пример стандартнго советника Moving Average, где:
    //---- go trading only for first tiks of new bar
    if(Volume[0]>1) return;
    ma=iMA(NULL,0,MovingPeriod,MovingShift,MODE_SMA,PRICE_CLOSE,0);
    if(Open[1]>ma && Close[1]<ma) ... и т.д.
    А все оказалось гораздо проще.

    Спасибо: 0 
    ПрофильЦитата Ответить



    Пост N: 1
    Зарегистрирован: 10.11.11
    ссылка на сообщение  Отправлено: 10.11.11 09:45. Заголовок: Уважаемый Сергей! у ..


    Уважаемый Сергей!
    у меня вопрос по функции Inform() (http://book.mql4.com/ru/build/info)
    решил ее протестить:
    int start() {
    i+=1;
    Inform(i); Sleep(20000);
    if (i>16) i=1;
    Inform(0);
    return(0);
    }
    работает отлично, но...
    весь журнал (вкладка Эксперты) забит
    2011.11.10 09:51:43 ProbaInfo GBPUSD,M1: object name passed to ObjectSet function cannot be an uninitialized or empty string
    - никак не пойму, в чем дело (((

    Спасибо: 0 
    ПрофильЦитата Ответить
    Ответов - 61 , стр: 1 2 3 4 5 6 7 All [только новые]
    Ответ:
    1 2 3 4 5 6 7 8 9
    большой шрифт малый шрифт надстрочный подстрочный заголовок большой заголовок видео с youtube.com картинка из интернета картинка с компьютера ссылка файл с компьютера русская клавиатура транслитератор  цитата  кавычки моноширинный шрифт моноширинный шрифт горизонтальная линия отступ точка LI бегущая строка оффтопик свернутый текст

    показывать это сообщение только модераторам
    не делать ссылки активными
    Имя, пароль:      зарегистрироваться    
    Тему читают:
    - участник сейчас на форуме
    - участник вне форума
    Все даты в формате GMT  3 час. Хитов сегодня: 0
    Права: смайлы да, картинки да, шрифты да, голосования нет
    аватары да, автозамена ссылок вкл, премодерация откл, правка нет