Total OPEN P/L em TODOS os pares de moedas.
5 respostas
Steve Green
6 anos atrás #197786
Olá a todos,
Alguém pode me ajudar com uma função personalizada que retorne o total em dinheiro de todas as ordens ABERTAS em TODOS os pares de moedas, ou seja, em todos os gráficos?
Obrigado de antemão
Cumprimentos
Steve
tomas262
6 anos atrás #197825
Steve Green
6 anos atrás #197826
Oi, Tomás,
Não tenho certeza de onde está o problema nas três funções de cliente que codifiquei, por isso colei todas elas abaixo. Suponho que o problema possa estar em qualquer uma das 3.
No testador do Mt4, ele funciona bem, mas quando o executo em uma conta demo, ele adiciona o saldo da conta à soma total.
O código da função de três clientes está abaixo:
- Eu inicializo essa variável da seguinte forma
lv_NumOrdersToday = GetAllOrdersOpenedToday(0, "false");
int GetAllOrdersOpenedToday(int direction, string includePending) {
string todayTime = TimeToStr( TimeCurrent(), TIME_DATE);
int tradesOpenedToday = 0;
for(int i=0;i<OrdersHistoryTotal();i++) {
Se(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)==true) {
if(direction == 1) {
if(OrderType() == OP_SELL || OrderType() == OP_SELLLIMIT || OrderType() == OP_SELLSTOP) {
// pular ordens curtas
continuar;
}
} else if(direction == -1) {
if(OrderType() == OP_BUY || OrderType() == OP_BUYLIMIT || OrderType() == OP_BUYSTOP) {
// pular ordens longas
continuar;
}
}
Se (includePending == "false") {
if(OrderType() == OP_BUYLIMIT || OrderType() == OP_BUYSTOP || OrderType() == OP_SELLLLIMIT || OrderType() == OP_SELLSTOP) {
// pular ordens pendentes
continuar;
}
}
if(TimeToStr( OrderOpenTime(), TIME_DATE) == hojeTime) {
tradesOpenedToday++;
}
}
}
para (int cc = OrderTotal() - 1; cc >= 0; cc-) {
Se (OrderSelect(cc, SELECT_BY_POS)) {
if(direction == 1) {
if(OrderType() == OP_SELL || OrderType() == OP_SELLLIMIT || OrderType() == OP_SELLSTOP) {
// pular ordens curtas
continuar;
}
} else if(direction == -1) {
if(OrderType() == OP_BUY || OrderType() == OP_BUYLIMIT || OrderType() == OP_BUYSTOP) {
// pular ordens longas
continuar;
}
}
Se (includePending == "false") {
if(OrderType() == OP_BUYLIMIT || OrderType() == OP_BUYSTOP || OrderType() == OP_SELLLLIMIT || OrderType() == OP_SELLSTOP) {
// pular ordens pendentes
continuar;
}
}
if(TimeToStr( OrderOpenTime(), TIME_DATE) == hojeTime) {
tradesOpenedToday++;
}
}
}
return(tradesOpenedToday);
}
- passado para essa função é lv_NumOrdersToday da função acima
double GetAllTotalClosedPLInMoney(int orderMagicNumber, int numberOfLastOrders) {
double pl = 0;
int count = 0;
for(int i=OrdersHistoryTotal(); i>=0; i-) {
Se(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)==true) {
Se (orderMagicNumber == 0 || OrderMagicNumber() == orderMagicNumber) {
contar++;
pl = pl + OrderProfit();
Se (count >= numberOfLastOrders) break;
}
}
}
return(pl);
}
double GetALLOpenPLInMoney(int orderMagicNumber) {
double pl = 0;
for(int cnt = 0; cnt < OrdersTotal(); cnt ++)
{
Se (!OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES)) continuar;
Se (orderMagicNumber == 0 || OrderMagicNumber() == orderMagicNumber) continue;
pl += OrderProfit();
}
return(pl);
}
A funcionalidade que estou tentando criar é adicionar os resultados das duas funções ((GetALLOpenPLInMoney(0) + GetAllTotalClosedPLInMoney(0, lv_NumOrdersToday)) e verificar se estão acima ou abaixo de um valor diário predeterminado de Profit ou Loss e, nesse caso, suspender a negociação em todos os pares de moedas.
Mais uma vez, quando executo no testador MT4, ele funciona bem, mas quando executo em uma conta demo, ele inclui o saldo da conta na soma por um motivo desconhecido.
Ou seja, 5023 em vez de 23 em uma conta de 5000.
Muito obrigado
Cumprimentos
Steve
tomas262
6 anos atrás #197897
Steve Green
6 anos atrás #200400
Oi, Tomás,
Esse era o problema. Um recurso não documentado e, como presumi, a maneira como os dados são armazenados. Veja o link: https://www.mql5.com/en/forum/126192
Do link, um trecho abaixo:
O nome de OrdersHistoryTotal() é um pouco enganador, pois também inclui extratos de saldo e crédito. Portanto, esse método pode ser potencialmente não confiável... Uma solução melhor seria fazer um loop nos pedidos no histórico e contar (filtrando o saldo e os extratos de crédito).
Para sua informação, embora não esteja oficialmente documentado, esse é o OrderType() dos extratos de saldo/crédito quando eles são selecionados:
Declaração de "saldo": OrderType()==6
Declaração de "crédito": OrderType()==7
Fiz as alterações necessárias e tudo está funcionando como planejado.
Só para que você saiba.
Cumprimentos
Steve
tomas262
6 anos atrás #200732
Olá,
Fico feliz que esteja funcionando para você agora. Estou verificando agora a função de abrir P/L que você enviou em nosso e-mail
Visualizando 5 respostas - 1 até 5 (de um total de 5)