Вы что-то подобное:
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); }
хотели увидеть?
т.к. они всё-равно не меняю свои значение, а потом унет смысла заново их получать.
Да, информация о допустимых объемах меняется редко, но, тем не менее, изменяется. Если эксперт будет работать без отключений, то в один прекрасный момент окажется, что у него неверные данные об условиях торговли. Причем, измениться эти данные теоретически могут и посреди торговой сессии. Поэтому лучше, все же, обновлять эту информацию на каждом тике. Такое действие не занимает много времени.
Вы что-то подобное:
хотели увидеть?
На самом деле, не это. Этот вариант самый примитивный. Обычно, я так и делаю. Но получается, что операции бывают разные, и в какую не зайди везде прогонять по циклу что-ли? Было б как-то универсальнее, если б структура заполнялась таким образом, чтоб потом можно было получать эти данные не по порядковому номеру из цикла, а по названию торгуемого инструмента.
Да, информация о допустимых объемах меняется редко, но, тем не менее, изменяется. Если эксперт будет работать без отключений, то в один прекрасный момент окажется, что у него неверные данные об условиях торговли. Причем, измениться эти данные теоретически могут и посреди торговой сессии. Поэтому лучше, все же, обновлять эту информацию на каждом тике. Такое действие не занимает много времени.
И что ж по Вашему может изменится в процессе торговли это данных структуры, которую я привёл выше?
На самом деле, не это. Этот вариант самый примитивный. Обычно, я так и делаю. Но получается, что операции бывают разные, и в какую не зайди везде прогонять по циклу что-ли? Было б как-то универсальнее, если б структура заполнялась таким образом, чтоб потом можно было получать эти данные не по порядковому номеру из цикла, а по названию торгуемого инструмента.
А как мультивалютники работают, если не в цикле с перебором всех используемых инструментов?
Перебор то есть, разумеется. Но у меня данная структура находится в классе соответствующем и создавать её экземпляр в различных методах, и сразу же его перезаполнять, навряд ли, будет разумно. Или всё же так и делают?
Например, вот у меня сейчас такой вариант функции старт:
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); } }
Получится, раз мне нужно значение пункта на определённом инструменте, буду постоянно создавать переменную соответствующей структуры, которая хранит переменные рыночного окружения. Тоже самое и с лотами. Это разве верный подход?
Я пытаюсь переписать сам эксперт т.к. библиотеки переписались легко по причине того, что в них все необходимые данные передаются через параметры. А в самом эксперте это как-то не увязывается.
Получится, раз мне нужно значение пункта на определённом инструменте, буду постоянно создавать переменную соответствующей структуры, которая хранит переменные рыночного окружения. Тоже самое и с лотами. Это разве верный подход?
Я пытаюсь переписать сам эксперт т.к. библиотеки переписались легко по причине того, что в них все необходимые данные передаются через параметры. А в самом эксперте это как-то не увязывается.
Т.к. в последнем коде отсутствует обращение к упоминаемой ранее структуре, я, честно говоря, не смог понять где цель, где средство.
Если я хоть как-то уловил направление Вашей мысли, то: создайте класс (наверняка что-то подобное у Вас уже есть), который должен будет работать (хранить) переменные окружения конкретного символа. В нём объявите упомянутую структуру (Lots_Percent). А потом объявляйте экземпляры класса (сколько нужно), именуя их названиями инструментов, не забывая заполнить соответствующие переменные и структуру при инициализации.
Но сейчас чтоб заполнить её нудно пройтись по всем инструментам. А потом условно их запрашивать. Как это делается?
очень просто:
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); и т.д. }
код написал прямо здесь, поэтому могут быть синтаксические ошибки.
для скорости можно не в цикле менять размерность массива а задать сразу, потом ввести некий счётчик и по выходу из цикла массив обрезать. Это будет быстрее работать.
На самом деле, не это. Этот вариант самый примитивный. Обычно, я так и делаю. Но получается, что операции бывают разные, и в какую не зайди везде прогонять по циклу что-ли? Было б как-то универсальнее, если б структура заполнялась таким образом, чтоб потом можно было получать эти данные не по порядковому номеру из цикла, а по названию торгуемого инструмента.
А чтобы это реализовать придётся создать дополнительный массив ключей в котором допустим будет хранится имя валютной пары и соответствующий индекс в строке в массиве структур....но стоит ли оно того ?
Конечно стоит, если канкретный эксперт торгует на нескольких инструментах. Ведь это экономия ресурсов. Переборы ордеров есть всё-равно. Одно дело пройтись по всем ордерам одному эксперту, а другое - каждый их экспертов на каждом графике пройдётся по всем ордерам. Разница то есть?
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Я активно работаю со структурами данных и массивами. Но чаще они запонляются в циклах. Но появилась необходимость единоразового заполнения данных массива канкретной структуры при инициализации эксперта, чтоб потом от туда брать данные и не получать данне повторно, т.к. они всё-равно не меняю свои значение, а потом унет смысла заново их получать.
Вот структура:
Хочется, чтоб массив таких структур она заполнялся данными, а после можно было получать значения из данного массива есс-но, как я понимаю, в нём будет отбор по имени торгуемого инструмента. Если Инструмент 1, то данные вернутся его, а если инструмент n, то данные вернутся другие.
Как это реализовать "по прямее" ?
В идеале лучше всего как-то пробежаться по всему списку имеющихся в терминале инструментов и получит все данные при нициализации. А потом уже при необходимости запрашивать их как я понимаю. Кто с подобным сталкивался?
Думаю так сделать, потому что в плане быстродействия кода часто запрашивать данные при помощи MarketInfo() как известно это времязатратный процесс...
Раньше я в ИНИТЕ заполнял структуру так:
Но сейчас чтоб заполнить её нудно пройтись по всем инструментам. А потом условно их запрашивать. Как это делается?