[ARCHIVO]Cualquier pregunta de novato, para no saturar el foro. Profesionales, no lo dejéis pasar. No puedo ir a ningún sitio sin ti - 5. - página 334

 
hoz:


Boris, si comentas una de las condiciones en int GetGeneralSignal(), la apertura es clara.

Lo he localizado. La bandera no cambia su valor cuando la rentabilidad de las órdenes abiertas actualmente está en menos. Aquí está la función reescrita que debería establecer las banderas de corto y largo a falso, es decir, prohibir la apertura de una posición si hay órdenes de menos:

La función de llamada es esta:

¿Quizás las condiciones para el bey son más adecuadas? Es cierto que hoy sólo tengo ventas abiertas debido a una caída muy débil del euro, pero aun así, ¡algo es mejor que nada!
 
borilunad:
¿Quizás las condiciones son más adecuadas para el bai? Francamente hablando, hoy sólo se abren ventas debido a la muy débil caída del euro, pero de todos modos, ¡algo es mejor que nada!


No. La señal está escrita en int GetGeneralSignal() y funciona claramente. La señal es primitiva, la tomé sólo para la prueba. Si el PCI ha cruzado la frontera superior - comprar, y si la inferior - vender. Yo mismo no utilizo índices, pero decidí comprobarlo sólo como experimento.

Así que ahí tienes. Sin banderas, todo funciona perfectamente. Pero no es así con las banderas. Cuando la funciónint FindOrders(bool&long,bool&short) contiene una orden del tipo dado y su beneficio es inferior a cero, mi función, según la referencia a la función GetGeneralSignal(), debe pasar un valor falso a una determinada bandera, pero en realidad las banderas siempre muestran verdadero:

//+-------------------------------------------------------------------------------------+
//| Поиск своих ордеров                                                                 |
//+-------------------------------------------------------------------------------------+
int FindOrders(bool& long, bool& short)
{
   int t, total = OrdersTotal() - 1;
   double profitL,               // Профит лонговой позиции
          profitS;               // Профит шортовой позиции
   
   for (int i=total; i>=0; i--)
   {
      if (!OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) continue;
          if (OrderSymbol() != Symbol()) continue;
              if (OrderMagicNumber() != i_magic) continue;
              {
                 if (OrderType() == OP_BUY)        // Найден ордер типа OP_BUY
                 {
                     if (profitL < OrderProfit())
                     {
                         profitL = OrderProfit();
                         pr("profitL =" + profitL);
                         if (profitL < 0)
                         long = false;
                     }
                 }

                 else if (OrderType() == OP_SELL)       // Найден ордер типа OP_SELL
                 {
                     if (profitS < OrderProfit())
                     {
                         pr("profitS =" + profitS);
                         profitS = OrderProfit();
                         if (profitS < 0)
                         long = false;
                     }
                 }
                 t++;
              }
   }
   
   return (t);
}  

Puedo verlo en la impresora, pero no está claro por qué la bandera no cambia.

Por cierto, he mostrado la rentabilidad de los pedidos en la impresión:

//+-------------------------------------------------------------------------------------+
//| Поиск своих ордеров                                                                 |
//+-------------------------------------------------------------------------------------+
int FindOrders(bool& long, bool& short)
{
   int t, total = OrdersTotal() - 1;
   double profitL,               // Профит лонговой позиции
          profitS;               // Профит шортовой позиции
   
   for (int i=total; i>=0; i--)
   {
      if (!OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) continue;
          if (OrderSymbol() != Symbol()) continue;
              if (OrderMagicNumber() != i_magic) continue;
              {
                 if (OrderType() == OP_BUY)        // Найден ордер типа OP_BUY
                 {
                     Print("if (OrderType() == OP_BUY)");
                     profitL = OrderProfit();
                     pr("profitL =" + profitL);
                     if (profitL < OrderProfit())
                         if (profitL < 0)
                         long = false;
                 }

                 else if (OrderType() == OP_SELL)       // Найден ордер типа OP_SELL
                 {
                     Print("if (OrderType() == OP_SELL)");
                     profitS = OrderProfit();
                     pr("profitS =" + profitS);
                     if (profitS < OrderProfit())
                         if (profitS < 0)
                         long = false;
                 }
                 t++;
              }
   }
   
   return (t);
}

Y en la impresión del valor de las banderas, esto es lo que se muestra:

Es decir, está claro que cuando la rentabilidad es inferior a cero, el indicador correspondiente debería ponerse en falso, pero esto no ocurre... Parece que es elemental, pero algo no funciona.

 
hoz:


No. Hay una señal en la función int GetGeneralSignal() que funciona bien. La señal es primitiva, la tomé sólo para la prueba. Si el PCI ha cruzado la frontera superior - comprar, y si la inferior - vender. Yo mismo no utilizo índices, pero decidí comprobarlo sólo como experimento.

Así que ahí tienes. Sin banderas, todo funciona perfectamente. Pero no es así con las banderas. Cuando la funciónint FindOrders(bool&long,bool&short) contiene una orden del tipo dado y su beneficio es inferior a cero, mi función, según la referencia a la función GetGeneralSignal(), debe pasar el valor falso a una determinada bandera pero las banderas siempre contienen verdadero:

Lo veo en la impresión, pero no entiendo por qué no cambia la bandera.
Mira, has escrito long=false en ambos casos, así que ¿cómo se abrirá?
 
hoz:



Puedo verlo en la impresión, pero no está claro por qué no cambia la bandera.

//+-------------------------------------------------------------------------------------+
//| Поиск своих ордеров                                                                 |
//+-------------------------------------------------------------------------------------+
int FindOrders(bool& long, bool& short)
{
   int t, total = OrdersTotal() - 1;
   double profitL,               // Профит лонговой позиции
          profitS;               // Профит шортовой позиции
   
   for (int i=total; i>=0; i--)
   {
      if (!OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) continue;
          if (OrderSymbol() != Symbol()) continue;
              if (OrderMagicNumber() != i_magic) continue;
              {
                 if (OrderType() == OP_BUY)        // Найден ордер типа OP_BUY
                 {
                     Print("if (OrderType() == OP_BUY)");
                     profitL = OrderProfit();
                     if (profitL < OrderProfit())
                         if (profitL < 0)
                         long = false;
                 }

                 else if (OrderType() == OP_SELL)       // Найден ордер типа OP_SELL
                 {
                     Print("if (OrderType() == OP_SELL)");
                     profitS = OrderProfit();
                     if (profitS < OrderProfit())
                         if (profitS < 0)
                         long = false; /// ?????????????????????? 
                 }
                 t++;
              }
   }
   
   return (t);
}  
 

Se ha corregido la errata.

//+-------------------------------------------------------------------------------------+
//| Поиск своих ордеров                                                                 |
//+-------------------------------------------------------------------------------------+
int FindOrders(bool& long, bool& short)
{
   int t, total = OrdersTotal() - 1;
   double profitL,               // Профит лонговой позиции
          profitS;               // Профит шортовой позиции
   
   for (int i=total; i>=0; i--)
   {
      if (!OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) continue;
          if (OrderSymbol() != Symbol()) continue;
              if (OrderMagicNumber() != i_magic) continue;
              {
                 if (OrderType() == OP_BUY)        // Найден ордер типа OP_BUY
                 {
                     if (profitL < OrderProfit())
                     {
                         profitL = OrderProfit();
                         pr("profitL =" + profitL);
                         if (profitL < 0)
                         long = false;
                     }
                 }

                 else if (OrderType() == OP_SELL)       // Найден ордер типа OP_SELL
                 {
                     if (profitS < OrderProfit())
                     {
                         pr("profitS =" + profitS);
                         profitS = OrderProfit();
                         if (profitS < 0)
                         short = false;
                     }
                 }
                 t++;
              }
   }
   
   return (t);
}

Aquí tienes una captura de pantalla:

Puedes ver, en el gráfico, que el bai es minúsculo y la bandera = TRU todo igual.

 
Buenas noches, ¿podrían decirme cómo hacer que el formulario de Alerta aparezca sólo una vez cuando se produce la condición y no cada vez que se cumple la condición?
 

Lo siento por ti. Te escribiré cómo funcionará sin bucles, ¡que se ralentizan con las funciones! Aquí está su código, pero ¿en qué lo cambio?

//+-------------------------------------------------------------------------------------+
//| Поиск своих ордеров                                                                 |
//+-------------------------------------------------------------------------------------+
bool& long, bool& short)
double profitL,               // Профит лонговой позиции
       profitS;               // Профит шортовой позиции
 
// int start()
 
//.........................................


  
   if(ExistPositions() == false)
   {
      if(long == true)
      {
         OrderSend(.......OPEN_BUY........................)  
      }
      if(short == true)
      {
         OrderSend(.......OPEN_SELL.........................)
   }  }
   if(ExistPositions() == true)
   {
      if(profitL > 0 && long == true && short == false)
      {
         OrderSend(.......OPEN_BUY........................)  
      }
      if(profitS > 0 && short == true && long == false)
      {
         OrderSend(.......OPEN_SELL.........................)
   }  }
      


                     
Este esquema no tiene calambres y funciona al instante. Suprima las funciones innecesarias. ¡Puedes encontrar la función ExistPositions() en Funciones útiles de Dear Kim!
 
borilunad:

Lo siento por ti. Te escribiré cómo funcionará sin bucles, ¡que se ralentizan con las funciones! Aquí está su código, pero ¿en qué lo cambio?

Este esquema es fácil y funciona al instante. Suprima las funciones innecesarias. ¡Puede encontrar la función ExistPositions() en Funciones útiles de Kim!


Boris, la funciónExistPositions tieneel mismo bucle, sólo que tiene más comprobaciones innecesarias, por lo que no será lenta en el camino. Su lógica me parece clara, pero no se ha revelado la razón de la inoperatividad de la versión anterior, lo cual es extraño :)

También se utilizan estas banderas:

 if(profitL > 0 && long == true && short == false)

Y estaba demostrando que no vuelven correctamente.

Así que, de nuevo, si las variables profitL y profitS estarán presentes en esta función, entonces las banderas no son necesarias.

Así es como resultó:

//+-------------------------------------------------------------------------------------+
//| Поиск своих ордеров                                                                 |
//+-------------------------------------------------------------------------------------+
int FindOrders(double& profitL, double& profitS)
{
   int t, total = OrdersTotal() - 1;
   
   for (int i=total; i>=0; i--)
   {
      if (!OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) continue;
          if (OrderSymbol() != Symbol()) continue;
              if (OrderMagicNumber() != i_magic) continue;
              {
                 if (OrderType() == OP_BUY)              // Найден ордер типа OP_BUY
                 {
                     if (profitL < OrderProfit())
                     {
                         profitL = OrderProfit();
                         pr("profitL =" + profitL);      // Выводим профим через коммент на график
                     }
                 }
                 if (OrderType() == OP_SELL)       // Найден ордер типа OP_SELL
                 {
                     if (profitS < OrderProfit())
                     {
                         pr("profitS =" + profitS);     // Выводим профим через коммент на график
                         profitS = OrderProfit();
                     }
                 }
                 t++;
              }
   }
   
   return (t);
}
//+-------------------------------------------------------------------------------------+
//| Получаем общий торговый сигнал                                                      |
//+-------------------------------------------------------------------------------------+
int GetGeneralSignal()
{
   double profitL,               // Профит лонговой позиции
          profitS;               // Профит шортовой позиции
        
   if (FindOrders(profitL, profitS) > 30)
       return (SIGNAL_NO);

   if(ExistPositions() == false)
   {
      if (GetRSI(1) < i_RSIToUpLimit)
      {
         if (GetRSI(0) > i_RSIToUpLimit)
         {
             return (SIGNAL_BUY);
         }
      }
       if (GetRSI(1) > i_RSIToDnLimit)
       {
         if (GetRSI(0) < i_RSIToDnLimit)
         {
             return (SIGNAL_SELL);
         }
      }
   }
   if(ExistPositions() == true)
   {
      if (GetRSI(1) < i_RSIToUpLimit)
         if (GetRSI(0) > i_RSIToUpLimit)
         {
            if(profitL > 0)
               return (SIGNAL_BUY);
         }
      if (GetRSI(1) > i_RSIToDnLimit)
      {
         if (GetRSI(0) < i_RSIToDnLimit)
            if(profitS > 0)
               return (SIGNAL_SELL);
      }
   }
            
   return (SIGNAL_NO);
}

De nuevo, no se abre con la señal, se abre con lo que sea.

 
Hola a todos.
Estoy haciendo un rastro virtual y encontré un problema con closelevel=profitpips-TrailingStop es decir, el rastro y GlobalVariableSet("tral",0) están activados como deberían, pero la variable
a la variablecloselevel se le asigna el valor de profitpips(es el beneficio actual en pips) en lugar de profitpips-TrailingStop con todas las consecuencias que ello conlleva o_o



void Trailing()
   {
    if(!GlobalVariableCheck("tral")&&profitpips>=TrailingStart)
     {
      closelevel=profitpips-TrailingStop;
      GlobalVariableSet("tral",0);
      }
    if(GlobalVariableCheck("tral")&&profitpips>=closelevel+TrailingStop)closelevel=profitpips;
    if(GlobalVariableCheck("tral")&&profitpips<=closelevel)
     {
      Print ("ВСЁ ОТЛИЧНО ЗАКРЫЛИСЬ ПО ТРАЛЛУ");
      for (int i=0; i<NumberOfTry; i++) 
        {
         CloseAll();
         Lot=LOT;
        }
      }  
     return;}

Me lo imaginé, la línea
if(GlobalVariableCheck("tral")&&profitpips>=closelevel+TrailingStop)closelevel=profitpips;  


lo cambié por...
if(GlobalVariableCheck("tral")&&profitpips-TrailingStop>=closelevel+TrailingStop)closelevel=profitpips; 



Ahorael nivel de cierreno se modificacuando el beneficio aumenta...

Ya me lo he imaginado.



 
hoz:


Boris, la funciónExistPositions tiene el mismobucle, pero hay más comprobaciones innecesarias, por lo que no será lenta en el camino. Su lógica me parece clara, pero no se ha revelado la razón de la inoperatividad de la versión anterior, lo cual es extraño :)

También está utilizando estas banderas:

Y he demostrado que no se devuelven correctamente.

Así que, de nuevo, si las variables profitL y profitS estarán presentes en esta función, entonces las banderas no son necesarias.

Así es como funcionó:

De nuevo no se abre por señal, sino por lo que sea.

Entonces, ¡investiga en tu propia casa! Tienes una función para cada palabra de tu código, y tienes que arreglártelas con variables. Eso es lo que hace que el código sea pesado. Hay que usar las funciones cuando no se puede prescindir de ellas! He comentado todo lo que no necesito en el código de Kim, y todo funciona muy rápido! Recuerden que les pregunté a todos cómo hacer que el programa funcione más rápido bajo muchas condiciones. ¡Ahora las pruebas se ejecutan durante un año en todas las garrapatas en 5 minutos! Revisé todas las condiciones y funciones y deseché todo lo innecesario.
Razón de la queja: