Cálculo do lucro de pedidos fechados "HELP - página 4

 
Renat Akhtyamov:

Não, esta linha é removida. Este é um cálculo de lucro, não vai funcionar dessa forma.

Onde está o comando próximo no código - lá

//+----------------------------------------------------------------------------+
//     Возвращает суммарный профит в валюте депозита серии закрытых ордеров    |
//+----------------------------------------------------------------------------+
double LastProfitCL(int op=-1){ //"op" позиция (-1 любая позиция)
  double LastProfit=0;
   for(i=OrdersHistoryTotal()-1;i>=0;i--)
     if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY) && (OrderType()==OP_BUY || OrderType()==OP_SELL) && OrderSymbol()==Symbol() && OrderMagicNumber()==magic) {
       if (OrderType()!= op || OrderSymbol()!= Symbol() || OrderMagicNumber()!= magic) continue;
    
       if (op<0 || OrderType()==op){if(OrderCloseTime()>=t)LastProfit+=OrderProfit()+OrderCommission()+OrderSwap();}
       }
  return(LastProfit);
   }

e na condição de fechamento

{CloseOrder(OrderTicket());t=TimeCurrent();} 

{DeleteAll();t=TimeCurrent();}

1 não conta, 2 conta corretamente, 3 não conta 0.

 
Natashe4ka:
//+----------------------------------------------------------------------------+
//     Возвращает суммарный профит в валюте депозита серии закрытых ордеров    |
//+----------------------------------------------------------------------------+
double LastProfitCL(int op=-1){ //"op" позиция (-1 любая позиция)
  double LastProfit=0;
   for(i=OrdersHistoryTotal()-1;i>=0;i--)
     if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY) && (OrderType()==OP_BUY || OrderType()==OP_SELL) && OrderSymbol()==Symbol() && OrderMagicNumber()==magic) {
       if (OrderType()!= op || OrderSymbol()!= Symbol() || OrderMagicNumber()!= magic) continue;
    
       if (op<0 || OrderType()==op){if(OrderCloseTime()>=t)LastProfit+=OrderProfit()+OrderCommission()+OrderSwap();}
       }
  return(LastProfit);
   }

e na condição de fechamento

{CloseOrder(OrderTicket());t=TimeCurrent();} 

{DeleteAll();t=TimeCurrent();}

1 não conta, 2 conta corretamente, 3 não conta 0

e é isso.

{t=TimeCurrent();CloseOrder(OrderTicket());}
{DeleteAll();}

E mais uma coisa.

Seus pedidos são fechados de acordo com o bilhete?

Então você precisa se lembrar da hora de início para fechar a série mais cedo

Ou seja, quando uma decisão de fechar uma série acaba de ser formada, não importa se ela vai realmente fechar ou não

 
Natashe4ka:
//+----------------------------------------------------------------------------+

Compreendo sua insistência, mas lhe dei uma versão funcional, com a boa função de fechar uma série de posições para negociação real, não trabalhando no testador.

Ele conta e lembra de tudo, mesmo que o terminal seja reiniciado.

Aqui está um teste, basta executá-lo no testador, e comparar os resultados com a história dos negócios

PS. Esqueci de escrever no código - aqui está a correção

Arquivos anexados:
e-info.mq4  10 kb
 
Vitaly Muzichenko:

Compreendo sua insistência, mas lhe dei uma versão funcional, com a boa função de fechar uma série de posições para negociação real, não trabalhando no testador.

Ele conta e lembra de tudo, mesmo que o terminal seja reiniciado.

Aqui está um teste, basta executá-lo no testador, e comparar os resultados com a história dos negócios

Como posso aplicar isto ao meu código?

O valor daLastProfitCL determina minhaação posterior

 
Renat Akhtyamov:

mas fora isso

{t=TimeCurrent();CloseOrder(OrderTicket());}
{DeleteAll();}

Mais uma coisa.

Seus pedidos estão fechando com um bilhete?

Portanto, você precisa se lembrar da hora do fechamento da série ainda mais cedo.

Ou seja, quando uma decisão de fechar uma série acaba de ser formada, não importa se ela vai realmente fechar ou não

Se a ordem for fechada pela parada, então{t=TimeCurrent();CloseOrder(OrderTicket();}{DeleteAll();} já perderá o valor do lucro
 
Natashe4ka:

Como posso aplicar isto ao meu código?

Eu tenho o valorLastProfitCL quedetermina a ação futura

Portanto, é claro, basta aplicá-lo como você julgar conveniente.

  double LastProfit = LastProfitCL(-1, (datetime)GlobalVariableGet(GetGlobalVariableName("LastProfit")));
  
  Comment(" Последний: ",DoubleToString(LastProfit,1) ," Профит: ", DoubleToString(Profit,1) );

Declarar"LastProfit" uma vez e utilizá-lo onde for necessário

 
Natashe4ka:
Se a ordem for fechada por uma parada, então{t=TimeCurrent();CloseOrder(OrderTicket();}{DeleteAll();} já perderá o valor do lucro

Sim, vai.

Você pode verificar cada tique para ver quantos pedidos ao vivo restam.

Se for o mesmo, então você deve se lembrar da hora do tique anterior.

Então você terá o que precisa.

Mas paradas geralmente não acontecem em autômatos

 
Natashe4ka:
Se fechar em uma parada,{t=TimeCurrent();CloseOrder(OrderTicket();}{DeleteAll();} já perderá o valor de lucro

Ele contará apenas os últimos fechados no tempo, e não depende do valor do fechamento.

Em geral, a tarefa não é completamente clara, portanto, não há mais discussão.

//---------------------------------------------------------

Aqui você vê a descrição, eu não entendo mais o problema:

Arquivos anexados:
e_info.mq4  10 kb
 
Vitaly Muzichenko:

Aqui está tudo disposto, eu não entendo mais a tarefa:

OK, obrigado.
 

Isto também é correto se o "cnt" estiver zerado, mas então o valor é novamente incompreensível como na captura de tela 3 (deve ser um valor de lucro de 4,27)

double LastProfitCL(int op=-1){ //"op" позиция (-1 любая позиция)
  int cnt=0;
  double LastProfit=0;
   for(i=0;i<OrdersHistoryTotal();i++)
     if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY) && (OrderType()==OP_BUY || OrderType()==OP_SELL) && OrderSymbol()==Symbol() && OrderMagicNumber()==magic) {
       if (OrderSymbol()!=Symbol() || OrderMagicNumber()!=magic) continue;
       if ((op<0 || OrderType()==op) && cnt==0) {LastProfit+=OrderProfit()+OrderCommission()+OrderSwap(); cnt++;} else {cnt=0;}
       }
  return(LastProfit);
   }