Victor писал(а):1) функция эвалуейт сама вызывается на какой-то эвент? или ее нужно вызвать?
Терминал 4.0. Скрипты пользовательских индикаторов и стратегийEvaluate() – функция расчета служит для вычисления одной точки индикатора, которая исполняется на каждом новом баре и при изменении последней цены .
Victor писал(а):2) что значит "заполнить данные"? то-есть нужно чтобы бот все это время работал, и заполнял эти данные сам?
Находясь в нижестоящем таймфрейме данные в списке O,H,L,C на первых порах отсутсвуют. Т.е. прежде чем использовать нужно проверять есть ли что-то в списке.
Представьте, что это первые бары истории и это начало первого бара суток и ещё нет информации о его High, Low, Close. Open конечно уже мы знаем, но этого мало.
Когда исполнится условие
if (BarDate(0).Day != BarDate(1).Day)
и только в этот момент данные о первом дне попадут в списки O, H, L, C и мы сможем их далее использовать (на втором, третьем дне и т.д.)
поэтому, прежде чем обратится, например, за High предыдущего дня в H[0], надо проверить вообще списки пустые эти или нет? Для этого достаточно одной проверки (все проверять нет смысла)
Например,
значит хотя бы 1 запись во всех списках есть и можно анализировать.
Victor писал(а):Мне нужно при запуске бота (в, допустим, минутном таймфрейме) как-то получить несколько последних дневных баров. Сразу при запуске. Как это сделать?
как то так:
Код: Выделить всё
// когда списки пусты, производим
// первоначальное заполнение 5 предыдущих дней относительно таймфрейма минутного
if (O.Count == 0)
for (int x = 1; x < 4100; x++)
{
if (BarDate(x) != BarDate(x+1))
{
O.Insert(0, Open); H.Insert(0, Max); L.Insert(0, Min); C.Insert(0, Input.Close[x+1]);
var CN = O.Count;
if (CN > Period) { O.RemoveAt(CN - 1); H.RemoveAt(CN - 1); L.RemoveAt(CN - 1); C.RemoveAt(CN - 1); }
Min = Double.MaxValue; Max = 0.0; Open = Input.Open[x];
}
if (Input.Low[x] < Min) Min = Input.Low[x];
if (Input.High[x] > Max) Max = Input.High[x];
}
// здесь мы продолжаем наполнять новыми данными списки при переходе через новый день
if (BarDate(0) != BarDate(1))
{
O.Insert(0, Open); H.Insert(0, Max); L.Insert(0, Min); C.Insert(0, Input.Close[1]);
var CN = O.Count;
if (CN > Period) { O.RemoveAt(CN - 1); H.RemoveAt(CN - 1); L.RemoveAt(CN - 1); C.RemoveAt(CN - 1); }
Min = Double.MaxValue; Max = 0.0; Open = Input.Open[0];
}
if (Input.Low[0] < Min) Min = Input.Low[0];
if (Input.High[0] > Max) Max = Input.High[0];
Всё это будет неактуально, когда в АД4 реализуют получение данных от других ТФ и желательно с возможностью чтения других инструментов из одной стратегии.
Но пока этого нет