Любой вопрос новичка, чтоб не захламлять форум. Профи, не проходите мимо. Без вас никуда - 6. - страница 900

 
lufer:
 Это не решает проблему, сейчас вообще как-то странно, видать что-то не верно в OnTick() - когда загружаю в окно терминала советник ничего не происходит, а когда пытаюсь удалить, то очень долго тупит терминал и только потом через некоторое время удаляется. Попробовал вручную присвоить значения нескольким элементам, все нормально. Что-то с циклом инициализации массива судя по всему.

Что значит "не решает"??? Вы в массив инт пихаете данные дабл меньше 1, естественно на выходе нули будут. Ну и цикл корявый был.

Вот такой код должен работать:

#property strict

extern int N=100;                       // Количество баров

double Mas[];                             // Объявление массива
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+

int OnInit()
  { 
    ArrayResize(Mas,N);
     return(INIT_SUCCEEDED);
  }

//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+

void OnDeinit(const int reason)
  {

  }

//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+

void OnTick()
  {                                       
       for(int i=0; i<N; i++)                     // Цикл записи данных
         {                      
    
              Mas[i]=iATR(NULL,0,5,i+1);           // Вычисление значений          
         }
           Print(DoubleToStr(Mas[0],_Digits),"," ,DoubleToStr(Mas[50],_Digits),"," ,DoubleToStr(Mas[99],_Digits));      // Вывод значений
  }
 
evillive:

Что значит "не решает"??? Вы в массив инт пихаете данные дабл меньше 1, естественно на выходе нули будут. Ну и цикл корявый был.

Вот такой код должен работать:

Нет, на счёт double Mas[] вы конечно же абсолютно верно мне подсказали (я почему-то посчитал, что в АТР количество пунктов в целых значениях исчисляется), суть была в том, что значения не выводились даже после изменения типа массива, но уже понял где косяк. Спасибо большое за помощь!
 
Не хочу пока отдельную тему создавать, спрошу тут. В документации к функции OrderSelect указано, что все данные об ордере копируются в "программное окружение". Программное окружение относится только лишь к текущему графику или ко всему терминалу в целом? Спрашиваю, потому что возникла проблема при одновременной работе с несколькими ордерами с разных чартов, на которых установлен один и тот же советник.
 
.roman.:
Не хочу пока отдельную тему создавать, спрошу тут. В документации к функции OrderSelect указано, что все данные об ордере копируются в "программное окружение". Программное окружение относится только лишь к текущему графику или ко всему терминалу в целом? Спрашиваю, потому что возникла проблема при одновременной работе с несколькими ордерами с разных чартов, на которых установлен один и тот же советник.
Данные ордера доступны всем пользовательским программам, запущенным в терминале, где этот ордер открыт.
 
evillive:
Данные ордера доступны всем пользовательским программам, запущенным в терминале, где этот ордер открыт.
Как тогда оградиться от ложного копирования в программное окружение данных другого ордера, который был в то же время выбран с другого чарта?
 
.roman.:
Как тогда оградиться от ложного копирования в программное окружение данных другого ордера, который был в то же время выбран с другого чарта?
Данные разных ордеров не пересекаются никак, ограждаться не от чего.
 
evillive:
Данные разных ордеров не пересекаются никак, ограждаться не от чего.

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

Конкретно моя проблема заключалась в том, что несмотря на исключительное сравнение OrderSymbol и Symbol в функции OrderSelect возникала проблема, когда с графика одной пары могли появиться данные(время открытия ордера, цена открытия и т.п.) совсем другой. То есть, меня интересует вопрос, возможна ли ситуация, когда во время работы функции OrderSelect советника на паре, допустим, EURUSD, на другой паре советник так же начнёт работать с функцией OrderSelect и в "программное окружение" загрузятся данные об ордере от последнего вызова данной функции?

 
.roman.:

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

Конкретно моя проблема заключалась в том, что несмотря на исключительное сравнение OrderSymbol и Symbol в функции OrderSelect возникала проблема, когда с графика одной пары могли появиться данные(время открытия ордера, цена открытия и т.п.) совсем другой. То есть, меня интересует вопрос, возможна ли ситуация, когда во время работы функции OrderSelect советника на паре, допустим, EURUSD, на другой паре советник так же начнёт работать с функцией OrderSelect и в "программное окружение" загрузятся данные об ордере от последнего вызова данной функции?

Нужен код. Ошибка в нем
 
.roman.:

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

Конкретно моя проблема заключалась в том, что несмотря на исключительное сравнение OrderSymbol и Symbol в функции OrderSelect возникала проблема, когда с графика одной пары могли появиться данные(время открытия ордера, цена открытия и т.п.) совсем другой. То есть, меня интересует вопрос, возможна ли ситуация, когда во время работы функции OrderSelect советника на паре, допустим, EURUSD, на другой паре советник так же начнёт работать с функцией OrderSelect и в "программное окружение" загрузятся данные об ордере от последнего вызова данной функции?

У каждого ордера есть уникальные параметры, которые поволяют однозначно отличить его от других. Это тикет и время открытия (закрытия, если ищем в истории). Они неповторимы в пределах одного  торгового счёта, как рисунок сетчатки глаза. 

Недостаточно выбрать ордер  функцией OrderSelect, нужно ещё проверить, тот ли это ордер мы выбрали, или надо выбрать следующий.

 
Vinin:
Нужен код. Ошибка в нем
for(int i=OrdersTotal()-1;i>=0;i--)
        {
            if(OrderSelect(i,SELECT_BY_POS) && OrderSymbol()==Symbol() && OrderMagicNumber()==magic)
               {
                  if(OrderType()==OP_BUY)
                     {
                        double openPrice = 0;
                        openPrice = OrderOpenPrice();
                        if(Ask>openPrice)
                           {
                              Print("OrderSymbol ",OrderSymbol()," OrderTicket ",OrderTicket()," OrderOpenPrice ",OrderOpenPrice());
                           }
                     }
                  if(OrderType()==OP_SELL)
                     {
                        double openPrice = 0;
                        openPrice = OrderOpenPrice();
                        if(Bid<openPrice)
                           {
                              Print("OrderSymbol ",OrderSymbol()," OrderTicket ",OrderTicket()," OrderOpenPrice ",OrderOpenPrice());
                           }
                     }
               }
        }

Ненужные расчёты (не относящиеся к проблеме) убрал. Специально для отображения косяка были дописаны в код принты. Несмотря на сравнение символа ордера с символом, на котором открыт советник, может выдать вот это (с ози чарта брать данные ордера по евро, например, как в данном случае):


Причина обращения: