Удобнее всего записать все нужные ордера в массив:
#define ARRAY_RESERVE_SIZE int(100) struct OrderInfo { int nTicket; int nType; double fOP; OrderInfo(const int _nTicket = -1, const int _nType = -1, const double _fOP = 0.0) : nTicket(_nTicket) , nType(_nType) , fOP(_fOP) { } }; OrderInfo m_arrstBuyOrders[], m_arrstSellOrders[]; bool FindExpertOrders() { ArrayResize(m_arrstBuyOrders, 0, ARRAY_RESERVE_SIZE); ArrayResize(m_arrstSellOrders, 0, ARRAY_RESERVE_SIZE); for (int i = OrdersTotal() - 1; i >= 0; i--) { if (!OrderSelect(i, SELECT_BY_POS)) continue; if (OrderSymbol() != Symbol()) continue; if (OrderMagicNumber() != m_nExpertID) continue; if (OrderType() == OP_BUY) if (!SaveOrderInfo(m_arrstBuyOrders)) return false; if (OrderType() == OP_SELL) if (!SaveOrderInfo(m_arrstSellOrders)) return false; } return true; } bool SaveOrderInfo(OrderInfo &arrstOrders[]) { int nTotal = ArraySize(arrstOrders); if (ArrayResize(arrstOrders, nTotal + 1, ARRAY_RESERVE_SIZE) != nTotal + 1) return false; OrderInfo stOrder(OrderTicket(), OrderType(), OrderOpenPrice()); arrstOrders[nTotal] = stOrder; return true; }
А потом отсортировать. Пузырьком, например:
void BubbleSort(OrderInfo &arrstOrders[], const bool bAscend) { int nTotal = ArraySize(arrstOrders); for (int i = 0; i < nTotal; ++i) for (int j = i + 1; j < nTotal; ++j) if ((arrstOrders[i].fOP > arrstOrders[j].fOP && !bAscend) || (arrstOrders[i].fOP < arrstOrders[j].fOP && bAscend)) { OrderInfo stOrder = arrstOrders[i]; arrstOrders[i] = arrstOrders[j]; arrstOrders[j] = stOrder; } }
Если bAscend равен true, то в начале массива будут ордера с наименьшей ценой открытия. В противном случае - с наибольшей.
Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
Задача состоит в поиске предыдущего МАКС значения цены открытия ордера. То же самое для Минимальной цены открытия ордера.
Необходимо узнать по отдельности:
1. Бай с самой высокой ценой открытия. Бай на 2й по уровню открытия. Бай Третий.
То есть сортировка :
МаксБайОпенПрайс0.
МаксБайОпенПрайс1. (т.е. максимальный за исключением предыдущего)
МаксБайОпенПрайс2. (т.е. максимальный за исключением предыдущих двух)
Ну по каждому прибыль и тикет чтобы его закрыть.
OnTick(){.... MaxOrderBuyPRICE0= GetMaxPriceFromOpenPos(OP_BUY,-1,MAGIC); //максимальный ордер BUY MaxOrderBuyPRICE1= GetMaxPriceFromOpenPos(OP_BUY, MaxOrderBuyPRICE0,MAGIC ); //максимальный ордер BUY }