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

 

Доброго времени суток. Нужно каким-то образом закрывать позицию в конце дня (сугубо экспертинг; дневные бары). Моделирование происходит либо по открытиям, либо по тикам. Т.е. мы либо довольствуемся открытиями, либо кувыркаемся через голову, пытаясь на каком-нибудь 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() и ошибки не будет
 
tuner:
сделай void start() и ошибки не будет
Спасибо! Ошибка исчезла, но позиция все равно не закрывается.
 
rapid_minus:
Спасибо! Ошибка исчезла, но позиция все равно не закрывается.
Недостаточно кода чтобы точно сказать в чем причина