[ARŞİV] Forumu kirletmemek için herhangi bir acemi sorusu. Profesyonel, kaçırmayın. Sensiz hiçbir yerde - 5. - sayfa 279

 

Bir şey, sahip olduğum işlev aracılığıyla bir dizinin öğelerinin değerini doğru şekilde döndürmüyor. Bu konuyla ilgili her şeyi sırayla anlatacağım.

Global değişkenler şunları içerir:

 extern int i_TF = 0 ;
int g_maPeriod[ 3 ] = { 6 , 25 , 150 , 250 },             // Периоды обрабатываемых МА
    g_singMa[ 3 ] = { 1 , 2 , 3 , 4 };                     // признаки машек, добавляемые к основному мэйджику

// Идентификаторы сигналов
#define SIGNAL_BUY           0                                  // Сигнал на покупку
#define SIGNAL_SELL           1                                  // Сигнал на продажу
#define SIGNAL_NO           - 1                                  // Сигнала нет

#define CROSS_UP             0                                  // Признак нахождения быстрой средней
                                                               // ..над медленной
#define CROSS_DN             1                                  // Признак нахождения медленной..
                                                               // ..средней над быстрой
#define CROSS_NO            - 1                                  // Признак равенства двух средних
 int crossDir[3];

Bu hesaplamada kullanılan fonksiyonlar:

 //+-------------------------------------------------------------------------------------+
//| Получение значений МА на двух соседних барах                                        |
//+-------------------------------------------------------------------------------------+
double GetCurAndPrevMA( int maPeriod, double & prevMA)
{
   prevMA = iMA ( NULL , i_TF, maPeriod, 0 , MODE_EMA , MODE_CLOSE, 1 );
   return ( iMA ( NULL , i_TF, maPeriod, 0 , MODE_EMA , MODE_CLOSE, 0 ));
}
//+-------------------------------------------------------------------------------------+
//| Получение положения машек между собой                                               |
//+-------------------------------------------------------------------------------------+
void GetStateMa( int & crossDir[])
{
   double ema365_1;
   double ema365_0 = GetCurAndPrevMA( 365 , ema365_1);

   Print ( "g_maPeriod[0] = " , g_maPeriod[ 0 ]);
   Print ( "g_maPeriod[1] = " , g_maPeriod[ 1 ]);
   Print ( "g_maPeriod[2] = " , g_maPeriod[ 2 ]);
   Print ( "g_maPeriod[3] = " , g_maPeriod[ 3 ]);
   
   for ( int i= 0 ; i< 4 ; i++)
   {
       double ema1;
       double ema0 = GetCurAndPrevMA(g_maPeriod[i], ema1);

      crossDir[i] = CROSS_NO;

       Print ( "ema1 < 365_1 " , ema1 , " < " , ema365_1);
       if (ema1 < ema365_1 && ema0 > ema365_0)
      {
         Print ( "ema1 < 365_1 " , ema1 , " < " , ema365_1);
         crossDir[i] = CROSS_UP;
      }
       if (ema1 > ema365_1 && ema0 < ema365_0)
      {
         Print ( "ema1 > 365_1 " , ema1 , " > " , ema365_1);
         crossDir[i] = CROSS_DN;
      }
   }
}

Başlangıçta , GetStateMa(int& crossDir[]) işlevi tarafından döndürülen dizi öğelerinin değerini ek olarak yazdırırım:

   Print ( "crossDir[0] = " , crossDir[ 0 ]);
   Print ( "crossDir[1] = " , crossDir[ 1 ]);
   Print ( "crossDir[2] = " , crossDir[ 2 ]);
   Print ( "crossDir[3] = " , crossDir[ 3 ]);

İşte iade edilenler:

 2013.04 . 11 15 : 08 : 48      2009.01 . 25 23 : 46   Base150_New EURUSD,H1: crossDir[ 3 ] = 0
2013.04 . 11 15 : 08 : 48      2009.01 . 25 23 : 46   Base150_New EURUSD,H1: crossDir[ 2 ] = - 1
2013.04 . 11 15 : 08 : 48      2009.01 . 25 23 : 46   Base150_New EURUSD,H1: crossDir[ 1 ] = - 1
2013.04 . 11 15 : 08 : 48      2009.01 . 25 23 : 46   Base150_New EURUSD,H1: crossDir[ 0 ] = - 1
2013.04 . 11 15 : 08 : 48      2009.01 . 25 23 : 46   Base150_New EURUSD,H1: open # 1 buy 0.10 EURUSD at 1.29654 ok
2013.04 . 11 15 : 08 : 48      2009.01 . 25 23 : 46   Base150_New EURUSD,H1: ema1 < 365 _1 1.3129 < 1.3225
2013.04 . 11 15 : 08 : 48      2009.01 . 25 23 : 46   Base150_New EURUSD,H1: ema1 < 365 _1 1.3017 < 1.3225
2013.04 . 11 15 : 08 : 48      2009.01 . 25 23 : 46   Base150_New EURUSD,H1: ema1 < 365 _1 1.2886 < 1.3225
2013.04 . 11 15 : 08 : 48      2009.01 . 25 23 : 46   Base150_New EURUSD,H1: ema1 < 365 _1 1.2916 < 1.3225
2013.04 . 11 15 : 08 : 48      2009.01 . 25 23 : 46   Base150_New EURUSD,H1: g_maPeriod[ 3 ] = 250
2013.04 . 11 15 : 08 : 48      2009.01 . 25 23 : 46   Base150_New EURUSD,H1: g_maPeriod[ 2 ] = 150
2013.04 . 11 15 : 08 : 48      2009.01 . 25 23 : 46   Base150_New EURUSD,H1: g_maPeriod[ 1 ] = 25
2013.04 . 11 15 : 08 : 48      2009.01 . 25 23 : 46   Base150_New EURUSD,H1: g_maPeriod[ 0 ] = 6

crossDir[] dizisinin öğelerinin değeri farklı döndürülür, ancak bunların tümü 1 değerinde olmalıdır.

Bu, Mashek 4 periyotları ile 365. periyotları karşılaştırmak için kullanılan ifadelerin çıktısından görülebilir. Değerlerin neden doğru döndürülmediğini söyleyebilir misiniz?

 
Ekburg :


Belirttiğiniz için teşekkür ederim, çünkü bana gönderilen bağlantıda özellikle bu diziler yoktu ve işte olduğum için soldaki sütuna dikkat etmedim.

ama tükürdüğün her şeyi senden başkası yutmaz ;)


Bilgi istemlerinden öğrendiyseniz, nasıl öğrendiniz? Sadece aktif ve meraklı bireysel çalışma meyve verecektir! Senin için çiğnedim ve sen makul tavsiyelere "tükür"! Bebek bakıcısı tut Bebek bakıcılarını sil!
 
Herkese iyi akşamlar.A göstergesinden oluşturulmuş B göstergesine sahibim ( iCustom aracılığıyla ).Her iki gösterge de grafikte.A göstergesinin parametrelerini değiştirirken, B göstergesi otomatik olarak yeniden oluşturulmaz, bunun için onu yeniden derlenmeye zorlamanız gerekir! B göstergesi neden otomatik olarak yeniden oluşturulmuyor Lütfen söyleyin, hatam ne?
 
MK07 :
Herkese iyi akşamlar. A göstergesinden oluşturulmuş B göstergesine sahibim ( iCustom aracılığıyla). Her iki gösterge de grafikte. A göstergesinin parametrelerini değiştirirken, B göstergesi otomatik olarak yeniden oluşturulmaz, bunun için onu yeniden derlenmeye zorlamanız gerekir! B göstergesi neden otomatik olarak yeniden oluşturulmuyor Lütfen söyleyin, hatam ne?
A göstergesini ( iCustom aracılığıyla) A göstergesindeki ayarlara BAĞLI OLMAYAN belirli ayarlarla çağırırsınız. Onlar. terminal aynı anda gösterge A'nın İKİ BAĞIMSIZ kopyasını hesaplar. Dışarıdan (başka bir koddan) çağrılan bir gösterge, terminal tarafından sanal olarak hesaplanır.
 
TarasBY :
A göstergesini ( iCustom aracılığıyla) A göstergesindeki ayarlara BAĞLI OLMAYAN belirli ayarlarla çağırırsınız. Onlar. terminal aynı anda gösterge A'nın İKİ BAĞIMSIZ kopyasını hesaplar.

Ve terminalin A göstergesinin ikinci versiyonunu hesaplaması için ne yapılması gerekiyor?
 
MK07 :
Ve terminalin A göstergesinin ikinci versiyonunu hesaplaması için ne yapılması gerekiyor?
Görevi belirtin.
 
borilunad :

Bilgi istemlerinden öğrendiyseniz, nasıl öğrendiniz? Sadece aktif ve meraklı bireysel çalışma meyve verecektir! Senin için çiğnedim ve sen makul tavsiyelere "tükür"! Bebek bakıcısı tut Bebek bakıcılarını sil!

egonu öfkelendir! Nasihate tükürmüyorum, kabul ettim ve teşekkür ettim ama böyle bir ifade tarzını kabul etmiyorum! Kültürel olarak sordum ve kültürel olarak cevapladım!
 

Merhaba!

Expert Advisor'da Point değişkeninin değerini kullanmanız gerekir.

Ama 0'a eşittir.

Anladığım kadarıyla bu, alıntıdaki ondalık noktadan sonraki 5 basamaktan kaynaklanıyor.

Bu değeri belirlemenin bir yolu var mı?

Teşekkür ederim.

 
TarasBY :
Görevi belirtin.

Gösterge A - normal AO (My_AO) şekildeki en üsttekidir.

Gösterge B - AO göstergesinin (My_AO) histogramı (+1/-1), şekilde ortadakidir.

A göstergesinin parametrelerini değiştirdiğinizde (şekilde altta), B göstergesi yeniden derlemeden sonra bile değişmez.

Sadece göstergelere ne olduğunu göstermek için iki AO göstergesini (My_AO) aynı anda gösterdim.Gerçek koşullarda, yalnızca bir AO (My_AO) olmalıdır.



İlk gösterge kodu A'dır.

İkinci kod gösterge B'dir.

 //---- indicator settings
#property  indicator_separate_window
#property  indicator_buffers 3
#property  indicator_color1  Black
#property  indicator_color2  Green
#property  indicator_color3  Red
#property  indicator_width2   2
#property  indicator_width3   2
#property  indicator_level1 0.0

//---- input parameters
extern int FastPeriod = 5 ;
extern int LowPeriod  = 34 ;
//---- indicator buffers
double      ExtBuffer0[];
double      ExtBuffer1[];
double      ExtBuffer2[];



//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
   //---- drawing settings
   SetIndexStyle( 0 , DRAW_NONE );
   SetIndexStyle( 1 , DRAW_HISTOGRAM );
   SetIndexStyle( 2 , DRAW_HISTOGRAM );
   IndicatorDigits( Digits + 1 );
   SetIndexDrawBegin( 0 , 34 );
   SetIndexDrawBegin( 1 , 34 );
   SetIndexDrawBegin( 2 , 34 );
//---- 3 indicator buffers mapping
   SetIndexBuffer ( 0 ,ExtBuffer0);
   SetIndexBuffer ( 1 ,ExtBuffer1);
   SetIndexBuffer ( 2 ,ExtBuffer2);
//---- name for DataWindow and indicator subwindow label
   IndicatorShortName( "My_AO" );
   SetIndexLabel( 1 , NULL );
   SetIndexLabel( 2 , NULL );
//---- initialization done
   return ( 0 );
  }
//+------------------------------------------------------------------+
//| Awesome Oscillator                                               |
//+------------------------------------------------------------------+
int start()
  {
      
  
   int     limit;
   int     counted_bars=IndicatorCounted();
   double prev,current;
//---- last counted bar will be recounted
   if (counted_bars> 0 ) counted_bars--;
   limit= Bars -counted_bars;
//---- macd
   for ( int i= 0 ; i<limit; i++)
      ExtBuffer0[i]= iMA ( NULL , 0 ,FastPeriod, 0 , MODE_SMA , PRICE_MEDIAN ,i)- iMA ( NULL , 0 ,LowPeriod, 0 , MODE_SMA , PRICE_MEDIAN ,i);
//---- dispatch values between 2 buffers
   bool up= true ;
   for (i=limit- 1 ; i>= 0 ; i--)
     {
      current=ExtBuffer0[i];
      prev=ExtBuffer0[i+ 1 ];
       if (current>prev) up= true ;
       if (current<prev) up= false ;
       if (!up)
        {
         ExtBuffer2[i]=current;
         ExtBuffer1[i]= 0.0 ;
        }
       else
        {
         ExtBuffer1[i]=current;
         ExtBuffer2[i]= 0.0 ;
        }
        
       
     }
//---- done
   return ( 0 );
  }
 #property indicator_separate_window
#property indicator_minimum - 1.5
#property indicator_maximum 1.5
#property indicator_buffers 2
#property indicator_color1 Green
#property indicator_color2 Red
#property  indicator_width1   2
#property  indicator_width2   2
#property indicator_level1 0.0

//--- buffers
double ExtMapBuffer1[];
double ExtMapBuffer2[];

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
//---- indicators
   SetIndexStyle( 0 , DRAW_HISTOGRAM );
   SetIndexBuffer ( 0 ,ExtMapBuffer1);
   SetIndexStyle( 1 , DRAW_HISTOGRAM );
   SetIndexBuffer ( 1 ,ExtMapBuffer2);
//----
   return ( 0 );
  }
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit()
  {
//----
   
//----
   return ( 0 );
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start()
  {  
      
       
     double UP,DN;     
  
  
     int counted_bars=IndicatorCounted(),
       limit;  
       
     if (counted_bars> 0 )
      counted_bars--;
   
      limit= Bars -counted_bars;
//----
   for ( int i= 0 ;i<limit;i++)
       
      { 
        UP= iCustom ( NULL , 0 , "My_AO" , 1 ,i+ 1 );               
        DN= iCustom ( NULL , 0 , "My_AO" , 2 ,i+ 1 );    
             
        
       if (UP> 0 )       
         {ExtMapBuffer1[i+ 1 ]= 1 ;
          ExtMapBuffer2[i+ 1 ]= 0 ;
         }
         
       if (UP< 0 )       
         {ExtMapBuffer1[i+ 1 ]=- 1 ;
          ExtMapBuffer2[i+ 1 ]= 0 ;
         }  
         
                              
       if (DN> 0 )            
         {
          ExtMapBuffer1[i+ 1 ]= 0 ;
          ExtMapBuffer2[i+ 1 ]= 1 ;
         }
              
       if (DN< 0 )            
         {
          ExtMapBuffer1[i+ 1 ]= 0 ;
          ExtMapBuffer2[i+ 1 ]=- 1 ;
         }
               
                       
    
    }
//----
   return ( 0 );
 
   }
   
//+------------------------------------------------------------------+    
   
        
        
 
MK07 :

Gösterge A - normal AO (My_AO) şekildeki en üsttekidir.

Gösterge B - AO göstergesinin (My_AO) histogramı (+1/-1), şekilde ortadakidir.

A göstergesinin parametrelerini değiştirdiğinizde (şekilde altta), B göstergesi yeniden derlemeden sonra bile değişmez.

Sadece göstergelere ne olduğunu göstermek için iki AO göstergesini (My_AO) aynı anda gösterdim.Gerçek koşullarda, yalnızca bir AO (My_AO) olmalıdır.

İlk gösterge kodu A'dır.

İkinci kod gösterge B'dir.

Ve bu sıra normaldir (bunlar terminalin ilkeleridir).

A göstergesinin parametrelerini değiştirirken gösterge B'nin okumalarını değiştirmesini istiyorsanız, göstergeler arasında bilgi alışverişi yapın (belki bir dosya, terminalin global değişkenleri , bilgisayar RAM'i): gösterge A başlatma sırasında başlatılmış parametrelerini iletir ve gösterge B periyodik olarak kontrol eder A göstergesinin parametrelerindeki olası değişiklikler için. Değişiklikler algılandığında, B göstergesinin de yeni parametrelerle yeniden başlatılması gerekir (zorunlu init() çalıştırması).

Neden: