Comprobar: ¿qué he hecho mal?

 

Escribir el código

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;
  }
//+------------------------------------------------------------------+

La tarea era originalmente:
Encontrar la última orden cerrada.
Comprueba si se ha cerrado en la posición de más o de menos.
Contar el número de operaciones
Contar el número de operaciones de más y menos.

Calcula el importe de la apuesta.


Si la operación es rentable (y el total de menos = 0) entonces apuesta número 1
Si la operación es menos, entonces cuenta menos y apuesta número 2
Si más, pero menos > 0 entonces siguiente apuesta.
Pero por alguna razón no cuenta correctamente el número de apuestas y el importe de las mismas...

 

Por ejemplo, la cadena

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

probablemente deberíamos configurar el funcionamiento de las condiciones algorítmicas así:

   bool neutral=false;

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

y las otras dos condiciones en la misma línea

 

Por cierto, el último acuerdo en la historia no siempre es el último acuerdo en el tiempo.

 
Nikita Chernyshov #:

Por cierto, el último acuerdo en la historia no siempre es el último acuerdo en el tiempo.

Sí, he eliminado el muestreo de tiempo, pero todavía no funciona...
Renat Akhtyamov #:

Por ejemplo, la línea

tal vez deberíamos formar el trabajo de las condiciones algorítmicas así:

   bool neutral=false;

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

y las otras dos condiciones en la misma línea

Acabo de utilizar este bloque antes en otros sistemas y ha funcionado perfectamente en esta parte.
pero aun así, seguro que lo comprobaré y reescribiré. Te haré saber el resultado.
 
Natalya Smirnova #:
Sí, he eliminado el muestreo de tiempo, pero todavía no funciona... Acabo de utilizar este bloque antes en otros sistemas y ha funcionado perfectamente en esta parte.
pero aun así, seguro que lo comprobaré y reescribiré. Te haré saber el resultado.

¿se restablecen estas variables en alguna parte?

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

¿se restablecen estas variables en alguna parte?

Sí, al inicio tienen un valor de 0
y antes de la finalización.
 
Renat Akhtyamov #:

¿Están estas variables a cero en alguna parte?

Tal vez ir desde el mapeado.
Voy a quitar la colección de estadísticas de esta función por ahora, y menos general y las estadísticas en otro (función separada producirá)

Escribir por bloques.

Recoger las estadísticas y calcular el menos y el más (el menos y el más son variables globales)

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++;

                 }
}


Bloque 2 - selección de la variable n para el cálculo (o más bien selección) de la tasa

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;
  }
//+------------------------------------------------------------------+


Esto sería probablemente correcto...

 

No entiendo la lógica.

¿Cómo es eso?

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

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

¿Cómo puede el precio de cierre de la orden ser inferior a cero?

La orden de COMPRA tiene beneficios si el precio de cierre es mayor que el precio de apertura

aquí está la condición de una compra plus (excluyendo las comisiones y el canje):

OrderClosePrice() > OrderOpenPrice()
Si es al revés, eso es un punto negativo
 
Renat Akhtyamov el precio de cierre de la orden sea inferior a cero?

La orden de COMPRA tiene beneficios si el precio de cierre es mayor que el precio de apertura

aquí está la condición de una compra plus (excluyendo las comisiones y el canje):

Si es al revés, eso es un punto negativo

Como estoy escribiendo para opciones binarias he hecho las cosas un poco diferentes:

if(OrderProfit() > 0)


¿Esto sería probablemente correcto?

 
Natalya Smirnova #:

Tal vez ir desde el mapeado.
Voy a quitar la colección de estadísticas de esta función por ahora, y el total de menos y las estadísticas en otro (función separada voy a producir)

Escribir por bloques

Menos y más acumulados (menos y más son variables globales)


Bloque 2 - selección de la variable n para el cálculo (o más bien selección) de la tasa


Esto sería probablemente correcto...

No quiero interferir y ni siquiera he mirado su código y consejos...

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;
  }

me llamó la atención. A este respecto, una pregunta: ¿no es más fácil y más legible utilizar el operador de conmutación

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);
  }
Creo que es más fácil de leer y entender. Quizás también funcione un poco más rápido.
 
Alexey Viktorov #:

Ya te han aconsejado sobre todo el algoritmo, no quiero interferir y ni siquiera he mirado tu código y los mismos consejos... Pero esto

me llamó la atención. A este respecto, una pregunta: ¿no es más fácil y más legible utilizar el operador de conmutación

Creo que es más fácil de leer y entender. Quizás también funcione un poco más rápido.
Como no tengo mucha experiencia, su sugerencia es completamente nueva para mí.
Originalmente lo hice como lo encontré, funcionó, así que no pensé en mejorarlo.
Ya sabes lo que dicen - Funciona - no lo toques.

Pero ahora sí que intentaré aplicar este método. Porque es necesario aprender y desarrollarse.

Pero ahora sólo me ocuparé de mi variable n. No quiere ser contado.
siempre n = 0 (hasta ahora)