genel başlatma başarısız !!!!!!! - sayfa 2

 

Sorun değil, angevogeur

Kod başlangıçta şuydu:

 int init()
  {
       // Check for input errors
       if (Use_LT_TimeFrame_Confirmation)
      {
         if (Number_Of_TimeFrames < 1 || Number_Of_TimeFrames > 4 )
         {
             Alert ( "Initialization Error: Number of time frames for timeframe trend confirmation must be between 2 and 4, inclusively." );
         }
         
         if (Number_Of_Periods_For_Trend_Agreement < 2 )
         {
             Alert ( "Initialization Error: Number of time frames for timeframe trend aggreement must be greater than 1." );
         }
      }
      
       IndicatorShortName ( "White Wolf Custom Software Moving Averages Indicator" );
      
//---- indicators
       SetIndexStyle ( 0 , DRAW_LINE );
       SetIndexBuffer ( 0 ,EMABuffer1);
       SetIndexStyle ( 1 , DRAW_LINE );
       SetIndexBuffer ( 1 ,EMABuffer2);
       SetIndexStyle ( 2 , DRAW_LINE );
       SetIndexBuffer ( 2 ,EMABuffer3);
       SetIndexStyle ( 3 , DRAW_LINE );
       SetIndexBuffer ( 3 ,SMABuffer);
   
       SetIndexEmptyValue ( 0 , 0.0 );
       SetIndexEmptyValue ( 1 , 0.0 );
       SetIndexEmptyValue ( 2 , 0.0 );
       SetIndexEmptyValue ( 3 , 0.0 );
//----

       // MA Period Buttons
      MA_Display_Time_Frame = Period (); // Set the trade entry time frame to the current chart period - this ensures that we have a TF for the MA calculations
   
   // Show the timeframe buttons so the user can refine their entry strategy if they wish
 
       ResetLastError ();
       Alert ( "In init() - Calling CreateMAPeriodButtons()" );
      CreateMAPeriodButtons();
       if (GetLastError() != 0 )
         Alert ( "GetLasteError() returned " + IntegerToString (GetLastError()));
         
       ResetLastError ();
       Alert ( "In init() - Calling CreateDismissSignalButtons()" );
      CreateDismissSignalButtons();
       if (GetLastError() != 0 )
         Alert ( "GetLasteError() returned " + IntegerToString (GetLastError()));
      
       ResetLastError ();
       Alert ( "In init() - Calling SetPeriodButtonState()" );
      SetPeriodButtonState();
       if (GetLastError() != 0 )
         Alert ( "GetLasteError() returned " + IntegerToString (GetLastError()));
   
   // Set normalization factor for current currency pair
   if (( Digits == 4 ) || ( Digits == 5 ))
         NormalizationFactor = 0.0001 ;
       else
         NormalizationFactor = 0.01 ;
   
   return ( 0 );
  }

void deinit()
  {
       Alert ( "In de-init() - getting ready to delete objects " );
      
       ResetLastError ();
       ObjectsDeleteAll ( 0 , OBJ_LABEL );
       Alert ( "In de-init() - attempting to delete labels - GetLastError() returns  " + IntegerToString (GetLastError()));
      
       ResetLastError ();
       ObjectsDeleteAll ( 0 , OBJ_BUTTON );
       Alert ( "In de-init() - attempting to delete buttons - GetLastError() returns  " + IntegerToString (GetLastError()));

return ( 0 );
 }

Bunu basitçe şu şekilde değiştirdim:

 //+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+

int OnInit ()
  {
       // Check for input errors
       if (Use_LT_TimeFrame_Confirmation)
      {
         if (Number_Of_TimeFrames < 1 || Number_Of_TimeFrames > 4 )
         {
             Alert ( "Initialization Error: Number of time frames for timeframe trend confirmation must be between 2 and 4, inclusively." );
         }
         
         if (Number_Of_Periods_For_Trend_Agreement < 2 )
         {
             Alert ( "Initialization Error: Number of time frames for timeframe trend aggreement must be greater than 1." );
         }
      }
      
       IndicatorShortName ( "White Wolf Custom Software Moving Averages Indicator" );
      
//---- indicators
       SetIndexStyle ( 0 , DRAW_LINE );
       SetIndexBuffer ( 0 ,EMABuffer1);
       SetIndexStyle ( 1 , DRAW_LINE );
       SetIndexBuffer ( 1 ,EMABuffer2);
       SetIndexStyle ( 2 , DRAW_LINE );
       SetIndexBuffer ( 2 ,EMABuffer3);
       SetIndexStyle ( 3 , DRAW_LINE );
       SetIndexBuffer ( 3 ,SMABuffer);
   
       SetIndexEmptyValue ( 0 , 0.0 );
       SetIndexEmptyValue ( 1 , 0.0 );
       SetIndexEmptyValue ( 2 , 0.0 );
       SetIndexEmptyValue ( 3 , 0.0 );
//----

       // MA Period Buttons
      MA_Display_Time_Frame = Period (); // Set the trade entry time frame to the current chart period - this ensures that we have a TF for the MA calculations
   
   // Show the timeframe buttons so the user can refine their entry strategy if they wish
 
       ResetLastError ();
       Alert ( "In init() - Calling CreateMAPeriodButtons()" );
      CreateMAPeriodButtons();
       if (GetLastError() != 0 )
         Alert ( "GetLasteError() returned " + IntegerToString (GetLastError()));
         
       ResetLastError ();
       Alert ( "In init() - Calling CreateDismissSignalButtons()" );
      CreateDismissSignalButtons();
       if (GetLastError() != 0 )
         Alert ( "GetLasteError() returned " + IntegerToString (GetLastError()));
      
       ResetLastError ();
       Alert ( "In init() - Calling SetPeriodButtonState()" );
      SetPeriodButtonState();
       if (GetLastError() != 0 )
         Alert ( "GetLasteError() returned " + IntegerToString (GetLastError()));
   
   // Set normalization factor for current currency pair
   if (( Digits == 4 ) || ( Digits == 5 ))
         NormalizationFactor = 0.0001 ;
       else
         NormalizationFactor = 0.01 ;
   
   return ( INIT_SUCCEEDED );
  }
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
void OnDeinit ( const int reason)
  {
       Alert ( "In de-init() - getting ready to delete objects " );
      
       ResetLastError ();
       ObjectsDeleteAll ( 0 , OBJ_LABEL );
       Alert ( "In de-init() - attempting to delete labels - GetLastError() returns  " + IntegerToString (GetLastError()));
      
       ResetLastError ();
       ObjectsDeleteAll ( 0 , OBJ_BUTTON );
       Alert ( "In de-init() - attempting to delete buttons - GetLastError() returns  " + IntegerToString (GetLastError()));
  }

Gördüğünüz gibi, fonksiyonların "etini" değiştirmedim. Ben sadece yeni işlevselliğe uyum sağlamak için gerekli olan modları yaptım. Hâlâ biraz kafam karışık olan bir şey, start()'tan OnStart() veya OnTick()'e geçiş, hangisi olursa olsun (şu anda unuttum, ama hala start()'ı sorunsuz kullanıyorum. .Bunun özel bir gösterge olduğunu belirtmeliyim.Sıkıldığım başka bir şey de, bir EA, gösterge veya komut dosyası kodluyor olmanıza bağlı olarak kullanabileceğiniz şeylerin sınırlamaları. bir EA kodlamadığınız sürece işlemlerin uygulanmasına izin vermemek gibi) ve yapmayan diğerleri (Mesaj Kutusu ve göstergesi kullanmanın yasaklanması gibi) Beni gerçekten rahatsız eden başka bir şey, ticaret gibi şeyler için uygun etkinliklerin olmaması açılır ve kapanır.Bu, şu anda bir araya getirdiğim şey için gerçekten yardımcı olacaktır.

Son ifademle elde ettiğim sonuca bir örnek şudur: Belirli kriterler karşılanırsa bir Al sinyali gösterebilmek istiyorum, belirli kriterler karşılanıyorsa bunun için bir Alım İşlemi Kapat sinyali görüntüleyebilmek istiyorum ama aynı zamanda şunu da istiyorum. kullanıcımın Satın al sinyalini iptal etmesine ve isterlerse bir başkasını beklemesine izin ver ve Kapat sinyali için aynen. İşlemi kapatmayı seçerlerse, Satın Alma ve Satın Alma Kapatma sinyallerinin kaybolmasını ve göstergenin başka bir işlem için giriş kriterlerini izlemesini istiyorum. İptal bölümleri mükemmel çalışıyor ancak MQL4 bunun için mesajlaşma sağlamadığından Aç ve Kapat olaylarını algılayamıyorum.

Profilime baktıysanız, hiçbir şekilde acemi bir programcı olmadığımı görmüşsünüzdür. Dil, bir profesyonelin modern bir geliştirme platformundan beklediği ve ihtiyaç duyduğu tüm işlevleri sağlamaz. Başka bir notta, büyük bir yakınma olan hata ayıklamayı çalıştıramıyorum. Belgeleri takip ettim ancak hata ayıklayıcıyı harekete geçirmeye çalıştığımda, göstergemi başlatmak için özellikler iletişim kutusunu açan bir grafik aldım ancak gösterge kurulumunu bitirmek için Tamam'a bastığımda grafik kayboldu ve hepsi bu kadar. Belki Rusça'dan İngilizce'ye çeviride bir şeyler kayboluyor ve ben sadece bir şeyi özlüyorum ya da belki de "kek" tam olarak pişmemiş. Bir profesyonel olarak, böyle bir geliştirme dili ve ortamı yaratmanın ne kadar anıtsal bir görev olduğunu biliyorum. Sözlerim, şikayetlerden ziyade geliştirme personeli için FYI'lerin doğasında daha fazla anlam ifade ediyor.

Prof.

 
ProfessorMetal :

Sorun değil, angevogeur

Kod başlangıçta şuydu:


Prof.

Üzgünüz, ancak gönderdiğiniz kod derlenmedi. Sorununuzu yeniden oluşturmaya çalışmak için sizden kodu istiyorum.
 

Ayarladığım değişkenleri bildirmediyseniz ve ayrıca adlandırdığım ve açıkladığım yöntemlere sahip değilseniz, derlenmeyecektir. Yapamaz. Bunu bilmeni beklerdim. İstediğini düşündüğüm şeyi yayınladım - sorunumu çözen çözüm. Her halükarda, MetaQuotes kullanıyorsanız ve MetaTrader ile neler olup bittiğini anlamaya ve düzeltmeye çalışıyorsanız, aşağıda daha fazlasını gönderdim. init() içindeki if bloğunu yorumlayın, MA_Display_Time_Frame'i global olarak bir tamsayı olarak bildirin ve şu yöntemleri ekleyin:

 void CreateMAPeriodButtons()
  {
//  Alert("In CreateMAPeriodButtons()");
       int X_Distance = 10 ;
       int Y_Distance = 20 ;
       // Create MA Period Label
       ObjectCreate ( "MAPeriodLabel" , OBJ_LABEL , 0 , 0 , 0 );
       ObjectSet ( "MAPeriodLabel" , OBJPROP_CORNER , CORNER_RIGHT_UPPER );
       ObjectSet ( "MAPeriodLabel" , OBJPROP_XDISTANCE , X_Distance);
       ObjectSet ( "MAPeriodLabel" , OBJPROP_YDISTANCE , Y_Distance);
       ObjectSetText ( "MAPeriodLabel" , "MA Display Period" , 12 , "Arial" , clrYellow );
      
       // Create Period Buttons
      CreateButton( "M1" , "M1" , 1 , 140 , 50 , 100 , 20 , "Arial" , 12 , clrYellow , clrGray );
}

void CreateDismissSignalButtons()
  {
       int X_Distance = 25 ;
       int Y_Distance = 100 ;
      
       // Create Dismiss Label
       ObjectCreate ( "DismissSignalsLabel" , OBJ_LABEL , 0 , 0 , 0 );
       ObjectSet ( "DismissSignalsLabel" , OBJPROP_CORNER , CORNER_RIGHT_LOWER );
       ObjectSet ( "DismissSignalsLabel" , OBJPROP_XDISTANCE , X_Distance);
       ObjectSet ( "DismissSignalsLabel" , OBJPROP_YDISTANCE , Y_Distance);
       ObjectSetText ( "DismissSignalsLabel" , "Dismiss Trade Signals" , 12 , "Arial" , clrYellow );
      
       // Create Dismiss Buttons
      
      CreateButton( "DismissBuySignal" , "Dismiss Buy Signal" , CORNER_RIGHT_LOWER , 200 , 95 , 190 , 20 , "Arial" , 12 , clrYellow , clrGray );
}

void CreateButton( string strButtonName, string strButtonText, const int nCorner, const int nXpos, const int nYpos, int nWidth, int nHeight, string strFont, 
                     int nFontSize, int nFontColor, int nBackColor, bool bSelected = false )
  {      
       ObjectCreate ( 0 , strButtonName, OBJ_BUTTON , 0 , 0 , 0 );

       //--- set button coordinates
      
       ObjectSetInteger ( 0 , strButtonName, OBJPROP_CORNER , nCorner);

       ObjectSetInteger ( 0 , strButtonName, OBJPROP_XDISTANCE , nXpos);

       ObjectSetInteger ( 0 , strButtonName, OBJPROP_YDISTANCE , nYpos);
 
       //--- set button size
       ObjectSet (strButtonName, OBJPROP_XSIZE , nWidth);
     
       ObjectSet (strButtonName, OBJPROP_YSIZE , nHeight);

       //--- set the chart's corner, relative to which point coordinates are defined
      
       ObjectSet (strButtonName, OBJPROP_CORNER , nCorner);

       //--- set the text
      
       ObjectSetString ( 0 , strButtonName, OBJPROP_TEXT , strButtonText);
       ObjectSetString ( 0 , strButtonName, OBJPROP_FONT , strFont);
       ObjectSetInteger ( 0 , strButtonName, OBJPROP_FONTSIZE , nFontSize);
       ObjectSetInteger ( 0 , strButtonName, OBJPROP_COLOR , nFontColor);

       //--- set background color
      
       ObjectSetInteger ( 0 , strButtonName, OBJPROP_BGCOLOR , nBackColor);
      
       return ;
  }

Bunun ticari bir ürün olması amaçlandığından, hiçbir şekilde gösterge kodunun tamamı değildir, ancak bu, orijinal init() ve deinit() yöntemlerini kullanarak derlemeli ve potansiyel olarak soruna neden olmalıdır. Birkaç etiket ve düğme oluşturmak yeterlidir. Bahsedilen posterlerden biri gibi, başarısızlık aralıklıydı. Bununla birlikte, gösterge özelliklerini değiştirmek, zaman çerçevelerini değiştirmek veya terminali durdurmak ve yeniden başlatmak gibi göstergenin sıfırlanmasına neden olacak herhangi bir eylemle ilgiliydi. Özellikleri değiştirmeyi test etmek istiyorsanız, bu dış öğeleri globallere ekleyin:

 extern int                Number_Of_TimeFrames = 2 ;
extern int                Number_Of_Periods_For_Trend_Agreement = 25 ;
extern bool              Allow_Modify_Entry_Timeframe = true ;

Extern'leri eklerseniz, onlara referans veren if bloğunu yorumlamanıza gerek yoktur. Bu, onu derlemeniz ve sorunu yeniden oluşturmaya çalışmanız için yeterli olmalıdır. Eski başlatma ve başlatmadan kaldırma işlevlerini değiştirip yeni sürümlere geçtiğimden beri sorun oluşmadı. Başka bir şeye ihtiyacın olursa bana haber ver. Konuya dikkat edeceğim.

 

Ben de benzer bir durum yaşadım, indi grafiğe düştüğünde iyi çalıştı.

Parametreler değiştikten sonra iyi çalıştı, Tf vardiyasından sonra iyi çalıştı.

MT4'ü kapatıp yeniden başlattıktan sonra indi görünmüyordu.

Grafikteki göstergeler listesindeydi ama işe yaramadı.

Parametreler penceresini açtıktan ve Tamam düğmesine tıkladıktan sonra, indi listeden hemen kayboldu.

Yukarıdaki gönderilerde açıklananlar dahil tüm hileleri denedim, hiçbir şey işe yaramadı.

0 sayı ile bölme olduğu ortaya çıktı!

Basit: if(x!=0) koşulu sorunu çözdü.

 

Evet, başka bir indi ile aynı sorunu yaşadım.

Platform her başlatıldığında "if" olmadan, indi 0'a bölünür,

yeni MT4'ün işaretlenene kadar saklanan hiçbir bilgisi yok gibi görünüyor.

Diğer çözüm, start() veya OnStart() yerine OnCalculate() kullanmak olabilir, sanırım?

Ancak, bu MetaQuotes'a şikayet edilecek bir şey.

   double pipValue = MarketInfo ( Symbol (), MODE_TICKVALUE ); 

   if (pipValue!= 0 )
    {
   double lots   = AccountBalance ()*(RiskPercent/ 100.0 )/(StopLoss*pipValue);
    }
 

İade (0) hilesini kullanmalısınız.

İlgi varsa birisi biraz detaylandıracaktır.

 
deysmacro :

İade (0) hilesini kullanmalısınız.

İlgi varsa birisi biraz detaylandıracaktır.


İnternette her yerde bulabileceğiniz eski göstergeler, kodlarını otomatik olarak değiştirmez.

Birisi kodları değiştirebilir ve sorunu anlarsa, bunu kendi başlarına yapabilirler.

Geri kalan her şey, MT4'ü her açtıklarında indi'lerini görememenin rahatsızlığını hissetmek zorundadır.

Bir şablonları varsa, onu indi'yi geri yüklemek için kullanabilirler, ancak bu, bunu her seferinde yapmak anlamına gelir.

Şablonlar, yeni Built 625'te başka bir hikaye.

 

Çocuklar,

Her şeyin dışındasın. Tarif ettiğiniz şey, her zaman sorun olan bir zamanlama sorunudur. Bununla çok basit bir şekilde ilgilenebilirsiniz:

 // Wait for the server "turmoil" to settle before doing anything
       string AcctCurrency = AccountCurrency ();
       
       if (AcctCurrency == "" )
           return ( 0 );

Sıfıra bölme hatası, sunucu oturmadan önce hesaplamalar yapmaya çalışmanızdan kaynaklanıyor olabilir. Başlatma işlevinde hesaplamalar yapıyorsanız - YAPMAYIN! Yukarıdaki kodu start() veya OnStart() içine koyun ve SONRA yapmanız gerekeni yapın. Dadas, bunu olduğun kadar basitleştirmeye çalışmak seni büyük zaman ısıracak. İndi konusunda şanslısın.

Bir indi kaybolduğunda, bir başlatma hatası yaşarsınız. Günlüklerinize bakarsanız "genel başlatma hatası" görürsünüz. Bunu neden aldığınızı anlamanız ve düzeltmeniz gerekir. Eğer yapmazsan, tek yaptığın dikiş gerektiren bir kesime yara bandı koymak ve sana geri dönecektir.

 

Bana bu hatanın OnInit() ile ilgisi yokmuş gibi geliyor ve hata açıklaması yanıltıcı.

Tek satır kod ile

 int OnCalculate ( const int rates_total,
                 const int prev_calculated,
                 const datetime &time[],
                 const double &open[],
                 const double &high[],
                 const double &low[],
                 const double &close[],
                 const long &tick_volume[],
                 const long &volume[],
                 const int &spread[])
  {
//---
   Print ( High [rates_total]);
  
//--- return value of prev_calculated for next call
   return (rates_total);
  }

Diziye aralık dışı hatası verecektir.

Zaman çerçevesini değiştirin ve Global başlatma başarısız oldu ve gösterge grafikten kaldırıldı

 
Olabilir, GumRai, Görünüşe göre burada farklı sorunlar var. Biri deinit() olması gerektiği zaman çağrılmaması ve bazı şeylerin ortada bırakılmasıdır. OnCalculate() ile gördüğünüz şey, nasıl çalışması gerektiğini anlarsam, MQL'nin function uygulamasında bir aksaklık gibi görünüyor. Bir diğeri, sunucu yerleşmeden ve sunucu tarafı bilgilerini "başlatmadan" önce bir şeyler yapmaya çalışıyor. Burada sadece tahmin yürütüyorum, ancak sonuncusu da OnCalculate() ile gördüğünüz şeye neden olabilir. MQL geliştiricilerinin yapması gereken biraz hata ayıklama var gibi görünüyor. Adil olmak gerekirse, yapmaya çalıştıkları şey önemsiz değil. Hatalar sadece beklenebilir.