Не могу поянть OrderOpenTime()

 

Добрый. Хочу достать время открытия каждого ордера в истории, но после выбора ордера функция OrderOpenTime() выдает 0. Как с этим бороться кто поможет пожалуйста?

 int tem,total,s; 

 total=OrdersHistoryTotal();
 if (total>0)
 {
 for (s=total;s>=1;s--)
   {
   tm=OrderSelect(s,SELECT_BY_POS,MODE_HISTORY);
   if (tm<0) Alert (GetLastError());  
   tem=OrderOpenTime();
   Alert(tem);
   }
}
Очень надо,но вот хоть ты тресни не вижу, что тут может быть не так!
 

У меня код работает нормално, но

1) время все таки нужно сохранять в переменную datetime а не int

2) индекс ордеров начинается с 0, а не с 1. поэтому код должен выглядеть где-то так


   datetime tem;
   int total = OrdersHistoryTotal();
   if (total > 0)
   {
      for (int s = total-1; s >= 0; s--)
      {
         if (!OrderSelect(s, SELECT_BY_POS, MODE_HISTORY)) Alert (GetLastError());
         else
         {
            tem = OrderOpenTime();
            Alert(tem);
         }
      }
   }
 

Спасибо за замечания, все начало работать.

Я, конечно, по-хорошему сам должен разобраться, но это последнее что заставит советника работать, а я все не сооброжу как найти сколько это будет профита/убытка в валюте депозита, если цена пройдет 20пунктов(например) при лоте 0.1????

double lot;
int mass = MarketInfo(OrderSymbol(), MODE_TICKVALUE)*lot*20;

Конечно, совсем некрасиво такое спрашивать)) Но голова у меня вообще уже не варит, а хочеться доделать....

Добавил через 10 мин.
Это совсем печально, что я не сообразил....

 

Чтобы найти сколько пунктов прошла цена нужно:

OrderProfit()/MarketInfo(OrderSymbol(),MODE_TICKVALUE)

хотя она даёт результат меньше чем написано в истории ордеров. С чем это может быть связано?


А вот такой подсчет прибыли/убытка в валюте депозита в зависимости от кол-ва пунктов пройденных дает результат больший.

profit=MarketInfo(Symbol(), MODE_TICKVALUE)*lot*N
где n-количество пунктов.
 

Не всегда тик равен 1 пункту. Поэтому может стоит попробовать поэксперементировать так?

int pipsPerTick = MarketInfo(OrderSymbol(), MODE_TICKSIZE) / MarketInfo(OrderSymbol(), MODE_POINT),
    pipsReached = OrderProfit() / MarketInfo(OrderSymbol(), MODE_TICKVALUE) * pipsPerTick;

хотя то что я написал, это лишь то что нужно учитывать в таких ситуациях.

на самом деле нужно расчеты вести, учитывая лот. Потому что 100$ можно заработать пройдя например 5 пунктов с лотом 2.00 или 10 с лотом 1.00 ;)

 
KING >>:

Чтобы найти сколько пунктов прошла цена нужно:

OrderProfit()/MarketInfo(OrderSymbol(),MODE_TICKVALUE)

хотя она даёт результат меньше чем написано в истории ордеров. С чем это может быть связано?


Для активных ордеров (позиций) точнее будет так:

double profit;
OrderSelect(s, SELECT_BY_POS, MODE_TRADES);
if (OrderType() == OP_BUY)
   profit = (Bid - OrderOpenPrice()) / Point;
if (OrderType() == OP_SELL)
   profit = (OrderOpenPrice() - Ask) / Point;


Для закрытых ордеров (сделок) так:

double profit;
OrderSelect(s, SELECT_BY_POS, MODE_HISTORY);
if (OrderType() == OP_BUY)
   profit = (OrderClosePrice() - OrderOpenPrice()) / Point;
if (OrderType() == OP_SELL)
   profit = (OrderOpenPrice() - OrderClosePrice()) / Point;
 

сам только что пробовал подобный подход, но при выполнении кода

   int i = 0;
   while (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY))
   {
         double pipsReached = (OrderClosePrice() - OrderOpenPrice()) / MarketInfo(OrderSymbol(), MODE_POINT);
         Alert("Open = ", OrderOpenPrice(), " ; Close = ", OrderClosePrice(), " ; Pips = ", pipsReached);
         i++;
   }
вылетает ошибка Zero Divide. Не пойму почему...
 
Есть ДЦ, где OrderOpenTime() показывает время выставления отложенного ордера, а не время его срабатывания. Поэтому затруднительно узнать, когда же открылась позиция.
 
Спасибо за информацию!
Причина обращения: