
Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
Я никогда не обрабатывал раньше события OnTradeTransaction (), в этом не было никакой необходимости, поскольку в торговой логике не было необходимости учитывать что именно сработало. SL или TP. Полагаете, что это свидетельствует о моём торговом опыте?)))
Я очень внимательно читаю, но не вижу, что бы кто то дал вразумительный ответ в виде рабочего кода. Или это охрененный секрет и великое колдунство - тайное знание и умение определять что сработало?
Я не пишу советников на заказ, тем более для ФОРЕКС.
У Вас, теперь, есть все необходимые знания для написания вразумительного кода,
соответствующего Вашим потребностям.
Я не пишу советников на заказ, тем более для ФОРЕКС.
У Вас, теперь, есть все необходимые знания для написания вразумительного кода,
соответствующего Вашим потребностям.
А кто Вас просил писать на заказ?!
Нынче задать вопрос на этом форуме означает написать на заказ?
Да идите вы все нахер. Барыги.
...
А если по истории счёта посмотреть комментарий последней сделки, это устроит?
Что-то вроде этого:
//| Возвращает причину закрытия позиции по Take Profit |
//+------------------------------------------------------------------+
bool CAccountHistory::IsClosedByTakeProfit(const string symbol)
{
//--- Получим комментарий последней сделки на указанном символе
string last_comment=LastDealComment(symbol);
//--- Если в комментарии есть строка "tp"
if(StringFind(last_comment,"tp",0)>-1)
return(true);
//--- Если нет строки "tp"
return(false);
}
//+------------------------------------------------------------------+
//| Возвращает причину закрытия позиции по Stop Loss |
//+------------------------------------------------------------------+
bool CAccountHistory::IsClosedByStopLoss(const string symbol)
{
//--- Получим комментарий последней сделки на указанном символе
string last_comment=LastDealComment(symbol);
//--- Если в комментарии есть строка "sl"
if(StringFind(last_comment,"sl",0)>-1)
return(true);
//--- Если нет строки "sl"
return(false);
}
//+------------------------------------------------------------------+
//| Возвращает комментарий последней сделки на указанном символе |
//+------------------------------------------------------------------+
string CAccountHistory::LastDealComment(const string symbol)
{
int total_deals =0; // Всего сделок в списке выбранной истории
string deal_symbol =""; // Символ сделки
string deal_comment =""; // Комментарий сделки
//--- Если история сделок получена
if(HistorySelect(0,TimeCurrent()))
{
//--- Получим количество сделок в полученном списке
total_deals=HistoryDealsTotal();
//--- Пройдемся по всем сделкам в полученном списке от последней сделки к первой
for(int i=total_deals-1; i>=0; i--)
{
//--- Получим комментарий сделки
deal_comment=HistoryDealGetString(HistoryDealGetTicket(i),DEAL_COMMENT);
//--- Получим символ сделки
deal_symbol=HistoryDealGetString(HistoryDealGetTicket(i),DEAL_SYMBOL);
//--- Если символ сделки и текущий символ равны, остановим цикл
if(deal_symbol==symbol)
break;
}
}
//---
return(deal_comment);
}
А если по истории счёта посмотреть комментарий последней сделки, это устроит?
Что-то вроде этого:
Спасибо, добрый человек!
Пожалуй это самый надёжный способ, если учитывать что SL и TP может проскользить и сравнивать цену окажется бесполезно.
А если по истории счёта посмотреть комментарий последней сделки, это устроит?
Что-то вроде этого:
А если комментария нет (что в полне возможно)?
Пожалуй это самый надёжный способ, если учитывать что SL и TP может проскользить и сравнивать цену окажется бесполезно.
{
int OrderType=(int)::HistoryOrderGetInteger(OrderTicket,ORDER_TYPE);
if((OrderType==ORDER_TYPE_BUY) || (OrderType==ORDER_TYPE_SELL))
{
const string OrderComment=HistoryOrderGetString(OrderTicket,ORDER_COMMENT);
const string OrderPrice=::DoubleToString(::HistoryOrderGetDouble(OrderTicket,ORDER_PRICE_OPEN),
(int)::SymbolInfoInteger(HistoryOrderGetString(OrderTicket,ORDER_SYMBOL),SYMBOL_DIGITS));
if(OrderComment=="tp "+OrderPrice)
OrderType=ORDER_TYPE_TAKEPROFIT;
else if(OrderComment=="sl "+OrderPrice)
OrderType=ORDER_TYPE_STOPLOSS;
}
return(OrderType);
}
А если комментария нет (что в полне возиожно)?
Вполне возможно, конечно. Этот использую для анализа на истории в тестере, как самый простой и быстрый.
А так с отложенными ордерами нужно делать и анализировать тикеты. Готового примера у меня под рукой нет.
Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий
TakeProfit (и StopLoss) закрытой позиции
fxsaber, 2016.07.17 20:19
Это не огульные обвинения, а результат многочасовых попыток разобраться (никакие HistorySelectByPosition и прочее не помогают), как же все работает. И я готов с радостью принести свои извинения, если ошибаюсь. Чтобы не быть голословным привожу советник для тестера (так проще разобраться) на сервере RoboForexEU-MetaTrader 5, который открывает позицию, затем ставит SL и TP-уровни.
В этом советнике невозможно определить (в OnDeinit) SL и TP единственной закрытой позиции. Это так задумано?
Вполне возможно, конечно. Этот использую для анализа на истории в тестере, как самый простой и быстрый.
А так с отложенными ордерами нужно делать и анализировать тикеты. Готового примера у меня под рукой нет.
А чем не устроил этот метод?
if (trans.order != my_order_ticket)
{
//Сработал SL или TP
}
break;
А чем не устроил этот метод?
if (trans.order != my_order_ticket)
{
//Сработал SL или TP
}
break;