Работа со структурами в мультивалютниках

 

Я активно работаю со структурами данных и массивами. Но чаще они запонляются в циклах. Но появилась необходимость единоразового заполнения данных массива канкретной структуры при инициализации эксперта, чтоб потом от туда брать данные и не получать данне повторно, т.к. они всё-равно не меняю свои значение, а потом унет смысла заново их получать.

Вот структура:

struct Lots_Properties
{
   double      dMinLot;           // Минимальный объём для заключения сделки
   double      dMaxLot;           // Максимальный объём для заключения сделки
   double      dLotStep;          // Шаг изменения размера лота
   double      dLotSize;          // Размер контракта в базовой валюте инструмента
};

 Хочется, чтоб массив таких структур она заполнялся данными, а после можно было получать значения из данного массива есс-но, как я понимаю, в нём будет отбор по имени торгуемого инструмента. Если Инструмент 1, то данные вернутся его, а если инструмент n, то данные вернутся другие.

 Как это реализовать "по прямее" ?

В идеале лучше всего как-то пробежаться по всему списку имеющихся в терминале инструментов и получит все данные при нициализации. А потом уже при необходимости запрашивать их как я понимаю. Кто с подобным сталкивался?

Думаю так сделать, потому что в плане быстродействия кода часто запрашивать данные при помощи MarketInfo() как известно это времязатратный процесс...

 Раньше я в ИНИТЕ заполнял структуру так:

SLot.dMinLot = MarketInfo (_Symbol, MODE_MINLOT);
SLot.dMaxLot = MarketInfo (_Symbol, MODE_MAXLOT);
SLot.dLotStep = MarketInfo (_Symbol, MODE_LOTSTEP);
SLot.dLotSize = MarketInfo (_Symbol, MODE_LOTSIZE);

 Но сейчас чтоб заполнить её нудно пройтись по всем инструментам. А потом условно их запрашивать. Как это делается?

 

Вы что-то подобное:

struct Lots_Properties
{
   double      dMinLot;           // Минимальный объём для заключения сделки
   double      dMaxLot;           // Максимальный объём для заключения сделки
   double      dLotStep;          // Шаг изменения размера лота
   double      dLotSize;          // Размер контракта в базовой валюте инструмента
   string      sSymbol;           // Инструмент
};
Lots_Properties SLot[];           // Не забудьте определить размер массива

//---- при инициализации
    for (int li_int = 0; li_int < ArraySize (SLot); li_int++)
    {
        SLot[li_int].dMinLot = MarketInfo (SLot[li_int].sSymbol, MODE_MINLOT);
        SLot[li_int].dMaxLot = MarketInfo (SLot[li_int].sSymbol, MODE_MAXLOT);
        SLot[li_int].dLotStep = MarketInfo (SLot[li_int].sSymbol, MODE_LOTSTEP);
        SLot[li_int].dLotSize = MarketInfo (SLot[li_int].sSymbol, MODE_LOTSIZE);
    }

хотели увидеть?

 
shanty:

т.к. они всё-равно не меняю свои значение, а потом унет смысла заново их получать.


Да, информация о допустимых объемах меняется редко, но, тем не менее, изменяется. Если эксперт будет работать без отключений, то в один прекрасный момент окажется, что у него неверные данные об условиях торговли. Причем, измениться эти данные теоретически могут и посреди торговой сессии. Поэтому лучше, все же, обновлять эту информацию на каждом тике. Такое действие не занимает много времени.

 
TarasBY:

Вы что-то подобное:

хотели увидеть?

На самом деле, не это. Этот вариант самый примитивный. Обычно, я так и делаю. Но получается, что операции бывают разные, и в какую не зайди везде прогонять по циклу что-ли? Было б как-то универсальнее, если б структура заполнялась таким образом, чтоб потом можно было получать эти данные не по порядковому номеру из цикла, а по названию торгуемого инструмента.

 

Scriptong:

Да, информация о допустимых объемах меняется редко, но, тем не менее, изменяется. Если эксперт будет работать без отключений, то в один прекрасный момент окажется, что у него неверные данные об условиях торговли. Причем, измениться эти данные теоретически могут и посреди торговой сессии. Поэтому лучше, все же, обновлять эту информацию на каждом тике. Такое действие не занимает много времени.

И что ж по Вашему может изменится в процессе торговли это данных структуры, которую я привёл выше? 

 
shanty:

На самом деле, не это. Этот вариант самый примитивный. Обычно, я так и делаю. Но получается, что операции бывают разные, и в какую не зайди везде прогонять по циклу что-ли? Было б как-то универсальнее, если б структура заполнялась таким образом, чтоб потом можно было получать эти данные не по порядковому номеру из цикла, а по названию торгуемого инструмента.

А как мультивалютники работают, если не в цикле с перебором всех используемых инструментов?
 
TarasBY:
А как мультивалютники работают, если не в цикле с перебором всех используемых инструментов?

Перебор то есть, разумеется. Но у меня данная структура находится в классе соответствующем и создавать её экземпляр в различных методах, и сразу же его перезаполнять, навряд ли, будет разумно. Или всё же так и делают?

Например, вот у меня сейчас такой вариант функции старт:

void OnTick()
{
   g_iOTotal = CPosInf.CheckCountPositions (g_iAmountPosByType);   // Получаем количество позиций( по типам )
   
   // ---- Собираем данные по СВОИМ ордерам
   for (int i = OrdersTotal() - 1; i >= 0; i--)
   {
      if (!CPosMan.CheckMyOrdersBased(i, -1)) continue;

      FillDataOfPositions (GPos[i]);

      ModifyOrder (GPos[i]);
      
      DeleteWrongPosition (g_iSignal);
   }
   
   if (g_dtLastBarTime != Time[0])
   {
      ZZ.MakeNoneEmptyArray (_Symbol, 0);              // Отбираем "непустые" значения Zig-Zag'а
      
      g_iSignal = GetTradingSignal();
      
      Trade (g_iSignal);
   }
}

 Получится, раз мне нужно значение пункта на определённом инструменте,  буду постоянно создавать переменную соответствующей структуры, которая хранит переменные рыночного окружения. Тоже самое и с лотами. Это разве верный подход?

 Я пытаюсь переписать сам эксперт т.к. библиотеки переписались легко по причине того, что в них все необходимые данные передаются через параметры. А в самом эксперте это как-то не увязывается.

 
shanty:

 Получится, раз мне нужно значение пункта на определённом инструменте,  буду постоянно создавать переменную соответствующей структуры, которая хранит переменные рыночного окружения. Тоже самое и с лотами. Это разве верный подход?

 Я пытаюсь переписать сам эксперт т.к. библиотеки переписались легко по причине того, что в них все необходимые данные передаются через параметры. А в самом эксперте это как-то не увязывается.

Т.к. в последнем коде отсутствует обращение к упоминаемой ранее структуре, я, честно говоря, не смог понять где цель, где средство.

Если я хоть как-то уловил направление Вашей мысли, то: создайте класс (наверняка что-то подобное у Вас уже есть), который должен будет работать (хранить) переменные окружения конкретного символа. В нём объявите упомянутую структуру (Lots_Percent). А потом объявляйте экземпляры класса (сколько нужно), именуя их названиями инструментов, не забывая заполнить соответствующие переменные и структуру при инициализации.

 
shanty:

 Но сейчас чтоб заполнить её нудно пройтись по всем инструментам. А потом условно их запрашивать. Как это делается?

очень просто:

Lots_Properties data[];
for (int i=SymbolsTotal(true)-1;i>=0;i--){
int cnt=ArraySize(data);
ArrayResize(data,cnt+1);
data[cnt].dMinLot=SymbolInfoDouble(SymbolName(i,true),SYMBOL_MINLOT);
и т.д.
}

 код написал прямо здесь, поэтому могут быть синтаксические ошибки.
для скорости можно не в цикле менять размерность массива а задать сразу, потом ввести некий счётчик и по выходу из цикла массив обрезать. Это будет быстрее работать.

 
shanty:

На самом деле, не это. Этот вариант самый примитивный. Обычно, я так и делаю. Но получается, что операции бывают разные, и в какую не зайди везде прогонять по циклу что-ли? Было б как-то универсальнее, если б структура заполнялась таким образом, чтоб потом можно было получать эти данные не по порядковому номеру из цикла, а по названию торгуемого инструмента.

А чтобы это реализовать придётся создать дополнительный массив ключей в котором допустим будет хранится имя валютной пары и соответствующий индекс в строке в массиве структур....но стоит ли оно того ?
 
Desead:
А чтобы это реализовать придётся создать дополнительный массив ключей в котором допустим будет хранится имя валютной пары и соответствующий индекс в строке в массиве структур....но стоит ли оно того ?
Конечно стоит, если канкретный эксперт торгует на нескольких инструментах. Ведь это экономия ресурсов. Переборы ордеров есть всё-равно. Одно дело пройтись по всем ордерам одному эксперту, а другое - каждый их экспертов на каждом графике пройдётся по всем ордерам. Разница то есть?
 
shanty:
Конечно стоит, если канкретный эксперт торгует на нескольких инструментах. Ведь это экономия ресурсов. Переборы ордеров есть всё-равно. Одно дело пройтись по всем ордерам одному эксперту, а другое - каждый их экспертов на каждом графике пройдётся по всем ордерам. Разница то есть?
Проще каждому инструменту дать свой Магик! Тогда в цикле будут проверяться только свои ордера, а не все! Со структурами много геморра! Оно Вам надо?