Страница 2 из 2

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

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

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

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] он будет запоминать тот бар который закрылся после моей сделки?

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

Добавлено: 10 июл 2017, 12:01
evge
последний [0], предпоследний [1] и т.д.

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

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

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

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

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]

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

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

Добавлено: 11 июл 2017, 08:07
evge
если кратко

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

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];
}

}

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

Добавлено: 11 июл 2017, 13:13
dkostiunin
Спасибо огромное! Все заработало еще потестирую.

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

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

Добавлено: 11 июл 2017, 13:47
evge
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]);
}


Тогда позиция откроется сразу.

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

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

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

Добавлено: 11 июл 2017, 18:22
evge
Да, верно. Либо дважды добавить при инициализации и не менять условия.

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

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

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

Добавлено: 13 июл 2017, 12:16
dkostiunin
Здравствуйте
Чего то как то не понятно в таком виде код работает.
Запускаешь его в советнике все работает. Причем проверял на разных фьючерсах.
Запускаешь на реальном счете - пишет в диспетчере 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];
}

}

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

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