Cualquier pregunta de novato, para no saturar el foro. Profesionales, no pasen de largo. En ninguna parte sin ti - 6. - página 111

 
Trendy:

¡Muchas gracias! Lo necesitaba para comparar las características de las velas (más, menos, etc.) Lo atornillé y funciona. Sólo no puedo entender cómo se compara el tipo de datos cadena? O doble a la cadena no se traduce número a la cadena? :-D


PS. No funciona en el indicador - sólo en el script... Cuando llamo a High[i] - obtengo sólo 4 decimales en él.

Estoy escribiendo:

Alert ("doubletostr High = ", DoubleToStr(High[1],5));
if (DoubleToStr(High[2],5)>(DoubleToStr(High[3],5)
{
Alerta ("Más");
}
if (DoubleToStr(High[2],5)<(DoubleToStr(High[3],5))
{
Alerta ("Más pequeño");

}

Funciona, escribe el resultado con cinco dígitos, cuenta por encima/por debajo. El problema es que en el indicador la matriz de cadenas no aparece en el gráfico. Por lo tanto...

...escribir:

Alert ("Normalized Double High = ", NormalizeDouble(High[1],5));

No funciona - el resultado es > 1,1234

No entiendo a los desarrolladores, ¿por qué han tenido que complicar tanto las cosas? ¿Por qué si muestra tantos dígitos en el gráfico, no raya la función llamada con cinco dígitos? ¿Quizás haya una solución sencilla?


La cosa se pone aún más interesante:

traducir

Alert ("iFractals doubletostr= ", DoubleToStr(iFractals(0,0,MODE_UPPER,2),Digits));

Escribe: 1,32169 - OK.

Convertir de nuevo a un valor numérico utilizando StrToDouble:

Alert ("iFractals StrToDoubledoubletostr= ", StrToDouble(DoubleToStr(iFractals(0,0,MODE_UPPER,2),Digits);

Resultado: 1,3217

Debería haber un meme con Jackie Chan en el que no entienda el chip).

 
hoz:

¿Y qué es lo que realmente produce Alert?

Dice 0,01 pero en realidad es 0...0100.
 
Trendy:

La cosa se pone aún más interesante:

traducir

Alert ("iFractals doubletostr= ", DoubleToStr(iFractals(0,0,MODE_UPPER,2),Digits));

Escribe: 1,32169 - OK.

Convertir de nuevo a un valor numérico utilizando StrToDouble:

Alert ("iFractals StrToDoubledoubletostr= ", StrToDouble(DoubleToStr(iFractals(0,0,MODE_UPPER,2),Digits);

Resultado: 1,3217

Debería haber un meme con Jackie Chan en el que se malinterpreta el chip).


DoubleToStr() se utiliza para dar salida a los mensajes con la precisión deseada. Las funciones estándar Print(), Alert(), etc., imprimen en 4 dígitos.

Cuando quiera ver un número con la precisión que desee, utilice entonces DoubleToStr(), no en los cálculos.

No es necesario traducir nada de un lado a otro... ;)

 
semiromid:

Dice 0,01 pero el valor real es 0...0100.


Salida entonces 100 * punto = 100 * 0,00001 = 0,001pp (si para cinco dígitos)

El valor de lBUY ha sido modificado anteriormente. Por lo tanto, como yo lo veo, la condición:

if(lBUY==0.01)

No se cumplirá. Y, por tanto, el valor de lBUY seguirá siendo el mismo.

 
artmedia70:
La variable j debe inicializarse explícitamente al principio de la función con un valor negativo. Pruébalo. Todavía no he mirado más allá.


Hasta ahora lo mismo. Aquí tenemos:

//+-------------------------------------------------------------------------------------+
//| Получаем состояние последней позиции (Открыта или закрыта)                          |
//+-------------------------------------------------------------------------------------+
bool isCloseByTakeLastOpenPos(int delta)
{
   datetime lastOrderCloseTime = 0,               // Время закрытия последнего открытого ордера
            lastOOTHist = -1;                     // Время открытия последнего открытого ордера из истории
   int j = -1;
   
   for (int i=OrdersHistoryTotal()-1; i>=0; i--)
   {
      if (!OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) continue;
      if (OrderMagicNumber() != i_magic) continue;
      if (OrderSymbol() != Symbol()) continue;
      if (OrderType() > 1) continue;               // Все удалённые отложки нас не интересуют..
  
      if (lastOrderCloseTime < OrderCloseTime())   // Находим время закрытия..
      {
         lastOrderCloseTime = OrderCloseTime();   // ..последней закрытой позиции в истории
         j = i;
      }
   }
  if (OrderSelect(j, SELECT_BY_POS, MODE_HISTORY))
   {
      if (OrderProfit() + OrderCommission() + OrderSwap() <= 0) return (false);
      if (MathAbs(OrderProfit() - OrderClosePrice()) > delta * pt) return (false);
      else
      {
         lastOOTHist = OrderOpenTime();
         Comment("FUNC isCloseByTakeLastOpenPos : lastOOTHist = ", lastOOTHist);
      }
   }
   else
   {
      Comment("FUNC isCloseByTakeLastOpenPos : не удалось выбрать ордер в истории");
      Print("FUNC isCloseByTakeLastOpenPos : не удалось выбрать ордер в истории");
      return(false);
   }
  
   for(int h=OrdersTotal()-1; h>=0; h--)
   {
      if (OrderSelect(h, SELECT_BY_POS, MODE_TRADES))
      {
         if (OrderMagicNumber() != i_magic)   continue;
         if (OrderSymbol() != Symbol())       continue;
         if (OrderType() > 1)                 continue;
         if (lastOOTHist < OrderOpenTime()) return(false);  // Выбранная рыночная позиция открыта позже закрытой по тейку
      }
      else {Print("FUNC isCloseByTakeLastOpenPos : не удалось выбрать рыночный ордер");return(false);}
   }
   
   return (true);
}
 
artmedia70:

DoubleToStr() se utiliza para dar salida a los mensajes con la precisión deseada. Las funciones estándar Print(), Alert(), etc. imprimirán 4 dígitos.

Cuando quieres ver un número con la precisión que deseas, es cuando usas DoubleToStr(), no en los cálculos.

No es necesario traducir nada de un lado a otro... ;)


Es comprensible... ahora...) Pero la cuestión es que necesito sacar de alguna manera un quinto dígito para los cálculos(

Si DoubleToStr() no sirve para ello, ¿entonces este lenguaje no tiene esa característica? ¿No lo previeron los desarrolladores?

 
hoz:


Hmm. Hasta ahora, todo bien. Aquí estamos:

¿No debería ser lo mismo? ;)
 
Trendy:

Es comprensible... ahora...) Pero la cuestión es que necesito sacar de alguna manera un quinto dígito para los cálculos(

Si DoubleToStr() no sirve para ello, ¿entonces este lenguaje no tiene esa característica? ¿No lo previeron los desarrolladores?


Los cálculos utilizan incluso más dígitos de los que crees. Si quieres ver con la precisión que deseas, utiliza DoubleToStr(). No lo verás de otra manera.
 

¡Señores programadores! Por favor, aconsejar cómo combinar un EA con un indicador?

Por ejemplo, tomé un simple bot mo_bidir.mq4 que comercia usando su propio algoritmo y quiero que siga abriendo operaciones usando su propio algoritmo pero después de la señal de 3 МА.

Por ejemplo en una señal - Tres medias móviles:

FastEMA>MediumEMA>SlowEMA (tendencia al alza) - bot compra

FastEMA<MediumEMA<SlowEMA (tendencia hacia abajo) - bot vende

Inp_Signal_ThreeEMA_FastPeriod = 8;

Inp_Signal_ThreeEMA_MediumPeriod = 38;

Inp_Signal_ThreeEMA_SlowPeriod = 48;

Lo que necesito es que el Asesor Experto siga operando en 5 minutos y que el indicador dé señales desde el marco temporal diario o de 4 horas, y quiero poder cambiar los marcos temporales en la configuración del bot.

 
Buenos días a todos los comerciantes. Tal vez esta cuestión ya ha sido discutida, pero algunos EAs de codebase no están compilando en las nuevas construcciones, el compilador jura que es una versión descompilada. Pero esto parece no tener sentido, las versiones nunca han sido descompiladas
Razón de la queja: