[Arquivo!] Qualquer pergunta de novato, de modo a não desorganizar o fórum. Profissionais, não passem por ela. Não poderia ir a lugar algum sem você - 2. - página 125

 
pyatka__ASD:
Você pode me dizer se alguém tem um software que tem uma conexão em ziguezague alto e baixo extremo. Obrigado

Não sei de qual conexão você precisa, mas... É assim que eu determino na EA qual extremo em ziguezague está disponível - baixo ou alto, esperemos que você encontre o que precisa:

//-----------------------------------------------------------------------------------------------------------------   
   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... O código é áspero e não otimizado. Espero que você saiba que é melhor subtrair dois valores normalizados e verificar o resultado para zero...

 
alsu:

Você pode. Retornar aos parâmetros.

como? se uma variável é declarada dentro do início, você pode atribuí-la ao return_value1?
 
eddy:
como? se uma variável é declarada dentro do início, você pode atribuí-la ao return_value1?

Sim, isto é chamado de passar um parâmetro por referência. Se uma função é declarada normal, sua chamada faz com que todas as variáveis, passadas como parâmetros formais, sejam copiadas para as variáveis locais da função e tratadas. A cópia não é realizada quando os parâmetros são passados por referência, ou seja, a função opera com seus originais, e não com suas cópias. Assim, todas as alterações feitas no código de função com estes parâmetros, permanecem efetivas após o retorno do código de função.

Para passar um parâmetro por referência, indique este método na declaração de função colocando o & antes do identificador do parâmetro requerido.

 

Exemplo (compilar como um roteiro e verificar)

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?))
não é multiplicado por 5, mas por 2. No primeiro caso, o parâmetro a é passado "por valor" e seu conteúdo não é salvo após sair da função, no segundo caso é passado por referência (duplo &a), portanto o valor alterado, ou seja, 5*2=10 será contido na variável a após sair da função Func2.
 

legal:)

Que tal isso?

double a=5;

   Print(Func2(a));
 
eddy:


Que tal isso?

que seriam dez. É mais rápido verificar do que perguntar, a propósito))))
 

O computador está ocupado com cálculos, por isso não posso verificá-lo eu mesmo no momento.

Existe uma peça de código como esta:

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

O Google encontrou várias repetições deste código, então concluo que ele funciona.

No entanto, esta linha

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

é confuso.

Se o DiminaseFactor=3 e asperdas=3, então, de acordo com a fórmula, obtemos Lote=0!!!

Se perdas>3, recebemosLote<0!!!

Isso é possível?

 
bem, quais são então as perdas e o Factor de Diminuição ?
 
eddy:

legal:)

Que tal isso?

não vai fazer nada. A função Funk2 - não retorna nenhum valor. ela é nula
Razão: