У меня код работает нормално, но
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 ;)
Чтобы найти сколько пунктов прошла цена нужно:
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. Не пойму почему...
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Добрый. Хочу достать время открытия каждого ордера в истории, но после выбора ордера функция OrderOpenTime() выдает 0. Как с этим бороться кто поможет пожалуйста?
Очень надо,но вот хоть ты тресни не вижу, что тут может быть не так!