[¡AVISO CERRADO!] Cualquier pregunta de novato, para no saturar el foro. Profesionales, no pasen. No puedo ir a ningún sitio sin ti. - página 667

 
artmedia70:

Amigos, no puedo entender por qué no funciona:

Si se encuentra una posición con la magia 5100 en el bucle, el bucle debe pasar a una nueva iteración:

... Pero esto no sucede y la posición seleccionada con un número mágico de 5100 comienza a participar en los cálculos posteriores como la más perdedora...

Este es el cierre... Y entonces, en consecuencia, se coloca otro de bloqueo...

Ayúdame a entender dónde está escondido el perro...

Eso es todo, gracias, no es necesario. Encontré al perro yo mismo...
 

Hasta ahora, he trabajado con funciones simples que producen un único valor de salida.

¿Puede la función dar salida a los valores de varias variables? Por ejemplo: Hora_1, Alta_1, Baja_1, Hora_2, Alta_2, Baja_2.

Gracias.

 
chief2000:

¿Puede una función dar salida a los valores de varias variables?


Una función sólo puede devolver un parámetro, pero nadie prohíbe que una función trabaje con variables declaradas fuera de la función start()(variables globales).
 
DDFedor:

La función sólo puede devolver un parámetro, pero nadie prohíbe que la función trabaje con variables declaradas fuera de la función start() (variables globales).


Tomemos un ejemplo sencillo - si [MA_1>=Ma_2], debería devolver los valores Tiempo_1, Alto_1, Bajo_1

para la barra en la que se produjo el cruce. Este módulo en start() es

 
chief2000:


¿verdad?


Pero hay que tener en cuenta que los valores de dichas variables son relevantes hasta que se llame de nuevo a la función. por lo tanto, las variables deben utilizarse INMEDIATAMENTE después de llamar a la función. entonces las variables contendrán los valores calculados para ESTA llamada a la función.
 
DDFedor:

Pero hay que tener en cuenta que los valores de dichas variables son relevantes hasta que se llame de nuevo a la función. por lo tanto, las variables deben utilizarse INMEDIATAMENTE después de llamar a la función. entonces las variables contendrán los valores calculados para ESTA llamada a la función.

Sí, es comprensible. Gracias.

 
chief2000:

Hasta ahora, he trabajado con funciones simples que producen un único valor de salida.

¿Puede la función dar salida a los valores de varias variables? Por ejemplo: Hora_1, Alta_1, Baja_1, Hora_2, Alta_2, Baja_2.

¿Y qué le impide utilizar el paso de parámetros por referencia en lugar de por valor en la declaración de la función? Ejemplo (Fundamentos del lenguaje/Variables/Parámetros formales):

Es posible pasar parámetros por referencia. En este caso, la modificación de dichos parámetros afectará a las variables correspondientes en la función llamada pasada por referencia. No se pueden pasar elementos de arrays por referencia. Los parámetros pueden ser pasados por referencia sólo dentro de los límites de un único módulo, tal oportunidad no se proporciona para las funciones de la biblioteca. Para especificar que un parámetro se pasa por referencia, se debe colocar el modificador & después del tipo de datos.

Ejemplo:

void func(int& x, double& y, double& z[]) { double calculated_tp; ... for(int i=0; i<OrdersTotal(); i++) { if(i==ArraySize(z)) break; if(OrderSelect(i)==false) break; z[i]=OrderOpenPrice(); } x=i; y=calculated_tp; }

Los arrays también se pueden pasar por referencia, todos los cambios se reflejarán en el array original. A diferencia de los parámetros simples, las matrices también pueden pasarse por referencia a las funciones de la biblioteca.

Observe que func() es de tipo void, pero su ejecución modificará los tres parámetros declarados fuera de él, ya que los tres están provistos del modificador &. Incluyendo, por cierto, la matriz z[] cambia completamente.
 
Mathemat:

¿Y qué le impide utilizar el paso de parámetros por referencia en lugar de por valor en la declaración de la función? Ejemplo (Fundamentos del lenguaje/Variables/Parámetros formales):

Observe que la función func() es de tipo void, pero su ejecución modificará los tres parámetros declarados fuera de ella, ya que los tres están provistos del modificador &. Incluyendo, por cierto, la matriz z[] cambia completamente.

¡Muchas gracias!

 
Cómo hacerlo Si la última operación no fue rentable, hay que cambiar el lote, si no, no)?
 
rovlent:
¡Cómo hacer así! Si la última operación no fue rentable, deberíamos cambiar el lote, si no, no).


Por ejemplo, así

//=================================================
// Расчет размера позиции
//==================================================
double CalculateLots(){
   double Res=dLots;
   bool bProfit=true;
   int PrevTime=-1;
   double tmpLots;
   for (int i=0;i<OrdersHistoryTotal();i++){
      if (!OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)) continue;
      if (OrderSymbol()!=Symbol())                    continue;
      if (OrderMagicNumber()!=MAGIC)                  continue;
      if (OrderCloseTime()<PrevTime)                  continue;
      PrevTime=OrderCloseTime();
      if (OrderProfit()>0) bProfit=true; else bProfit=false;
      tmpLots=OrderLots();
   }
   double Lots_Step=MarketInfo(Symbol(), MODE_LOTSTEP);
   if (!bProfit) Res=tmpLots+Lots_Step;
   return(Res);
}

Se incrementa en el paso fijado por la CC. Aunque las variantes pueden ser diferentes

dLots - tamaño de posición por defecto