Forumu kirletmemek için herhangi bir acemi sorusu. Profesyonel, kaçırmayın. Sensiz, hiçbir yerde - 6. - sayfa 987

 
mario_SC-- :

Bu kodla neyi kanıtlamak istediğinizi anlamıyorum. ama ben sınava girenler kategorisine girmeyeceğimden eminim... Yani, eğer yardım istiyorsan, soru cevaplama kategorisinde kendin ol. Böyle bir döngü kolaylıkla, belirli koşullar altında, döngüler ve bundan sadece bir vaka kurtarabilir.
 

Hata ayıklayıcı göstergede hata ayıklarken neden "çöküyor" (çünkü diziye erişiliyor), ancak aynı zamanda her şey grafikte normal şekilde çiziliyor?

MT4 yapı 950, Alpari demosu.

Ekli gösterge.

 //+------------------------------------------------------------------+
//|                                     FX5_MACD_Divergence_V1.1.mq4 |
//|                                                              FX5 |
//|                                                    hazem@uk2.net |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2007, FX5"
#property link        "hazem@uk2.net"
//----
#property indicator_separate_window
#property indicator_buffers 4
#property indicator_color1 Green
#property indicator_color2 Red
#property indicator_color3 Magenta
#property indicator_color4 Blue
//----
#define arrowsDisplacement 0.0001
//---- input parameters
extern string separator1 = "*** MACD Settings ***" ;
extern int     fastEMA = 12 ;
extern int     slowEMA = 26 ;
extern int     signalSMA = 9 ;
extern string separator2 = "*** Indicator Settings ***" ;
extern bool    drawIndicatorTrendLines = true ;
extern bool    drawPriceTrendLines = true ;
extern bool    displayAlert = true ;
//---- buffers
double bullishDivergence[];
double bearishDivergence[];
double macd[];
double signal[];
//----
static datetime lastAlertTime;
static string    indicatorName;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
//---- indicators
   SetIndexStyle( 0 , DRAW_ARROW );
   SetIndexStyle( 1 , DRAW_ARROW );
   SetIndexStyle( 2 , DRAW_LINE );
   SetIndexStyle( 3 , DRAW_LINE );
//----   
   SetIndexBuffer ( 0 , bullishDivergence);
   SetIndexBuffer ( 1 , bearishDivergence);
   SetIndexBuffer ( 2 , macd);
   SetIndexBuffer ( 3 , signal);   
//----   
   SetIndexArrow( 0 , 233 );
   SetIndexArrow( 1 , 234 );
//----
   indicatorName = "FX5_MACD_Divergence_v1.1(" + fastEMA + ", " + 
                                 slowEMA + ", " + signalSMA + ")" ;
   SetIndexDrawBegin( 3 , signalSMA);
   IndicatorDigits( Digits + 2 );
   IndicatorShortName(indicatorName);

   return ( 0 );
}
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit()
  {
   for ( int i = ObjectsTotal () - 1 ; i >= 0 ; i--)
     {
       string label = ObjectName (i);
       if ( StringSubstr (label, 0 , 19 ) != "MACD_DivergenceLine" )
           continue ;
       ObjectDelete (label);   
     }
   return ( 0 );
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start()
  {
   int countedBars = IndicatorCounted();
   if (countedBars < 0 )
       countedBars = 0 ;
   CalculateIndicator(countedBars);
//---- 
   return ( 0 );
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void CalculateIndicator( int countedBars)
  {
   for ( int i = Bars - countedBars; i >= 0 ; i--)
     {
       CalculateMACD(i);
       CatchBullishDivergence(i + 2 );
       CatchBearishDivergence(i + 2 );
     }              
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void CalculateMACD( int i)
  {
   macd[i] = iMACD ( NULL , 0 , fastEMA, slowEMA, signalSMA, 
                   PRICE_CLOSE , MODE_MAIN, i);
   
   signal[i] = iMACD ( NULL , 0 , fastEMA, slowEMA, signalSMA, 
                     PRICE_CLOSE , MODE_SIGNAL, i);         
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void CatchBullishDivergence( int shift)
  {
   if (IsIndicatorTrough(shift) == false )
       return ;  
   int currentTrough = shift;
   int lastTrough = GetIndicatorLastTrough(shift);
//----   
   if (macd[currentTrough] > macd[lastTrough] && 
      Low[currentTrough] < Low[lastTrough])
     {
       bullishDivergence[currentTrough] = macd[currentTrough] - 
                                          arrowsDisplacement;
       //----
       if (drawPriceTrendLines == true )
           DrawPriceTrendLine(Time[currentTrough], Time[lastTrough], 
                              Low[currentTrough], 
                             Low[lastTrough], Green, STYLE_SOLID );
       //----
       if (drawIndicatorTrendLines == true )
          DrawIndicatorTrendLine(Time[currentTrough], 
                                 Time[lastTrough], 
                                 macd[currentTrough],
                                 macd[lastTrough], 
                                 Green, STYLE_SOLID );
       //----
       if (displayAlert == true )
          DisplayAlert( "Classical bullish divergence on: " , 
                        currentTrough);  
     }
//----   
   if (macd[currentTrough] < macd[lastTrough] && 
      Low[currentTrough] > Low[lastTrough])
     {
       bullishDivergence[currentTrough] = macd[currentTrough] - 
                                          arrowsDisplacement;
       //----
       if (drawPriceTrendLines == true )
           DrawPriceTrendLine(Time[currentTrough], Time[lastTrough], 
                              Low[currentTrough], 
                              Low[lastTrough], Green, STYLE_DOT );
       //----
       if (drawIndicatorTrendLines == true )                            
           DrawIndicatorTrendLine(Time[currentTrough], 
                                  Time[lastTrough], 
                                  macd[currentTrough],
                                  macd[lastTrough], 
                                  Green, STYLE_DOT );
       //----
       if (displayAlert == true )
           DisplayAlert( "Reverse bullish divergence on: " , 
                        currentTrough);   
     }      
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void CatchBearishDivergence( int shift)
  {
   if (IsIndicatorPeak(shift) == false )
       return ;
   int currentPeak = shift;
   int lastPeak = GetIndicatorLastPeak(shift);
//----   
   if (macd[currentPeak] < macd[lastPeak] && 
      High[currentPeak] > High[lastPeak])
     {
       bearishDivergence[currentPeak] = macd[currentPeak] + 
                                        arrowsDisplacement;
      
       if (drawPriceTrendLines == true )
           DrawPriceTrendLine(Time[currentPeak], Time[lastPeak], 
                              High[currentPeak], 
                              High[lastPeak], Red, STYLE_SOLID );
                            
       if (drawIndicatorTrendLines == true )
           DrawIndicatorTrendLine(Time[currentPeak], Time[lastPeak], 
                                  macd[currentPeak],
                                  macd[lastPeak], Red, STYLE_SOLID );

       if (displayAlert == true )
           DisplayAlert( "Classical bearish divergence on: " , 
                        currentPeak);  
     }
   if (macd[currentPeak] > macd[lastPeak] && 
      High[currentPeak] < High[lastPeak])
     {
       bearishDivergence[currentPeak] = macd[currentPeak] + 
                                        arrowsDisplacement;
       //----
       if (drawPriceTrendLines == true )
           DrawPriceTrendLine(Time[currentPeak], Time[lastPeak], 
                              High[currentPeak], 
                              High[lastPeak], Red, STYLE_DOT );
       //----
       if (drawIndicatorTrendLines == true )
           DrawIndicatorTrendLine(Time[currentPeak], Time[lastPeak], 
                                  macd[currentPeak],
                                  macd[lastPeak], Red, STYLE_DOT );
       //----
       if (displayAlert == true )
           DisplayAlert( "Reverse bearish divergence on: " , 
                        currentPeak);   
     }   
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
bool IsIndicatorPeak( int shift)
  {
   if (macd[shift] >= macd[shift+ 1 ] && macd[shift] > macd[shift+ 2 ] && 
      macd[shift] > macd[shift- 1 ])
       return ( true );
   else 
       return ( false );
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
bool IsIndicatorTrough( int shift)
  {
   if (macd[shift] <= macd[shift+ 1 ] && macd[shift] < macd[shift+ 2 ] && 
      macd[shift] < macd[shift- 1 ])
       return ( true );
   else 
       return ( false );
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int GetIndicatorLastPeak( int shift)
  {
   for ( int i = shift + 5 ; i < Bars ; i++)
     {
       if (signal[i] >= signal[i+ 1 ] && signal[i] >= signal[i+ 2 ] &&
          signal[i] >= signal[i- 1 ] && signal[i] >= signal[i- 2 ])
         {
           for ( int j = i; j < Bars ; j++)
             {
               if (macd[j] >= macd[j+ 1 ] && macd[j] > macd[j+ 2 ] &&
                  macd[j] >= macd[j- 1 ] && macd[j] > macd[j- 2 ])
                   return (j);
             }
         }
     }
   return (- 1 );
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int GetIndicatorLastTrough( int shift)
  {
     for ( int i = shift + 5 ; i < Bars ; i++)
      {
         if (signal[i] <= signal[i+ 1 ] && signal[i] <= signal[i+ 2 ] &&
           signal[i] <= signal[i- 1 ] && signal[i] <= signal[i- 2 ])
          {
             for ( int j = i; j < Bars ; j++)
              {
                 if (macd[j] <= macd[j+ 1 ] && macd[j] < macd[j+ 2 ] &&
                   macd[j] <= macd[j- 1 ] && macd[j] < macd[j- 2 ])
                     return (j);
              }
          }
      }
     return (- 1 );
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void DisplayAlert( string message, int shift)
  {
   if (shift <= 2 && Time[shift] != lastAlertTime)
     {
       lastAlertTime = Time[shift];
       Alert (message, Symbol (), " , " , Period (), " minutes chart" );
     }
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void DrawPriceTrendLine( datetime x1, datetime x2, double y1, 
                         double y2, color lineColor, double style)
  {
   string label = "MACD_DivergenceLine_v1.0# " + DoubleToStr(x1, 0 );
   ObjectDelete (label);
   ObjectCreate (label, OBJ_TREND , 0 , x1, y1, x2, y2, 0 , 0 );
   ObjectSet(label, OBJPROP_RAY , 0 );
   ObjectSet(label, OBJPROP_COLOR , lineColor);
   ObjectSet(label, OBJPROP_STYLE , style);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void DrawIndicatorTrendLine( datetime x1, datetime x2, double y1, 
                             double y2, color lineColor, double style)
  {
   int indicatorWindow = WindowFind(indicatorName);
   if (indicatorWindow < 0 )
       return ;
   string label = "MACD_DivergenceLine_v1.0$# " + DoubleToStr(x1, 0 );
   ObjectDelete (label);
   ObjectCreate (label, OBJ_TREND , indicatorWindow, x1, y1, x2, y2, 
                 0 , 0 );
   ObjectSet(label, OBJPROP_RAY , 0 );
   ObjectSet(label, OBJPROP_COLOR , lineColor);
   ObjectSet(label, OBJPROP_STYLE , style);
  }
//+------------------------------------------------------------------+
 
r772ra :
Yükseliş mumundan sonra günün geri kalanında en yüksek oranı bulma ile ilgili sorunuzda nedense sunucu saat dilimi ile ilgili kısım duyulmadı. Görev kesinlikle günün sınırlarına bağlıdır ve farklı şirketlerde bu sınırlar farklıdır. Mumların günlere aidiyeti farklıdır. Sunucunun saat dilimine bağlı olarak, bulunan en yüksek değerler periyodik olarak değil farklı günlerde olacaktır. Bu sizin durumunuz için normal mi?
 
Merhaba!

Acemi değil, ama "aptal" bir soru var, tk. neredeyse hiç böyle bir durumla karşılaşmadım.

Diyelim ki önceden belirlenmiş bir bekleyen sipariş var.
Fiyatını göstergeye göre hareket ettiriyoruz.
Güzel bir anda, sıra değiştirilemez, çünkü onun için yeni uzlaşma fiyatı, Ask/Bid +/- MarketInfo(Symbol(), MODE_STOPLEVEL / MODE_FREEZELEVEL) gibi durdurma seviyeleri nedeniyle yasak aralığa düştü.

Ancak sipariş kesinlikle "piyasada" açılmalıdır.

Bu durumda ne yapılabilir?

Bekleyen birini sil ve piyasada yeni bir tane aç?

Yoksa ertelenmiş olanı bir şekilde açık hale getirmek mümkün mü?
 
mt4trade :
Merhaba!

Acemi değil, ama "aptal" bir soru var, tk. neredeyse hiç böyle bir durumla karşılaşmadım.

Diyelim ki zaten bekleyen bir sipariş var.
Fiyatını göstergeye göre hareket ettiriyoruz.
Güzel bir anda, sıra değiştirilemez, çünkü onun için yeni uzlaşma fiyatı, Ask/Bid +/- MarketInfo(Symbol(), MODE_STOPLEVEL / MODE_FREEZELEVEL) gibi durdurma seviyeleri nedeniyle yasak aralığa düştü.

Ancak sipariş kesinlikle "piyasada" açılmalıdır.

Bu durumda ne yapılabilir?

Bekleyen birini sil ve piyasada yeni bir tane aç?

Yoksa ertelenmiş olanı bir şekilde açık hale getirmek mümkün mü?
Fiyata bu kadar yakınsa, fiyat onu kendi başına bulacaktır, ancak değil, o zaman belki daha iyisi için durursa! Ve sınır, sonra sabır. Test cihazında denemeyi deneyin, optimizasyon en iyi seçeneği belirleyecektir! İyi şanlar!
 

Lütfen yardım et.

EA bağımsız bir çizelgeye kurulduğunda, start() işlevi çalışmadığından EA çalışmaz.

Grafiği, onu oluşturan Expert Advisor'dan veya bu grafiğe eklenmiş Expert Advisor'dan nasıl güncelleyebilirsiniz?

 
borilunad :
Fiyata bu kadar yakınsa, fiyat onu kendi başına bulacaktır, ancak değil, o zaman belki daha iyisi için durursa! Ve sınır, sonra sabır. Test cihazında denemeyi deneyin, optimizasyon en iyi seçeneği belirleyecektir! İyi şanlar!
Teşekkür ederim! Her şey çok anlaşılır. Ama şu soruya bir cevaba ihtiyacım var - fiyatın şimdi nereye gideceğinden bağımsız olarak siparişin çalışması gerekiyorsa, o zaman ne yapmalıyım? Geciktiriciyi silin ve normal olanı açın veya başka seçenekler var mı?
 
mt4trade :
Teşekkür ederim! Bunların hepsi anlaşılabilir, ancak şu soruya bir cevaba ihtiyacım var - fiyatın şimdi nereye gideceğinden bağımsız olarak siparişin çalışması için gerekliyse ne yapmalıyım? Geciktiriciyi silin ve normal olanı açın veya başka seçenekler var mı?
Benim için stratejini takip edersen, onu takip et! Yarıda değiştirmenizi önermiyorum, aksi takdirde kesin sonuçlar (olumlu veya olumsuz) olmadan stratejinizin rasyonelliğinden emin olamazsınız. Bunun gibi!
 
borilunad :
Benim için stratejini takip edersen, onu takip et! Yarıda değiştirmenizi önermiyorum, aksi takdirde kesin sonuçlar (olumlu veya olumsuz) olmadan stratejinizin rasyonelliğinden emin olamazsınız. Bunun gibi!
Ve tekrar teşekkürler! Doğru şeyler söylüyorsun ama soruyla ilgili değil. :) Bir kez daha tekrar edeceğim: Bir geciktiricinin uzlaşma fiyatı yasak aralığa düşerse ve değiştirilemezse, ancak (stratejiye göre) uzlaşma fiyatında çalışması gerekiyorsa - nasıl "dönüştürülür" bir çalıştı? Silin ve normal şekilde açılsın mı? Yoksa başka seçenekler var mı? Lütfen bu soruyu tam olarak cevaplayın.
 
mt4trade :
Ve tekrar teşekkürler! Doğru şeyleri söylüyorsun ama soruyla ilgili değil. :) Bir kez daha tekrar edeceğim: Bir geciktiricinin uzlaşma fiyatı yasak aralığa düşerse ve değiştirilemezse, ancak (stratejiye göre) uzlaşma fiyatında çalışması gerekiyorsa - nasıl "dönüştürülür" bir çalıştı? Silin ve normal şekilde açılsın mı? Yoksa başka seçenekler var mı? Lütfen bu soruyu tam olarak cevaplayın.
Bu yaklaşımda tutarsızlık var. Bekleyen emirden zaten dondurma bölgesinde (değişiklik imkansızlığı) bir pozisyon açılması bekleniyorsa, emrin başlangıçta bu dondurma sınırında farklı bir fiyattan ertelenmesi gerekirdi. Bu nedenle, yaklaşımınız buradaki birçok kişi tarafından hala kabul edilemez.

Özellikle sorunuz için ise. Önce bekleyen emri kaldırın ve ardından hemen mevcut fiyattan bir pozisyon açın. Sorun şu ki, bu işlemler sırasında fiyat donma bölgesinden çıkabilir (daha kötüsü için) ve pozisyon yanlış fiyattan açılacaktır. Diğer bir seçenek ise bekleyen emir oluşturmak değil, programda pozisyon açmak için bir değişkene değer yazmaktır. Güncel fiyat ile karşılaştırın ve koşul sağlanırsa (donma bölgesini dikkate alarak) bir pozisyon açın.
Neden: