Владимир писал(а):но столкнулся с тем как в других языках программирования есть режим наладки где можно по шагам пройти нужные участки программы и найти свою ошибку
Режима отладки в скриптах АД4 нет, но можно для поиска ошибок использовать сохранение данных в лог файл, как пример:
Код: Выделить всё
LogData(String.Format("Время бара: {0} {1}, Максимальная цена:{2}, Минимальная цена:{3}", BarDate(0), BarTime(0), Input.High[0], Input.Low[0]), IndicatorName);
добавляете это, точнее подобный этому коду, в свой скрипт
значения будут сохранятся в
X:\Users\ВАШ ПОЛЬЗОВАТЕЛЬ\AppData\Local\Alfa-Direct\Logs\test.log (по имени индикатора в данном случае)
содержание будет примерно таким
2017.01.12 07:58:44.297 Время бара: 14.12.2016 0:00:00 18:30:00, Максимальная цена:17425, Минимальная цена:17382
2017.01.12 07:58:44.297 Время бара: 14.12.2016 0:00:00 18:35:00, Максимальная цена:17425, Минимальная цена:17383
2017.01.12 07:58:44.297 Время бара: 14.12.2016 0:00:00 18:40:00, Максимальная цена:17400, Минимальная цена:17382
2017.01.12 07:58:44.297 Время бара: 14.12.2016 0:00:00 19:05:00, Максимальная цена:17417, Минимальная цена:17333
2017.01.12 07:58:44.297 Время бара: 14.12.2016 0:00:00 19:10:00, Максимальная цена:17365, Минимальная цена:17341
Далее про индикатор - примерозначает
присвоить значение High бара со смещением "x" для текущего бара серии MarkerLow.
Т.е. на текущем баре будет отрисовано значение High (3 бара назад)
поэтому и рисует на всех барах, т.к. вы указали, что надо обходить на каждом баре циклом назад на расстояние Scan и брать со смещения 2 значение для текущего бара.
исправленный код, если я правильно понял задачу:
Код: Выделить всё
function Initialize()
{
// Область определения параметров индикатора
// Обязательные параметры:
IndicatorName = "testx"; // Задайте название индикатора и сохраните с данным именем
PriceStudy = true; // Рисовать в области цены (true – да, false – нет)
AddInput("Input", Inputs.Candle); // Input - входной ряд (Inputs.Price) или свечи (Inputs.Candle)
AddSeries("LineHigh", DrawAs.Line, Color.Green); // Задаем вид линии индикатора с именем LineHigh
AddSeries("LineLow", DrawAs.Line, Color.Red); // Задаем вид линии индикатора с именем LineLow
AddSeries("MarkerUp", DrawAs.Custom, Color.Red); // Метим экстремум
AddSeries("MarkerLow", DrawAs.Custom, Color.Yellow); // Метим экстремум
// Дополнительные параметры:
AddParameter("Scan", 163, 1); // сканируемый период
}
function Evaluate()
{
if ((MaxIndex - CurrentIndex) > Scan) return;
if (CurrentIndex == MaxIndex)
for (var x=0; x<Scan; x++)
{
if (x==2)
{
MarkerLow[x]=Input.High[x];
}
} //закрытие цикла for
MarkerLow.DrawArrowDown();
}
Хотя здесь можно обойтись вообще без цикла, если явно известно что надо именно 3ый
бар, но будем думать что внутри цикла какой-то алгоритм и я его не убрал из примера этого.
Здесь
означает, что выполнять цикл мы будем только на последнем баре истории, т.е. сканировать будем от последнего бара и только на нем, а не на каждом баре. Уберите это условие (строку) и увидите, что отрисовка будет на всех барах начиная с 3-го и далее в историю.
MarkerLow[x] - [x] означает что мы подставляем (задним числом) значение в MarketLow, т.к. мы не хотим рисовать на текущем баре.
А чтобы это значение нарисовалось надо на кажлом баре вызывать DrawArrowDown, т.к. заранее мы не знаем надо ли рисовать или нет. Поэтому
Вынесен за пределы цикла и условия CurrentIndex == MaxIndex, и выполняется для всех баров. Но отрисовывать будет только на барах где задано значение, даже задним числом, как в нашем примере MarkerLow[x].
Владимир писал(а):Как можно построить линию по координатам например соединить хай свечи[8] и лою свечи[2]? если данные сохранили в массиве?
пример
Код: Выделить всё
function Initialize()
{
IndicatorName = "testz";
PriceStudy = true;
AddInput("Input", Inputs.Candle);
AddSeries("Line", DrawAs.Line, Color.Green);
}
function Evaluate()
{
if (CurrentIndex == MaxIndex)
{
Line[2]=Input.Low[2];
Line[7]=Input.High[7];
}
Line.DrawLine();
}