Logo

Вход

Войти с помощью соц. сетей
X
 
  • Фильтр
  • Время
  • Показать
Очистить всё
новые сообщения
ТОП СООБЩЕНИЙ
16.11.2016, 23:02
Лучший ответ
Сообщение от ir0407 Посмотреть сообщение
В моем случае я имел ввиду выход из OnCalculate(). Т.е. мы просто ждем подгрузки котировок. Если на текущем тике запрашиваемых данных нет, то делать нам нечего и мы просто вываливаемся из индикатора до прихода следующего тика. На нескольких следующих тиках запрашиваемые данные должны будут появится.
Извиняюсь сразу, что не уточнил. Это происходит не в текущем баре, а при запуске индикатора, когда он просматривает историю другой валюты и рисует ее
16.11.2016, 23:05
Лучший ответ
Накопленные выплаты: 209 RUB
Сообщение от ic2d Посмотреть сообщение
Это происходит не в текущем баре, а при запуске индикатора, когда он просматривает историю другой валюты и рисует ее
Блин... А на код глянуть можно? А то долго гадать будем что там где происходит и кто о чем говорит.
16.11.2016, 23:17
Лучший ответ
Сообщение от ir0407 Посмотреть сообщение
Блин... А на код глянуть можно? А то долго гадать будем что там где происходит и кто о чем говорит.
Без проблем может что и подскажите. Я индикатор первый раз пишу, долго уже мучаюсь. На г0внокодил там капитально думаю. Вдруг будут какие подсказки - буду рад выслушать, потому что мне даже приходится указывать количество баров сколько считать в прочем, сами увидите. Вот код



MQL код:

#property indicator_separate_window // Отображение в отдельном окне
#property indicator_buffers 2 // Количество буферов

extern int History = 50; // Колич.баров в расчётной истории
extern int Aver_Bars = 10; // Количество баров для расчёта
extern string str1 = "Первая пара";
extern string Pair11 = "EURUSD"; // Пара 1
extern string str2 = "Вторая пара";
extern string Pair21 = "GBPUSD"; // Пара 2

double Buf_0[]; // Объявление индикаторного массива
double Buf_1[]; // Объявление индикаторного массива

string GroupA, GroupB;
//--------------------------------------------------------------------
int init() // Специальная функция init()
{


SetIndexBuffer(0,Buf_0); // Назначение массива буферу
SetIndexLabel(0, GroupA);
SetIndexStyle (0,DRAW_LINE,STYLE_SOLID,1, clrRed);// Стиль линии
SetIndexBuffer(1,Buf_1); // Назначение массива буферу
SetIndexLabel(1, GroupB);
SetIndexStyle (1,DRAW_LINE,STYLE_SOLID,1, clrAqua);// Стиль линии


return (true); // Выход из спец. ф-ии init()
}
//--------------------------------------------------------------------
int start() // Специальная функция start()
{
int i, // Индекс бара
n, // Формальный параметр
Counted_bars; // Количество просчитанных баров
double
Symb1,
Symb2,
Symbol1; // Сумма значений High за период
//--------------------------------------------------------------------
Counted_bars=IndicatorCounted(); // Количество просчитанных баров
i=Bars-Counted_bars-1; // Индекс первого непосчитанного
if (i>History-1) // Если много баров то ..
i=History-1; // ..рассчитывать заданное колич.
while(i>=0) // Цикл по непосчитанным барам
{
Symb1=0; // Обнуление в начале цикла
for(n=i;n<=i+Aver_Bars-1;n++) // Цикл суммирования значений
{
Symbol1 = Percent(Pair11, n);
Symb1 = (Symb1+Symbol1);

}
Buf_0[i]= Symb1/Aver_Bars;



Symb2=0; // Обнуление в начале цикла
for(n=i;n<=i+Aver_Bars-1;n++) // Цикл суммирования значений
{
Symbol1 = Percent(Pair21, n);
Symb2 = (Symb2+Symbol1);

}
Buf_1[i]= Symb2/Aver_Bars;



i--; // Расчёт индекса следующего бара
}

//--------------------------------------------------------------------
return (true); // Выход из спец. ф-ии start()
}
//--------------------------------------------------------------------

double Percent (string Symb, int Bar) {

bool OK=true;
double Diff;

if(iClose(Symb,0,Bar)==0 || iOpen(Symb,0,Bar)==0)
{
// ОТКЛЮЧЕННО ИЗЗА ФЛУДА ))) Alert("Не хватает котировок пары: "+Symb+" на текущем таймфрейме. Пожалуйста откройте котировки этой пары.");
OK=false;
Diff = 0;
}

if(OK==true)
{
Diff=(iClose(Symb,0,Bar)-iOpen(Symb,0,Bar))/(iClose(Symb,0,Bar)/100);
}
return (Diff);

}




В самом конце увидите комментарий где изза флуда убрал алерт...
16.11.2016, 23:56
Лучший ответ
Накопленные выплаты: 209 RUB
Сообщение от ic2d Посмотреть сообщение
Вот код
Слегка изменил функцию и ее вызов в контексте твоего вопроса. Пробуй...

MQL код:

#property indicator_separate_window // Отображение в отдельном окне
#property indicator_buffers 2 // Количество буферов

extern int History = 50; // Колич.баров в расчётной истории
extern int Aver_Bars = 10; // Количество баров для расчёта
extern string str1 = "Первая пара";
extern string Pair11 = "EURUSD"; // Пара 1
extern string str2 = "Вторая пара";
extern string Pair21 = "GBPUSD"; // Пара 2

double Buf_0[]; // Объявление индикаторного массива
double Buf_1[]; // Объявление индикаторного массива

string GroupA, GroupB;
//--------------------------------------------------------------------
int init() // Специальная функция init()
{


SetIndexBuffer(0,Buf_0); // Назначение массива буферу
SetIndexLabel(0, GroupA);
SetIndexStyle (0,DRAW_LINE,STYLE_SOLID,1, clrRed);// Стиль линии
SetIndexBuffer(1,Buf_1); // Назначение массива буферу
SetIndexLabel(1, GroupB);
SetIndexStyle (1,DRAW_LINE,STYLE_SOLID,1, clrAqua);// Стиль линии


return (true); // Выход из спец. ф-ии init()
}
//--------------------------------------------------------------------
int start() // Специальная функция start()
{
int i, // Индекс бара
n, // Формальный параметр
Counted_bars; // Количество просчитанных баров
double
Symb1,
Symb2,
Symbol1; // Сумма значений High за период
//--------------------------------------------------------------------
Counted_bars=IndicatorCounted(); // Количество просчитанных баров
i=Bars-Counted_bars-1; // Индекс первого непосчитанного
if (i>History-1) // Если много баров то ..
i=History-1; // ..рассчитывать заданное колич.
while(i>=0) // Цикл по непосчитанным барам
{
Symb1=0; // Обнуление в начале цикла
for(n=i;n<=i+Aver_Bars-1;n++) // Цикл суммирования значений
{
if(!Percent(Pair11, n, Symbol1)) return;
Symb1 = (Symb1+Symbol1);

}
Buf_0[i]= Symb1/Aver_Bars;



Symb2=0; // Обнуление в начале цикла
for(n=i;n<=i+Aver_Bars-1;n++) // Цикл суммирования значений
{
if(!Percent(Pair21, n, Symbol1)) return;
Symb2 = (Symb2+Symbol1);

}
Buf_1[i]= Symb2/Aver_Bars;



i--; // Расчёт индекса следующего бара
}

//--------------------------------------------------------------------
return (true); // Выход из спец. ф-ии start()
}
//--------------------------------------------------------------------

bool Percent (string Symb, int Bar, double &Result) {

bool RetVal = true;
double open = iOpen(Symb, 0, Bar);
double close = iClose(Symb, 0, Bar);

if(open == 0.0 || close == 0.0)
RetVal = false;
else
Result=(close-open)/(close/100);
return (RetVal);
}
17.11.2016, 00:16
Лучший ответ
Сообщение от ir0407 Посмотреть сообщение
Слегка изменил функцию и ее вызов в контексте твоего вопроса. Пробуй...

MQL код:

#property indicator_separate_window // Отображение в отдельном окне
#property indicator_buffers 2 // Количество буферов

extern int History = 50; // Колич.баров в расчётной истории
extern int Aver_Bars = 10; // Количество баров для расчёта
extern string str1 = "Первая пара";
extern string Pair11 = "EURUSD"; // Пара 1
extern string str2 = "Вторая пара";
extern string Pair21 = "GBPUSD"; // Пара 2

double Buf_0[]; // Объявление индикаторного массива
double Buf_1[]; // Объявление индикаторного массива

string GroupA, GroupB;
//--------------------------------------------------------------------
int init() // Специальная функция init()
{


SetIndexBuffer(0,Buf_0); // Назначение массива буферу
SetIndexLabel(0, GroupA);
SetIndexStyle (0,DRAW_LINE,STYLE_SOLID,1, clrRed);// Стиль линии
SetIndexBuffer(1,Buf_1); // Назначение массива буферу
SetIndexLabel(1, GroupB);
SetIndexStyle (1,DRAW_LINE,STYLE_SOLID,1, clrAqua);// Стиль линии


return (true); // Выход из спец. ф-ии init()
}
//--------------------------------------------------------------------
int start() // Специальная функция start()
{
int i, // Индекс бара
n, // Формальный параметр
Counted_bars; // Количество просчитанных баров
double
Symb1,
Symb2,
Symbol1; // Сумма значений High за период
//--------------------------------------------------------------------
Counted_bars=IndicatorCounted(); // Количество просчитанных баров
i=Bars-Counted_bars-1; // Индекс первого непосчитанного
if (i>History-1) // Если много баров то ..
i=History-1; // ..рассчитывать заданное колич.
while(i>=0) // Цикл по непосчитанным барам
{
Symb1=0; // Обнуление в начале цикла
for(n=i;n<=i+Aver_Bars-1;n++) // Цикл суммирования значений
{
if(!Percent(Pair11, n, Symbol1)) return;
Symb1 = (Symb1+Symbol1);

}
Buf_0[i]= Symb1/Aver_Bars;



Symb2=0; // Обнуление в начале цикла
for(n=i;n<=i+Aver_Bars-1;n++) // Цикл суммирования значений
{
if(!Percent(Pair21, n, Symbol1)) return;
Symb2 = (Symb2+Symbol1);

}
Buf_1[i]= Symb2/Aver_Bars;



i--; // Расчёт индекса следующего бара
}

//--------------------------------------------------------------------
return (true); // Выход из спец. ф-ии start()
}
//--------------------------------------------------------------------

bool Percent (string Symb, int Bar, double &Result) {

bool RetVal = true;
double open = iOpen(Symb, 0, Bar);
double close = iClose(Symb, 0, Bar);

if(open == 0.0 || close == 0.0)
RetVal = false;
else
Result=(close-open)/(close/100);
return (RetVal);
}
Спасибо огромное, теперь я понял
16.11.2016, 21:41
Лучший ответ
Накопленные выплаты: 209 RUB
Сообщение от ic2d Посмотреть сообщение
Может кто подскажет как вызвать загрузку котировок ?
Чтоб получать котировки, как говорили метаквоты, график можно и не открывать. Главное, чтобы нужный символ присутствовал в списке в окне "Обзор рынка".
  • #1 Свернуть

    Получение котировки другого символа для индикатора (Не видит цены)

    Здравствуйте. Заранее благодарен за любую помощь, подсказку, а так же потраченное вами время!

    Пишу индикатор, в индикаторе на график накладываю график другой валюты, но столкнулся с проблемой, если требуемый символ с требуемым таймфреймом не открывался то получаю нули.
    т.е.:
    MQL код:

    double BClose = iClose(Symb,0,Bar);
    double BOpen = iOpen(Symb,0,Bar);


    Возвращает нули если график не был загружен с таким таймфремом.
    Как быть ? Рылся в документации, не нашел способа загрузить котировки не открывая окна. А открывать окно которое не нужно как-то тоже не очень вариант. Может кто подскажет как вызвать загрузку котировок ?
  • <a href="https://www.instaforex.org/ru/?x=ruforum">InstaForex</a>
  • #2 Свернуть

    Сообщение от ic2d Посмотреть сообщение
    Может кто подскажет как вызвать загрузку котировок ?
    Чтоб получать котировки, как говорили метаквоты, график можно и не открывать. Главное, чтобы нужный символ присутствовал в списке в окне "Обзор рынка".

    Комментарий

    • #3 Свернуть

      Сообщение от ir0407 Посмотреть сообщение
      Чтоб получать котировки, как говорили метаквоты, график можно и не открывать. Главное, чтобы нужный символ присутствовал в списке в окне "Обзор рынка".
      Спасибо огромное за ваш ответ. Интересно, а почему временами тогда котировки не показывает, а выдает нули? Т.е. а таймфрейм поменяешь раз 20, или откроешь пару необходимую то сразу нормально показывает. (Я сделал алерт, что-бы отслеживать это)
      MQL код:

      if(iClose(Symb,0,Bar)==0 || iOpen(Symb,0,Bar)==0)
      {
      Alert("Не хватает котировок пары: "+Symb+" на текущем таймфрейме. Пожалуйста откройте котировки этой пары.");
      }

      Комментарий

      • #4 Свернуть

        Сообщение от ic2d Посмотреть сообщение
        Интересно, а почему временами тогда котировки не показывает, а выдает нули?
        Потому, что может случиться так, что котировок, которые запрашивает iOpen(), по факту может не оказаться в терминале. В этом случае функция возвращает ноль и ошибку 4066 (ERR_HISTORY_WILL_UPDATED), что говорит о том, что запрашиваемых котировок в терминале нет и будет произведена их подкачка с сервера. Если подождать некоторое время(от 2-3 сек и выше, в зависимости от качества интернета и загруженности сервера) и повторить запрос - котировки появятся. Вобщем, при использовании подобных функций, нужна обработка возвращаемых ими ошибок.

        Комментарий

        • #5 Свернуть

          Сообщение от ir0407 Посмотреть сообщение
          Потому, что может случиться так, что котировок, которые запрашивает iOpen(), по факту может не оказаться в терминале. В этом случае функция возвращает ноль и ошибку 4066 (ERR_HISTORY_WILL_UPDATED), что говорит о том, что запрашиваемых котировок в терминале нет и будет произведена их подкачка с сервера. Если подождать некоторое время(от 2-3 сек и выше, в зависимости от качества интернета и загруженности сервера) и повторить запрос - котировки появятся. Вобщем, при использовании подобных функций, нужна обработка возвращаемых ими ошибок.
          Спасибо за очень доступное обьяснение я начинающий, так что да, глупые вопросы задаю.
          Может вы еще сможете подсказать как бороться с этим? Я вначале тоже думал что подгрузит, и сделал цикл while, якобы смотреть этот бар пока результат не будет не нулем. Понятно что вариант не супер, но терминал напрочь завис. Я кажется догадываюсь даже где ошибка, он ушел в цикл настолько, что не осталось ресурсов ПК для загрузки котировок. Как выйти из этой ситуации?

          Комментарий

          • #6 Свернуть

            Сообщение от ic2d Посмотреть сообщение
            Как выйти из этой ситуации?
            Как вариант, например, так:
            MQL код:

            while(True)
            {
            double BOpen = iOpen(Symb, 0, Bar);
            if(BOpen > 0.0) break;
            Sleep(3000);
            }

            Комментарий

            • #7 Свернуть

              Сообщение от ir0407 Посмотреть сообщение
              Как вариант, например, так:
              MQL код:

              while(True)
              {
              double BOpen = iOpen(Symb, 0, Bar);
              if(BOpen > 0.0) break;
              Sleep(3000);
              }

              Индикаторы не разрешают ведь использовать функцию Sleep

              Комментарий

              • #8 Свернуть

                Сообщение от ic2d Посмотреть сообщение
                Индикаторы не разрешают ведь использовать функцию Sleep
                Тогда еще проще:
                MQL код:

                double BOpen = iOpen(Symb, 0, Bar);
                if(BOpen == 0.0) return;

                Комментарий

                • #9 Свернуть

                  Сообщение от ir0407 Посмотреть сообщение
                  Тогда еще проще:
                  MQL код:

                  double BOpen = iOpen(Symb, 0, Bar);
                  if(BOpen == 0.0) return;
                  А это и так в функции к сожалению, и он просто выдаст ноль...Чувствую это так и не решится, просто перезагружать ручками индикатор через 5 минут)

                  Комментарий

                  • #10 Свернуть

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

                    Комментарий

                    • #11 Свернуть

                      Сообщение от ir0407 Посмотреть сообщение
                      В моем случае я имел ввиду выход из OnCalculate(). Т.е. мы просто ждем подгрузки котировок. Если на текущем тике запрашиваемых данных нет, то делать нам нечего и мы просто вываливаемся из индикатора до прихода следующего тика. На нескольких следующих тиках запрашиваемые данные должны будут появится.
                      Извиняюсь сразу, что не уточнил. Это происходит не в текущем баре, а при запуске индикатора, когда он просматривает историю другой валюты и рисует ее

                      Комментарий

                      • #12 Свернуть

                        Сообщение от ic2d Посмотреть сообщение
                        Это происходит не в текущем баре, а при запуске индикатора, когда он просматривает историю другой валюты и рисует ее
                        Блин... А на код глянуть можно? А то долго гадать будем что там где происходит и кто о чем говорит.

                        Комментарий

                        • #13 Свернуть

                          Сообщение от ir0407 Посмотреть сообщение
                          Блин... А на код глянуть можно? А то долго гадать будем что там где происходит и кто о чем говорит.
                          Без проблем может что и подскажите. Я индикатор первый раз пишу, долго уже мучаюсь. На г0внокодил там капитально думаю. Вдруг будут какие подсказки - буду рад выслушать, потому что мне даже приходится указывать количество баров сколько считать в прочем, сами увидите. Вот код



                          MQL код:

                          #property indicator_separate_window // Отображение в отдельном окне
                          #property indicator_buffers 2 // Количество буферов

                          extern int History = 50; // Колич.баров в расчётной истории
                          extern int Aver_Bars = 10; // Количество баров для расчёта
                          extern string str1 = "Первая пара";
                          extern string Pair11 = "EURUSD"; // Пара 1
                          extern string str2 = "Вторая пара";
                          extern string Pair21 = "GBPUSD"; // Пара 2

                          double Buf_0[]; // Объявление индикаторного массива
                          double Buf_1[]; // Объявление индикаторного массива

                          string GroupA, GroupB;
                          //--------------------------------------------------------------------
                          int init() // Специальная функция init()
                          {


                          SetIndexBuffer(0,Buf_0); // Назначение массива буферу
                          SetIndexLabel(0, GroupA);
                          SetIndexStyle (0,DRAW_LINE,STYLE_SOLID,1, clrRed);// Стиль линии
                          SetIndexBuffer(1,Buf_1); // Назначение массива буферу
                          SetIndexLabel(1, GroupB);
                          SetIndexStyle (1,DRAW_LINE,STYLE_SOLID,1, clrAqua);// Стиль линии


                          return (true); // Выход из спец. ф-ии init()
                          }
                          //--------------------------------------------------------------------
                          int start() // Специальная функция start()
                          {
                          int i, // Индекс бара
                          n, // Формальный параметр
                          Counted_bars; // Количество просчитанных баров
                          double
                          Symb1,
                          Symb2,
                          Symbol1; // Сумма значений High за период
                          //--------------------------------------------------------------------
                          Counted_bars=IndicatorCounted(); // Количество просчитанных баров
                          i=Bars-Counted_bars-1; // Индекс первого непосчитанного
                          if (i>History-1) // Если много баров то ..
                          i=History-1; // ..рассчитывать заданное колич.
                          while(i>=0) // Цикл по непосчитанным барам
                          {
                          Symb1=0; // Обнуление в начале цикла
                          for(n=i;n<=i+Aver_Bars-1;n++) // Цикл суммирования значений
                          {
                          Symbol1 = Percent(Pair11, n);
                          Symb1 = (Symb1+Symbol1);

                          }
                          Buf_0[i]= Symb1/Aver_Bars;



                          Symb2=0; // Обнуление в начале цикла
                          for(n=i;n<=i+Aver_Bars-1;n++) // Цикл суммирования значений
                          {
                          Symbol1 = Percent(Pair21, n);
                          Symb2 = (Symb2+Symbol1);

                          }
                          Buf_1[i]= Symb2/Aver_Bars;



                          i--; // Расчёт индекса следующего бара
                          }

                          //--------------------------------------------------------------------
                          return (true); // Выход из спец. ф-ии start()
                          }
                          //--------------------------------------------------------------------

                          double Percent (string Symb, int Bar) {

                          bool OK=true;
                          double Diff;

                          if(iClose(Symb,0,Bar)==0 || iOpen(Symb,0,Bar)==0)
                          {
                          // ОТКЛЮЧЕННО ИЗЗА ФЛУДА ))) Alert("Не хватает котировок пары: "+Symb+" на текущем таймфрейме. Пожалуйста откройте котировки этой пары.");
                          OK=false;
                          Diff = 0;
                          }

                          if(OK==true)
                          {
                          Diff=(iClose(Symb,0,Bar)-iOpen(Symb,0,Bar))/(iClose(Symb,0,Bar)/100);
                          }
                          return (Diff);

                          }




                          В самом конце увидите комментарий где изза флуда убрал алерт...

                          Комментарий

                          • #14 Свернуть

                            Сообщение от ic2d Посмотреть сообщение
                            Вот код
                            Слегка изменил функцию и ее вызов в контексте твоего вопроса. Пробуй...

                            MQL код:

                            #property indicator_separate_window // Отображение в отдельном окне
                            #property indicator_buffers 2 // Количество буферов

                            extern int History = 50; // Колич.баров в расчётной истории
                            extern int Aver_Bars = 10; // Количество баров для расчёта
                            extern string str1 = "Первая пара";
                            extern string Pair11 = "EURUSD"; // Пара 1
                            extern string str2 = "Вторая пара";
                            extern string Pair21 = "GBPUSD"; // Пара 2

                            double Buf_0[]; // Объявление индикаторного массива
                            double Buf_1[]; // Объявление индикаторного массива

                            string GroupA, GroupB;
                            //--------------------------------------------------------------------
                            int init() // Специальная функция init()
                            {


                            SetIndexBuffer(0,Buf_0); // Назначение массива буферу
                            SetIndexLabel(0, GroupA);
                            SetIndexStyle (0,DRAW_LINE,STYLE_SOLID,1, clrRed);// Стиль линии
                            SetIndexBuffer(1,Buf_1); // Назначение массива буферу
                            SetIndexLabel(1, GroupB);
                            SetIndexStyle (1,DRAW_LINE,STYLE_SOLID,1, clrAqua);// Стиль линии


                            return (true); // Выход из спец. ф-ии init()
                            }
                            //--------------------------------------------------------------------
                            int start() // Специальная функция start()
                            {
                            int i, // Индекс бара
                            n, // Формальный параметр
                            Counted_bars; // Количество просчитанных баров
                            double
                            Symb1,
                            Symb2,
                            Symbol1; // Сумма значений High за период
                            //--------------------------------------------------------------------
                            Counted_bars=IndicatorCounted(); // Количество просчитанных баров
                            i=Bars-Counted_bars-1; // Индекс первого непосчитанного
                            if (i>History-1) // Если много баров то ..
                            i=History-1; // ..рассчитывать заданное колич.
                            while(i>=0) // Цикл по непосчитанным барам
                            {
                            Symb1=0; // Обнуление в начале цикла
                            for(n=i;n<=i+Aver_Bars-1;n++) // Цикл суммирования значений
                            {
                            if(!Percent(Pair11, n, Symbol1)) return;
                            Symb1 = (Symb1+Symbol1);

                            }
                            Buf_0[i]= Symb1/Aver_Bars;



                            Symb2=0; // Обнуление в начале цикла
                            for(n=i;n<=i+Aver_Bars-1;n++) // Цикл суммирования значений
                            {
                            if(!Percent(Pair21, n, Symbol1)) return;
                            Symb2 = (Symb2+Symbol1);

                            }
                            Buf_1[i]= Symb2/Aver_Bars;



                            i--; // Расчёт индекса следующего бара
                            }

                            //--------------------------------------------------------------------
                            return (true); // Выход из спец. ф-ии start()
                            }
                            //--------------------------------------------------------------------

                            bool Percent (string Symb, int Bar, double &Result) {

                            bool RetVal = true;
                            double open = iOpen(Symb, 0, Bar);
                            double close = iClose(Symb, 0, Bar);

                            if(open == 0.0 || close == 0.0)
                            RetVal = false;
                            else
                            Result=(close-open)/(close/100);
                            return (RetVal);
                            }

                            Комментарий

                            • <a href="https://www.instaforex.org/ru/?x=ruforum">InstaForex</a>
                            • #15 Свернуть

                              Сообщение от ir0407 Посмотреть сообщение
                              Слегка изменил функцию и ее вызов в контексте твоего вопроса. Пробуй...

                              MQL код:

                              #property indicator_separate_window // Отображение в отдельном окне
                              #property indicator_buffers 2 // Количество буферов

                              extern int History = 50; // Колич.баров в расчётной истории
                              extern int Aver_Bars = 10; // Количество баров для расчёта
                              extern string str1 = "Первая пара";
                              extern string Pair11 = "EURUSD"; // Пара 1
                              extern string str2 = "Вторая пара";
                              extern string Pair21 = "GBPUSD"; // Пара 2

                              double Buf_0[]; // Объявление индикаторного массива
                              double Buf_1[]; // Объявление индикаторного массива

                              string GroupA, GroupB;
                              //--------------------------------------------------------------------
                              int init() // Специальная функция init()
                              {


                              SetIndexBuffer(0,Buf_0); // Назначение массива буферу
                              SetIndexLabel(0, GroupA);
                              SetIndexStyle (0,DRAW_LINE,STYLE_SOLID,1, clrRed);// Стиль линии
                              SetIndexBuffer(1,Buf_1); // Назначение массива буферу
                              SetIndexLabel(1, GroupB);
                              SetIndexStyle (1,DRAW_LINE,STYLE_SOLID,1, clrAqua);// Стиль линии


                              return (true); // Выход из спец. ф-ии init()
                              }
                              //--------------------------------------------------------------------
                              int start() // Специальная функция start()
                              {
                              int i, // Индекс бара
                              n, // Формальный параметр
                              Counted_bars; // Количество просчитанных баров
                              double
                              Symb1,
                              Symb2,
                              Symbol1; // Сумма значений High за период
                              //--------------------------------------------------------------------
                              Counted_bars=IndicatorCounted(); // Количество просчитанных баров
                              i=Bars-Counted_bars-1; // Индекс первого непосчитанного
                              if (i>History-1) // Если много баров то ..
                              i=History-1; // ..рассчитывать заданное колич.
                              while(i>=0) // Цикл по непосчитанным барам
                              {
                              Symb1=0; // Обнуление в начале цикла
                              for(n=i;n<=i+Aver_Bars-1;n++) // Цикл суммирования значений
                              {
                              if(!Percent(Pair11, n, Symbol1)) return;
                              Symb1 = (Symb1+Symbol1);

                              }
                              Buf_0[i]= Symb1/Aver_Bars;



                              Symb2=0; // Обнуление в начале цикла
                              for(n=i;n<=i+Aver_Bars-1;n++) // Цикл суммирования значений
                              {
                              if(!Percent(Pair21, n, Symbol1)) return;
                              Symb2 = (Symb2+Symbol1);

                              }
                              Buf_1[i]= Symb2/Aver_Bars;



                              i--; // Расчёт индекса следующего бара
                              }

                              //--------------------------------------------------------------------
                              return (true); // Выход из спец. ф-ии start()
                              }
                              //--------------------------------------------------------------------

                              bool Percent (string Symb, int Bar, double &Result) {

                              bool RetVal = true;
                              double open = iOpen(Symb, 0, Bar);
                              double close = iClose(Symb, 0, Bar);

                              if(open == 0.0 || close == 0.0)
                              RetVal = false;
                              else
                              Result=(close-open)/(close/100);
                              return (RetVal);
                              }
                              Спасибо огромное, теперь я понял

                              Комментарий

                              X