Resposta

Total OPEN P/L em TODOS os pares de moedas.

5 respostas

Steve Green

Assinante, bbp_participant, comunidade, 47 respostas.

Perfil da visita

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

0

tomas262

Administrador, sq-ultimate, 2 respostas.

Perfil da visita

6 anos atrás #197825

Olá, Steven,

Claro, vou publicar a função

0

Steve Green

Assinante, bbp_participant, comunidade, 47 respostas.

Perfil da visita

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

0

tomas262

Administrador, sq-ultimate, 2 respostas.

Perfil da visita

6 anos atrás #197897

Olá,

verifique sua caixa de correio. Eu lhe enviei uma resposta ao e-mail que nos foi enviado.

0

Steve Green

Assinante, bbp_participant, comunidade, 47 respostas.

Perfil da visita

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

0

tomas262

Administrador, sq-ultimate, 2 respostas.

Perfil da visita

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

0

Visualizando 5 respostas - 1 até 5 (de um total de 5)