Общие вопросы по разработке > можно ли создать массив
-
- Сообщения: 38
- Зарегистрирован: 10 июн 2017, 20:50
- Благодарил (а): 1 раз
можно ли создать массив
В инструкции по созданию роботов есть описания основных возможностей.
В частности создание и использование глобальных переменных.
А можно ли так же создать и использовать одномерный или двухмерный массив.
Если можно, то какая орфография?
Такие вещи применяющиеся в области инициализации как AddParameter, AddInput, LongLimit и прочее, это вообще откуда?
В описаниях языка C# такого ведь нет, это какие то внутренние функции альфадиректа?
Где есть подробный перечень этих функций?
В файле "скрипты пользователя" кратко описаны нескольо этих функций а есть ли где то подробный перечень этих функций с их описанием?
В частности создание и использование глобальных переменных.
А можно ли так же создать и использовать одномерный или двухмерный массив.
Если можно, то какая орфография?
Такие вещи применяющиеся в области инициализации как AddParameter, AddInput, LongLimit и прочее, это вообще откуда?
В описаниях языка C# такого ведь нет, это какие то внутренние функции альфадиректа?
Где есть подробный перечень этих функций?
В файле "скрипты пользователя" кратко описаны нескольо этих функций а есть ли где то подробный перечень этих функций с их описанием?
- evge
- Администратор
- Сообщения: 1813
- Зарегистрирован: 04 фев 2016, 09:46
- Откуда: Млечный путь, планета Земля
- Благодарил (а): 83 раза
- Поблагодарили: 367 раз
- Контактная информация:
Re: можно ли создать массив
Из инструкции:
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(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);
...
Так же можно примеры использования посмотреть в скриптах индикаторов, стратегий.
Например в этой теме есть пример использования
никогда такого не было и вот опять
-
- Сообщения: 38
- Зарегистрирован: 10 июн 2017, 20:50
- Благодарил (а): 1 раз
Re: можно ли создать массив
Спасибо!
Вхожу в позицию частями, и частями выхожу. разница на вход и выход Delta.(код, составленный Дмитрием Ереминым).недостаток кода, что из за Гэпов открытия и закрытия позиций происходят не всегда на дельту. приходится следить за роботом и вручную его перезапускать если произошел такой гэп.
Нужно доработать робот чтоб запоминать, по какой цене были входы в позицию. Для этого поменять тип переменной LastPrice на DoubleList
посмотрите так грамотно будет?
у меня сомнения в правильности применения Add и Remove.
в инструкции из которой Вы привели пример использования для добавления в список используется Add а в Вашем примере Insert
как правильно? пока поставил Add
Вхожу в позицию частями, и частями выхожу. разница на вход и выход 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
- Администратор
- Сообщения: 1813
- Зарегистрирован: 04 фев 2016, 09:46
- Откуда: Млечный путь, планета Земля
- Благодарил (а): 83 раза
- Поблагодарили: 367 раз
- Контактная информация:
Re: можно ли создать массив
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
никогда такого не было и вот опять
-
- Сообщения: 38
- Зарегистрирован: 10 июн 2017, 20:50
- Благодарил (а): 1 раз
Re: можно ли создать массив
Спасибо, завтра попробую.
Интересно, как будет в отчете на странице переменные эта переменная отображаться.
По идее все открытые позиции должны отображаться
Интересно, как будет в отчете на странице переменные эта переменная отображаться.
По идее все открытые позиции должны отображаться
-
- Сообщения: 38
- Зарегистрирован: 10 июн 2017, 20:50
- Благодарил (а): 1 раз
Re: можно ли создать массив
Уточнение по моему коду. Посмотрел применение LastPrice.RemoveAt(0);
Если мне нужно чтобы после закрытия последней открытой части позиции переменная становилась равным предпоследнему значению то нужно просто написать
LastPrice.Remove;
Так как в моем случае удаляться будет цена самой первой открытой позиции, а не той, что только что закрылась.
Чего то я засомневался в том, что выше написал.
В описании Remove написано что будет удалять первое значение. Если так трактовать то LastPrice.RemoveAt(0); и LastPrice.Remove; будут равнозначны.
Значит получается надо писать LastPrice.RemoveAt(0) только вместо нуля использовать значение count.
Если мне нужно чтобы после закрытия последней открытой части позиции переменная становилась равным предпоследнему значению то нужно просто написать
LastPrice.Remove;
Так как в моем случае удаляться будет цена самой первой открытой позиции, а не той, что только что закрылась.
Чего то я засомневался в том, что выше написал.
В описании Remove написано что будет удалять первое значение. Если так трактовать то LastPrice.RemoveAt(0); и LastPrice.Remove; будут равнозначны.
Значит получается надо писать LastPrice.RemoveAt(0) только вместо нуля использовать значение count.
-
- Сообщения: 38
- Зарегистрирован: 10 июн 2017, 20:50
- Благодарил (а): 1 раз
Re: можно ли создать массив
Можно ли в LastPrice.RemoveAt(0) вместо нуля использовать переменную?
Например
После
CloseLong(Qty);
вставляю
var SumOpen = Lastprice.Count;
Затем LastPrice.RemoveAt(SumOpen);
Так грамотно будет?
Например
После
CloseLong(Qty);
вставляю
var SumOpen = Lastprice.Count;
Затем LastPrice.RemoveAt(SumOpen);
Так грамотно будет?
- evge
- Администратор
- Сообщения: 1813
- Зарегистрирован: 04 фев 2016, 09:46
- Откуда: Млечный путь, планета Земля
- Благодарил (а): 83 раза
- Поблагодарили: 367 раз
- Контактная информация:
Re: можно ли создать массив
индексы идут с 0, а не с 1
что бы удалить последний элемент необходимо
LastPrice.RemoveAt(SumOpen -1);
что бы удалить последний элемент необходимо
LastPrice.RemoveAt(SumOpen -1);
никогда такого не было и вот опять
-
- Сообщения: 38
- Зарегистрирован: 10 июн 2017, 20:50
- Благодарил (а): 1 раз
Re: можно ли создать массив
к сожалению не компилируется, где то ошибка
во всех строках где есть переменная LastPrice
пишет Имя "LastPrice" отсутствует в текущем контексте At...
общий код такой получился
во всех строках где есть переменная 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
- Администратор
- Сообщения: 1813
- Зарегистрирован: 04 фев 2016, 09:46
- Откуда: Млечный путь, планета Земля
- Благодарил (а): 83 раза
- Поблагодарили: 367 раз
- Контактная информация:
Re: можно ли создать массив
1. Из названия стратегии лучше убрать спецсимволы типа, +, =, пробел и т.д.
заменить на
2. Неверно определили глоб. переменную списка. Значение по умолчанию задавать не нужно.
заменить на
3. Неверно используете список
к элементу списка необходимо обращаться по индексу, например к последнему элементу так:
4. Неверное задаете значение в списке в первом условии
LastPrice списку нельзя присвоить AverPrice(), необходимо добавить элемент в список
5. Неверно добавляете значение в список, об этом выше писалось, у Add нет первого параметра (индекса элемента) это не Insert, Add добавляет значение в конец списка, указывать индекс здесь не нужно.
заменить на
6. Не соблюдаете регистр в наименовании переменных
Lastprice это не тоже самое что LastPrice - Это две разные переменные, Lastprice, при этом, у вас нигде не определена.
заменить на
а лучше эту и следующую строку вместе заменить на одну, т.к. непонятно зачем вам здесь лишняя переменная SumOpen.
7. Получать значение из списка нужно только если он заполнен. Представьте ситуацию, когда в списке у вас нет значений!
LastPrice.Count, при пустом списке, вернет 0
Обращаясь к элементу списка по LastPrice[LastPrice.Count - 1] это тоже самое что LastPrice[-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) ...
никогда такого не было и вот опять
Вернуться в «Общие вопросы по разработке»
Кто сейчас на конференции
Сейчас этот форум просматривают: нет зарегистрированных пользователей и 6 гостей