Germany | Finland | Saint Petersburg | Drive

Получение значения параметра из таблицы текущих параметров QUIK

Опубликовано в AmiSharp

Получение параметра в столбце 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(), которая возвращает номер текущего чарта.

Недостаточно прав для комментирования