Как собирать информацию о сделках и пользоваться ей? Мне нужно собрать информацию о всех позициях советника, их объеме, прибыли, типе, цене открытия. А потом обратиться к информации о самой свежей позиции, или самой большой позиции. У меня вызывает затруднение запись в массивы.
1. Нужно ли вообще связываться с массивами?
2. Лучше использовать массив структур или разные массивы?
3. Зачем нужен динамический массив, если всё равно нужно выделять память с запасом? Не проще ли использовать статический массив? Или без динамического не обойтись, потому что он может быть с обратной индексацией?
Пример кода без ооп, потому что я что-то не смог даже написать эту конструкцию, если не затруднит, спасибо.
А зачем вообще что-то собирать? Нужно проходить в цикле по позициям и обрабатывать информацию - а собирать не нужно. Всё, что Вы собрали в тот же момент является устаревшей информацией.
1. При работе с историей торговли обычно обходятся без массивов. Примерно так, как в примере: https://www.mql5.com/ru/docs/trading/historyselect. Стоит изучить все функции в колонке слева по ссылке (и все примеры, которые там есть).
2. Массив структур - это очень удобно. Вот только с ним не работают встроенные функции, которые можно применять к многомерным массивам - ArraySort() и пр.
3. Если уверены, что изначально указанного размера массива хватит, то можно и статические применять. Если их размер разумен.
А зачем вообще что-то собирать? Нужно проходить в цикле по позициям и обрабатывать информацию - а собирать не нужно. Всё, что Вы собрали в тот же момент является устаревшей информацией.
int OnInit() { ENUM_POSITIONS_TYPE ar [1000]; //проинициализирую нулем еще, просто я не копирую, а вручную всё пишу, и некоторые очевидные куски не пишу. return(INIT_SUCCEEDED); } void OnDeinit(const int reason) {} void OnTick() { for(int index=PositionsTotal()-1; index>=0; index--) { ulong ticket=PositionGetTicket(index); PositionSelectByTicket(ticket); // И вот я готов вызывать функции для выуживания данных, только я не знаю //как их вписывать в массив.
1. При работе с историей торговли обычно обходятся без массивов. Примерно так, как в примере: https://www.mql5.com/ru/docs/trading/historyselect. Стоит изучить все функции в колонке слева по ссылке (и все примеры, которые там есть).
2. Массив структур - это очень удобно. Вот только с ним не работают встроенные функции, которые можно применять к многомерным массивам - ArraySort() и пр.
3. Если уверены, что изначально указанного размера массива хватит, то можно и статические применять. Если их размер разумен.
Это я не с историей, это позиции хочу проанализировать открытые. Как лучше сделать?
Почти так же, но без HistorySelect(). Начинаем с функции PositionsToatal() и дальше по той ссылке изучаем все функции, начинающиеся с Position
Вот пишу сетку без ооп. Мне надо узнать, какая из открытых позиций самая большая, и она по какому типу сделок идет , бай или сел. Я так понимаю, что надо в цикле сначала собрать из каждой позиции данные , записать в массив, потом анализировать массив, либо брать самый свежий элемент, если это динамический с обратной индексацией.
Не надо в массив- перебирать позиции, и по ходу дела выискивать максимум и минимум.
Не надо в массив- перебирать позиции, и по ходу дела выискивать максимум и минимум.
Спасибо. Только можете пример коротенький? Нам же нужно записать, чтобы сравнить? А записать куда кроме как не в массив? Я не соображу как без записи сделать. Работа то идёт с одной позицией в проходе цикла, как мы можем сравнить другую позицию, если она в другом проходе цикла?
Спасибо. Только можете пример коротенький? Нам же нужно записать, чтобы сравнить? А записать куда кроме как не в массив? Я не соображу как без записи сделать. Работа то идёт с одной позицией в проходе цикла, как мы можем сравнить другую позицию, если она в другом проходе цикла?
int Magic=123; double maxBuyPrice=0; ulong maxBuyTicket=0; double minSellPrice=DBL_MAX; ulong minSellTicket=0; for(int i=0;i<PositionsTotal();i++){ ulong ticket=PositionGetTicket(i); if(ticket!=0){ long magic=PositionGetInteger(POSITION_MAGIC); string symbol=PositionGetString(POSITION_SYMBOL); if(magic==Magic && symbol==Symbol()){ long type=PositionGetInteger(POSITION_TYPE); if(type==POSITION_TYPE_BUY){ if(PositionGetDouble(POSITION_PRICE_OPEN)>maxBuyPrice){ maxBuyPrice=PositionGetDouble(POSITION_PRICE_OPEN); maxBuyTicket=ticket; // тут можно и другие данные позиции запоминать в переменные } } else if(type==POSITION_TYPE_SELL){ if(PositionGetDouble(POSITION_PRICE_OPEN)<minSellPrice){ minSellPrice=PositionGetDouble(POSITION_PRICE_OPEN); minSellTicket=ticket; // и тут } } } } } if(maxBuyTicket!=0){ } if(minSellTicket!=0){ }
Спасибо за такой пример.
long magic=PositionGetInteger(POSITION_MAGIC); string symbol=PositionGetString(POSITION_SYMBOL); if(magic==Magic && symbol==Symbol())
Я думал, что я один предпочитаю так раскладывать всё, а не писать хз как
if(PositionGetInteger(POSITION_MAGIC)==Magic && PositionGetString(POSITION_SYMBOL)==Symbol())
хз — в переводе на русский «хотелось-бы знать»… не подумайте плохого…
ps; Это помогает проследить всё что можно во время отладки программы.
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Как собирать информацию о сделках и пользоваться ей? Мне нужно собрать информацию о всех позициях советника, их объеме, прибыли, типе, цене открытия. А потом обратиться к информации о самой свежей позиции, или самой большой позиции. У меня вызывает затруднение запись в массивы.
1. Нужно ли вообще связываться с массивами?
2. Лучше использовать массив структур или разные массивы?
3. Зачем нужен динамический массив, если всё равно нужно выделять память с запасом? Не проще ли использовать статический массив? Или без динамического не обойтись, потому что он может быть с обратной индексацией?
Пример кода без ооп, потому что я что-то не смог даже написать эту конструкцию, если не затруднит, спасибо.