Вопросы от начинающих MQL5 MT5 MetaTrader 5 - страница 817

 
pivomoe:

Вы объяснили, как готовить CPositionInfo. Хотя, я так и не понял, двух вещей:

1) Как этот рецепт следует из справки по классу CPositionInfo ?

2) Нафига нужен сам класс если больше одного объекта нормально использовать нельзя, ведь перед каждым доступом к свойству позиции нужно настраивать на позицию с помощью метода Select, а то вдруг мы в каком нибудь другом месте когда, использовали  метод Select для другого объекта CPositionInfo.

1). Всё это есть в справке. Усидчивость и внимательность плюс самостоятельное написание даст понимание. 
2). Ещё раз: класс CPositionInfo это не шкатулка в которой хранятся все данные всех позиций, это просто удобный инструмент доступа к свойствам позиции. 

И так было всегда: сначала позицию выделяем, потом получаем её свойства. После этого цикл повторяется: выделили позицию и только потом получаем свойства позиции.
 

Я не понимаю, в чем моя ошибка в использовании справки.

1) Мне понадобился объем позиции в программе.

2) Через поиск я нашел метод Volume из класса CPositionInfo.

3) В нем есть ссылка на использовании метода Select перед вызовом Volume.

4) В описании метода Select не каких ссылок нет. На всякий случай изучаю описание класса CPositionInfo.

5) Пишу код. Получаю результат не следующий из справки.


Где ошибка ?

Еще раз про выбор позиции, ордера, перед доступом к свойствам я знаю. Но эти знания и знания по CPositionInfo в справке  не пересекаются.

 
pivomoe:

Где ошибка ?

Если научитесь писать более подробно, вам будет виднее где ошибаетесь.

Попробуйте написать так :

CPositionInfo PositionInfoKotiryemii,PositionInfoVedygii;
double Volume1=0; Volume2=0;
string Symbol1=""; Symbol2="";

if ( PositionInfoVedygii.Select("SBRF-12.17") ) // Select 1
{ Volume1=PositionInfoVedygii.Volume(); Symbol1=PositionInfoVedygii.Symbol(); } // Use 1
else Print("Не удалось выбрать позицию по символ SBRF-12.17 ");

if ( PositionInfoKotiryemii.Select("SBRF-3.18") ) // Select 2
{ Volume2=PositionInfoKotiryemii.Volume(); Symbol2=PositionInfoKotiryemii.Symbol(); } // Use 2
els Print("Не удалось выбрать позицию по символ SBRF-3.18 ");
 
Print(Symbol2," Объем ",Volume2," ",Symbol1," Объем ",Volime1);
 
pivomoe:

Я не понимаю, в чем моя ошибка в использовании справки.

1) Мне понадобился объем позиции в программе.

2) Через поиск я нашел метод Volume из класса CPositionInfo.

3) В нем есть ссылка на использовании метода Select перед вызовом Volume.

4) В описании метода Select не каких ссылок нет. На всякий случай изучаю описание класса CPositionInfo.

5) Пишу код. Получаю результат не следующий из справки.


Где ошибка ?

Еще раз про выбор позиции, ордера, перед доступом к свойствам я знаю. Но эти знания и знания по CPositionInfo в справке  не пересекаются.


Блок кода, который обходит все позиции и распечатывает информацию, аналогичную в терминале во вкладке "Торговля":

   for(int i=PositionsTotal()-1;i>=0;i--)
      if(m_position.SelectByIndex(i)) // selects the position by index for further access to its properties
        {
         string str_position_type=(m_position.PositionType()==POSITION_TYPE_BUY)?"buy":"sell";
         Print(m_position.Symbol()+" | "+
               IntegerToString(m_position.Ticket())+" | "+
               TimeToString(m_position.Time(),TIME_DATE|TIME_MINUTES|TIME_SECONDS)+" | "+
               str_position_type+" | "+
               DoubleToString(m_position.Volume(),2)+" | "+
               DoubleToString(m_position.PriceOpen(),2));

}

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

 
pivomoe:

Получается, что никакого смысла в классе CPositionInfo нет т.к нормально, можно работать только с одним объектом этого класса.

Да, это обертка.
 

Ivan Ivanov, Vladimir Karputov, fxsaber спасибо за помощью.

 

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

Вопросы:

1. На какую глубину истории производятся вычисления в этих индикаторах?

2. Существует ли способ ограничить глубину вычислений?
В данном случае нужны всего несколько последних значений для определения перегиба или направления вверх/вниз.
Эксперт мультивалютный, индикаторов десятки, поэтому есть нужда не делать лишних вычислений.

 
User_mt5:

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

Вопросы:

1. На какую глубину истории производятся вычисления в этих индикаторах?

2. Существует ли способ ограничить глубину вычислений?
В данном случае нужны всего несколько последних значений для определения перегиба или направления вверх/вниз.
Эксперт мультивалютный, индикаторов десятки, поэтому есть нужда не делать лишних вычислений.


Надеюсь Вы хендлы индикатор создаёте ОДИН раз в OnInit()?

Глубина расчёта - всё зависит от самого индикатора. Редкие индикаторы принудительно ограничивают глубины - как правило все считают на всю историю. Поэтому Вам, возможно, пригодится такой вариант: в индикаторе ввести переменную отвечающую за глубину и затем в советнике, через iCustom, передавать этот параметр.

 
Vladimir Karputov:

Надеюсь Вы хендлы индикатор создаёте ОДИН раз в OnInit()?

Глубина расчёта - всё зависит от самого индикатора. Редкие индикаторы принудительно ограничивают глубины - как правило все считают на всю историю. Поэтому Вам, возможно, пригодится такой вариант: в индикаторе ввести переменную отвечающую за глубину и затем в советнике, через iCustom, передавать этот параметр.

1. Да, я понимаю, что по-хорошему это делается один раз в ините. Но вопрос в том, что входные параметры индикаторов могут меняться. Например, в спектральном анализе вычисляются резонансные частоты, результатом расчётов является период используемой МА. И если запрашивать данные МА для новой размерности, то это - новый хэндл. Практически частоты меняются же не на каждом баре, поэтому достаточно долго (~ минуты) в расчётах используется один и тот же хэндл МА. Но всё равно наступает момент, когда хэндл меняется. И тогда мне нужно либо кучу хэндлов юзать, либо использовать один хэндл, но периодически его пересчитывать. Вот здесь-то и нужна экономия.

2. iCustom я освоил. Но как ограничить глубину расчётов в самом индикаторе? В технических - никак. Видимо, придётся понасоздавать кучу пользовательских клонов тех. индикаторов. Это противно, конечно, но должно быть эффективно. Спасибо за совет. Хорошая идея. Спасибо.

 
User_mt5:

1. Да, я понимаю, что по-хорошему это делается один раз в ините. Но вопрос в том, что входные параметры индикаторов могут меняться.

Разработчики могут написать СБ, в которой с индикаторами можно без потери эффективности работать в MQL4-стиле. Т.е. все кеши и хендлы спрятаны в СБ.