Zhunko: При открытии и обновлении графика на сервер идёт запрос на новые данные. Некоторые жадные ДЦ предпочитают свои средства расходовать не на более мощные сервера и более широкий канал, а рассовывать их по своим карманам. Им приходится ограничивать количество запросов от терминала чтобы слабый сервер "не повесили". У MRC всего 2000 запросов в сутки. Это в 10 раз меньше количества их инструментов помноженное на количество ТФ, не считая торговых запросов.
Ну значится нужно избегать такие кухни. Про MRC я первый раз слышу негатив, буду знать. Тут остаётся уяснить только терминал или всё-таки функции тоже (кроме торговых) обращаются к серверу. Данный вопрос я в поддержку задал (выше я уже об этом писал, пока ещё не ответили). Если не только, тогда всё становится на свои места, а если только терминал, тогда вообще абсурдно выходит, что типа запустил терминал, а он если будет обращаться к серверу чтоб обновлять котировки, превысит лимит не торгуя. По моему это не адекватно, и всё-таки функции, как сказал, Виктор кроме торговых не обращаются к серверу.
Zhunko:
Инклюды в MQL4 помогают упорядочить код. Например, так выглядит индикатор у меня на 3000 строк.
Дело в том, что я видел библиотеки, да об этом сказано и в документации, что объявляют инклюды обычно в самом верху кода, там где объявляются глобальные переменные. Если в инклюдах присуствуют функции, то по-моему странно представить, что в месте, где объявляются глобальные переменные будет фактически в результате инклюда в то место функция, и, как вариант, как-нибудь переменные. Ведь так коды не пишутся. Если вверху объявляют переменные используемые в эксперте, и внешние пользовательские переменные, то функции рядом с ними никто не помещает! А вот инклюд, в котором есть функции помещают, и это считается нормальным явлением, как я понимаю. Вот это меня больше всего здесь смущает.
Как-то оно не логично же...
С другой стороны, если инклюд поместить, где-нибудь. вместо нескольких функций, которые отвечают за получение, скажем так, торгового сигнал по какому-нибудь признаку, то это будет логичным и читабельным моментом.
Zhunko:
К сожалению, компилятор не разрешает использовать один инклюд более одного раза в одном модуле. Обычно так можно экономить на повторяющемся коде.
Ну это уже мелочь. Ведь главное вынести за пределы основного кода главные громоздкие функции и куски кода, и вызывать их через инклюд. А потом уже внутри можно будет к той функции, которую инклюданул обращаться по имени функции... И не придётся заморачиваться о том, что есть данное ограничение.
double T ;
int start()
{
T = MarketInfo("EURUSD",MODE_HIGH); // в глобальную переменную Т запоминаем максимум дневной свечи,который должна возвращать MarketInfo ( )
Print (" corresponds to ", T ); //
if ( T > iHigh( Symbol (), 0,10)) // если максимум текущей дневной свечи > High свечи N10(ТФ60 мин)OrderSend(Symbol(),OP_SELL,0.1,Bid,1,0,0,"jfh",123 );открыть ордер
}
return;
ПРОБЛЕМА
1.Ордер не открывается
2.Print() постоянно возвращает 0
ПРИМЕЧАНИЕ.
Для открытия ордера - мне нужной сравнивать параметры свечей разных ТФ(60 мин и 1440 мин.)
Подскажите пожалуйста как это можно сделать.
Спасибо.
Integer: Запрос от графика похож на CopyRates ArrayCopySeries, а не на RefreshRates. CopyRates это единственная функция из неторговых шевелящая сервер.
Проверил RefreshRates(). Если этот эксперт запустить, например, на EURUSD, а в настройки вставить другой инструмент, окно, которого давно не было открыто (чтобы истории не было), то история появляется.
TarasBY: если использовать GetProfitFromDateInCurrency() (оригинальную - это ВАЖНО: я не знаю, что Вы там могли "наковырять" в своём варианте), то вызывать нужно так:
и функция вернёт профит по ордерам, закрытым с начала текущих суток.
А ВСЕ глупости из кода отлавливаются через Print().
не работает. Выдает весь имеющийся профит по сделкам за всю историю.
вот оригинальная функция и я в ней естественно ничего не менял
//+----------------------------------------------------------------------------+//| Автор : Ким Игорь В. aka KimIV, http://www.kimiv.ru |//+----------------------------------------------------------------------------+//| Версия : 19.02.2008 |//| Описание : Возвращает суммарный профит в валюте депозита |//| закрытых с определённой даты позиций |//+----------------------------------------------------------------------------+//| Параметры: |//| sy - наименование инструмента ("" - любой символ, |//| NULL - текущий символ) |//| op - операция (-1 - любая позиция) |//| mn - MagicNumber (-1 - любой магик) |//| dt - Дата и время в секундах с 1970 года ( 0 - с начала истории) |//+----------------------------------------------------------------------------+double GetProfitFromDateInCurrency(string sy="", int op=-1, int mn=-1, datetime dt=0)
{
double p=0;
int i, k=OrdersHistoryTotal();
if (sy=="0") sy=Symbol();
for (i=0; i<k; i++) {
if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) {
if ((OrderSymbol()==sy || sy=="") && (op<0 || OrderType()==op)) {
if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
if (mn<0 || OrderMagicNumber()==mn) {
if (dt<OrderCloseTime()) {
p+=OrderProfit()+OrderCommission()+OrderSwap();
}
}
}
}
}
}
return(p);
}
Проверил RefreshRates(). Если этот эксперт запустить, например, на EURUSD, а в настройки вставить другой инструмент, окно, которого давно не было открыто (чтобы истории не было), то история появляется.
Так что, всё же, RefreshRates() обращается к серверу и подкачивает историю. Как следствие, контроллировать приход истории необходимо.
А в поддержке скажут, что ни одна функция напрямую не обращается к серверу. Типа, всё делается через терминал :-)
Вадим, я запустил Ваш скрипт на терминале, на котором я ни разу не открывал кроме мажоров и кроссов с иеной никаких инструментов. В общем, вот скрин:
Не подкачивается ничего, т.к. массив рыночных данных пуст, судя по комментам..
Проверил RefreshRates(). Если этот эксперт запустить, например, на EURUSD, а в настройки вставить другой инструмент, окно, которого давно не было открыто (чтобы истории не было), то история появляется.
Так что, всё же, RefreshRates() обращается к серверу и подкачивает историю. Как следствие, контроллировать приход истории необходимо.
А в поддержке скажут, что ни одна функция напрямую не обращается к серверу. Типа, всё делается через терминал :-)
Впечатляет уровень буйности фантазий. Что же даные появились только по некоторым символам (котрые данво не были открыты), а не по всем присутствующим в обзоре рынка? Каким это хитрым образом функция RefreshRates() узнала, что какие-то символы надо обновлять, а какие-то нет?
Ну так всё правильно. Ты функцию "прочитай" по строчкам и пойму как она работает, если самому влом писать и всё станет на свои места..
У тебя параметр функции:
iTime (NULL, PERIOD_D1, 0)
время открытия дневного последнего бара, т.е. все позиции, которые закрыты раньше чем открыта текущая дневка будут просчитаны и просуммированы! Логично? Так вот ставь другой бар, который требуется или что там у тебя. Но это уже сам смотри.
При открытии и обновлении графика на сервер идёт запрос на новые данные. Некоторые жадные ДЦ предпочитают свои средства расходовать не на более мощные сервера и более широкий канал, а рассовывать их по своим карманам. Им приходится ограничивать количество запросов от терминала чтобы слабый сервер "не повесили". У MRC всего 2000 запросов в сутки. Это в 10 раз меньше количества их инструментов помноженное на количество ТФ, не считая торговых запросов.
Инклюды в MQL4 помогают упорядочить код. Например, так выглядит индикатор у меня на 3000 строк.
Дело в том, что я видел библиотеки, да об этом сказано и в документации, что объявляют инклюды обычно в самом верху кода, там где объявляются глобальные переменные. Если в инклюдах присуствуют функции, то по-моему странно представить, что в месте, где объявляются глобальные переменные будет фактически в результате инклюда в то место функция, и, как вариант, как-нибудь переменные. Ведь так коды не пишутся. Если вверху объявляют переменные используемые в эксперте, и внешние пользовательские переменные, то функции рядом с ними никто не помещает! А вот инклюд, в котором есть функции помещают, и это считается нормальным явлением, как я понимаю. Вот это меня больше всего здесь смущает.
Как-то оно не логично же...
С другой стороны, если инклюд поместить, где-нибудь. вместо нескольких функций, которые отвечают за получение, скажем так, торгового сигнал по какому-нибудь признаку, то это будет логичным и читабельным моментом.
К сожалению, компилятор не разрешает использовать один инклюд более одного раза в одном модуле. Обычно так можно экономить на повторяющемся коде.
Всем добрый день.
Изучаю функции MarketInfo ( ) и Print ( )
Вот простой код с использованием этих функций
Тестер,ТФ 60 мин.
Запрос от графика похож на CopyRates ArrayCopySeries, а не на RefreshRates. CopyRates это единственная функция из неторговых шевелящая сервер.
Проверил RefreshRates(). Если этот эксперт запустить, например, на EURUSD, а в настройки вставить другой инструмент, окно, которого давно не было открыто (чтобы истории не было), то история появляется.
Так что, всё же, RefreshRates() обращается к серверу и подкачивает историю. Как следствие, контроллировать приход истории необходимо.
А в поддержке скажут, что ни одна функция напрямую не обращается к серверу. Типа, всё делается через терминал :-)
если использовать GetProfitFromDateInCurrency() (оригинальную - это ВАЖНО: я не знаю, что Вы там могли "наковырять" в своём варианте), то вызывать нужно так:
и функция вернёт профит по ордерам, закрытым с начала текущих суток.
А ВСЕ глупости из кода отлавливаются через Print().
не работает. Выдает весь имеющийся профит по сделкам за всю историю.
вот оригинальная функция и я в ней естественно ничего не менял
вот ее вызов и принт
Проверил RefreshRates(). Если этот эксперт запустить, например, на EURUSD, а в настройки вставить другой инструмент, окно, которого давно не было открыто (чтобы истории не было), то история появляется.
Так что, всё же, RefreshRates() обращается к серверу и подкачивает историю. Как следствие, контроллировать приход истории необходимо.
А в поддержке скажут, что ни одна функция напрямую не обращается к серверу. Типа, всё делается через терминал :-)
Вадим, я запустил Ваш скрипт на терминале, на котором я ни разу не открывал кроме мажоров и кроссов с иеной никаких инструментов. В общем, вот скрин:
Не подкачивается ничего, т.к. массив рыночных данных пуст, судя по комментам..
Вадим, я запустил Ваш скрипт на терминале, на котором я ни разу не открывал кроме мажоров и кроссов с иеной никаких инструментов. В общем, вот скрин:
Не подкачивается ничего, т.к. массив рыночных данных пуст, судя по комментам..
Ага. Еще он не заметил, что у него в эксперте MarketInfo(), а не только RefreshRates().
Проверил RefreshRates(). Если этот эксперт запустить, например, на EURUSD, а в настройки вставить другой инструмент, окно, которого давно не было открыто (чтобы истории не было), то история появляется.
Так что, всё же, RefreshRates() обращается к серверу и подкачивает историю. Как следствие, контроллировать приход истории необходимо.
А в поддержке скажут, что ни одна функция напрямую не обращается к серверу. Типа, всё делается через терминал :-)
Впечатляет уровень буйности фантазий. Что же даные появились только по некоторым символам (котрые данво не были открыты), а не по всем присутствующим в обзоре рынка? Каким это хитрым образом функция RefreshRates() узнала, что какие-то символы надо обновлять, а какие-то нет?
Жунко, завязывай бредить.
не работает. Выдает весь имеющийся профит по сделкам за всю историю.
вот оригинальная функция и я в ней естественно ничего не менял
вот ее вызов и принт
Ну так всё правильно. Ты функцию "прочитай" по строчкам и пойму как она работает, если самому влом писать и всё станет на свои места..
У тебя параметр функции:
время открытия дневного последнего бара, т.е. все позиции, которые закрыты раньше чем открыта текущая дневка будут просчитаны и просуммированы! Логично? Так вот ставь другой бар, который требуется или что там у тебя. Но это уже сам смотри.
Ага. Еще он не заметил, что у него в эксперте MarketInfo(), а не только RefreshRates().
Еще все функции:
DoubleToStr(iOpen(sTool, 0, i), Digits), " ",
DoubleToStr(iLow(sTool, 0, i), Digits), " ",
DoubleToStr(iHigh(sTool, 0, i), Digits), " ",
DoubleToStr(iClose(sTool, 0, i), Digits), " ",
DoubleToStr(iVolume(sTool, 0, i), 0), "\n");
Естественно данные обновятся.