Получение значения параметра из таблицы текущих параметров QUIK
Получение параметра в столбце ColumnName из Таблицы Текущих Значений по Коду бумаги и Коду Класса. Результат - строка. Если ошибка или невозможно однозначно определить, возвращается пустая строка
Таблица текущих значений после экспорта её по DDE в Amisharp выглядит как двумерная матрица, полностью повторяющая её вид в терминале QUIK. Первая строка - это заголовки столбцов, остальные - собственно данные. Чтобы найти нужный нам параметр для нужной бумаги, необходимо сначала определить в таблице строку, содержащиую параметры интересующего нас инструмента, а затем в этой строке из нужной колонки взять значение. Таким образом, в цикле по строкам исполняем поиск по коду класса, при нахождении нужного проверяем seccode и если совпадает - это наша строка, берем из нее требуемый параметр. Можно поступить иначе: дважды наложить фильтр на таблицу текущих параметров. Первый раз по коду инструмента, второй раз по коду класса. В результате получаем временную таблицу из одной строки, откуда и берём значение нужного нам параметра, а временные таблицы удаляем. Если инструмент в таблице текущих значений отсутствует - в результате получим пустую таблицу. Очевидно, что как в первом, так и во втором способе порядок стобцов в таблице текущих параметров никакой роли не играет. Пойдем вторым путём - он требует меньше текста и быстрее по времени.
function GetParameter(TableName,ClassCode,Seccode,ClassCodeColumnName,SecCodeColumnName,ColumnName)
{ local result,Filter1,Filter2;
Filter1 = TableName + mtRandom() + "~1";
if (amisharp.ApplyFilterName(TableName,SecCodeColumnName,SecCode,Filter1) == "-2")
result = "";
else
{ Filter2 = TableName + StrToNum(mtRandom()) + "~2";
if (amisharp.ApplyFilterName(Filter1 ,ClassCodeColumnName,ClassCode,Filter2) != "1")
result = "";
else
{ result = amisharp.GetCellName(Filter2,ColumnName,1);
amisharp.DeleteTable(Filter2);
}
amisharp.DeleteTable(Filter1);
}
return result;
}
Результаты фильтраций сохраняются во временных таблицах Filter1 и Filter2. Их имена должны быть уникальными. Нельзя задать их просто текстовыми строками. Дело в том, что одновременно могут быть запущены несколько копий робота и возможна ситуация, когда два из них одновременно захотят выполнить эту функцию. В примере выше для генерации уникального имени таблицы использована mtRandom(). Также неплохой результат может получиться при использовании GetChartID(), которая возвращает номер текущего чарта.