уже не хочу код писать - поздно, но у Вас неправильная логика поиска ордера с наименьшим временем открытия, Вы зачем то используете время сервера, производите расчеты и пр.
-используйте перебор ордеров которые в рынке OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES)
-затем проверяйте свой магик, символ и пр. тип ордера Buy или Sell не разделяйте раз нет необходимости отдельно обрабатывать ордера на покупку и продажу
-убедились, что ордер Вашего кода, возьмите запомните время открытия: OrderOpenTime()
- и потом сравнивайте с запомненным временем открытия все новые итерации цикла перебора ордеров, тип datetime можно сравнивать между собой как обычные int на > или <
в итоге, по окончанию цикла у Вас будет в переменной минимальное время открытия ордера, а там дальше на Ваше усмотрение
вот поиском нашел анализ ордеров из истории терминала, немного не по сабжу, но принцип тот же:
void history(){ int time = 0;double profit = 0;//обьявляем необходимые нам переменные куда мы положим интересующие нас характеристики ордера for(int i = OrdersHistoryTotal();i>=0;i--){// Перебираем все закрытые ордера if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)){//если ордер с таким номером (i) в списке закрытых ордеров есть ( не путать с тикетом) if(OrderSymbol() == Symbol()){//если выбранный ордер был открыт по нашей валютной паре if(time<OrderCloseTime()){//(сравниваем его с хранящимся в пероеменной time) time=OrderCloseTime();//если время закрытия ордера больше - ложим его в переменную profit=OrderProfit();//и заодно запоминаем прибыль ордера } } } } //по окончании этой процедуры в наших переменных будут сидет наибольшее время закрытия, и его профит. Или по нулям если история чистая. //теперь мы можем выставлять условия в зависимости от результата процедуры if(profit == 0 &&time == 0){//действия если история чистая} } if(profit >= 0){//действия если последний ордер был прибыльным, или нулевым} } if(profit < 0 ){//действия если последний ордер был убыточным} } return; }
Почти все правильно
if(MaxOpenTime>0) { for(cnt=total-1;cnt>=0;cnt==) { if (OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES)&&OrderMagicNumber()>0} { tmp = TimeCurrent() - OrderOpenTime();//это в порядке совета, но можно и оставить как было if (tmp - MaxOpenTime*3600>=0) { RefreshRates(); if (OrderType() == OP_BUY) closeprice=Bid; else closeprice=Ask; if (OrderClose(OrderTicket(), OrderLots(), closeprice,10, Green)) { Print("Принудительное закрытие сделки - №", OrderTicket()); OrderPrint(); } else Print("OrderClose() в блоке проверки времени жизни сделки вернул ошибку - ",GetLastError()); } } else Print("OrderSelect() в блоке проверки времени жизни сделки вернул ошибку - ",GetLastError()); } } return(0); }
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Приветствую всех! Коллеги, передо мной стоит задача, преобразовать данный код, так, что бы время сверялось с самой первой позицией, из открытых, с определенным магиком и без магика. Не могу только понять. Каким образом вызвать и использовать нужные мне данные вот здесь OrderOpenTime(). На данный момент блок кода берет ближайшую открытую позицию и без магического номера, сверяет текущее время и время открытие ближайшей позиции. А нужно чтобы данные брались с первой позиции из открытых, с определенным магическим номером. Кто поможет? Тому буду очень благодарен!!!