Общие вопросы по разработке > Лимит по числу бумаг

Общие вопросы по разработке в Альфа-Директ 4. Обсуждение разработки пользовательских индикаторов, стратегий.
High Profit Trader
Сообщения: 77
Зарегистрирован: 23 мар 2018, 10:54
Поблагодарили: 2 раза

Лимит по числу бумаг

Непрочитанное сообщение High Profit Trader » 22 июн 2019, 16:51

Всем привет!
Лимиты по числу бумаг задаются в мастере робота.
Но в коде по умолчанию есть команды для этого, которые на практике почему-то не работают - робот все равно берет ручные значения из мастера.

Никто не разобрался случайно, как заставить робота брать значения из кода?

Например так:

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

function Initialize()
{
   StrategyName = "y";
   AddInput("Input1", Inputs.Candle, 1, true, "");
   LongLimit = LotSize()*100;
   ShortLimit = LotSize()*100;

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

Re: Лимит по числу бумаг

Непрочитанное сообщение evge » 22 июн 2019, 17:48

Можно в роботе и тестировании задавать большИе значения для максимальной позиции Long и Short, а в коде использовать расчетным путем нужные максимальные значения.
Открывать позицию задавая Q, с учетом рассчитанной максимальной позиции long и short.
EnterLong(Q), EnterLongLimit(Price, Q) и т.п.

Где Q – Количество, заданное в штуках, которое должно быть кратно лоту.

см. документацию.

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

BugsDigger
Сообщения: 533
Зарегистрирован: 11 ноя 2018, 17:11
Благодарил (а): 21 раз
Поблагодарили: 91 раз

Re: Лимит по числу бумаг

Непрочитанное сообщение BugsDigger » 23 июн 2019, 17:50

отрывок из моего кода.
Sig - сигнал: -1/0/+1 - продавать/закрывать/покупать
Aggression - коэффициент <=1.0 - доля от макс. разрешенной позиции, которой можно оперировать за раз.
cp - текущая позиция, шт.: <0/0/>0 - шорт/пусто/лонг
P - текущая цена (при работе робота по закрытию бара - цена закрытия бара)

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

 if(Sig!=0)
 {
  var FI=GetFinInfo();
   
  if(Sig>0)                               // индикатор пошел в рост
  {
   double AvailMoney=CurrentMoney;           // наличные
   int n=(int)(AvailMoney/P);                // сколько штук можно купить
   n/=FI.Lot;                                // сколько можно купить лотов
   n*=FI.Lot;                                // сколько штук можно купить с учетом лотов
   int ns=(cp<0 ? cp+n : n);                 // сколько из них пойдет в лонг

   int maxAllowed=(int)MaxLongAllowed();
   if(ns>maxAllowed) ns=maxAllowed;
   
   if(ns>0)
   {                                         // будет лонг
    double rate=(cp>0 ? cp/(cp+ns) : 0.0);   // текущий уровень затаривания
    rate+=Aggression; if(rate>=0.95) rate=1.0;
    ns=(int)(ns*rate/FI.Lot);                // лотов с учетом к-та агрессии
    if(ns==0) ns=1;                          // взять как минимум один лот
    ns*=FI.Lot;
    if(ns>maxAllowed) ns=maxAllowed;         // на всякий случай
   }
       
   if(ns>0) EnterLong(ns); else  // закроет шорт, если был, и купит ns; без шорта добавит ns
   if(ns<0) CloseShort(n); else  // сокращение шорта сколько можно (денег на полное закрытие не хватает)
   if(cp<0) CloseShort();         // ns=0: закрытие шорта, если был (денег хватает)
  } else
 
  if(Sig<0)                                // индикатор начал падать
  {
   double AvailMoney=CurrentMoney;           // наличные
   if(cp>0) AvailMoney+=2.0*cp*P;            //  + актив в лонге, доступный для покрытия шорта
   else AvailMoney+=2.0*cp*AverPrice();      //  - пассив для покрытия шорта
           
   int n=(int)(AvailMoney/P);                // сколько всего можно продать
   n/=FI.Lot;                                // сколько можно продать лотов
   n*=FI.Lot;                                // сколько штук можно продать с учетом лотов
   int ns=(cp>0 ? cp-n : -n);                // сколько из них пойдет в шорт
   
   int maxAllowed=(int)MaxShortAllowed();
   if(ns<-maxAllowed) ns=-maxAllowed;

   if(ns<0)
   {                                         // будет шорт
    double rate=(cp<0 ? cp/(cp+ns) : 0.0);   // текущий уровень затаривания
    rate+=Aggression; if(rate>=0.95) rate=1.0;
    ns=(int)(ns*rate/FI.Lot);                // лотов с учетом к-та агрессии
    if(ns==0) ns=-1;                         // продать как минимум один лот
    ns*=FI.Lot;
    if(ns<-maxAllowed) ns=-maxAllowed;       // на всякий случай
   }
     
   if(ns<0) EnterShort(-ns); else  // закроет лонг, если был, и продаст ns; без лонга продаст еще ns
   if(cp>0) CloseLong();             // закрытие лонга (это всегда доступно)
  } // Sig<0
 } // Sig!=0
 /*
 else
 { // Sig==0
  if(cp!=0) ClosePosition();
 } // Sig==0
 */


Как-то так.

High Profit Trader
Сообщения: 77
Зарегистрирован: 23 мар 2018, 10:54
Поблагодарили: 2 раза

Re: Лимит по числу бумаг

Непрочитанное сообщение High Profit Trader » 24 июн 2019, 12:26

Спасибо! Интересно.

Но тогда лимиты робота вообще получаются бессмысленными. В любой реализации.

А хотелось бы все же их иметь. Для защиты от опечатки. Все мы видели драматичные прыжки из-за опечаток. А сколько опечаток просто не заметны на общем графике!

Жалко, что в А-Д лимиты по факту работают только в ручном исполнении.
Причем они могут сыграть злую шутку. Ведь по-умолчанию задается минимальный лимит = 1 лот. Если забыть исправить его руками, то робот запустится неполноценным.
А программно задать лимиты сейчас вообще нельзя, хотя этот функционал и декларируется.

Вообщем, факт в том, что безусловные лимиты - полезная штука. Но их логика в А-Д сейчас явно страдает.


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

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

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