Você está perdendo oportunidades de negociação:
- Aplicativos de negociação gratuitos
- 8 000+ sinais para cópia
- Notícias econômicas para análise dos mercados financeiros
Registro
Login
Você concorda com a política do site e com os termos de uso
Se você não tem uma conta, por favor registre-se
Nunca lidei com um evento da OnTradeTransaction () antes, não havia necessidade de fazê-lo, pois a lógica comercial não precisava levar em conta o que desencadeou SL ou TP. Você está sugerindo que isso é uma evidência da minha experiência comercial?)))
Estou lendo com muito cuidado, mas não vejo ninguém dando uma resposta sensata na forma de um código de trabalho. Ou é um grande segredo e uma grande feitiçaria - o conhecimento secreto e a capacidade de determinar o que funciona?
Eu não escrevo EAs para pedir, especialmente para FOREX.
Você, agora, tem todo o conhecimento necessário para escrever um código sensato,
que atenda às suas necessidades.
Eu não escrevo EAs para pedir, especialmente para FOREX.
Agora você tem todo o conhecimento necessário para escrever um código sensato,
que atenda às suas necessidades.
E quem lhe pediu para escrever para pedir?
Fazer uma pergunta neste fórum hoje em dia significa escrever sob encomenda?
Vão para o inferno, todos vocês. Vocês são vendedores.
...
E se você olhar para o histórico da conta para ver o comentário da última negociação, não haveria problema?
Algo parecido com isso:
//| Возвращает причину закрытия позиции по 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);
}
E se você olhar para o histórico da conta para ver o comentário da última transação, não haveria problema?
Algo parecido com isso:
Obrigado, gentil homem!
Provavelmente a maneira mais confiável, dado que SL e TP podem deslizar e comparar preços seria inútil.
E se você olhar para o histórico da conta para ver o comentário da última transação, não haveria problema?
Algo parecido com isso:
E se não houver comentários (o que é inteiramente possível)?
Esta é provavelmente a maneira mais confiável, dado que SL e TP podem deslizar e uma comparação de preços seria inútil.
{
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);
}
E se não houver nenhum comentário (o que é inteiramente possível)?
Muito possível, é claro. Uso este para analisar a história no testador, como o mais fácil e rápido.
Neste caso, tenho que fazer e analisar bilhetes com ordens pendentes. Não tenho um exemplo pronto em mãos.
fechar uma posição .
Isto não é uma acusação indiscriminada, mas o resultado de horas tentando descobrir (sem HistorySelectByPosition e outras coisas ajudam) como tudo funciona. E tenho o prazer de pedir desculpas se estiver errado. Para não ser infundado, estou mostrando um Expert Advisor para o testador (é mais fácil de entender) no servidor RoboForexEU-MetaTrader 5, que abre uma posição, depois coloca níveis SL e TP.
Neste EA, SL e TP de uma única posição fechada não podem ser definidos (em OnDeinit). É suposto fazer isso?
Muito possível, é claro. Eu uso este para analisar a história no testador, como o mais fácil e rápido.
E assim, com ordens pendentes, você precisa fazer e analisar as passagens. Eu não tenho um exemplo pronto à mão.
O que não lhe agradou neste método?
if (trans.order != my_order_ticket)
{
//Сработал SL или TP
}
break;
O que há de errado com este método?
if (trans.order != my_order_ticket)
{
//Сработал SL или TP
}
break;