[UYARI, KONU KAPALI!] Forumu kirletmemek için herhangi bir acemi sorusu. Profesyonel, kaçırmayın. Sensiz hiçbir yerde. - sayfa 1085

 
khorosh :

İşlev benim değil - İnternetten aldım ama kullanmadım. Şimdi dikkatlice baktım - orada bir operatör eksik.

Şu şekilde doğru olacaktır:


Yine doğru değil! Fun_New_Bar() her zaman true döndüreceğinden EA her tikte tekrar bip sesi çıkaracaktır. O zaman soru şu ki, Fun_New_Bar () işlevi sürekli olarak doğru dönüyorsa neden gerekli?
 
drknn :


Ama işe yaramayacak - programı yanlış yazdınız. Ve hepsi, kendi kodunuzun nasıl çalışacağı hakkında hiçbir fikriniz olmadığı için. Anlayalım. Danışman kuruluş:

Yeni bir onay işareti gelir ve Fun_New_Bar() işlevi çağrılır. Ana programa dönerse, Uyarı açılır. Aksi takdirde EA bir iade ile işini bitirir ve yeni bir tick bekler. Yeni bir kene üzerinde her şey tekrar eder.

Kodun çalışmadığını mı söylüyorsun? Şimdi alt programda neler olduğuna bakalım.

Boole işlevi bildirildi. Bir prosedür değil, bir işlev olduğu için, çağrıldığı ana programa bir şey döndürmesi gerekir. İşlev boolean olduğundan, bir boole değeri döndürmesi gerekir. Ana programa en azından bir şey döndüren satırınız nerede? Yok! Bu, programın başlangıcında, işlevden hiçbir şey döndürülmediğinden, if (Fun_New_Bar()) ifadesinin parantez içinde her zaman yanlış olacağı ve uyarının hiçbir zaman açılmayacağı anlamına gelir.

Daha ileri gidelim. Neden datetime New_Time= 0 ; tam olarak statik mi? Hangi nedenlerle? Bir değişken tanımladınız ve onu hemen sıfıra başlattınız. Bir sonraki tikte aynı şey olacak - değişken tekrar bildirilecek ve tekrar sıfıra sıfırlanacak. Aşağıya bakın if (New_Time!=Time[ 0 ]){ Bu satır, değişkenin değerini geçerli zamana eşitsizlik açısından kontrol eder. Evet, değişken sıfır ve şimdiki zaman sıfır değil. Koşul sağlanır, değişkene o anki zamanın değeri girilir, New_Bar parametresi true olur. İşte bu, fonksiyon ana programa hiçbir şey döndürmeden işini tamamladı. Bir sonraki tikte, yine New_Time, Time[ 0 ]'a eşit olmayacak, yine eşitsizlik kontrolü başarıyla gerçekleştirilecek ve yine sonraki iki işlem gerçekleştirilecek. Kısacası, if (New_Time!=Time[ 0 ]) koşulu test edildiğinde, parantez içindeki ifade her tikte doğru olacaktır. HER ZAMAN. Soru şu ki, eğer her zaman doğruysa, o zaman bu kontrole neden burada ihtiyaç duyuluyor? Sadece kaldırabilir misin? Bu değişkenlerin her ikisi de hiçbir yerde kullanılmıyorsa neden New_Time=Time[ 0 ] ve New_Bar= true atansın. Bu iki görev ne işe yarıyor? Oynamak ister misin? Yoksa düşünemeyecek kadar tembel mi?


Tk bu kodu deneyin. Çalışıyor gibi görünüyor, sadece doğru veya yanlış görün. Bir şeyler yanlışsa, düzeltin:

//--------------------------------------------------------------------
int start() // Спец. функция start
{
if(Fun_New_Bar())//проверка наличия нового бара
return; // Выход из start()
}
//--------------------------------------------------------------------
bool Fun_New_Bar() // Ф-ия обнаружения ..
{ // .. нового бара
static datetime New_Time=0; // Время текущего бара
bool New_Bar=false; // Нового бара нет
if(New_Time!=Time[0]) // Сравниваем время
{
New_Time=Time[0]; // Теперь время такое
New_Bar=true; // Поймался новый бар
Alert("Сформировался новый бар"); // Вывод на экран
}
}
//--------------------------------------------------------------------

 
kolyango :


Tk bu kodu deneyin. Çalışıyor gibi görünüyor, doğru olup olmadığına bakın:

Hayır, bu doğru değil - Bu kodu sizin için harflerle ayrıştırdım. Hiçbir şey anlamadın mı?
 

kolyango: Sana doğru kodu göstereceğim. Görmek.

 //+------------------------------------------------------------------+
//|                                                            0.mq4 |
//|                                                                  |
//|                                                                  |
//+------------------------------------------------------------------+
#property copyright ""
#property link       ""

int MyChandle; // количество свеч на графике
//+------------------------------------------------------------------+
//|                  Блок инициализации                                |
//+------------------------------------------------------------------+
int init(){
  MyChandle= 0 ;// ну или можно вот так : MyChandle= Bars ;

   return ( 0 );
}
//+------------------------------------------------------------------+
//|                  Блок деинициализации                              |
//+------------------------------------------------------------------+
int deinit(){
   if (!IsTesting()){
     Comment ( "" );
     Print ( "Советник деинициализирован (выключен совсем)" );
  }
   return ( 0 );
}
//+------------------------------------------------------------------+
//|                  Старт работы советника                            |
//+------------------------------------------------------------------+
int start(){
   if (MyChandle< Bars ){
    Alert ( "Было свеч = ", MyChandle," Стало свеч = ", Bars );

   MyChandle= Bars ;
  }
   return ( 0 );
}
//+------------------------------------------------------------------+
//|                  Пользовательские подпрограммы                       |
//+------------------------------------------------------------------+
 
drknn :
Hayır, bu doğru değil - Bu kodu sizin için harflerle ayrıştırdım. Hiçbir şey anlamadın mı?


Ve bak, düzgün çalışıyor gibi görünüyor! M1 zaman diliminde kontrol edildi:

int start() // Спец. функция start
{
if(Fun_New_Bar())//проверка наличия нового бара
{
Alert("Сформировался новый бар"); // Вывод на экран
}
return(0); // Выход из start()
}
//--------------------------------------------------------------------
bool Fun_New_Bar() // Ф-ия обнаружения ..
{ // .. нового бара
static datetime New_Time=0; // Время текущего бара
bool New_Bar=false; // Нового бара нет
if(New_Time!=Time[0]) // Сравниваем время
{
New_Time=Time[0]; // Теперь время такое
New_Bar=true; // Поймался новый бар
}
return(New_Bar);
}

 
kolyango :


Ve bak, düzgün çalışıyor gibi görünüyor! M1 zaman diliminde kontrol edildi:



Dinle, peki, okumayı biliyor musun, bilmiyor musun - yukarıda aynı şeyi söyledi - doğru kod değil - her tikte bip sesi çıkar ve yeni bir mumda 1 kez değil. Yukarıya bakın - Size doğru kodu verdim. Tam satya için başka neyiniz eksik? Kodunuzun neden doğru olmadığını biliyor musunuz? Daha önce açıklamıştım, bu yanlış çünkü altyordam her zaman doğru ve yalnızca doğru döndürür. Uyarı her kene açılır! Programlama bir tahmin oyunu değildir - burada düşünmek zorundasınız.
 
drknn :

Yine doğru değil! Fun_New_Bar() her zaman true döndüreceğinden EA her tikte tekrar bip sesi çıkaracaktır. O zaman soru şu ki, Fun_New_Bar () işlevi sürekli olarak doğru dönüyorsa neden gerekli?
Doğru çalışıyor - çizelgede kontrol edildi. Ne zaman
New_Time=Time[ 0 ]

функция Fun_New_Bar() не будет возвращать истину
 
drknn :

kolyango: Sana doğru kodu göstereceğim. Görmek.

Çubukların değeri yalnızca yeni bir çubuğun görünümü nedeniyle değişebileceğinden, Çubukları kullanma seçeneği daha az tercih edilir.
 

drknn :
 ... Программирование - это не игра в угадайки - тут думать надо...

... en azından, en azından bazen ... :-)))

 
khorosh :
Çubukların değeri yalnızca yeni bir çubuğun görünümü nedeniyle değişebileceğinden, Çubukları kullanma seçeneği daha az tercih edilir.


Öyleyse beni aydınlatın - yeni bir çubuğun ortaya çıkması dışında, grafikteki mumların sayısı başka bir şeyle bağlantılı olarak hala değişebilir ??? :)))))

Ah, peki, evet, kesinlikle - yükleme geçmişi. :) Aynı şekilde, işlevi her tıklamada bip sesi çıkarır - zamanı doğru hatırlamıyor.