Cálculo do lucro de pedidos fechados "HELP

 

O lucro das ordens fechadas é considerado corretamente, mas após o fechamento adiciona o valor ao anterior (5; 5+5=10; 10+5=15)
Como fazer com que cada lucro fechado de uma série seja um novo, em vez do anterior (5; 5; 5; 5) ?
Em uma série de pedidos fechados pode haver compra e venda, ou apenas compra e apenas vende pedidos

color ProfitColor;

// START //
   if(LastProfitCL(-1)<0) ProfitColor=Red;
   if(LastProfitCL(-1)>0) ProfitColor=LimeGreen;
   if(LastProfitCL(-1)==0)ProfitColor=DarkGray;
   ObjectCreate("Last Profit", OBJ_LABEL, 0, 0, 0);
   ObjectSet("Last Profit", OBJPROP_CORNER, 1);
   ObjectSet("Last Profit", OBJPROP_XDISTANCE, 5);
   ObjectSet("Last Profit", OBJPROP_YDISTANCE, 15);
   ObjectSetText("Last Profit",StringConcatenate("Last Profit: ",DoubleToStr(LastProfitCL(-1),2)),10,"Arial",ProfitColor);
// END START //

//+----------------------------------------------------------------------------+
//|    Возвращает суммарный профит в валюте депозита серии закрытых ордеров    |
//+----------------------------------------------------------------------------+
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) {LastProfit+=OrderProfit()+OrderCommission()+OrderSwap();}
       }
  return(LastProfit);
   }
 

Precisamos acrescentar uma condição para dividir os pedidos fechados em série

Diga-nos o princípio do algoritmo ou da divisão

 
Natashe4ka:   ... Lucro de ordens fechadas ... adiciona o valor ao anterior (5; 5+5=10; 10+5=15)

Como fazer com que cada lucro fechado de uma série seja um novo, não o anterior (5; 5; 5; 5) ?? .....

Em vez de soma aritmética, ela deve ser adicionada à cadeia de caracteres com um espaço ou ponto-e-vírgula e espaço, o que você preferir
 
STARIJ:
Em vez de soma aritmética, acrescente-a a uma cadeia de caracteres com um espaço ou ponto-e-vírgula e espaço, o que você preferir

Boa idéia.

Ou podemos colocá-lo em uma matriz.

 
Natashe4ka:

O lucro das ordens fechadas é considerado corretamente, mas após o fechamento adiciona o valor ao anterior (5; 5+5=10; 10+5=15)
Como fazer com que cada lucro fechado de uma série seja um novo, em vez do anterior (5; 5; 5; 5) ?
Em uma série de pedidos fechados pode haver compra e venda, ou apenas compra e apenas vende pedidos

color ProfitColor;

// START //
   if(LastProfitCL(-1)<0) ProfitColor=Red;
   if(LastProfitCL(-1)>0) ProfitColor=LimeGreen;
   if(LastProfitCL(-1)==0)ProfitColor=DarkGray;
   ObjectCreate("Last Profit", OBJ_LABEL, 0, 0, 0);
   ObjectSet("Last Profit", OBJPROP_CORNER, 1);
   ObjectSet("Last Profit", OBJPROP_XDISTANCE, 5);
   ObjectSet("Last Profit", OBJPROP_YDISTANCE, 15);
   ObjectSetText("Last Profit",StringConcatenate("Last Profit: ",DoubleToStr(LastProfitCL(-1),2)),10,"Arial",ProfitColor);
// END START //

//+----------------------------------------------------------------------------+
//|    Возвращает суммарный профит в валюте депозита серии закрытых ордеров    |
//+----------------------------------------------------------------------------+
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 (OrderSymbol()!= Symbol()) continue;
       if (OrderMagicNumber()!= magic) continue;        
       if (OrderType()!= op) continue;
       if (op<0 || OrderType()==op) {LastProfit+=OrderProfit()+OrderCommission()+OrderSwap();}
       }
  return(LastProfit);
   }
Você pode inserir uma variável global e escrever o lucro atual nela. Após fechar o pedido, subtraia o valor anterior, e o que sobrar será o lucro e lembre-se disso
 

É complicado, há algo mais simples?
E exemplos que você pode dar, porque seu cérebro está fervendo?

 
Natashe4ka:
Isto é um pouco complicado; há algo mais simples?

Não, não vai ser mais fácil. Você sempre conta TODAS as ordens, incluindo aquelas que foram contadas durante as vezes anteriores que você usou a funçãoLastProfitCL.E como há cada vez mais pedidos, a quantidade de lucro também aumenta.

Temos que trabalhar a condição segundo a qual o laço será quebrado quando as novas encomendas forem concluídas.

 
Vitalie Postolache:

Precisamos trabalhar em uma condição na qual o loop será interrompido quando as novas ordens se esgotarem.

Ali, essa é a maneira correta de pensar sobre isso))

 
Natashe4ka:

Ali, essa é a maneira correta de pensar sobre isso))

Então?

Onde está a condição?

 
Renat Akhtyamov:

Então?
Onde está a condição?

algo como isto:

double cnt=0;

if (op<0||OrderType()==op) {lastprof+=OrderProfit()+OrderCommission()+OrderSwap(); cnt++}  

e você tem que de alguma forma subtrair cnt novo do passado
cnt 1,2,3 passado
cnt 4,5,6 novo

 
Natashe4ka:

algo como isto:

double cnt=0;

if (op<0||OrderType()==op) {lastprof+=OrderProfit()+OrderCommission()+OrderSwap(); cnt++}  

e você tem que de alguma forma subtrair cnt novo do passado
cnt 1,2,3 passado
cnt 4,5,6 novo

Não, não me refiro à maneira como você já escreveu.

Diga-me em palavras - cálculo de lucro para pedidos fechados em que você está interessado

por exemplo:

- para o dia

- que gera perdas

- último pedido

ou algo mais?

Descreva a série

Razão: