[Arşivle!] Forumu kirletmemek için herhangi bir acemi sorusu. Profesyonel, kaçırmayın. Sensiz hiçbir yerde - 2. - sayfa 125

 
pyatka__ASD :
Söyleyin bana, zikzakların yüksek ve düşük köşelerinin bağlantısının olduğu programın bir parçasına sahip olan var mı? teşekkürler

Hangi bağlantıya ihtiyacınız olduğunu bilmiyorum, ama... Expert Advisor'da GZ'nin hangi ekstremumunun mevcut olduğunu bu şekilde belirlerim - alt veya üst, umarım ihtiyacınız olanı bulursunuz:

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

ZY... Kod taslaktır ve optimize edilmemiştir. Umarım iki normalleştirilmiş değeri çıkarmanın ve sonucu sıfır için kontrol etmenin daha iyi olduğunu biliyorsunuzdur...

 
alsu :

Yapabilir. Parametrelere dön.

Bu nasıl? değişken start içinde bildirilmişse, ona return_value1 değerini atayabilirsiniz.
 
eddy :
Bu nasıl? değişken start içinde bildirilmişse, ona return_value1 değerini atayabilirsiniz.

Evet. Buna bir parametreyi referansla geçirme denir. Bir işlev normal olarak bildirildiğinde, onu çağırmak, biçimsel parametreler olarak iletilen tüm değişkenlerin işlevin yerel değişkenlerine kopyalanmasına ve değiştirilmesine neden olur. Referans ile geçerken kopyalama yapılmaz; işlev, parametrelerin kopyalarıyla değil, orijinalleriyle çalışır. Buna göre fonksiyon kodunda bu parametrelerle yapılan tüm değişiklikler fonksiyon kodundan döndükten sonra da geçerliliğini korur.

Bir parametreyi referans olarak iletmek için, bir işlev bildirirken bu yöntemi, gerekli parametrenin tanımlayıcısını & işaretiyle önekleyerek belirtmek gerekir.

 

Örnek (komut dosyası olarak derleyin ve test edin)

 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?))
5 ile değil, 2 ile çarpılır. İlk durumda, a parametresi "değere göre" iletilir ve içeriği işlevden çıktıktan sonra kaydedilmez, ikincisinde - referansa göre (çift & a), bu nedenle değişti değer, yani 5*2=10, Func2 çıktıktan sonra a değişkeninde yer alacaktır.
 

vay canına:)

ve öyle olsa bile?

 double a= 5 ;

   Print (Func2(a));
 
eddy :


ve öyle olsa bile?

on olacak. Bu arada, kontrol etmek sormaktan daha hızlı)))
 

Bilgisayar hesaplamalarla meşgul, bu yüzden şu anda kendim kontrol edemiyorum.

Bu kod parçası var:

   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 aracılığıyla bu kodun birkaç tekrarını buldum, bu nedenle kodun çalıştığı sonucuna vardım.

Ancak, çizgi

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

utandırıcı.

DecreaseFactor=3 ve kayıplar=3 ise, formüle göre Lot=0 !!!

Kayıp>3 ise, Lot<0 !!!

Mümkün mü?

 
Peki, o zaman kayıplar ve DecreaseFactor nedir?
 
eddy :

vay canına:)

ve öyle olsa bile?

yani hiçbir şey olmayacak. Funk2 işlevi - herhangi bir değer döndürmez. o boş