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

 
yosuf :
Teşekkürler, soruna programlı bir çözüm olduğunu gösteren bir bağlantı var ama ne yapacağımı bilmiyorum. Bunun nedeni nedir ve bu sorunu nasıl çözebilirim? EA neden bir ay boyunca iyi çalıştı ve şimdi sorunlu? Hata koddaysa? Soruların cevaplarını yüklüyorsa, dalın yeni başlayanlar için olmadığı ortaya çıkıyor. Üzgünüm.

Başladıktan hemen sonra Uzman Danışmanıma aşağıdakileri yazdım:

 //--- Section A: start - checking.
   if (! IsExpertEnabled ())
      { Comment ( "Expert is NOT working. Check the reason." ); return ( 0 );}
   if (! IsConnected ())
      { Comment ( "No connection!" ); return ( 0 );}
   if ( IsTradeContextBusy ())
      { Comment ( "Trade flow is busy. Wait..." ); Sleep ( 5 * 1000 ); return ( 0 );}
   if ( AccountFreeMargin ()< 1000 *Lot_super)
      { Comment ( "No money to trade. Free Margin = " , AccountFreeMargin ()); Sleep ( 20 * 1000 ); return ( 0 );}
//--- Section A: end - checking.

Deneyin, bazılarını da faydalı bulabilirsiniz.

 
drknn :


1. Tamam. int start() bildirildi. Her zaman null döndürdüm. Kodlarda return(-1) ve hatta return(-2) komutunu gördüm. Bu kod nasıl seçilir?

2. Doğal bir soru ortaya çıkıyor, bir Uzman Danışmanın/göstergenin/komut dosyasının start() öğesini int() türünden değil de isteğe bağlı başka bir türde ve ardından terminale neyin döndürülmesi gerektiğini bildirmek mümkün mü? ? Başka bir deyişle, terminal, return() tarafından döndürülen değerle ne yapar?

1. Sıradan bir işlevin ne döndürmesi gerektiğine nasıl karar verirsiniz?

2. Normal bir işlev gibi herhangi bir türü kullanabilirsiniz. Terminal, döndürülen değerlerle hiçbir şey yapmaz. Onları görmezden geliyor.

Özel Özellikler

 
Zhunko :

1. Normal bir fonksiyonun ne döndürmesi gerektiğine nasıl karar verirsiniz?

2. Normal bir işlev gibi herhangi bir türü kullanabilirsiniz. Terminal, döndürülen değerlerle hiçbir şey yapmaz. Onları görmezden geliyor.


1. Normal bir fonksiyonun tam olarak ne döndürmesi gerektiğine karar vermek için ana kodun neden böyle bir değere ihtiyacı olduğunu bilmem gerekiyor. Örneğin bir sinyal varken alış emri açma kararı vermeniz gerekiyorsa zaten açık olan alış emirlerinin sayısını döndürecek bir fonksiyon yazacağım. Kaç tane olduğuna bağlı olarak, kod, koda gömülü mantığı izleyerek bir karar verecektir. Terminalde hangi dönüş kodu işleme mantığının iç içe olduğunu bilmiyorum. Bugün semafor oluşturma ile ilgili bir makaleye bakıyordum ve bir dönüş koduna (-2) rastladım. Şaşırdım, burada bir soru sordum. Sadece ve her şey. ( https://www.mql5.com/en/articles/1412 - yazı burada).

2. Terminal, dönüş değerlerini yok sayar. Kesinlikle? Eğer öyleyse, o zaman yine meşru bir soru ortaya çıkıyor, neden bir danışman/gösterge/komut dosyası oluştururken, geliştirici tam olarak şablonun içine int koydu, çünkü oraya void koymak daha mantıklı olurdu - o zaman terminalin görmezden gelmesi gerekmeyecekti. herhangi bir şey - daha sonra 1 işlemci çevrim süresi kazanır mıyız? Belki de int init (), int deinit () ve int start () işlevlerinden dönüşte neyin döndürüleceği konusunda bir mantık vardır? Benim düşünceme göre, Roche bir yerde bunu birine zaten açıkladı - ne zaman sıfıra dönmeniz gerektiğini ve ne zaman (-1) gerektiğinin bir açıklaması olduğunu hatırlıyorum. Aradığım açıklama buydu. Maalesef bulamadım...

not

dönüş (-2) makalenin yazarı kendi amaçları için kullanır. Ancak, bazen start() işlevinin sıfırdan farklı bir dönüş koduyla bittiği de bir gerçektir. Ve bu sadece bir kişi tarafından yapılmaz. Benim anlamak istediğim mantık bu.

 

Metinde öyle görünüyor

Önceden tanımlanmış fonksiyonların parametreleri olabilir. Ancak bu fonksiyonlar istemci terminali tarafından çağrıldığında dışarıdan herhangi bir parametre geçilmeyecek ve varsayılan değerler kullanılacaktır.

biz fonksiyona gelen parametrelerden bahsediyoruz, fonksiyon tarafından döndürülen parametrelerden değil.

 
Cevap için teşekkürler!
drknn :
Bu sipariş sayacı. Örneğin, belirli bir döviz çifti için ve piyasada belirli bir sihirli sayı ile satın alma emirleri olup olmadığını kodda öğrenmeniz gerekir. Örneğin varsa, örneğin başka bir satın alma siparişi açmak imkansızdır. Yani, bir karar vermek için sipariş sayacına ihtiyaç vardır.
 
paladin80 :

Başladıktan hemen sonra Uzman Danışmanıma aşağıdakileri yazdım:

Deneyin, bazılarını da faydalı bulabilirsiniz.

Teşekkürler, bir hata buldum. EA, makalede belirtilen sebepten dolayı takıldığında (yukarıdaki bağlantı), kapatıp tekrar başlattım, ancak sihri 123'ten 124'e değiştirmeyi unuttum ve iki farklı yönlendirilmiş EA aynı büyüyü aldı ve başladı. siparişi kimin daha hızlı açtığını rekabet etmek için. Önce açılırsa. Diyelim ki "HÜCRE" artık "AL" ile açılmadı ya da tam tersi. İkinci, güncellenmiş danışmanın büyüsünü değiştirir değiştirmez, ikisi de normal şekilde çalışmaya başladı. Hata tekrar ederse tavsiyenizi dikkate alacağım. Cevaplar için teşekkürler.
 

Bu satırları nasıl anlayabilirsiniz:

iade sipariş hacmi

if(satın alır>0) iade(satın alır);

başka iade(-satış);

} ?

 

Bir komut dosyası yazıyoruz:

 int start(){
   Print ( "Попытка ретурна 136" );
   return ( 136 );
}

çizelgeye atın ve günlüğe bakın:

2012.07.20 12:04:11 111 NZDUSD,M15: removed
2012.07.20 12:04:11 111 NZDUSD,M15: uninit reason 0
2012.07.20 12:04:11 111 NZDUSD,M15: Попытка ретурна 136
2012.07.20 12:04:11 111 NZDUSD,M15: loaded successfully

(burada 111, betiğin adıdır). "uninit Reason 0" satırını görüyoruz - görünüşe göre terminal sıfırı bekliyordu!

(-1) ile aynı şeyi denemek:

 int start(){
   Print ( "Попытка ретурна -1" );
   return (-1);
}

Sonuç aynı:

2012.07.20 12:08:19 111 NZDUSD,M15: kaldırıldı
2012.07.20 12:08:19 111 NZDUSD,M15: uninit neden 0
2012.07.20 12:08:19 111 NZDUSD,M15: İade girişimi -1

2012.07.20 12:08:19 111 NZDUSD,M15: başarıyla yüklendi

Görünüşe göre terminal, sıfırın döndürülüp döndürülmediğine kayıtsız değil.

not

Aslında internette bu cevaba rastladım:

0 döndür - program işini hatasız bitirdi
dönüş 1 - veya daha yüksek bir sayı, program çalışmasını bir hatayla sonlandırdı ve daha sonraki işlemler için bir hata kodu döndürür.

Herhangi bir işletim sisteminde, herhangi bir program her zaman bir hata kodu verir.

Tek sorun, dönüşümüzün kodu işletim sistemine değil, terminale döndürmesidir. Bu soruyu açık bırakır.

 
drknn :

Bir komut dosyası yazıyoruz:

çizelgeye atın ve günlüğe bakın:

(burada 111, betiğin adıdır). "uninit Reason 0" satırını görüyoruz - görünüşe göre terminal sıfırı bekliyordu!

Aynısını (-1) ile deneyelim:

Sonuç aynı:

Terminali görmek, sıfırın döndürülüp döndürülmemesine kayıtsız değildir.


uninit nedeni, EA sonlandırma nedeni kodudur

https://docs.mql4.com/en/constants/uninit

 
Biraz kafanız karıştı, UNINIT REASON'ın standart işlevlerle ilgili geri dönüşlerle ilgisi yok. Bir danışman yazın ve "start" dan farklı dönüş sonuçlarıyla "init" arayın ve görün. Aslında https://docs.mql4.com/en/basis/functions/special her şey belgede mükemmel bir şekilde yazılmıştır. Sadece dikkatlice tekrar okuyun.