Получается, что при таком подходе к начислению нужен чуть более сложный алгоритм:
- Найти последний закрытый ордер с типом OP_BUY или OP_SELL. Все также, как Вы и делаете, но с добавлением проверки типа ордера, чтобы не посчитать балансовую операцию или отложенный ордер.
- Найти в истории счета запись с типом балансовой операции, у которой тикет больше, чем тикет найденного последнего ордера, и в комментарии (OrderComment()) есть подстрока с тикетом последнего ордера. У балансовых операций OrderType() должен быть равен 6, но возможны варианты. Для проверки выберите запись с тикетом 148446952 и посмотрите, какой у нее OrderType().
Так найдем тикет последнего ордера:
int GetTicketOfLastOrder() { int nTicket = -1; datetime dtCloseTime = 0; for (int i = OrdersHistoryTotal() - 1; i >= 0; --i) { if (!OrderSelect(i, SELECT_BY_TICKET, MODE_HISTORY)) continue; if (OrderType() != OP_BUY && OrderType() != OP_SELL) // Некоторым нравится поставить здесь OrderType() < 2 continue; if (OrderMagicNumber() != Magic || OrderSymbol() == sy) continue; if (OrderCloseTime() > dtCloseTime) { dtCloseTime = OrderCloseTime(); nTicket = OrderTicket(); } } return nTicket; }
Затем найдем прибыль балансовой операции, ссылающейся на нужный тикет:
double GetProfitOfBalanceOPerationByTicket(const int nTicket) { string sStr = IntegerToString(nTicket); for (int i = OrdersHistoryTotal() - 1; i >= 0; --i) { if (!OrderSelect(i, SELECT_BY_TICKET, MODE_HISTORY)) continue; if (OrderType() != 6) // Вместо 6, возможно, потребуется другой код continue; if (OrderTicket() > nTicket && StringFind(OrderComment(), sStr) >= 0) return OrderProfit(); } return 0.0; }
Все это используется таким образом:
int nTicket = GetTicketOfLastOrder(); if (nTicket > 0) Alert("Last order profit: ", DoubleToString(GetProfitOfBalanceOPerationByTicket(nTicket), 2));P. S. Писал сразу на форум, не используя ME. Возможны опечатки.
Ihor Herasko #:
Большое Вам спасибо, за столь подробный ответ. Получается, что при таком подходе к начислению нужен чуть более сложный алгоритм:
- Найти последний закрытый ордер с типом OP_BUY или OP_SELL. Все также, как Вы и делаете, но с добавлением проверки типа ордера, чтобы не посчитать балансовую операцию или отложенный ордер.
- Найти в истории счета запись с типом балансовой операции, у которой тикет больше, чем тикет найденного последнего ордера, и в комментарии (OrderComment()) есть подстрока с тикетом последнего ордера. У балансовых операций OrderType() должен быть равен 6, но возможны варианты. Для проверки выберите запись с тикетом 148446952 и посмотрите, какой у нее OrderType().
Так найдем тикет последнего ордера:
Затем найдем прибыль балансовой операции, ссылающейся на нужный тикет:
Все это используется таким образом:
P. S. Писал сразу на форум, не используя ME. Возможны опечатки.Сейчас буду пробовать, заодно и границы знаний своих расширять.
Спасибо.
Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
Делаю выборку по истории, так как это советовали на форуме.
Однако профит и лотность показывает 0
Делала 2 варианта,что не так не понимаю
Второй вариант
Далее у меня исходя из суммы лота и профита делается расчет.
Т.е. мне важно просто понять профит плюс или минус.
Привожу код что делается вообще в данном месте.
Советник для бинарных опционов поэтому такие функции.
Может быть это потому-что в истории счета отображается вот так: