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

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

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

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

В инструкции по созданию роботов есть описания основных возможностей.
В частности создание и использование глобальных переменных.
А можно ли так же создать и использовать одномерный или двухмерный массив.
Если можно, то какая орфография?
Такие вещи применяющиеся в области инициализации как AddParameter, AddInput, LongLimit и прочее, это вообще откуда?
В описаниях языка C# такого ведь нет, это какие то внутренние функции альфадиректа?
Где есть подробный перечень этих функций?
В файле "скрипты пользователя" кратко описаны нескольо этих функций а есть ли где то подробный перечень этих функций с их описанием?

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

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

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

Из инструкции:

AddGlobalVariable(Name, Types, Value) – функция создания статической переменной, которая сохраняет значение при следующем обращении к функции Evaluate(). В скрипте может быть определено несколько глобальных переменных.
Параметры:
• Name – строка - имя параметра.
• Types – тип переменной
o Int
o Long
o Double
o Boolean
o String
o DateTime
o IntList
o DoubleList

o Dictionary
• Value – значение по умолчанию

Пример. Создания списка

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

...
AddGlobalVariable("DataList", Types.DoubleList); // Создание списка
}

function Evaluate()
{
DataList.Add(Input[0]);
if ( CurrentIndex >= Period )
   DataList.RemoveAt(0);
SMATest = DataList.Average(x => x);
...


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

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

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

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

Спасибо!
Вхожу в позицию частями, и частями выхожу. разница на вход и выход Delta.(код, составленный Дмитрием Ереминым).недостаток кода, что из за Гэпов открытия и закрытия позиций происходят не всегда на дельту. приходится следить за роботом и вручную его перезапускать если произошел такой гэп.
Нужно доработать робот чтоб запоминать, по какой цене были входы в позицию. Для этого поменять тип переменной LastPrice на DoubleList

посмотрите так грамотно будет?
у меня сомнения в правильности применения Add и Remove.
в инструкции из которой Вы привели пример использования для добавления в список используется Add а в Вашем примере Insert
как правильно? пока поставил Add

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

AddGlobalVariable("LastPrice", Types.DoubleList);

function OnUpdate()
{

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

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

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

}

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

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

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

dkostiunin писал(а):в инструкции из которой Вы привели пример использования для добавления в список используется Add а в Вашем примере Insert
как правильно? пока поставил Add


Add добавляем в конец списка, Insert в нужную позицию списка, например в 0 индекс означает, что в начало списка.

MSDN Класс List

по коду,

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

LastPrice.Add(0, Input1.Close[0]);


некорректно, т.к. Add добавляет в конец списка и указание индекса не требуется, см. выше

нужно

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

LastPrice.Add(Input1.Close[0]);


в данном коде последняя цена будет в конце списка по индексу
например, если 10 раз открывалась позиция то по индексу 9(от 0..9) будет последняя цена открытой позиции

количество элементов списка можно получить так:

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

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

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

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

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

Спасибо, завтра попробую.
Интересно, как будет в отчете на странице переменные эта переменная отображаться.
По идее все открытые позиции должны отображаться

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

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

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

Уточнение по моему коду. Посмотрел применение LastPrice.RemoveAt(0);

Если мне нужно чтобы после закрытия последней открытой части позиции переменная становилась равным предпоследнему значению то нужно просто написать
LastPrice.Remove;

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

Чего то я засомневался в том, что выше написал.
В описании Remove написано что будет удалять первое значение. Если так трактовать то LastPrice.RemoveAt(0); и LastPrice.Remove; будут равнозначны.

Значит получается надо писать LastPrice.RemoveAt(0) только вместо нуля использовать значение count.

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

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

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

Можно ли в LastPrice.RemoveAt(0) вместо нуля использовать переменную?
Например
После

CloseLong(Qty);

вставляю

var SumOpen = Lastprice.Count;
Затем LastPrice.RemoveAt(SumOpen);

Так грамотно будет?

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

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

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

индексы идут с 0, а не с 1
что бы удалить последний элемент необходимо
LastPrice.RemoveAt(SumOpen -1);
никогда такого не было и вот опять

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

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

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

к сожалению не компилируется, где то ошибка
во всех строках где есть переменная LastPrice
пишет Имя "LastPrice" отсутствует в текущем контексте At...

общий код такой получился

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

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

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

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

if ( Input1.Close[0] < LastPrice - Delta )
{
EnterLong(Qty);
LastPrice.Add(0, Input1.Close[0]);
}
if ( Input1.Close[0] > LastPrice + Delta)
{
CloseLong(Qty);
var SumOpen = Lastprice.Count;
LastPrice.RemoveAt(SumOpen-1);
}

}

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

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

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

1. Из названия стратегии лучше убрать спецсимволы типа, +, =, пробел и т.д.

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

StrategyName = "AveragePositionBuy+Massiv";


заменить на

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

StrategyName = "AveragePositionBuyMassiv";


2. Неверно определили глоб. переменную списка. Значение по умолчанию задавать не нужно.

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

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


заменить на

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

AddGlobalVariable("LastPrice", Types.DoubleList);


3. Неверно используете список

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

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


к элементу списка необходимо обращаться по индексу, например к последнему элементу так:

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

if (LastPrice[LastPrice.Count - 1] >= 100000000.0 && CurrentPosition() != 0)


4. Неверное задаете значение в списке в первом условии

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

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


LastPrice списку нельзя присвоить AverPrice(), необходимо добавить элемент в список

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

LastPrice.Add(AverPrice());


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

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

LastPrice.Add(0, Input1.Close[0]);


заменить на

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

LastPrice.Add(Input1.Close[0]);


6. Не соблюдаете регистр в наименовании переменных

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

var SumOpen = Lastprice.Count;


Lastprice это не тоже самое что LastPrice - Это две разные переменные, Lastprice, при этом, у вас нигде не определена.

заменить на

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

var SumOpen = LastPrice.Count;


а лучше эту и следующую строку вместе заменить на одну, т.к. непонятно зачем вам здесь лишняя переменная SumOpen.

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

LastPrice.RemoveAt(LastPrice.Count - 1);


7. Получать значение из списка нужно только если он заполнен. Представьте ситуацию, когда в списке у вас нет значений!

LastPrice.Count, при пустом списке, вернет 0
Обращаясь к элементу списка по LastPrice[LastPrice.Count - 1] это тоже самое что LastPrice[-1].

Поэтому надо проверять на наличие элементов в списке перед проверкой элемента

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

if (LastPrice.Count > 0) ...
//и / или
if (LastPrice.Count == 0) ...
никогда такого не было и вот опять


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

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

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