Verificar - o que eu fiz de errado?

 

Código de redação

int GetN()
{
   int n = 0;
   for (int i = OrdersHistoryTotal() - 1; i >= 0; i--)
   {
      if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY) && OrderMagicNumber() == Magic && OrderSymbol() == _Symbol)
      {
         bool profit = OrderType() == OP_BUY ? OrderClosePrice() > OrderOpenPrice() : OrderClosePrice() < OrderOpenPrice();
         
         bool loss = OrderType() == OP_BUY ? OrderClosePrice() < OrderOpenPrice() : OrderClosePrice() > OrderOpenPrice();
         
         bool neutral = OrderClosePrice() == OrderOpenPrice();

            SumPosOrder = OrderLots();
            Tiket2 = OrderTicket();
           }


         if(loss)
           {
            n++;
            ObchMin = ObchMin + SumPosOrder; // Подсчет общего минуса
            Minus++;                         //Подсчет отрицательных сделок
            Sdelok++;                        //Подсчет количества сделок
           }

         if(n >= MartinSteps)
           {
            n = 0;
            break;
           }

         if(profit)
           {
            ObchPlus = ObchPlus + (SumPosOrder * 0.8); // Расчет для Бинарных опционов поэтому умножаю на 0,8
           }

         if(profit && ObchPlus < ObchMin)
           {
            n++;
            Pobeda++;
            Sdelok++;
           }



         if(profit && ObchPlus > ObchMin)
           {
            ObchPlus = 0;
            ObchMin = 0;
            Pobeda++;
            Sdelok++;
            n = 0;
            break;
           }
        }
     
   return n;
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
double SelectVolume(int n)
  {
   return
      n == 0 ? Volume1
      : n == 1 ? Volume2
      : n == 2 ? Volume3
      : n == 3 ? Volume4
      : n == 4 ? Volume5
      : n == 5 ? Volume6
      : n == 6 ? Volume7
      : n == 7 ? Volume8
      : n == 8 ? Volume9
      : n == 9 ? Volume10
      : Volume1;
  }
//+------------------------------------------------------------------+

A tarefa era originalmente:
Encontrar a última ordem fechada.
Verifique se fechou na posição mais ou menos.
Conte o número de negócios
Conte o número de negócios mais e menos.

Calcule o valor da aposta.


Se o comércio for lucrativo (e total menos = 0) então aposte o número 1
Se o comércio for menos, então conte menos e aposte o número 2
Se mais, mas menos > 0 então aposte a próxima aposta.
Mas, por alguma razão, não conta o número de apostas e o valor das apostas corretamente.

 

por exemplo, fio

bool neutral = OrderClosePrice() == OrderOpenPrice();

provavelmente devemos moldar a operação das condições algorítmicas como esta:

   bool neutral=false;

   if(NormalizeDouble(OrderClosePrice(),_Digits) == NormalizeDouble(OrderOpenPrice(),_Digits)neutral=true;

e as outras duas condições na mesma veia

 

A propósito, o último acordo na história nem sempre é o último acordo no tempo.

 
Nikita Chernyshov #:

A propósito, o último acordo da história nem sempre é o último acordo no tempo.

Sim, removi a amostragem de tempo, mas ainda não funciona...
Renat Akhtyamov #:

por exemplo, linha

talvez devêssemos formar o trabalho de condições algorítmicas como esta:

   bool neutral=false;

   if(NormalizeDouble(OrderClosePrice(),_Digits) == NormalizeDouble(OrderOpenPrice(),_Digits)neutral=true;

e as outras duas condições na mesma veia

Já usei este bloco antes em outros sistemas e funcionou perfeitamente nesta parte.
mas ainda assim, certamente vou verificar e reescrever. Eu o informarei sobre o resultado.
 
Natalya Smirnova #:
Sim, removi a amostragem de tempo, mas ainda não funciona... Já usei este bloco antes em outros sistemas e funcionou perfeitamente nesta parte.
mas ainda assim, certamente vou verificar e reescrever. Eu o informarei sobre o resultado.

estas variáveis são reiniciadas em algum lugar?

            ObchMin = ObchMin + SumPosOrder; // Подсчет общего минуса
            Minus++;                         //Подсчет отрицательных сделок
            Sdelok++;                        //Подсчет количества сделок
 
Renat Akhtyamov #:

estas variáveis são reiniciadas em algum lugar?

Sim, na inicialização eles têm um valor de 0
e antes da conclusão.
 
Renat Akhtyamov #:

estas variáveis estão zeradas em algum lugar?

Talvez ir a partir do mapeado.
Vou remover a coleta de estatísticas desta função por enquanto, e menos geral e estatísticas em outra (função separada irá produzir)

Escrita por blocos.

Reunir estatísticas e calcular menos e mais (menos e mais são variáveis globais)

if(OrderSelect((OrdersHistoryTotal() - 1), SELECT_BY_POS, MODE_HISTORY) && OrderMagicNumber() == Magic && OrderSymbol() == _Symbol)
              {
               if(OrderTicket() != Tiket2)
                 {
                  bool profit1 = false;
                  if(OrderClosePrice() > 0)
                    {
                     profit1 = true;
                    }
                  bool loss1 = false;
                  if(OrderClosePrice() < 0)
                    {
                     loss1 = true;
                    }


                  SumPosOrder = OrderLots();
                  Tiket2 = OrderTicket();
                  Print(OrderCloseTime());
                 


               if(loss1)
                 {
                  ObchMin = ObchMin + SumPosOrder;
                  Minus++;
                  Sdelok++;
                 }



               if(profit1)
                 {
                  ObchPlus = ObchPlus + (SumPosOrder * 0.8);
                 }

               if(profit1 && ObchPlus < ObchMin)
                 {

                  Pobeda++;
                  Sdelok++;
                 }




               if(profit1 && ObchPlus > ObchMin)
                 {
                  ObchPlus = 0;
                  ObchMin = 0;
                  Pobeda++;
                  Sdelok++;

                 }
}


Bloco 2 - seleção da variável n para cálculo (ou melhor, seleção) da taxa

int GetN()
  {
   int n = 0;
   for(int i = OrdersHistoryTotal() - 1; i >= 0; i--)
     {
      if(OrderSelect(i, SELECT_BY_POS, MODE_HISTORY) && OrderMagicNumber() == Magic && OrderSymbol() == _Symbol)
        {
         bool profit = false;
         if(OrderClosePrice() > 0)
            profit = true;

         bool loss = false;
         if(OrderClosePrice() < 0)
            loss = true;


        }


      if(loss)
        {
         n++;
        }

      if(n >= MartinSteps)
        {
         n = 0;
         break;
        }

      

      if(profit && ObchPlus < ObchMin)
        {
         n++;
        }



      if(profit && ObchPlus > ObchMin)
        {
         n = 0;
         break;
        }
     }

   Print(n);

   return n;
  }


double SelectVolume(int n)
  {
   return
      n == 0 ? Volume1
      : n == 1 ? Volume2
      : n == 2 ? Volume3
      : n == 3 ? Volume4
      : n == 4 ? Volume5
      : n == 5 ? Volume6
      : n == 6 ? Volume7
      : n == 7 ? Volume8
      : n == 8 ? Volume9
      : n == 9 ? Volume10
      : Volume1;
  }
//+------------------------------------------------------------------+


Isto seria provavelmente correto...

 

Eu ainda não entendo a lógica.

Como assim?

bool profit = false;
         if(OrderClosePrice() > 0)
            profit = true;

         bool loss = false;
         if(OrderClosePrice() < 0)
            loss = true;

Como o preço de fechamento do pedido pode ser inferior a zero?

A ordem de compra tem lucro se o preço de fechamento for maior que o preço de abertura

aqui está a condição de um plus de compra (excluindo comissões e trocas):

OrderClosePrice() > OrderOpenPrice()
Se for ao contrário, é um sinal de menos
 
Renat Akhtyamov o preço de fechamento do pedido pode ser inferior a zero?

A ordem de compra tem lucro se o preço de fechamento for maior que o preço de abertura

aqui está a condição de um plus de compra (excluindo comissões e trocas):

Se for ao contrário, é um sinal de menos

Como estou escrevendo para opções binárias, tenho feito as coisas um pouco diferente:

if(OrderProfit() > 0)


Isto seria provavelmente correto?

 
Natalya Smirnova #:

Talvez ir a partir do mapeado.
Vou remover a coleta de estatísticas desta função por enquanto, e o total menos e estatísticas em outra (função separada que vou produzir)

Escrita por blocos

Acumulados menos e mais (menos e mais são variáveis globais)


Bloco 2 - seleção da variável n para cálculo (ou melhor, seleção) da taxa


Isto seria provavelmente correto...

Não quero interferir e ainda nem sequer olhei seu código e dicas...

double SelectVolume(int n)
  {
   return
      n == 0 ? Volume1
      : n == 1 ? Volume2
      : n == 2 ? Volume3
      : n == 3 ? Volume4
      : n == 4 ? Volume5
      : n == 5 ? Volume6
      : n == 6 ? Volume7
      : n == 7 ? Volume8
      : n == 8 ? Volume9
      : n == 9 ? Volume10
      : Volume1;
  }

chamou minha atenção. A este respeito, uma pergunta: não é mais fácil e mais legível usar o interruptor operador

double SelectVolume(int n)
  {
   double Volume = 0.0;
    switch(n)
    {
     case 1  :  Volume = Volume2;     break;
     case 2  :  Volume = Volume3;     break;
     case 3  :  Volume = Volume4;     break;
     case 4  :  Volume = Volume5;     break;
     case 5  :  Volume = Volume6;     break;
     case 6  :  Volume = Volume7;     break;
     case 7  :  Volume = Volume8;     break;
     case 8  :  Volume = Volume9;     break;
     case 9  :  Volume = Volume10;    break;
     default :  Volume = Volume1;     break;
    }
   return(Volume);
  }
Acho que é mais fácil de ler e entender. Talvez funcione um pouco mais rápido também.
 
Alexey Viktorov #:

Você já recebeu conselhos sobre todo o algoritmo, eu não quero interferir e nem sequer olhei para seu código e os mesmos conselhos... Mas isto

chamou minha atenção. A este respeito, uma pergunta: não é mais fácil e mais legível usar o interruptor operador

Acho que é mais fácil de ler e entender. Talvez também funcione um pouco mais rápido.
Como não sou muito experiente, sua sugestão é completamente nova para mim.
Originalmente eu o fiz da maneira que o encontrei, funcionou, então não pensei em melhorá-lo.
Você sabe o que eles dizem - Funciona - não toque nele.

Mas agora vou certamente tentar aplicar este método. Porque é necessário aprender e desenvolver.

Mas eu só vou lidar com minha variável n agora. Não quer ser contado.
sempre n = 0 (até agora)
Razão: