//+------------------------------------------------------------------+ //| Возвращает причину закрытия позиции по Take Profit | //+------------------------------------------------------------------+ bool CAccountHistory::IsClosedByTakeProfit(conststring symbol) { //--- Получим комментарий последней сделки на указанном символе string last_comment=LastDealComment(symbol); //--- Если в комментарии есть строка "tp" if(StringFind(last_comment,"tp",0)>-1) return(true); //--- Если нет строки "tp" return(false); } //+------------------------------------------------------------------+ //| Возвращает причину закрытия позиции по Stop Loss | //+------------------------------------------------------------------+ bool CAccountHistory::IsClosedByStopLoss(conststring symbol) { //--- Получим комментарий последней сделки на указанном символе string last_comment=LastDealComment(symbol); //--- Если в комментарии есть строка "sl" if(StringFind(last_comment,"sl",0)>-1) return(true); //--- Если нет строки "sl" return(false); } //+------------------------------------------------------------------+ //| Возвращает комментарий последней сделки на указанном символе | //+------------------------------------------------------------------+ string CAccountHistory::LastDealComment(conststring 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); }
我以前从未处理过OnTradeTransaction()事件,没有必要这样做,因为不需要考虑交易逻辑中的触发因素。SL或TP。你是说这是我交易经验的证据吗?)
我读得很仔细,但我没有看到有人以工作代码的形式给出一个合理的答案。还是说这是一个他妈的伟大的秘密和一个伟大的魔法--秘密的知识和确定什么是有效的能力?
我不写EA的订单,特别是对外汇。
现在,你已经掌握了所有必要的知识,可以写出合理的代码。
满足你的需求。
我不写EA下单,特别是对外汇。
你现在有了写出合理的代码所需的所有知识。
满足你的需求。
又是谁要求你写下命令的?
现在在这个论坛上提问,意味着要写信订购?
去死吧,你们所有人。你是卖家。
...
而如果你看一下账户历史,看看最后一笔交易的评论,这样做可以吗?
类似这样的事情。
//| Возвращает причину закрытия позиции по 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);
}
如果没有评论呢(这完全有可能)?
当然,很有可能。我使用这个方法来分析测试器中的历史,因为它是最简单和最快的方法。
在这种情况下,我必须制作和分析有挂单 的票据。我手头没有一个现成的例子。
平仓 后,你没有办法通过MQL5知道它的止盈和止损值。
这不是不分青红皂白的指责,而是经过几个小时的努力,找出(没有HistorySelectByPosition和其他东西的帮助)一切工作的结果。如果我错了,我也很乐意道歉。不是没有根据的,我在RoboForexEU-MetaTrader 5服务器上展示了一个测试者的专家顾问(它更容易理解),它打开一个位置,然后把SL和TP水平。
在这个EA中,不能定义单个平仓的SL和TP(在OnDeinit中)。它应该这样做吗?
当然,很有可能。我用这个来分析测试器中的历史,因为这是最简单和最快的。
因此,对于挂单,你需要做和分析票。我手头没有一个现成的例子。
这种方法有什么不适合你?
if (trans.order != my_order_ticket)
{
//Сработал SL или TP
}
break;
这种方法有什么问题?
if (trans.order != my_order_ticket)
{
//Сработал SL или TP
}
break;