У меня есть поиск крайних ордеров в серии
А как мне найти самый крайний предыдущий ордер и т.д. по убыванию??
Точно так же, только добавьте проверку не соответствует новая цена самому крайнему. Или в массив сортируйте...
Словами не понятно, примером всё прояснится))
Т.е. в двухмерный массив собрать все цены по возрастанию и присвоить каждому номер от крайнего 1,2,3..., а потом вызывать под нужным номером (1=дальний, 2=предыдущий) ??Словами не понятно, примером всё прояснится))
Т.е. в двухмерный массив собрать все цены по возрастанию и присвоить каждому номер от крайнего 1,2,3..., а потом вызывать под нужным номером (1=дальний, 2=предыдущий) ??Вот такой код у меня работал нормально. Правильнее наверно, делать массив структур, но для моих задач так было удобнее.
#include <Trade\OrderInfo.mqh> #include <Trade\PositionInfo.mqh> #include <Trade\Trade.mqh> #include <Trade\SymbolInfo.mqh> COrderInfo m_order; CPositionInfo m_position; CTrade m_trade; CSymbolInfo m_symbol; long Magic = 123; ulong slippage = 10; double ArrayBuy[][4], ArraySell[][4]; //+------------------------------------------------------------------+ //| Expert initialization function | //+------------------------------------------------------------------+ int OnInit() { if(!m_symbol.Name(Symbol())) return(INIT_FAILED); IsRefreshRates(); m_trade.SetExpertMagicNumber(Magic); if(IsFillingTypeAllowed(SYMBOL_FILLING_FOK)) m_trade.SetTypeFilling(ORDER_FILLING_FOK); else if(IsFillingTypeAllowed(SYMBOL_FILLING_IOC)) m_trade.SetTypeFilling(ORDER_FILLING_IOC); else m_trade.SetTypeFilling(ORDER_FILLING_RETURN); m_trade.SetDeviationInPoints(slippage); return(INIT_SUCCEEDED); } //+------------------------------------------------------------------+ void OnTick() { IsArrayPick(); } //+------------------------------------------------------------------+ void IsArrayPick() { int orders_Buy = 0; int orders_Sell = 0; for(int i = PositionsTotal() - 1; i >= 0; i--) if(m_position.SelectByIndex(i)) if(m_position.Symbol() == m_symbol.Name() && m_position.Magic() == Magic) if(m_position.PositionType() == POSITION_TYPE_BUY) { orders_Buy ++; ArrayResize(ArrayBuy, orders_Buy, 0); ArrayBuy[orders_Buy - 1][0] = m_position.PriceOpen(); ArrayBuy[orders_Buy - 1][1] = (double)m_position.PositionType(); ArrayBuy[orders_Buy - 1][2] = (double)m_position.Ticket(); ArrayBuy[orders_Buy - 1][3] = (double)m_position.Volume(); } else { orders_Sell ++; ArrayResize(ArraySell, orders_Sell, 0); ArraySell[orders_Sell - 1][0] = m_position.PriceOpen(); ArraySell[orders_Sell - 1][1] = (double)m_position.PositionType(); ArraySell[orders_Sell - 1][2] = (double)m_position.Ticket(); ArraySell[orders_Sell - 1][3] = (double)m_position.Volume(); } for(int i = OrdersTotal() - 1; i >= 0; i--) { if(m_order.SelectByIndex(i)) if(m_order.Symbol() == m_symbol.Name() && m_order.Magic() == Magic) if(m_order.OrderType() == ORDER_TYPE_BUY_STOP) { orders_Buy ++; ArrayResize(ArrayBuy, orders_Buy, 0); ArrayBuy[orders_Buy - 1][0] = m_order.PriceOpen(); ArrayBuy[orders_Buy - 1][1] = (double)m_order.OrderType(); ArrayBuy[orders_Buy - 1][2] = (double)m_order.Ticket(); ArrayBuy[orders_Buy - 1][3] = (double)m_order.VolumeInitial(); } else { orders_Sell ++; ArrayResize(ArraySell, orders_Sell, 0); ArraySell[orders_Sell - 1][0] = m_order.PriceOpen(); ArraySell[orders_Sell - 1][1] = (double)m_order.OrderType(); ArraySell[orders_Sell - 1][2] = (double)m_order.Ticket(); ArraySell[orders_Sell - 1][3] = (double)m_order.VolumeInitial(); } } ArraySort(ArrayBuy); ArraySort(ArraySell); } //+------------------------------------------------------------------+ bool IsRefreshRates() { if(!m_symbol.RefreshRates()) { Print("не удалось обновить котировки!"); return(false); } if(m_symbol.Ask() == 0 || m_symbol.Bid() == 0) return(false); return(true); } //+------------------------------------------------------------------+ bool IsFillingTypeAllowed(int fill_type) { int filling = m_symbol.TradeFillFlags(); return((filling & fill_type) == fill_type); } //+------------------------------------------------------------------+
Вот такой код у меня работал нормально. Правильнее наверно, делать массив структур, но для моих задач так было удобнее.
Ну здесь так же определяется самый дальний, а я пытаюсь по порядку удалённости определить.
Перебираю цены по удалённости, но порядок получается не по удалённости
void start() { NumPrice(1); } //=========================================================| int n; void NumPrice(int type=-1){ int tf=PERIOD_CURRENT; int bars=iBars(Symbol(),tf); double price[]; n=0; if(ArraySize(price)<Bars){ArraySetAsSeries(price,false); ArrayResize(price,bars); ArraySetAsSeries(price,true);} for(i=OrdersTotal()-1;i>=0;i--) if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES) && OrderSymbol()==Symbol() && OrderMagicNumber()==Magic){ if(OrderType()==type||type<0){ double prc=0.0; if(prc==0.0) prc=OrderOpenPrice(); if(prc>OrderOpenPrice()) prc=OrderOpenPrice(); if(prc==OrderOpenPrice()){ n++; price[n]=prc; Print("ЦЕНА ПО ПОРЯДКУ = ", price[n]," == ",n);}}}} //=========================================================|
Ну здесь так же определяется самый дальний, а я пытаюсь по порядку удалённости определить.
Перебираю цены по удалённости, но порядок получается не по удалённости
Извиняюсь, не обратил внимание, что у вас MQL4.
У вас вообще ордера могут записаться в массив через один или вовсе в массиве будет один ордер если самый дальний окажется самым первым.
У вас в коде сортировка не правильная, попробуйте .
ArraySort
Ну здесь так же определяется самый дальний, а я пытаюсь по порядку удалённости определить.
Перебираю цены по удалённости, но порядок получается не по удалённости
Немного переделал Ваш код, не проверял но должно работать...
void start() { NumPrice(1); } //=========================================================| void NumPrice(int type=-1) { int i; int n; double price[]; for(i=OrdersTotal()-1;i>=0;i--) { if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES) && OrderSymbol()==Symbol() && OrderMagicNumber()==Magic) { if(OrderType()==type||type<0) { n=ArrayResize(price,ArraySize(price)+1); price[n - 1]=OrderOpenPrice(); } } } // отсортируем массив ArraySort(price); // выведем результат в журнал for(i=ArraySize(price)-1;i>=0;i--) Print("ЦЕНА ПО ПОРЯДКУ = ", price[i]," == ",i); } //=========================================================|
Немного переделал Ваш код, не проверял но должно работать...
Ну да, работает, цены теперь по порядку убывания.
Спасибо, вопрос решился.
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
У меня есть поиск крайних ордеров в серии
А как мне найти самый крайний предыдущий ордер и т.д. по убыванию??