Общие вопросы по разработке > можно ли создать массив

Общие вопросы по разработке в Альфа-Директ 4. Обсуждение разработки пользовательских индикаторов, стратегий.
dkostiunin
Сообщения: 38
Зарегистрирован: 10 июн 2017, 20:50
Благодарил (а): 1 раз

Re: можно ли создать массив

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

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

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

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


Поставил на моэск. Бид был 0.833 аск был 0.836
Lastprice задал начальное значение 0.81 (так покупал).
В итоге закрылась позиция по 0.833 (как и задумано)
Но новый lastprice записался 0.836
Я посмотрел ленту сделок. Предыдущие сделки до моей были как раз по 0.836
Получается если моя сделка произошла то робот запоминает input1.close с предыдущего уде закрытого бара?
Если написать Input1.Close[1] он будет запоминать тот бар который закрылся после моей сделки?

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

Re: можно ли создать массив

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

последний [0], предпоследний [1] и т.д.
никогда такого не было и вот опять

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

Re: можно ли создать массив

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

Не поможете ли еще по двум вопросам.
По поводу "Получать значение из списка нужно только если он заполнен. Представьте ситуацию, когда в списке у вас нет значений! Поэтому надо проверять на наличие элементов в списке перед проверкой элемента "

Может быть два этапа -первый - когда позиция вообще не открыта, робот только запускаешь, в этом случае никаких значений в списке нет, я предполагаю, что можно добавить условие ИЛИ

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

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


второй этап, когда закрывается последняя позиция, в этом случае из списка не надо удалять значение последней позиции

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

if ( Input1.Close[0] > LastPrice[LastPrice.Count-1] + Delta)
{
CloseLong(Qty);
if (CurrentPosition() != 0)
LastPrice.RemoveAt(LastPrice.Count - 1);
}


Так можно сделать?

и второй вопрос - правильно ли я вообще написал Input1.Close[0] < LastPrice[LastPrice.Count-1]

В общем попытался проверить
Код компилируется, но робот не запускается, нажимаешь на пуск, через секунду опять переходит на стоп.
Все равно что то не правильно, чне подскажете, что еще нужно доработать?

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

Re: можно ли создать массив

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

если кратко

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

function Initialize()
{
StrategyName = "AveragePositionBuyMassiv";
AddParameter("Qty", 1, "Qty ", 1);
AddParameter("Delta", 100, "Delta", 1);
AddInput("Input1", Inputs.Candle, 1, true, "");
LongLimit = 0;
ShortLimit = 0;

AddGlobalVariable("LastPrice", Types.DoubleList);
}

function OnUpdate()
{

// если позиция есть, а список пуст. Например, задали позицию при старте стратегии.
if (LastPrice.Count == 0 && CurrentPosition() != 0)
LastPrice.Add(AverPrice());

// если позиции нет и список пуст, то инициализируем список.
if (LastPrice.Count == 0 && CurrentPosition() == 0)
LastPrice.Add(Input1.Close[0]);

int Last = LastPrice.Count - 1;

if ( Input1.Close[0] < LastPrice[Last] - Delta && CurrentPosition() < LongLimit)
{
EnterLong(Qty);
LastPrice.Add(Input1.Close[0]);
}

else

if ( Input1.Close[0] > LastPrice[Last] + Delta && LastPrice.Count > 1)
{
CloseLong(Qty);
LastPrice.RemoveAt(Last);
LastPrice[0] = Input1.Close[0];
}

}
никогда такого не было и вот опять

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

Re: можно ли создать массив

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

Спасибо огромное! Все заработало еще потестирую.

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

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

Re: можно ли создать массив

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

dkostiunin писал(а):Уточнение, если нужно запустить робот, но позиции еще нет, лучше купить первую позицию руками, иначе робот не купит пока. цена на Дельту еще не снизится.


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

Ну я специально не открывал позицию, а задал точку отсчета здесь:

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

// если позиции нет и список пуст, то инициализируем список.
if (LastPrice.Count == 0 && CurrentPosition() == 0)
LastPrice.Add(Input1.Close[0]);


достаточно дополнить (заменить кусок выше):

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

// если позиции нет и список пуст, то инициализируем список.
if (LastPrice.Count == 0 && CurrentPosition() == 0)
{
EnterLong(Qty);
LastPrice.Add(Input1.Close[0]);
}


Тогда позиция откроется сразу.
никогда такого не было и вот опять

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

Re: можно ли создать массив

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

Попробовал так сделать, как в последнем примере, чтоб сразу при запуске робота позиция открывалась.
Где то логика нарушается, пока не могу сообразить где.
Робот позиции открывает но не закрывает.
Это как то связано последним условием строки
if ( Input1.Close[0] > LastPrice[Last] + Delta && LastPrice.Count > 1)
То есть если убрать && LastPrice.Count > 1
То позиции начинают закрываться.
Понятно что после закрытия последней позиции список становится пустой и робот останавливается.
То есть условие какое то нужно будет придумать.

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

Re: можно ли создать массив

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

Да, верно. Либо дважды добавить при инициализации и не менять условия.

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

// если позиции нет и список пуст, то инициализируем список.
if (LastPrice.Count == 0 && CurrentPosition() == 0)
{
EnterLong(Qty);
LastPrice.Add(Input1.Close[0]);
LastPrice.Add(Input1.Close[0]);
}
никогда такого не было и вот опять

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

Re: можно ли создать массив

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

Здравствуйте
Чего то как то не понятно в таком виде код работает.
Запускаешь его в советнике все работает. Причем проверял на разных фьючерсах.
Запускаешь на реальном счете - пишет в диспетчере enterlong - но реально не открывает позицию. Если несколько сигналов подряд, то в отчете переменная в списке так запоминает правильно несколько сигналов. Но реальные позиции на реальном роботе не открываются.
Если присвоить значение начальное (то есть руками открыть, а потом запустить) то работает. Как то странно.

еще погонял на реальных роботах. То ли это альфпдирект глючит, не пойму. Запустил на акции сберпреф и фьючерс MXI оба с начальной позицией. MXI сделки делает. СБер стоит на месте написано что в состянии инициализации, при том что я его запустил с начальным значением цены 129,9 т дельтой 2 - цена уже больше 133 так он и не продал.

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

 Initialize()
{

   StrategyName = "AveragePositionBuyMassiv";
   AddParameter("Qty", 1, "Qty ", 1);
AddParameter("Delta", 0.3, "Delta", 1);
AddInput("Input1", Inputs.Candle, 1, true, "BRQ7=ФОРТС");
LongLimit = 1111;
ShortLimit = -1111;

AddGlobalVariable("LastPrice", Types.DoubleList);
}

function OnUpdate()
{

// если позиция есть, а список пуст. Например, задали позицию при старте стратегии.
if (LastPrice.Count == 0 && CurrentPosition() != 0)
LastPrice.Add(AverPrice());

// если позиции нет и список пуст, то инициализируем список.
if (LastPrice.Count == 0 && CurrentPosition() == 0)
LastPrice.Add(Input1.Close[0]);

int Last = LastPrice.Count - 1;

if ( Input1.Close[0] < LastPrice[Last] - Delta && CurrentPosition() < LongLimit)
{
EnterLong(Qty);
LastPrice.Add(Input1.Close[0]);
}

else

if ( Input1.Close[0] > LastPrice[Last] + Delta && LastPrice.Count > 1)
{
CloseLong(Qty);
LastPrice.RemoveAt(Last);
LastPrice[0] = Input1.Close[0];
}

}

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

Re: можно ли создать массив

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

Для реальной торговли не получается использовать вариант с запоминанием цен на вход.
Робот на mxi который вчера сделки делал днем, вечером завис, и так больше не функционировал.
Остались еще на акции несколько штук, но похоже тоже не вариант.


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

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

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