[Qualsiasi domanda da principiante, per non ingombrare il forum. Professionisti, non passate oltre. Non potrei andare da nessuna parte senza di te - 2. - pagina 125

 
pyatka__ASD:
Potete dirmi se qualcuno ha un software che ha una connessione a zig zag alta e bassa. Grazie

Non so di quale connessione abbiate bisogno, ma... Questo è il modo in cui determino nell'EA quale estremo a zigzag è disponibile - basso o alto, si spera che troverai quello che ti serve:

//-----------------------------------------------------------------------------------------------------------------   
   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... Il codice è grezzo e non ottimizzato. Spero che tu sappia che è meglio sottrarre due valori normalizzati e controllare il risultato per zero...

 
alsu:

È possibile. Ritorno ai parametri.

come? se una variabile è dichiarata all'interno di start allora potete assegnarla a return_value1?
 
eddy:
come? se una variabile è dichiarata all'interno di start, è possibile assegnarla a return_value1?

Sì. Questo si chiama passare un parametro per riferimento. Se una funzione è dichiarata normalmente, la sua chiamata fa sì che tutte le variabili, passate come parametri formali, siano copiate nelle variabili locali della funzione e gestite. La copia non viene eseguita quando i parametri vengono passati per riferimento, cioè la funzione opera con i loro originali, non con le loro copie. Di conseguenza, tutte le modifiche fatte nel codice funzione con questi parametri, rimangono efficaci dopo il ritorno dal codice funzione.

Per passare un parametro per riferimento, indicate questo metodo nella dichiarazione della funzione mettendo il segno & prima dell'identificatore del parametro richiesto.

 

Esempio (compilare come script e controllare)

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?))
non è moltiplicato per 5, ma per 2. Nel primo caso, il parametro a viene passato "per valore" e il suo contenuto non viene salvato dopo l'uscita dalla funzione, nel secondo caso viene passato per riferimento (doppio &a), quindi il valore cambiato, cioè 5*2=10 sarà contenuto nella variabile a dopo l'uscita dalla funzione Func2.
 

cool:)

Che ne dite di questo?

double a=5;

   Print(Func2(a));
 
eddy:


Che ne dite di questo?

sarebbero dieci. A proposito, è più veloce controllare che chiedere)))
 

Il computer è occupato con i calcoli, quindi non posso controllare io stesso al momento.

C'è un pezzo di codice come questo:

   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 trovato diverse ripetizioni di questo codice, quindi concludo che funziona.

Tuttavia, questa linea

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

è confuso.

Se DecreaseFactor=3 e perdite=3, allora secondo la formula otteniamo Lot=0 !!!

Se le perdite>3, otteniamoLotto<0!!!

È possibile?

 
Bene, che cosa sono le perdite e il fattore di diminuzione allora?
 
eddy:

cool:)

Che ne dite di questo?

non farà nulla. La funzione Funk2 - non restituisce alcun valore. è nulla