[АРХИВ]Любой вопрос новичка, чтоб не захламлять форум. Профи, не проходите мимо. Без вас никуда - 5. - страница 409

 
Запрос от графика похож на CopyRates ArrayCopySeries, а не на RefreshRates. CopyRates это единственная функция из неторговых шевелящая сервер.
 
Zhunko:
При открытии и обновлении графика на сервер идёт запрос на новые данные. Некоторые жадные ДЦ предпочитают свои средства расходовать не на более мощные сервера и более широкий канал, а рассовывать их по своим карманам. Им приходится ограничивать количество запросов от терминала чтобы слабый сервер "не повесили". У MRC всего 2000 запросов в сутки. Это в 10 раз меньше количества их инструментов помноженное на количество ТФ, не считая торговых запросов.
 Ну значится нужно избегать такие кухни. Про MRC я первый раз слышу негатив, буду знать. Тут остаётся уяснить только терминал или всё-таки функции тоже (кроме торговых) обращаются к серверу. Данный вопрос я в поддержку задал (выше я уже об этом писал, пока ещё не ответили). Если не только, тогда всё становится на свои места, а если только терминал, тогда вообще абсурдно выходит, что типа запустил терминал, а он если будет обращаться к серверу чтоб обновлять котировки, превысит лимит не торгуя. По моему это не адекватно, и всё-таки функции, как сказал, Виктор кроме торговых не обращаются к серверу.

Zhunko:

Инклюды в MQL4 помогают упорядочить код. Например, так выглядит индикатор у меня на 3000 строк. 

Дело в том, что я видел библиотеки, да об этом сказано и в документации, что объявляют инклюды обычно в самом верху кода, там где объявляются глобальные переменные. Если в инклюдах присуствуют функции, то по-моему странно представить, что в месте, где объявляются глобальные переменные будет фактически в результате инклюда в то место функция, и, как вариант, как-нибудь переменные. Ведь так коды не пишутся. Если вверху объявляют переменные используемые в эксперте, и внешние пользовательские переменные, то функции рядом с ними никто не помещает! А вот инклюд, в котором есть функции помещают, и это считается нормальным явлением, как я понимаю. Вот это меня больше всего здесь смущает.

Как-то оно не логично же...

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

Zhunko:

К сожалению, компилятор не разрешает использовать один инклюд более одного раза в одном модуле. Обычно так можно экономить на повторяющемся коде.

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

Всем добрый день.

Изучаю функции MarketInfo ( ) и  Print  (  )

Вот простой код с использованием этих функций

Тестер,ТФ 60 мин.

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, а в настройки вставить другой инструмент, окно, которого давно не было открыто (чтобы истории не было), то история появляется.

extern string Tool           = "AUDNZD"; // Имя инструмента.
extern bool   IsRefreshRates = true;     // Флаг включения обновления таймсерий.
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
void start()
 {
  string sTool = Tool; // Имя инструмента.
  if (Tool == "") sTool = Symbol();
  while (!IsStopped())
   {
    if (IsRefreshRates) RefreshRates();
    string sComment = StringConcatenate("MarketInfo()\n",
                                        TimeToStr(MarketInfo(sTool, MODE_TIME), TIME_DATE|TIME_MINUTES|TIME_SECONDS), "\n",
                                        DoubleToStr(MarketInfo(sTool, MODE_BID), Digits), "  ", DoubleToStr(MarketInfo(sTool, MODE_ASK), Digits),
                                        "\n\nПредопределенные переменные\n",
                                        TimeToStr(Time[0], TIME_DATE|TIME_MINUTES|TIME_SECONDS), "\n",
                                        DoubleToStr(Bid, Digits), "  ", DoubleToStr(Ask, Digits),
                                        "\n\nМассивы-таймсерии\n");
    for (int i = 0; i < 10; i++)
     {
      sComment = sComment + StringConcatenate(TimeToStr(iTime(sTool, 0, i), TIME_DATE|TIME_MINUTES|TIME_SECONDS), "  ",
                                              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");
     }
    Comment(sComment);
    Sleep(300);
   }
 }

Так что, всё же,  RefreshRates() обращается к серверу и подкачивает историю. Как следствие, контроллировать приход истории необходимо.

А в поддержке скажут, что ни одна функция напрямую не обращается к серверу. Типа, всё делается через терминал :-)

 
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);
}

 вот ее вызов и принт

GetProfitFromDateInCurrency (Symbol(), -1, -1, iTime (NULL, PERIOD_D1, 0));  
Print(   GetProfitFromDateInCurrency () );
 
Zhunko:

Проверил RefreshRates(). Если этот эксперт запустить, например, на EURUSD, а в настройки вставить другой инструмент, окно, которого давно не было открыто (чтобы истории не было), то история появляется.

Так что, всё же,  RefreshRates() обращается к серверу и подкачивает историю. Как следствие, контроллировать приход истории необходимо.

А в поддержке скажут, что ни одна функция напрямую не обращается к серверу. Типа, всё делается через терминал :-)

 


Вадим, я запустил Ваш скрипт на терминале, на котором я ни разу не открывал кроме мажоров и кроссов с иеной никаких инструментов. В общем, вот скрин:

Не подкачивается ничего, т.к. массив рыночных данных пуст, судя по комментам.. 

 

 
hoz:


Вадим, я запустил Ваш скрипт на терминале, на котором я ни разу не открывал кроме мажоров и кроссов с иеной никаких инструментов. В общем, вот скрин:

Не подкачивается ничего, т.к. массив рыночных данных пуст, судя по комментам.. 

 


Ага. Еще он не заметил, что у него в эксперте MarketInfo(), а не только RefreshRates().
 
Zhunko:

Проверил RefreshRates(). Если этот эксперт запустить, например, на EURUSD, а в настройки вставить другой инструмент, окно, которого давно не было открыто (чтобы истории не было), то история появляется.

Так что, всё же,  RefreshRates() обращается к серверу и подкачивает историю. Как следствие, контроллировать приход истории необходимо.

А в поддержке скажут, что ни одна функция напрямую не обращается к серверу. Типа, всё делается через терминал :-)

 


Впечатляет уровень буйности фантазий. Что же даные появились только по некоторым символам (котрые данво не были открыты), а не по всем присутствующим в обзоре рынка? Каким это хитрым образом функция RefreshRates() узнала, что какие-то символы надо обновлять, а какие-то нет?

Жунко, завязывай бредить.  

 
lottamer:


не работает. Выдает весь имеющийся профит по сделкам за всю историю.

 

вот оригинальная функция и я в ней естественно ничего не менял

 вот ее вызов и принт

GetProfitFromDateInCurrency (Symbol(), -1, -1, iTime (NULL, PERIOD_D1, 0));  
Print(   GetProfitFromDateInCurrency () );

 

Ну так всё правильно. Ты функцию "прочитай" по строчкам и пойму как она работает, если самому влом писать и всё станет на свои места..

У тебя параметр функции:

iTime (NULL, PERIOD_D1, 0)

 время открытия дневного последнего бара, т.е. все позиции, которые закрыты раньше чем открыта текущая дневка будут просчитаны и просуммированы! Логично? Так вот ставь другой бар, который требуется или что там у тебя. Но это уже сам смотри.

 
Integer:

Ага. Еще он не заметил, что у него в эксперте 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");

Естественно данные обновятся.