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

 
Sergey Gritsay:
E onde tudo isso existe? Você o escreve em algum lugar em uma variável ou em uma matriz? Mostre-me onde você o guarda primeiro, depois você pode ver o que fazer a seguir.
Não em nenhum lugar. Você precisa criar tudo isso de forma competente e coletar os dados de lucro.
 
Natashe4ka:

OK, então vamos quebrar: há um horário de fechamento de pedidos, há um bilhete ou número de pedidos que coincide com o horário de fechamento. Como combinar e calcular o lucro desses pedidos?
Parece ser fácil, mas ainda não o entendo.

Até agora, ninguém consegue descobrir quais estão destacados em vermelho. Precisamos dos critérios exatos para encontrar essas ordens. Portanto, tente explicar, como eles dizem, nos dedos, com fotos, etc.
 
Sergey Gritsay:
Até agora, ninguém consegue descobrir quais estão destacados em vermelho. Precisamos dos critérios exatos para encontrar essas ordens. Portanto, tente explicar, como dizem nos dedos, com fotos e assim por diante.

?

Por que ninguém pode entender isso, você provavelmente se refere a si mesmo?

Tudo está claro há muito tempo.

A senhora só quer fazê-lo por conta própria, sem ostentar os detalhes de seu programa.

 
Sergey Gritsay:
Até agora, ninguém consegue entender quais estão destacados em vermelho. Precisamos de critérios precisos para encontrar essas ordens. Por este motivo, tente explicar, como dizem nos dedos, com fotos e assim por diante

Sim, eu já dei uma condição de 100% de trabalho e o anexei como código pronto. Você também deve observar que o código usa um método que não é afetado pelo reinício do terminal, e nada será perdido quando o terminal for ligado e continuará a funcionar. Mas aqui eles inventam uma roda que só funcionará no testador.

Sergey, observe também que no código TS original quando você fecha uma série de 5 posições, a ordem no meio do fechamento também é excluída, o que, por sua vez, não levará a nada de bom na negociação real. Em geral, tudo é claro para todos, exceto para o TS.

 
Acho que entendo o que Natalia quer obter
//+------------------------------------------------------------------+
//|                                                   Natashe4ka.mq4 |
//|                                                   Sergey Gritsay |
//|                         https://www.mql5.com/ru/users/sergey1294 |
//+------------------------------------------------------------------+
#property copyright "Sergey Gritsay"
#property link      "https://www.mql5.com/ru/users/sergey1294"
#property version   "1.00"
#property strict

input int Magic=1;//Identification number
double Profit=0;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---

//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---

  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   color ProfitColor=0;

// START //
   LastProfitCL_1(Profit,TimeCurrent(),-1);
  
   if(Profit<0)ProfitColor=clrRed;
   else if(Profit>0)ProfitColor=clrLimeGreen;
   else ProfitColor=clrDarkGray;
  
   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(Profit,2)),10,"Arial",ProfitColor);
// END START //

  }
//+------------------------------------------------------------------+
//Вариант 1
//+------------------------------------------------------------------+
bool LastProfitCL_1(double &LastProfit,//сюда записываем профит
                  datetime timecurent,// текущее время
                  int op=-1//"op" позиция (-1 любая позиция)                
                  )
  {
   double profit=0;
   int cnt=0;
   datetime timecurents=0;
   int total=OrdersHistoryTotal();

   for(int i=total-1;i>=0;i--)
     {
      if(!OrderSelect(i,SELECT_BY_POS,MODE_HISTORY))continue;
      if(OrderMagicNumber()!=Magic)continue;
      if(OrderSymbol()!=_Symbol)continue;
      if(OrderType()>1)continue;// исключим удаленные отложенные ордера
      if(OrderCloseTime()!=timecurent)continue;
      if(OrderType()==op || op==-1)
        {
         profit+=OrderProfit()+OrderCommission()+OrderSwap();
         cnt++;
        }
     }
   if(cnt!=0)
     {
      LastProfit=profit;
      return(true);
     }
   return(false);
  }
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
//|   Вариант 2                                                               |
//+------------------------------------------------------------------+
bool LastProfitCL_2(double &LastProfit,//сюда записываем профит
                  datetime timecurent,// текущее время
                  int op=-1//"op" позиция (-1 любая позиция)                
                  )
  {
   double profit=0;
   int cnt=0;
   datetime timecurents=0;
   int total=OrdersHistoryTotal();
   if(OrderSelect(total-1,SELECT_BY_POS,MODE_HISTORY))
     {
      timecurents=OrderCloseTime();
     }
   for(int i=total-1;i>=0;i--)
     {
      if(!OrderSelect(i,SELECT_BY_POS,MODE_HISTORY))continue;
      if(OrderMagicNumber()!=Magic)continue;
      if(OrderSymbol()!=_Symbol)continue;
      if(OrderCloseTime()<timecurents)continue;
      if(OrderType()>1)continue;// исключим удаленные отложенные ордера
      if(OrderType()==op || op==-1)
        {
         profit+=OrderProfit()+OrderCommission()+OrderSwap();
         cnt++;
        }
     }
   if(cnt!=0)
     {
      LastProfit=profit;
      return(true);
     }
   return(false);
  }
//+------------------------------------------------------------------+
....
 

Corrigida a segunda versão da função

bool LastProfitCL_2(double &LastProfit,//сюда записываем профит
                    datetime timecurent,// текущее время
                    int op=-1//"op" позиция (-1 любая позиция)                
                    )
  {
   double profit=0;
   int cnt=0;
   datetime timecurents=0;
   int total=OrdersHistoryTotal();
   for(int i=total-1;i>=0;i--)
     {
      if(!OrderSelect(i,SELECT_BY_POS,MODE_HISTORY))continue;
      if(OrderType()>1)continue;// исключим удаленные отложенные ордера
      if(OrderType()!=op && op!=-1)continue;  
      if(OrderMagicNumber()!=Magic)continue;
      if(OrderSymbol()!=_Symbol)continue;
      if(timecurents==0)timecurents=OrderCloseTime(); // запомним время последнего закрытого ордера
      if(OrderCloseTime()<timecurents)continue;

      profit+=OrderProfit()+OrderCommission()+OrderSwap();
      cnt++;
     }
   if(cnt!=0)
     {
      LastProfit=profit;
      return(true);
     }
   return(false);
  }

..........

 
Sergey Gritsay:

Corrigida a segunda versão da função

Obrigado por sua ajuda.
A variante 1 não funciona corretamente
A variante 2 funciona corretamente.
Minha variante também funciona corretamente, mas se as ordens forem transportadas para outro dia ou mais, o valor não é Lucro 190 claro, enquanto que deveria ser 4,27.

Veja o screenshot #3https://www.mql5.com/ru/forum/162930/page3

//+----------------------------------------------------------------------------+
//     Возвращает суммарный профит в валюте депозита серии закрытых ордеров    |
//+----------------------------------------------------------------------------+
double LastProfitCL(int op=-1){ //"op" позиция (-1 любая позиция)
  double LastProfit=0;
  datetime t=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()||OrderMagicNumber()!=magic) continue;
       if (t<OrderCloseTime()) {t=OrderCloseTime();}
       if ((op<0||OrderType()==op) && t==OrderCloseTime()) {LastProfit+=OrderProfit()+OrderCommission()+OrderSwap();}
       }
  return(LastProfit);
   }
 
Afinal, o problema não é o número de pedidos, mas a transferência de pedidos para outro dia ou mais.
 
Natashe4ka:
Afinal, o problema não é o número de pedidos, mas a transferência de pedidos para outro dia ou mais.
Você fecha em série ou o quê? O que é a transferência se você fechar todos os pedidos em um ciclo?
 
Vitalie Postolache:
Então você fecha em uma série ou o quê? O que é o carry-over se você fechar todos os pedidos em um ciclo?

Os pedidos são fechados por série, mas se não houver condições de fechamento, os pedidos são reunidos por um ou dois dias, etc.
Embora, o número de pedidos também afete o valor do lucro.
Se houver mais de 3 pedidos, o valor é calculado apenas para o último pedido fechado.