Как можно получить OrderProfit() предпоследнего открытого ордера, пробую как на примере с низу даёт OrderProfit() только последнего
Время открытия в массив, отсортировать, посмотреть.
Или еще один цикл, время последнего уже известно,
находите минимальное неравное последнему.
for(int i=OrdersTotal()-2;i>=0;i--)// неправильно
for(int i=OrdersTotal()-1;i>=0;i--)// правильно
Как можно получить OrderProfit() предпоследнего открытого ордера, пробую как на примере с низу даёт OrderProfit() только последнего
Вот, выбираете номер нужного, не забывайте, первая с индексом "0"
Comment( GetProfitOpenPosInCurrency(_Symbol, OP_SELL, -1, 1) ); // GetProfitOpenPosInCurrency( symbol, бай или селл(-1 - все), Magic(-1 - любой), индекс позиции (1-предпоследняя, 0-последняя)) //=============================================================================================== //------------- Возвращает суммарный профит открытых позиций в валюте депозита -----------------+ //=============================================================================================== double GetProfitOpenPosInCurrency(string symb="0", int type=-1, int mg=-1,int index=0) { double p[]; int c=-1, pr=0; if(symb=="0") { symb=Symbol();} for (int i=OrdersTotal()-1; i>=0; i--) { if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) { if(OrderType()==OP_BUY || OrderType()==OP_SELL) { if((OrderSymbol()==symb||symb=="")&&(type<0||OrderType()==type)&&(mg<0||OrderMagicNumber()==mg)) { c++; ArrayResize(p, c+1); p[c]=OrderProfit()+OrderSwap()+OrderCommission(); pr=c>=index?index:c; // если открытых меньше, чем указано в выборе по индексу, то выведет профит самой первой открытой }}}} return(p[pr]); }
Вот, выбираете номер нужного, не забывайте, первая с индексом "0"
То что нужно, Спасибо!!!
Исправил, а то если не было открытых, была ошибка
//+------------------------------------------------------------------+ //=============================================================================================== //------------- Возвращает суммарный профит открытых позиций в валюте депозита -----------------+ //=============================================================================================== double GetProfitOpenPosInCurrency(string symb="0", int type=-1, int mg=-1,int index=0) { double p[]; int c=-1, pr=0; if(symb=="0") { symb=Symbol();} for (int i=OrdersTotal()-1; i>=0; i--) { if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) { if(OrderType()==OP_BUY || OrderType()==OP_SELL) { if((OrderSymbol()==symb||symb=="")&&(type<0||OrderType()==type)&&(mg<0||OrderMagicNumber()==mg)) { c++; ArrayResize(p, c+1); p[c]=OrderProfit()+OrderSwap()+OrderCommission(); pr=c>=index?index:c; }}}} return(c==-1?0:p[pr]); }
Исправил, а то если не было открытых, была ошибка
Зачем так усложнять?
Вопрос стоит четко "Как получить профит предпоследнего ордера?".
if(OrdersTotal()>=2)
{
if(OrderSelekt(OrdersTotal()-2, SELEKT_BY_POS)
{
profit=OrderProfit();
}
}
Зачем так усложнять?
Вопрос стоит четко "Как получить профит предпоследнего ордера?".
if(OrdersTotal()>=2)
{
if(OrderSelekt(OrdersTotal()-2, SELEKT_BY_POS)
{
profit=OrderProfit();
}
}
Потому, что может быть открыто десяток позиций по разным инструментам, и ваши -2 попадут на второстепенный символ от того, который нужен в расчёте.
Вот, выбираете номер нужного, не забывайте, первая с индексом "0"
Ненадежный способ. Как ордера сортируются после перезапуска терминала никто не знает, по времени ли, по тикету ли.
Поэтому надо надеться только на себя - сортировать по времени.
Как можно получить OrderProfit() предпоследнего открытого ордера, пробую как на примере с низу даёт OrderProfit() только последнего
Можно первый раз найти последний, потом второй раз такой же поиск, но найденный ранее игнорировать и будет предпоследний.
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Как можно получить OrderProfit() предпоследнего открытого ордера, пробую как на примере с низу даёт OrderProfit() только последнего