Общие вопросы по разработке > Цена открытия и стопа на графике

Общие вопросы по разработке в Альфа-Директ 4. Обсуждение разработки пользовательских индикаторов, стратегий.
Jude_Masson
Сообщения: 6
Зарегистрирован: 03 окт 2020, 22:38
Благодарил (а): 2 раза

Цена открытия и стопа на графике

Непрочитанное сообщение Jude_Masson » 09 янв 2021, 15:37

Здравствуйте.
Пробую вывести цену открытия и стопа на график, для удобства просмотра.
В принципе получилось вывести как addlevel и сделать пунктиром.
Или вывести через addseries и можно поставить галочку отображать последние значение.
А вот мечта сделать пунктиром линии, менять цвет зелёный когда в плюс переставлен стоп, красный когда ещё в минусе. И главное вывести значение на графике числом (как при галочке отображать последние значение).
Может быть есть готовые решение и я зря мучаюсь, подскажите.

Вот что я наделал, индикатор:

Код: Выделить всё

function Initialize()
{
   IndicatorName = "OpenStop";
   PriceStudy = true;
   AddInput("Input", Inputs.Price);
   AddSeries("A", DrawAs.Line, Color.DeepSkyBlue);
   AddSeries("OpenStop", DrawAs.Line, Color.Red);
   AddSeries("OpenStop1", DrawAs.Line, Color.Green);
   AddParameter("SPos", 0);
   AddParameter("LS", 0);
//   AddLevel(0, Color.Green, LineStyles.DashBig, 1, "OpenStop");
//   AddLevel(0, Color.DeepSkyBlue, LineStyles.DashBig,1, "A");
}

function Evaluate()
{
   var Position = GetPosition();
   if (Position.Price > 0)
   A = Position.Price;

   if ((LS > 0 && SPos < Position.Price) || (LS < 0 && SPos > Position.Price)) OpenStop = SPos;
   else OpenStop1 = SPos;
}


И вот такое в роботе:

Код: Выделить всё

   AddGlobalVariable("SPos", Types.Double, 0);
   AddGlobalVariable("LS", Types.Double, 0);


if (CurrentPosition() > 0) LS =1;
if (CurrentPosition() < 0) LS =-1;

var orders = GetActiveOrders();
var count = orders.Count;
for (int i = 0;  i < count; i++)
SPos= orders[i].Price;


п.с. Что ещё печально значит в индикаторе var Position = GetPosition(); я могу получить, а var orders = GetActiveOrders(); а это уж нельзя.

Аватара пользователя
evge
Администратор
Сообщения: 1673
Зарегистрирован: 04 фев 2016, 09:46
Откуда: Млечный путь, планета Земля
Благодарил (а): 64 раза
Поблагодарили: 308 раз
Контактная информация:

Re: Цена открытия и стопа на графике

Непрочитанное сообщение evge » 09 янв 2021, 15:54

Приветствую!

Выводите и серию и уровень вместе, задав одинаковые значения.

Но у серии прописать DrawAs.Custom вот так:

Код: Выделить всё

AddSeries("A", DrawAs.Custom, Color.DeepSkyBlue);


её последнее значение всё равно показываться будет на графике, при включенной галочке "последнее значение"

last-value-01.png
last-value-01.png (9.89 КБ) 456 просмотров


Уровень свое последнее значение не показывает, да в настройки индикатора они не выносятся и настроить нельзя. Но будет визуально отображаться вместе с серией DrawAs.Custom.

Цвет для уровня можно взять от серии и настройка (цвета) серии в индикаторе будет влиять на цвет отображаемого уровня.

пример:

Код: Выделить всё

function Initialize()
{
IndicatorName = "_blank";
PriceStudy = true;
AddInput("Input", Inputs.Price);
AddSeries("A", DrawAs.Custom, Color.Red);
AddParameter("Period", 20);
AddLevel(0, Color.DeepSkyBlue, LineStyles.DashBig, 1, "A");
}

function Evaluate()
{
A[0] = 220;
Levels[0].Level = 220;
Levels[0].Color = A.Color;
}


last-value-02.png
last-value-02.png (8.7 КБ) 452 просмотра


тут же и ответ на вопрос про цвет уровня по условию:

Код: Выделить всё

if (...)
Levels[0].Color = Color.Red;
else
Levels[0].Color = Color.Green;


Jude_Masson писал(а):Что ещё печально значит в индикаторе var Position = GetPosition(); я могу получить, а var orders = GetActiveOrders(); а это уж нельзя.


GetActiveOrders() – запрос списка активных заявок по роботу.

GetPosition() - получение текущей позиции по торговому ряду
никогда такого не было и вот опять

Jude_Masson
Сообщения: 6
Зарегистрирован: 03 окт 2020, 22:38
Благодарил (а): 2 раза

Re: Цена открытия и стопа на графике

Непрочитанное сообщение Jude_Masson » 09 янв 2021, 16:14

Спасибо за вашу отзывчивость.
И как всегда не до конца сформулировал вопрос.
Галочку отображать значение нужно ставить постоянно, переключился на один робот, потом на другой и заново ставить.
Можно в коде это прописать сразу или раз я этого не нашёл в инструкции то этого и нет?

Аватара пользователя
evge
Администратор
Сообщения: 1673
Зарегистрирован: 04 фев 2016, 09:46
Откуда: Млечный путь, планета Земля
Благодарил (а): 64 раза
Поблагодарили: 308 раз
Контактная информация:

Re: Цена открытия и стопа на графике

Непрочитанное сообщение evge » 09 янв 2021, 16:21

Jude_Masson писал(а):Спасибо за вашу отзывчивость.
И как всегда не до конца сформулировал вопрос.
Галочку отображать значение нужно ставить постоянно, переключился на один робот, потом на другой и заново ставить.
Можно в коде это прописать сразу или раз я этого не нашёл в инструкции то этого и нет?


Понял, о чем речь.

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

Тут уже проблема с AddChartIndicator у роботов, там нет такой функциональности, задания ещё и настроек отображения серий.
И в AddSeries такого тоже нет, чтоб по умолчанию было активировано :(
никогда такого не было и вот опять

Jude_Masson
Сообщения: 6
Зарегистрирован: 03 окт 2020, 22:38
Благодарил (а): 2 раза

Re: Цена открытия и стопа на графике

Непрочитанное сообщение Jude_Masson » 09 янв 2021, 16:25

Спасибо. Ну хотя бы перестану об этом думать )) А то уже голова кругом.

Jude_Masson
Сообщения: 6
Зарегистрирован: 03 окт 2020, 22:38
Благодарил (а): 2 раза

Re: Цена открытия и стопа на графике

Непрочитанное сообщение Jude_Masson » 09 янв 2021, 18:26

Релиз получился таким, возможно что то можно оптимизировать.

Код: Выделить всё

function Initialize()
{
   IndicatorName = "OpenStop";
   PriceStudy = true;
   AddInput("Input", Inputs.Price);
   AddSeries("A", DrawAs.Custom, Color.DeepSkyBlue);
   AddSeries("OpenStop", DrawAs.Custom, Color.Red);
   AddSeries("OpenStop1", DrawAs.Custom, Color.Green);
   AddParameter("SPos", 0);
   AddParameter("LS", 0);
   AddParameter("AP", 0);

   AddLevel(0, Color.Green, LineStyles.DashBig, 1, "OpenStop");
   AddLevel(0, Color.DeepSkyBlue, LineStyles.DashBig,1, "A");
}

function Evaluate()
{
   if (AP > 0) { A = AP; Levels[1].Level = AP;}
   if ((LS > 0 && SPos < AP) || (LS < 0 && SPos > AP)) {OpenStop = SPos; Levels[0].Color = Color.Red; Levels[0].Level = SPos;}
   if ((LS > 0 && SPos > AP) || (LS < 0 && SPos < AP)) {OpenStop1= SPos; Levels[0].Color = Color.Green; Levels[0].Level = SPos;}
}

И код в роботе. Надеюсь будет видеть только позиции робота.

Код: Выделить всё

function Initialize()
{
   AddGlobalVariable("SPos", Types.Double, 0);
   AddGlobalVariable("LS", Types.Double, 0);
   AddGlobalVariable("AP", Types.Double, 0);
      AddChartIndicator("MY.OpenStop", new Dictionary <string, string>{ {"SPos", "SPos"},{"LS", "LS"},{"AP", "AP"} });
....


...function OnUpdate()

{
......
if (CurrentPosition() > 0) LS =1;
if (CurrentPosition() < 0) LS =-1;
AP = AverPrice();
var orders = GetActiveOrders();
var count = orders.Count;
for (int i = 0;  i < count; i++)
SPos= orders[i].Price;
}


Вернуться в «Общие вопросы по разработке»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 7 гостей