Quaisquer perguntas de recém-chegados sobre MQL4 e MQL5, ajuda e discussão sobre algoritmos e códigos - página 287

 
Boa tarde. Ajuda com esta função, por favor, soma a perda de ordens fechadas, quando usada com ordens fechadas a função metatrader crashes, eu acho que há algum tipo de erro nesta função.
double ClosProfit()
{
double summa=0;
int orders=OrdersHistoryTotal();
{
for(int i=orders-1;i>=0;i--)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)==false)
{
Print("Erro na história!");
break;
}
if(OrderSymbol()!=Symbol() || OrderType()>OP_SELL)
continue;
//---
if(OrderProfit()>0) break;
If(OrderProfit()<0)i++;
}
If(i<0)
summa=OrderProfit()+summa;
}
If(OrderProfit()>summa)
summa=OrderProfit()+summa;
return(summa);
}
 
Lowech:
Olá. Ajude-me com esta função, ela resume as perdas de ordens fechadas, metatrader crashes quando usada com a função de ordens fechadas, eu acho que há algum tipo de erro nesta função.

É melhor olhar para os já prontos e ajustá-los, se necessário. GetProfitFromDateInCurrency()

 
Lowech:
Boa tarde. Ajuda com a função por favor, resume a perda de ordens fechadas, quando usado com ordens fechadas a função metatrader crashes, eu acho que há algum tipo de erro nesta função.

O que você quer dizer com " Metatrader crashes"? O programa se compila com erros!!!

Em três lugares ao invés de se com uma pequena letra minúscula, diz Se com uma letra maiúscula

um par de parênteses encaracolados é claramente desnecessário: o primeiro após int orders=OrdersHistoryTotal(); e seu par após summa=OrderProfit()+summa; - mas isto não é importante

há também...

 
Lowech:
Boa tarde. Ajuda com esta função por favor, ela resume a perda de ordens fechadas, quando usada com a função de ordens fechadas Metatrader crashes, eu acho que há algum tipo de erro nesta função.

Tente isto :

double ClosProfit()
{ double summa=0;
  int orders=OrdersHistoryTotal(); 
  for(int i=orders-1;i>=0;i--)
  {
    if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)==false) { Print("Error in history!"); break; }
    if(OrderSymbol()!=Symbol() || OrderType()>OP_SELL) continue;
    if(OrderProfit()<0.0) summa=OrderProfit()+summa;
  }
  return(summa);
}
 
Cheguei 2 minutos atrasado escrevendo ... Vamos considerar esta parte cuidadosamente:
  for(int i=orders-1;i>=0;i--)
  {
    if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)==false)
    {
      Print("Error in history!");
      break;
    }
    if(OrderSymbol()!=Symbol() || OrderType()>OP_SELL) continue;
    if(OrderProfit()>0) break;
    if(OrderProfit()<0)i++;
  }
  if(i<0)

Compilou-a com a diretiva #propriedade estrita - é a última linha: "i" - identificador não declarado. A questão é que a variável é declarada em um loop e é válida somente no loop. Sem a diretiva #propriedade estrita ela compila sem erros, mas isto é ruim. A diretriz deve ser utilizada.

É mais fácil escrever if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)==falso) em vez de if(!OrderSelect(i,SELECT_BY_POS,MODE_HISTORY))). Agora o próximo passo é uma pausa - esta é a saída do loop. Mas precisamos processar as outras ordens. No entanto, na história, isto não é necessário. O erro ocorre no mercado e nas ordens pendentes, se no momento do processamento, a ordem tiver sido fechada e estiver faltando. A regra geral é se(!OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)) continuar; - continuar a processar os próximos pedidos

Pelo mesmo motivo, substituir if(OrderProfit()>0) break; por if(OrderProfit()>0) continue;

E aqui está a razão do erro: if(OrderProfit()<0)i++; - if(OrderProfit()>0; - o índice é incrementado. E o cabeçalho do laço para(int i=ordens-1;i>=0;i--) o diminui. O processamento da mesma ordem é repetido e o programa entra em um loop. É provavelmente assim que deve ser:

#property   strict
double ClosProfit()
{
  double summa=0;
  for(int i=OrdersHistoryTotal()-1; i>=0; i--)
  {
    if(!OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)) continue;
    if(OrderSymbol()!=Symbol() || OrderType()>OP_SELL) continue;
    if(OrderProfit()<0) summa+=OrderProfit();
  }
  return(summa);
}
 
STARIJ:
2 minutos de atraso ao escrever ... Vamos considerar esta parte cuidadosamente:

Compilou-a com a diretiva #propriedade estrita - é a última linha: "i" - identificador não declarado. A questão é que a variável é declarada em um loop e é válida somente no loop. Sem a diretiva #propriedade estrita ela compila sem erros, mas isto é ruim. A diretriz deve ser utilizada.

É mais fácil escrever if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)==falso) em vez de if(!OrderSelect(i,SELECT_BY_POS,MODE_HISTORY))). Agora o próximo passo é uma pausa - esta é a saída do loop. Mas precisamos processar as outras ordens. No entanto, na história, isto não é necessário. O erro ocorre no mercado e nas ordens pendentes, se no momento do processamento, a ordem tiver sido fechada e estiver faltando. A regra geral é se(!OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)) continuar; - continuar a processar os próximos pedidos

Pela mesma razão, se(OrderProfit()>0) quebrar; substituir por if(OrderProfit()>0) continuar;

E aqui está a razão do erro: if(OrderProfit()<0)i++; - if(OrderProfit()>0; o índice é incrementado. E o cabeçalho do laço para(int i=ordens-1;i>=0;i--) o diminui. O processamento da mesma ordem é repetido e o programa entra em um loop. É provavelmente assim que deve ser:


Obrigado, não há mais acidentes com metatrader) Em relação

if(OrderProfit()>0) quebra; substituir por if(OrderProfit()>0) continua;

Quero que esta função ignore este lucro quando uma ordem fecha com lucro. Quero apenas que inclua o montante do prejuízo antes que a primeira ordem feche com lucro. Isto é

if(OrderProfit()>0) quebra;


Eu deveria parar o balcão se o pedido tiver fechado com lucro, eu vejo corretamente?
 
Lowech:

Obrigado, não há mais metatrader crashes) O que eu preciso é que se um pedido fechar com lucro, a função não leve em conta este lucro, apenas a quantidade de perda e até o primeiro pedido fechado com lucro. Isto é
Eu deveria parar o balcão se o pedido tiver fechado com lucro, eu vejo corretamente?
Seu raciocínio é quase correto. Não há garantia de qualquer colocação de pedidos na história. Para você mesmo você pode, mas para vender - mal.
 
STARIJ:
Seu raciocínio é quase correto. Não há garantia de nenhum arranjo de pedido na história. Para você mesmo - sim, mas para vender - mau.
O loop baseado em pedidos não está em ordem no cálculo dos pedidos?
 
STARIJ:

Se houver uma fonte - DROW_NONE - sem desenho

Não ajudou, ainda exibe números no canto

 
Lowech O loop de pedidos não conta os pedidos em ordem?

Em ordem de ordem na lista. Mas não há garantia de nenhum pedido nesta lista

Razão: