Общие вопросы по разработке > Как в индикаторе узнать текущую цену

Общие вопросы по разработке в Альфа-Директ 4. Обсуждение разработки пользовательских индикаторов, стратегий.
Владимир
Сообщения: 84
Зарегистрирован: 14 ноя 2016, 02:17
Благодарил (а): 3 раза
Поблагодарили: 5 раз

Как в индикаторе узнать текущую цену

Непрочитанное сообщение Владимир » 25 фев 2017, 19:48

Добрый день!
Как в индикаторе узнать текущую цену?
пробовал GetAsk()/GetBid(), Price() индикатор выдаёт ошибку!!!
Сравнение текущей цены и последнего экстремума максимума/минимума необходимо для сброса сигнала индикатора на открытие позиции в роботе. А если производить эти сравнения в роботе, то получаем в результате открытие позиции ещё на одну позже.

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

Re: Как в индикаторе узнать текущую цену

Непрочитанное сообщение evge » 26 фев 2017, 07:30

В индикаторе функция Evaluate() вызывается в т.ч. и при формировании последнего бара и поэтому прочитать текущую цену можно просто через

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

Input.Close[0]


или если нужно цены лучших заявок из стакана Bid \ Ask, то через GetAsk(), GetBid()

В стратегии \ роботе вызов функции OnUpdate() происходит только 1 раз в начале нового бара, когда полностью сформировался предыдущий бар. В OnUpdate() мы получаем значение полностью сформированного предыдущего бара под индексом [0] и текущая цена доступна точно так же Input1.Close[0], но в отличии от индикатора, при формировании текущего бара, стратегия \ робот не получает никаких данных.
никогда такого не было и вот опять

Владимир
Сообщения: 84
Зарегистрирован: 14 ноя 2016, 02:17
Благодарил (а): 3 раза
Поблагодарили: 5 раз

Re: Как в индикаторе узнать текущую цену

Непрочитанное сообщение Владимир » 27 фев 2017, 10:21

Евгений добрый день!
У меня тогда возникает другой вопрос , а может быть другое явление:
1. Сигнал роботу дан он ждёт пример из лога (работают два робота используя один индикатор поэтому лог двойной)
2017.02.24 16:30:30.844 NaprTrenda - 1PowerTrenda - 70,5426356589195// StopExst - 2094,8
2017.02.24 16:30:30.991 -1- high[0] 2096,7 > high[1] 2095,5// low[0] 2094,8> low[1] 2090,25
2017.02.24 16:30:30.991 NaprTrenda - 1PowerTrenda - 70,5426356589195// StopExst - 2094,8
2017.02.24 16:30:31.357 -1- high[0] 2096,7 > high[1] 2095,5// low[0] 2094,8> low[1] 2090,25
2017.02.24 16:30:31.616 -1- high[0] 2096,7 > high[1] 2095,5// low[0] 2094,8> low[1] 2090,25
2017.02.24 16:30:43.282 -1- high[0] 2096,7 > high[1] 2095,5// low[0] 2094,8> low[1] 2090,25
2017.02.24 16:30:45.457 -1- high[0] 2096,7 > high[1] 2095,5// low[0] 2094,8> low[1] 2090,25
2017.02.24 16:30:48.427 -1- high[0] 2096,7 > high[1] 2095,5// low[0] 2094,8> low[1] 2090,25
2017.02.24 16:30:51.904 -1- high[0] 2096,7 > high[1] 2095,5// low[0] 2094,8> low[1] 2090,25

по логу видно что сигнал повторяется примерно 300-700mS
2. Свеча закрылась робот готов открывать позицию и индикатор даёт сигнал на отмену?
Может ли произойти открытие позиции роботом, а потом приход сигнала индикатора позицию не открывать?
Работая в отделе АСУП (Автоматизирование Системы Управления Производством), точно знаю возможность перекрытия сигнала по бек индикации (какие вещи как инерция, зависящие от массы, или выработка деталей связанные с давлением масла, забивание глушителей распределителей, механические перекосы магнитных пускателей и многое другое), но там большой проблемы не возникает это цепи контроля и они помогают. Но тут противоположная проблема может возникнуть.
Поэтому хочется заранее избежать данной ситуации (надеюсь я понятно описал вопрос)
вот лог из робота он маленький поэтому можно скинуть целиком
2017.02.24 09:06:59.495 EnterLong
2017.02.24 11:35:06.638 EnterLong
2017.02.24 11:35:06.834 EnterLong
2017.02.24 11:39:57.697 EnterLong
2017.02.24 11:39:57.852 EnterLong
2017.02.24 12:40:07.002 EnterShort
2017.02.24 12:40:07.366 EnterShort
2017.02.24 12:45:00.343 EnterShort
2017.02.24 12:45:00.762 EnterShort
2017.02.24 13:09:56.336 EnterShort
2017.02.24 13:09:56.530 EnterShort
2017.02.24 13:14:57.696 EnterShort
2017.02.24 13:14:58.571 EnterShort
2017.02.24 16:30:30.855 EnterLong
2017.02.24 19:02:02.871 EnterLong = 0 стоп по % = 0
2017.02.24 19:02:02.871 EnterShort = 0 стоп по % = 0

Хотелось бы точно знать несколько раньше приходит сигнал с индикатора и когда происходит открытие позиции (в цифрах может это просто производственный морализм от работы как знать, может всё проще!)
где рекомендуется ставить защёлку в индикаторе или в роботе?
"Не в позиции это более сильная позиция чем в позиции" как то так звучала фраза Резвякова, то есть слом тренда как и по Герчику ненада кормить рынок.

Владимир
Сообщения: 84
Зарегистрирован: 14 ноя 2016, 02:17
Благодарил (а): 3 раза
Поблагодарили: 5 раз

Re: Как в индикаторе узнать текущую цену

Непрочитанное сообщение Владимир » 02 мар 2017, 23:46

Добрый день!
В стратегии \ роботе вызов функции OnUpdate() происходит только 1 раз в начале нового бара, когда полностью сформировался предыдущий бар. В OnUpdate() мы получаем значение полностью сформированного предыдущего бара под индексом [0] и текущая цена доступна точно так же Input1.Close[0], но в отличии от индикатора, при формировании текущего бара, стратегия \ робот не получает никаких данных.

У меня вопрос на какую функцию в роботе еще можно использовать в замен функции OnUpdate() . Данная функция является тормозам при создании стратегий с использованием индикаторов. Подтверждение привожу в виде логов по двум роботам с незамедлительным отличием одного робота от другого:

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

/**Версия робота IndTrenda_v2.1
   /// Лонг
   if ( (MY.WolfeWave(Input1, 326, NRepetition).GetValue("NaprTrenda", 0) == 1) && (MY.WolfeWave(Input1, 326, NRepetition).GetValue("PowerTrenda", 0) >= PowerTrenda) )

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

/**Версия робота IndTrenda_v2.3
   /// Лонг
   if ( (MY.WolfeWave(Input1, 326, NRepetition).GetValue("NaprTrenda", 0) == 1) && (MY.WolfeWave(Input1, 326, NRepetition).GetValue("PowerTrenda", 0) >= PowerTrenda) && Input1.Close[0]>StopExst )

то есть разница при открытии позиции перепроверка Input1.Close[0]>StopExst , где StopExst -значение цены последнего лоу.
Часть лога по индикатору
2017.03.01 13:50:03.372 О//NaprTrenda - 1// PowerTrenda - 18,8679245283012// StopExst - 2057,7
2017.03.01 15:40:00.637 О//NaprTrenda - 1// PowerTrenda - 72,6923076923098// StopExst - 2061,4
2017.03.01 15:40:02.042 О//NaprTrenda - 1// PowerTrenda - 72,6923076923098// StopExst - 2061,4
2017.03.01 15:40:27.379 О//NaprTrenda - 1// PowerTrenda - 72,6923076923098// StopExst - 2061,4
2017.03.01 15:40:47.682 О//NaprTrenda - 1// PowerTrenda - 72,6923076923098// StopExst - 2061,4
2017.03.01 15:40:49.079 О//NaprTrenda - 1// PowerTrenda - 72,6923076923098// StopExst - 2061,4
2017.03.01 15:41:29.470 О//NaprTrenda - 1// PowerTrenda - 72,6923076923098// StopExst - 2061,4
2017.03.01 15:41:55.746 О//NaprTrenda - 1// PowerTrenda - 72,6923076923098// StopExst - 2061,4
2017.03.01 15:42:06.751 О//NaprTrenda - 1// PowerTrenda - 72,6923076923098// StopExst - 2061,4
2017.03.01 15:42:08.772 О//NaprTrenda - 1// PowerTrenda - 72,6923076923098// StopExst - 2061,4
2017.03.01 15:42:21.607 О//NaprTrenda - 1// PowerTrenda - 72,6923076923098// StopExst - 2061,4
2017.03.01 15:42:22.980 О//NaprTrenda - 1// PowerTrenda - 72,6923076923098// StopExst - 2061,4
2017.03.01 15:42:50.137 О//NaprTrenda - 1// PowerTrenda - 72,6923076923098// StopExst - 2061,4
2017.03.01 15:42:54.506 О//NaprTrenda - 1// PowerTrenda - 72,6923076923098// StopExst - 2061,4
2017.03.01 15:42:55.866 О//NaprTrenda - 1// PowerTrenda - 72,6923076923098// StopExst - 2061,4
2017.03.01 15:43:20.308 О//NaprTrenda - 1// PowerTrenda - 72,6923076923098// StopExst - 2061,4
2017.03.01 15:43:21.678 О//NaprTrenda - 1// PowerTrenda - 72,6923076923098// StopExst - 2061,4
2017.03.01 15:43:49.495 О//NaprTrenda - 1// PowerTrenda - 72,6923076923098// StopExst - 2061,4
2017.03.01 15:43:49.644 О//NaprTrenda - 1// PowerTrenda - 72,6923076923098// StopExst - 2061,4
2017.03.01 15:44:25.537 О//NaprTrenda - 1// PowerTrenda - 72,6923076923098// StopExst - 2061,4
2017.03.01 15:44:30.800 О//NaprTrenda - 1// PowerTrenda - 72,6923076923098// StopExst - 2061,4
2017.03.01 15:44:38.822 О//NaprTrenda - 1// PowerTrenda - 72,6923076923098// StopExst - 2061,4
2017.03.01 15:44:49.836 О//NaprTrenda - 1// PowerTrenda - 72,6923076923098// StopExst - 2061,4
2017.03.01 15:45:52.348 О//NaprTrenda - 1// PowerTrenda - 72,6923076923098// StopExst - 2061,4
2017.03.01 15:45:52.443 О//NaprTrenda - 1// PowerTrenda - 72,6923076923098// StopExst - 2061,4
2017.03.01 19:10:00.032 О//NaprTrenda - 1// PowerTrenda - 34,9056603773599// StopExst - 2065,9

часть лога "Сообщение роботов"
01.03.2017 16:05:47 Исполнена заявка стоп на уровне 2061,15 IndTrenda_v2.3.1
01.03.2017 16:05:47 Инструмент MMH7 (M5)=ФОРТС. Советник: 0шт (0.0р.) IndTrenda_v2.3.1
01.03.2017 16:05:36 Исполнена заявка стоп на уровне 2061,9 IndTrenda_v2.1.1
01.03.2017 16:05:36 Инструмент MMH7 (M5)=ФОРТС. Советник: 0шт (0.0р.) IndTrenda_v2.1.1
01.03.2017 16:00:05 Установка стопа на уровне 2061,15 IndTrenda_v2.3.1
01.03.2017 15:58:59 Инструмент MMH7 (M5)=ФОРТС. Советник: 1шт (2 063.7р.) IndTrenda_v2.3.1
01.03.2017 15:45:52 Установка стопа на уровне 2061,9 IndTrenda_v2.1.1
01.03.2017 15:45:52 Инструмент MMH7 (M5)=ФОРТС. Советник: 1шт (2 064.0р.) IndTrenda_v2.1.1
01.03.2017 15:45:52 Открытие длинной позиции на 1шт (до максимального количества 1шт). EnterLongLimit 2063,7 IndTrenda_v2.3.1
01.03.2017 15:45:52 Открытие длинной позиции на 1шт (до максимального количества 1шт). EnterLong 2069,6 IndTrenda_v2.1.1

лог по роботу IndTrenda_v2.1.1
2017.03.01 15:45:52.368 EnterLong

Лог по роботу IndTrenda_v2.3.1
2017.03.01 15:45:52.457 EnterLong = 2063,7

Самое интересное получается это время сигнала (по индикатору 15:40:00.637), а по роботам (15:45:52) задержка открытия позиции происходит с задержкой почти на 5-6 минут. Для торгового робота это большая задержка! Почему так сделано совсем непонятно! Индикатор сигналы строит по сформированным свечкам и выдаёт сигнал с небольшой задержкой на начале формирования новой свечи (пример по индикатору 15:40:00.637 пример лога выше), что исключает колебания цены и неоднозначность на открытие позиции по индикаторам. Дальше еще интересней рассматривая картинки и сопоставляя логи (рисунок смонтирован из скринов графиков двух роботов и выделено самое интересное). Оригиналы в архиве. Обратите на время открытия позиций роботами и отображение на графиках они разные (я думаю некорректное), верить надо больше логам.
Вложения
описание для примера.rar
(1.26 МБ) 917 скачиваний
v2.1-3.jpg

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

Re: Как в индикаторе узнать текущую цену

Непрочитанное сообщение evge » 03 мар 2017, 07:01

Если Ваш индикатор рисует сигналы задним числом, то Вы себя обманываете, т.к. это лишь визуально сигнал был на какой-то свечке в истории, индикатор лишь нарисовал этот сигнал (например 5 баров назад), но войти в этой точке задним числом Вы никак не могли. На деле же сигнал Вы обнаружили совсем не в момент этого бара со стрелочкой, а позже (через несколько баров).
никогда такого не было и вот опять

Владимир
Сообщения: 84
Зарегистрирован: 14 ноя 2016, 02:17
Благодарил (а): 3 раза
Поблагодарили: 5 раз

Re: Как в индикаторе узнать текущую цену

Непрочитанное сообщение Владимир » 03 мар 2017, 10:22

Добрый день! Евгений вы немного неправильно сопоставили время или я неправильно или непонятно объяснил.
индикатор выдал сигнал в 2017.03.01 15:40:00.637
робот сигнал получил и ждёт вход по роботам
лог по роботу:
IndTrenda_v2.1.1 2017.03.01 15:45:52.368 EnterLong
IndTrenda_v2.3.1 2017.03.01 15:45:52.457 EnterLong = 2063,7
то есть ждали 5мин 52 сек
лога "Сообщение роботов"
01.03.2017 15:45:52 Открытие длинной позиции на 1шт (до максимального количества 1шт). EnterLongLimit
время совпадает со временем по логам в роботах ( LogData )
А вот отображение на графике не соответствует реальности, также как и "Отчёт" по роботам на картинке видно, что один робот типа открывает позицию закладка "Сигналы"
IndTrenda_v2.1.1 01.03.17 15:45:54 EnterLong
IndTrenda_v2.3.1 01.03.17 15:59:01 EnterLong

У меня вопрос какие функции в роботе могут открывать позицию не теряя время.
В данном примере попали в боковик а могли и войти далеко от точки входа!

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

Re: Как в индикаторе узнать текущую цену

Непрочитанное сообщение evge » 03 мар 2017, 10:43

Владимир писал(а):У меня вопрос какие функции в роботе могут открывать позицию не теряя время.


EnterLongLimit Вы указываете цену исполнения желаемую и она не обязательно может быть близкой к текущей и не факт что исполнится сразу такой ордер.

EnterLong получше, но тоже может не исполнится т.к. цена может уйти пока выставляется ордер на биржу и Ваш ордер будет ожидать возврата цены.

Помочь может выставление ордера по худшей цене чем есть например так

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

EnterLongLimit(GetAsk() - GetPriceSte() * 2);

Здесь мы покупаем у лучшего продавца + 2 шага цены (на всякий случай). 2 можно изменить для надёжности :)

можно и EnterLong, но тогда в роботе необходимо указать некоторое проскальзывание, чтобы ордер с большей вероятностью исполнился.
никогда такого не было и вот опять

Владимир
Сообщения: 84
Зарегистрирован: 14 ноя 2016, 02:17
Благодарил (а): 3 раза
Поблагодарили: 5 раз

Re: Как в индикаторе узнать текущую цену

Непрочитанное сообщение Владимир » 03 мар 2017, 11:02

Евгений! Всё это в роботе реализовано!

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

/**Версия робота IndTrenda_v2.1
Разработчик Владимир
Создаём переменные как в индикаторе
1 - в переменной "NRepetition" задаём число повторяющихся экстремумов (передаём в индикатор)
2 - в переменной "PowerTrenda" задаём минимальное значение коррекции волни в %
3 - в переменная "StopExst" выводит значение экстремума для выставление стопа технического или рассчётного стопа
4 - переменная "NaprTrenda" задаёт направление входа: 0- нет направления, 1 -  лонг, 2 - шорт
5 - переменная "Rstop" значение стопа
6 - переменная "RPbu"  размер при котором разрешён перенос в безубыток
7 - переменная "Tp", 0.6, "Тейк профи %"
8 - переменная "Maxub", -90, максимальная просадка счёта в рублях
9 - переменная "Istop" разрешение выставления заявки на перенос стопа в безубыток
   (0 - безубыток (stop loss + take profit), 1 - стоп)
10 - в переменной "AccelerationSlowdown" задаём минимальное значение ускорения замедления
Открытие позиции:
Лонг/Шорт
1. Переменная:
    "NaprTrenda"= 1 -  лонг последние максимумы и минимумы повышающихся
    "NaprTrenda"= 2 -  шорт последние максимумы и минимумы понижаются
2. Сила тренда по индикатору переменная "PowerTrenda">=50% (характер тренда по Рязвякову)
3. Определяем динамику рынка ускоряется или замедляется (размах волны) "AccelerationSlowdown"
Developed by Владимир;
Algorithm = ТРЕНД;**/

function Initialize()
{
   StrategyName = "IndTrenda_v2.1";
   AddParameter("NRepetition", 1, "", 1);
   AddParameter("PowerTrenda", 50, "", 1);
   AddParameter("StopExst", 0, "", 1);
   AddParameter("Rstop", 0.12, "Размер стопа", 1);
   AddParameter("RPbu", 0.15, "Разрешение переноса в безубыток", 1);
   AddParameter("stop_lossl", -0.01, "Размер безубытка, сдвиг учётной цены %", 1);
   AddParameter("Tp", 2.0, "Тейк профи %", 1);
   AddParameter("Maxub", -90, "Максимальная просадка счёта в рублях", 1);
   AddGlobalVariable("Istop", Types.Int, 0); // "Выставление заявки на стоп"
   AddInput("Input1", Inputs.Candle, 5, true, "MMH7=ФОРТС");
   LongLimit = 1;
   ShortLimit = -1;
   AddChartIndicator("MY.WolfeWave", new Dictionary <string, double>{{"Scan", 326},{"NRepetition", 2}});
}

function OnUpdate()
{
   /// Лонг
   if ( (MY.WolfeWave(Input1, 326, NRepetition).GetValue("NaprTrenda", 0) == 1) && (MY.WolfeWave(Input1, 326, NRepetition).GetValue("PowerTrenda", 0) >= PowerTrenda) )
   {
      EnterLongLimit(GetAsk() - GetPriceSte() * 5);
      //EnterLong();
      StopLoss(0.1, SignalPriceType.DeltaInPercentFromAveragePrice);
      Istop=1;  //выставление стоп заявки
      LogData ("EnterLong",Name);
   }

   /// Шорт
   if ( (MY.WolfeWave(Input1, 326, NRepetition).GetValue("NaprTrenda", 0) == 2) && (MY.WolfeWave(Input1, 326, NRepetition).GetValue("PowerTrenda", 0) >= PowerTrenda) )
   {
      EnterShortLimit(GetBid() + GetPriceSte() * 5);
      //EnterShort();
      StopLoss(0.1, SignalPriceType.DeltaInPercentFromAveragePrice);
      Istop=1;  //выставление стоп заявки
      LogData ("EnterShort",Name);
   }
   /// Перенос в безубыток
   if ( (CurrentPLper() > RPbu) && (CurrentPosition() != 0) && (Istop==1))
   {
      CancelStopLoss();
      //StopLoss(stop_lossl, SignalPriceType.DeltaFromAveragePrice);
      BreakingStop(stop_lossl, Tp, SignalPriceType.DeltaInPercentFromAveragePrice);
   Istop=0; //Выставили stop loss + take profit
   }

   /// Тейк профи
   if ( (CurrentPLper() > Tp) )
   {
      ClosePosition();
   }

   /// Закрытие по максимальному убытку
   if ( (RealizedPL() < Maxub) && (CurrentPosition() != 0) )
   {
      ClosePosition();
      Stop();
      PlaySound(InnerSystemSounds.Exclamation);
   }
}

вопрос по времени входа!
Нужна функция для робота которая открывает позицию сразу при поступлении сигнала, а не та которая ждёт начала открытия следующей свечи.
При торговле если позицию вовремя не открыл потом поздно. Бывает минуту запаздал и всё, обычно позицию вообще рекомендуют открывать за 15 секунд до окончания формирования свечи!!!
Плохо, что вы сами не торгуете, а только программируете. Нюансы можно только понять торгуя.
Последний раз редактировалось Владимир 06 мар 2017, 00:51, всего редактировалось 1 раз.

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

Re: Как в индикаторе узнать текущую цену

Непрочитанное сообщение evge » 03 мар 2017, 11:30

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


Вам нужно разобраться в отличии OnUpdate() в стратегии (роботе) от Evaluate() в индикаторах.

В индикаторе свечка последняя при изменении вызывает Evaluate() индикатора и за 1 свечку сигнал Ваш может 10 раз появится и 10 раз исчезнуть.

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

Поэтому OnUpdate() в стратегиях вызывается только 1 раз после того как бар отрисовался полностью.

Функции в стратегиях которая бы входила внутри бара при его формировании ПО СИГНАЛУ нет (EnterLongLimit, EnterShortLimit, EnterLongStop, EnterShortStop - эти функции исполнятся внутри бара, но не по сигналу, а после него на последующих барах при достижении цены указанной в этих заявках)
никогда такого не было и вот опять

Владимир
Сообщения: 84
Зарегистрирован: 14 ноя 2016, 02:17
Благодарил (а): 3 раза
Поблагодарили: 5 раз

Re: Как в индикаторе узнать текущую цену

Непрочитанное сообщение Владимир » 03 мар 2017, 11:52

Евгений! Дело в том, что сигнал в индикаторе уже сформирован и рассчитан только по значениям закрытых (сформированных) свечей. То есть получается , что использовать индикаторы в роботах невозможно по ограничениям программистов Альфы и как вариант перенос всего индикатора в робот. Что в данном варианте позволит сэкономить целую свечку!
При написании Альфы предлагаю исключить использование DLL ради прикола и в одном листе (юните) :lol:
Нет это конечно юмор, но что тогда делать? Как обойти ограничения.


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

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

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