Стратегии и роботы > Возможно ли создать робота с алгоритмом маркетмейкера

Обсуждение, описание стратегий и роботов, идеи для стратегий
dkostiunin
Сообщения: 38
Зарегистрирован: 10 июн 2017, 20:50
Благодарил (а): 1 раз

Возможно ли создать робота с алгоритмом маркетмейкера

Непрочитанное сообщение dkostiunin » 10 июн 2017, 21:02

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

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

Re: Возможно ли создать робота с алгоритмом маркетмейкера

Непрочитанное сообщение evge » 10 июн 2017, 21:36

Да, есть функции получения лучшего bid, лучшего ask из стакана на момент их вызова.
Конечно такие функции в роботе будут работать только в живую, т.к. на истории никакого стакана нет, эти функции вернут цену закрытия.

Функции работы с ценой

GetAsk() – функция возвращает лучший аск в очереди заявок.
GetBid() – функция возвращает лучший бид в очереди заявок.
GetLast() – функция возвращает цену последней сделки на момент вызова.
никогда такого не было и вот опять

dkostiunin
Сообщения: 38
Зарегистрирован: 10 июн 2017, 20:50
Благодарил (а): 1 раз

Re: Возможно ли создать робота с алгоритмом маркетмейкера

Непрочитанное сообщение dkostiunin » 10 июн 2017, 22:11

Спасибо за ответ.
Если возможно, еще два вопроса.
1. Эти функции с помощью конструктора роботов можно использовать, или их надо в код будет вставить( опыта в создании роботов нет пока)
2. Есть ли возможность при выставления заявки учитывать и объем заявок в стакане (например , выставить заявку перед лучшей ценой с обьемом 10 лотов)?

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

Re: Возможно ли создать робота с алгоритмом маркетмейкера

Непрочитанное сообщение evge » 11 июн 2017, 08:26

dkostiunin писал(а):1. Эти функции с помощью конструктора роботов можно использовать, или их надо в код будет вставить( опыта в создании роботов нет пока)


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

Полезно изучать чужой код и код из библиотеки индикаторов, здесь на сайте в соответствующем разделе и разделе пользовательских индикаторов или загрузив индикаторы из библиотеки, непосредственно в АД4.

В скриптах синтаксис C#, скриптовый язык сильно ограниченный. Поверьте, там всё довольно просто :)

dkostiunin писал(а):2. Есть ли возможность при выставления заявки учитывать и объем заявок в стакане (например , выставить заявку перед лучшей ценой с обьемом 10 лотов)?


Параметров у функций нет, т.е. объем они не учитывают, а просто возвращают лучшую цену ask, bid.

Может быть какие-то изменения будут в новых версиях ад и в данной части. Периодически скачивать документацию на сайте alfadirect.ru, она может измениться.

"справочник" по функциям языка в этом документе

Терминал 4.0. Скрипты пользовательских индикаторов и стратегий

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

dkostiunin
Сообщения: 38
Зарегистрирован: 10 июн 2017, 20:50
Благодарил (а): 1 раз

Re: Возможно ли создать робота с алгоритмом маркетмейкера

Непрочитанное сообщение dkostiunin » 12 июн 2017, 23:13

Подскажите пожалуйста
Надо выставить трейлинг стоп на 0,1% ниже открытой позиции, если цена спроса выше цены открытой позиции на 1%
Такой код не работает

что я не правильно делаю?

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

if ( GetBid()=(CurrentPLper() > 1) )
   {
      TrailingStopLoss(0.1, SignalPriceType.DeltaInPercentFromAveragePrice);
   }

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

Re: Возможно ли создать робота с алгоритмом маркетмейкера

Непрочитанное сообщение evge » 13 июн 2017, 06:41

dkostiunin писал(а):Подскажите пожалуйста
Надо выставить трейлинг стоп на 0,1% ниже открытой позиции, если цена спроса выше цены открытой позиции на 1%
Такой код не работает

что я не правильно делаю?

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

if ( GetBid()=(CurrentPLper() > 1) )
   {
      TrailingStopLoss(0.1, SignalPriceType.DeltaInPercentFromAveragePrice);
   }


Цена открытой позиции AverPrice() - учетная цена
GetBid() - возвращает цену лучшего bid
"=" - это присваивание
"==" - сравнение

Если речь о Long

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

if ( CurrentPosition() > 0 && GetBid() >= AverPrice() + AverPrice() * 0.01 * 1 )
{
      TrailingStopLoss(0.1, SignalPriceType.DeltaInPercentFromAveragePrice);
}


Здесь * 1 - 1%, можно подставить параметр или нужную константу

формула такого вида лишь для наглядности, понимания и удобства использования т.к. конкретно можно указать процент числом (параметром)

конечно можно было проще написать так

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

if ( CurrentPosition() > 0 && GetBid() >= AverPrice() * 1.01 )
{
      TrailingStopLoss(0.1, SignalPriceType.DeltaInPercentFromAveragePrice);
}


что равнозначно, но процент задавать придётся через 1.01 - 1%, 1.05 - 5% и т.д.

здесь в коде нет проверки на выставление ранее стопа. Так что ещё это необходимо, хотя стоп перевыставлятся не должен, но лишние действия будут происходить постоянно на каждом баре при >= %
никогда такого не было и вот опять

dkostiunin
Сообщения: 38
Зарегистрирован: 10 июн 2017, 20:50
Благодарил (а): 1 раз

Re: Возможно ли создать робота с алгоритмом маркетмейкера

Непрочитанное сообщение dkostiunin » 13 июн 2017, 11:08

спасибо за разъяснение.
Если не сложно посмотрите пожалуйста код стратегии AveragePositionBuy
Я попытался переделать на шорт, откомпилировалось, потестировал на истории - работает
Запустил сейчас роботов на двух разных субсчетах (одного в шорт другого лонг) - лонг работает, шорт - позиции не открывает.

кусок оригинала лонга

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

    if (LastPrice >= 100000000.0 && CurrentPosition() != 0)
        LastPrice = AverPrice();

   if ( Input1.Close[0] < LastPrice - Delta )
   {
      EnterLong(Qty);
        LastPrice =  Input1.Close[0];
   }

   if ( Input1.Close[0] > LastPrice + Delta)
    {
       CloseLong(Qty);
         LastPrice =  Input1.Close[0];
    }


переделал на шорт изменив знаки

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

if (LastPrice >= 100000000.0 && CurrentPosition() != 0)
        LastPrice = AverPrice();

   if ( Input1.Close[0] > LastPrice + Delta )
   {
      EnterShort(Qty);
        LastPrice =  Input1.Close[0];
   }

   if ( Input1.Close[0] < LastPrice - Delta)
    {
       CloseShort(Qty);
         LastPrice =  Input1.Close[0];
    }

в роботе инструмент поставил один фьючерс газпрома, настройки (таймфрейм и пр.) все сделал одинаково, но в шорт не открывает позицию
что то упустил?

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

Re: Возможно ли создать робота с алгоритмом маркетмейкера

Непрочитанное сообщение evge » 13 июн 2017, 12:51

dkostiunin писал(а):но в шорт не открывает позицию


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

dkostiunin
Сообщения: 38
Зарегистрирован: 10 июн 2017, 20:50
Благодарил (а): 1 раз

Re: Возможно ли создать робота с алгоритмом маркетмейкера

Непрочитанное сообщение dkostiunin » 13 июн 2017, 13:53

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

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

на всякий случай вот полный код

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

function Initialize()
{

   StrategyName = "AverageSell";
   AddParameter("Qty", 1, "Qty ", 1);
   AddParameter("Delta", 100, "Delta", 1);

   AddInput("Input1", Inputs.Candle, 1, true, "");
   LongLimit = 0;
   ShortLimit = 0;

   AddGlobalVariable("LastPrice", Types.Double, 100000000.0);

}

function OnUpdate()
{

    if (LastPrice >= 100000000.0 && CurrentPosition() != 0)
        LastPrice = AverPrice();

   if ( Input1.Close[0] > LastPrice + Delta )
   {
      EnterShort(Qty);
        LastPrice =  Input1.Close[0];
   }

   if ( Input1.Close[0] < LastPrice - Delta)
    {
       CloseShort(Qty);
         LastPrice =  Input1.Close[0];
     }

}

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

Re: Возможно ли создать робота с алгоритмом маркетмейкера

Непрочитанное сообщение evge » 13 июн 2017, 14:54

Теперь понятно.

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

AddGlobalVariable("LastPrice", Types.Double, 100000000.0);


замените на

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

AddGlobalVariable("LastPrice", Types.Double, 0.0);


т.к. при первом варианте никогда не исполнится открытие позиции

а так же

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

if (LastPrice >= 100000000.0 && CurrentPosition() != 0)


на

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

if (LastPrice == 0.0 && CurrentPosition() != 0)
никогда такого не было и вот опять


Вернуться в «Стратегии и роботы»

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

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