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

 
evillive:

С чего бы лишнюю переменную? Прекрасно работает прямая проверка:

Переменную заводить нужно, когда необходимо видеть значение функции из разных точек программы, чтобы не вызывать её несколько раз.
Переменная для того, чтобы новичку было более понятно. Теперь понятно для чего?
 
Vinin:
Чаще заглядывайте. Меньше вопросов будет. Лучше знания будут. 
игнор.
 

Доброго времени суток. Нужно каким-то образом закрывать позицию в конце дня (сугубо экспертинг; дневные бары). Моделирование происходит либо по открытиям, либо по тикам. Т.е. мы либо довольствуемся открытиями, либо кувыркаемся через голову, пытаясь на каком-нибудь 15мин таймфрейме проанализировать предыдущие дни и отловить начало и конец текущего. Есть какие-либо решения данной проблемы? Я вижу несколько виртуально-гипотетических вариантов:

1) Хакерско-читерское закрытие позиции в по любой цене и в любое время. Пусть нечестно, но зато можно было бы без извращений просто задним числом закрывать позицию по нужной цене.

2) Моделирование по открытиям и закрытиям в рамках одного бара. Т.е. сначала тик-открытие, затем тик-закрытие.

3) Выставление ордера, автоматом закрывающегося в определенное время (т.е. в конце дня). 

Буду благодарен за какую-либо помощь. Спасибо.

 

Баг?

 

int OnInit()
  {
   int subwindow = ChartWindowFind(ChartID(),WindowExpertName());
   Print("Подокно запрашиваемого индикатора: ",subwindow);
   
   return(INIT_SUCCEEDED);
  }

int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
   return(rates_total);
  }


2015.04.13 20:51:10.710 indi AUDJPY,H1: Подокно запрашиваемого индикатора: -1


 
tuner:

Баг?

 


2015.04.13 20:51:10.710 indi AUDJPY,H1: Подокно запрашиваемого индикатора: -1


Нет, не баг.

Возвращаемое значение

Номер подокна в случае удачи. Ноль означает главное окно графика. В случае неудачи возвращает -1.

 
AlexeyVik:

Нет, не баг.


А в чем заключается неудача если функции передается ID текущего графика, на котором запущен индикатор, и имя текущего индикатора, который запущен на текущем графике?
 
tuner:
А в чем заключается неудача если функции передается ID текущего графика, на котором запущен индикатор, и имя текущего индикатора, который запущен на текущем графике?

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

Тестовый код (добавила несколько строк в ваш):

#define LINE    __LINE__,": "
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
   int subwindow=ChartWindowFind(ChartID(),WindowExpertName());
   Print(LINE,"Подокно запрашиваемого индикатора: ",subwindow);
   
   int subwindow1=ChartWindowFind();
   Print(LINE,"Подокно запрашиваемого индикатора: ",subwindow1);

   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
   return(rates_total);
  }
//+------------------------------------------------------------------+

В справке к функции ChartWindowFind() есть пример хороший ещё на эту тему (в том числе, в плане имеющихся там комментариев):

//+------------------------------------------------------------------+
//| Сообщает номер окна графика с указанным индикатором              |
//+------------------------------------------------------------------+
int GetIndicatorSubWindowNumber(long chartID=0,string short_name="")
  {
   int window=-1;
//--- 
   if((ENUM_PROGRAM_TYPE)MQLInfoInteger(MQL_PROGRAM_TYPE)==PROGRAM_INDICATOR)
     {
      //--- функция вызвана из индикатора,имя не требуется
      window=ChartWindowFind();
     }
   else
     {
      //--- функция вызвана из эксперта или скрипта
      window=ChartWindowFind(0,short_name);
      if(window==-1) Print(__FUNCTION__+"(): Error = ",GetLastError());
     }
//---
   return(window);
  }
 
DiPach:

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

Тестовый код (добавила несколько строк в ваш):

В справке к функции ChartWindowFind() есть пример хороший ещё на эту тему (в том числе, в плане имеющихся там комментариев):

Благодарю за подсказку, но у меня стоит немного другая задача, из-за чего использование 2-го варианта функции не имеет смысла: я хочу посчитать количество индикаторов с указанным именем на всех открытых графиках терминала. Задача уже решена, но хотелось упростить получившийся код благодаря использованию функции ChartWindowFind() первого варианта, а оказалось что эта функция не работает не только с другими окнами, но и даже с текущим, вот я и спрашиваю баг ли это, имеет ли смысл писать в сервис деск или я чего то не учел и все работает как задумано?
 

Добрый вечер!

Никак не врублюсь: в функции start компилятор требует "return" - function must return a value".

Какое value я must return в данном случае?:

 int start()                                      
        {
            if (Orders!=0||Ord > 0)               
             {
             CritCloseBuy();
             CritCloseSell();                                               
             }
               else
                  {
                  CritOpen();           
                  }
           return;
         }

Может из-за этого OrderClose() не видит открытой позиции

 
rapid_minus:

Добрый вечер!

Никак не врублюсь: в функции start компилятор требует "return" - function must return a value".

Какое value я must return в данном случае?:

 int start()                                      

Может из-за этого OrderClose() не видит открытой позиции? 

сделай void start() и ошибки не будет