[¡Archivo!] Cualquier pregunta de novato, para no saturar el foro. Profesionales, no lo dejéis pasar. No podría ir a ningún sitio sin ti - 2. - página 125

 
pyatka__ASD:
Me pueden decir si alguien tiene un software que tenga una conexión de extremo de zig zag alto y bajo. Gracias

No sé qué conexión necesitas, pero... Así es como determino en el EA qué extremo del zigzag está disponible - bajo o alto, espero que encuentre lo que necesita:

//-----------------------------------------------------------------------------------------------------------------   
   if (op==OP_BUY)
      {
         for (m=1; m<=CalcBarsLimit; m++)                      // Найдём первый перелом ЗЗ слева от первого бара
            {
               zz=iCustom(sy, tf, "ZigZag", dp, dv, bs, 0, m); // Берём данные 0 буфера ЗЗ с бара m
               if (zz!=0 &&                                    // Если первый экстремум верхний
                  NormalizeDouble(zz, dg)==NormalizeDouble(iCustom(sy, tf, "ZigZag", dp, dv, bs, 1, m), dg))
                     return(false);                            // Валим отсюда
               else if (zz!=0 &&                               // Если первый экстремум нижний
                        NormalizeDouble(zz, dg)==NormalizeDouble(iCustom(sy, tf, "ZigZag", dp, dv, bs, 2, m), dg)) 
                  {
                     if (MathRound((KLevel-zz)/pt)>=DistanceMIN &&         // Если расстояние от ZZ до KLevel ...
                         MathRound((KLevel-zz)/pt)<=DistanceMAX)           // ... в заданных пределах
                        {
                           if (Open[1]<KLevel && 
                               Close[1]>KLevel &&
                               pa>KLevel)
                              {
                                 Fibo0_PriceB=zz;                                   // Сохраним цену излома ZZ
                                 Fibo23_PriceB=pa;                                  // Сохраним цену 23 фибы
                     
                                 nmKLB=DoubleToStr(Time[m], 4);                     // имя метки
                                 SetArrow(5, DeepSkyBlue, nmKLB, Time[m], zz, 1);   // Отмечаем излом ЗЗ на графике
                                 return(true);
                              }
                        }       
                  }
            }
      }
//-----------------------------------------------------------------------------------------------------------------   
   if (op==OP_SELL)
      {
         for (m=1; m<=CalcBarsLimit; m++)                      // Найдём первый перелом ЗЗ слева от первого бара
            {
               zz=iCustom(sy, tf, "ZigZag", dp, dv, bs, 0, m); // Берём данные 0 буфера ЗЗ с бара m
               if (zz!=0 &&                                    // Если первый экстремум нижний
                  NormalizeDouble(zz, dg)==NormalizeDouble(iCustom(sy, tf, "ZigZag", dp, dv, bs, 2, m), dg))
                     return(false);                            // Валим отсюда
               else if (zz!=0 &&                               // Если первый экстремум верхний
                        NormalizeDouble(zz, dg)==NormalizeDouble(iCustom(sy, tf, "ZigZag", dp, dv, bs, 1, m), dg)) 
                  {
                     if (MathRound((zz-KLevel)/pt)>=DistanceMIN &&         // Если расстояние от ZZ до KLevel ...
                         MathRound((zz-KLevel)/pt)<=DistanceMAX)           // ... в заданных пределах
                        {
                           if (Open[1]>KLevel && 
                               Close[1]<KLevel &&
                               pb<KLevel)
                              {
                                 Fibo0_PriceS=zz;                                // Сохраним цену излома ZZ
                                 Fibo23_PriceS=pb;                               // Сохраним цену 23 фибы
                     
                                 nmKLS=DoubleToStr(Time[m], 4);                  // имя метки
                                 SetArrow(5, BurlyWood, nmKLS, Time[m], zz, 1);  // Отмечаем излом ЗЗ на графике
                                 return(true);
                              }
                        }       
                  }
            }
      }

   return(false);
}
//-------------------------------------------------------------------------------

ZS... El código es tosco y no está optimizado. Espero que sepas que es mejor restar dos valores normalizados y comprobar que el resultado es cero...

 
alsu:

Puedes hacerlo. Vuelve a los parámetros.

¿cómo? si se declara una variable dentro de start, ¿se puede asignar a return_value1?
 
eddy:
¿cómo? si se declara una variable dentro de start, se puede asignar a return_value1?

Sí, esto se llama pasar un parámetro por referencia. Si una función se declara normalmente, su llamada hace que todas las variables, pasadas como parámetros formales, se copien a las variables locales de la función y se manejen. La copia no se realiza cuando los parámetros se pasan por referencia, es decir, la función opera con sus originales, no con sus copias. En consecuencia, todos los cambios realizados en el código de función con estos parámetros, siguen siendo efectivos después de regresar del código de función.

Para pasar un parámetro por referencia, indique este método en la declaración de la función poniendo el signo & antes del identificador del parámetro requerido.

 

Ejemplo (compilar como un script y comprobar)

void Func1(double a)
{
   a=a*2;
}

void Func2(double &a)
{
   a=a*2;
}

int start()
{
   double a=5;

   Func1(a);
   
   Print(a); //выведет 5

   Func2(a);
   
   Print(a); //выведет 10
}
 
eddy:
5*5=5?))
no se multiplica por 5, sino por 2. En el primer caso, el parámetro a se pasa "por valor" y su contenido no se guarda después de salir de la función, en el segundo caso se pasa por referencia (double &a), por lo que el valor cambiado, es decir, 5*2=10 estará contenido en la variable a después de salir de la función Func2.
 

cool:)

¿Qué te parece esto?

double a=5;

   Print(Func2(a));
 
eddy:


¿Qué te parece esto?

que serían diez. Por cierto, es más rápido comprobar que preguntar)))
 

El ordenador está ocupado con los cálculos, así que no puedo comprobarlo yo mismo en este momento.

Hay un trozo de código como este:

   if(DecreaseFactor>0){
      for(int cnt=OrdersHistoryTotal()-1; cnt>=0; cnt--){
        if(OrderSelect(cnt,SELECT_BY_POS,MODE_HISTORY)){ 
          if(OrderMagicNumber()==Magic){
            if(OrderSymbol()==Symbol()){
              if(OrderType()<2){ 
                  if(OrderProfit()>0) break;
                  if(OrderProfit()<0) losses++;
       } } } } } 
      if(losses>1) Lot=NormalizeDouble(Lot-Lot*losses/DecreaseFactor,1);
    }

Google ha encontrado varias repeticiones de este código, por lo que concluyo que funciona.

Sin embargo, esta línea

Lot=NormalizeDouble(Lot-Lot*losses/DecreaseFactor,1);

es confuso.

¡¡¡Si DecreaseFactor=3 y pérdidas=3, entonces según la fórmula obtenemos Lot=0 !!!

¡¡¡Si las pérdidas>3, obtenemosLot<0!!!

¿Es posible?

 
Bueno, ¿cuáles son las pérdidas y el factor de disminución entonces?
 
eddy:

cool:)

¿Qué te parece esto?

no hará nada. La función Funk2 - no devuelve ningún valor. es nula
Razón de la queja: