Kapanış Sorunları, Lütfen yardım edin - sayfa 8

 
Ais

Merhaba Cameofx,
Nazik yanıt için teşekkürler.
Bu kodlama sistemi çok basit ve kolaydır.
Hepsi MetaEditor'da manuel olarak yapılır.
Aslında sistem büyük programları kolay ve yüksek hızda geliştirmek için tasarlanıyor.
Sistem ayrıca esnek ve güvenilir olmalıdır.
Saygılarımla!

Ayşe, cevabınız için teşekkür ederim. Yazılarınızdan çok şey öğrendim :)

minyatür

 

Merhaba arkadaşlar!

Geçmişten bir şey her gün üzerimde asılı duruyor.
Bu, AIS5 Ticaret Makinesinin belgeleridir.
Tanrı karar verir vermez geri döneceğim.

Şimdilik hoşça kal!

 

Merhaba Ayşe
Yokluğunuz çok özlenecek. Dikkatli ol.
Dönüşünüzü memnuniyetle karşılıyoruz.
Arkadaşın, Şerefe

 

Merhaba Ayşe
Döndüğünüzde, sizi hemen daha fazla soruyla meşgul ettiğim için özür dilerim. Bu özellikle sizin sisteminiz değil, çoğu programda bu sorunu yaşıyorum. Kullanıcı tanımlı işlevlerle ilgisi vardır. Kullanıcı tanımlı işlev tanımını nasıl alır?
Örneğin:

 int        iSignalOpen ()     //       - i      17 l       1 o     //< This is what iSignalOpen function will do.....
{                                                                 //< When the chart is opened, first pass..
if     ( ( iTradeBarTime    == iTime   ( 0 , 0 , 0 ) )   //< false input, EMPTY == (0,0,0)------|
      &&         //                                         &&                                 |--(return)EMPTY
      ( iTradeBarOnce    == 1 ))                         //< true  input, 1 == 1 ---------------|
       return ( EMPTY);
      
// This proves, 'EMPTY' will always be returned when the chart first opens. At the next tick...       
// ... 'iTime' will have parameters, example: (EUR/USD,HOUR_1,1) it is a predefined function so that...
// ... these parameters will be collected so that an expression can be calculated. Where as the... 
// ... 'iTradeBarTime' is not predefined. 'iTradeBarTime' was assigned 'EMPTY' at declaration earlier in the program.
// 'iTradeBarTime' knows that it is 'EMPTY'and nothing else. 
// When and how did 'iTradeBarTime' get deifined to collect data so that it's value can be other than 'EMPTY'? 
// The 'iTradeBarTime' has to have the same values as the 'iTime', or the input will never be 'true'?
// If it is never 'true', the return is always 'EMPTY'? 
Kitapta veya forumda kesin bir cevap bulamıyorum. Bir röle mantığı şemasında, bir AND geçidi yukarıdaki örnekle aynı şekilde çalışır. Yalnızca iki 'doğru' girdi olduğunda, bir 'doğru' çıktı olacaktır. Ancak o zaman, kontrol devam edecek.
Cevabını bekliyorum. Şimdiden teşekkür ederim.
Şerefe
 

Merhaba Huckleberry

Kodun bu bölümünü açıklığa kavuşturalım.

1. Muhtemelen büyük zorluklar:
1.1. tüm insanlar farklı düşünür ve hareket eder;
1.2. Kesinlikle sınırlı sayıda veri türü kullanmayı seviyorum;
1.3. Yalnızca "standart" veri türlerini kullanmayı seviyorum:
1.3.1. "int",
1.3.2. "çift",
1.3.3. "sicim";
1.4. Diğer veri türlerini yalnızca özel durumlarda kullanırım;
1.5. Program öğelerimin türünü adların ilk konumunda küçük harflerle belirtirim:
1.5.1. "int" veri türü için "i",
1.5.2. "Çift" veri türü için "d",
1.5.3. "dize" veri türü için "s",
1.5.4. "tanımsız" veri türü için "r";
1.6. bu programlama tekniği, tip dökümü kontrol etmeme yardımcı oluyor;
1.7. önceden tanımlanmış işlevler ve sabitler ayrıca aşağıdaki veri türlerine sahip olabilir:
1.7.1. "bool",
1.7.2. "renk",
1.7.3. "tarih saat";
1.8. Her zaman bu türleri "int" türüne dönüştürmeye çalışıyorum;
1.9. bugün için veri dökümüm genellikle örtüktür;
1.10. programlama tekniklerimin bazı temelleri:
1.10.1. "TRUE" ve "FALSE" sabitleri yerine "TRUE" ve "EMPTY" sabitlerini kullanmayı sevdim;
1.10.2. "if" ifadelerinde bazen "TRUE" ve "FALSE" yerine "1" ve "0" kullandım;
1.10.3. İmzasız veri öğeleri için geçersiz sonuçları belirtmek için "-1" negatif değerine sahip "BOŞ" sabitini kullandım;
1.10.4. gelecekte isimlerde "b" ön ekiyle "bool" türünü kullanacağım.

2. Aşağıdaki MQL4 veri türleri hakkında bilgi sahibi olmalıyız:
2.1. "int", -2147483648 ile 2147483647 arasında değerlere sahip, <!>imzalı</!> 4 baytlık bir tam sayıdır;
2.2. "datetime", 0 ile 4294967295 arasında değerlere sahip, <!>imzasız</!> uzun 4 baytlık bir tam sayıdır;
2.3. "int" değişkenlerine "datetime" değerleri atayarak yaklaşık 2038.01.01'e kadar doğru sonuçlar elde ederiz.

3. Aşağıdaki "iTime (symbol, timeframe, shift )" işlevi hakkında bilgi sahibi olmalıyız:
3.1. bu işlev her zaman "tarih saat" türünde bir değer döndürür;
3.2. 2 farklı iade durumu vardır:
3.2.1. yerel geçmiş boşsa "0";
3.2.2. diğer tüm durumlarda "shift" ile gösterilen bar için açık zaman ;
3.3. "iTime (0, 0, 0 )", geçerli grafiğin sıfır çubuğu için açık zamanı döndürür;
3.4. sıfır çubuğu aynıyken, "iTime (0, 0, 0 )" aynı değeri döndürür;
3.5. mevcut sıfır çubuğu tamamlandığında, bu çubuk 1 numaralı çubuk haline gelir ve yeni sıfır çubuğunun oluşumu başlar;
3.6. "iTime (0, 0, 0 )" yeni değeri döndürür;
3.7. yani sıfır çubuğu değiştiğinde "iTime (0, 0, 0 )" değeri değişiyor.

4. "2.2.3.1. Geçmiş veri denetimi" program bloğunda boş geçmişle çalışmayı engelledik.

5. "iTryClose" fonksiyonunda sipariş başarıyla kapatıldığında "iTradeBarTime = iTime (0, 0, 0 ) ;" olarak atanır.

6. "iSignalOpen" fonksiyonunda "iTradeBarTime == iTime ( 0, 0, 0 ) )" olup olmadığını kontrol ederiz.

7. Eğer doğruysa ve tekrarlanan ticaret "iTradeBarOnce = 1 ;" tarafından yasaklanmışsa daha sonra sinyalin "BOŞ" değeriyle açılmasını yasaklıyoruz.

Şerefe

 

Merhaba Ayşe
Cevabınız için teşekkürler. Bunun üzerinde çalışacağım ve yakında döneceğim.
Şerefe

 

Merhaba Ais,
Yavaş cevabım için özür dilerim. Pazartesi günü normal işime geri döndüm. Bu günlerde zaman biraz daha kısa. Eğitim süresi daha kısadır.
Bu başlıkta daha önce bahsettiğim gibi, her şeyi somunlara ve cıvatalara ayırmayı seviyorum. Bir zincir dişlisi diğerine nasıl güç sağlıyor? Bu yüzden program içindeki kontrolün büyüleyici olduğunu buldum. Lütfen sağladığınız sabır ve bilgi için size tüm saygımı gösterdiğimi anlayın, ancak 2.2.3.1 bloğunun neden gerekli olduğuna dair sorularım var.
iBaseLag + iBaseBar nasıl bir ifade olabilir?
iBaseLag ve iBaseBar'ın iHighest ve iLowest parametresinde olduğunu anladım. Açık sayılar olmadıkça,
tam sayının ne olacağı nasıl belirlenebilir. iBaseLag, ortalamayı hesaplamak için kullanılan 20 çubuğu temsil eden 20'dir.
iBaseBar, ortalamanın hangi çubukta başlaması gerektiğini temsil eder. 1'den 20'ye kadar olan çubuklar, bu durumda çubuk sıfır dikkate alınmaz.
Programı /* 2.2.3.1*/ ile kısaltma özgürlüğüne sahip oldum. Programı test etti ve aynı sonuçları buldu. Programı gerçek ticaret koşullarında çalıştırırken bu iyi bir fikir olmayabilir.
Alıntınız nedir lütfen?
Ayrıca, 2.1.2'yi bloke etme açıklamanız kafa karışıklığıma açıklık getirdi. iTime, sıfır çubuğunun açık zamanını döndürür.
iTradeBarTime aynı zamanda bir tür döküm tarihidir. Program, ticaretin hangi barda gerçekleştiğini bilir, bu nedenle bar başına sadece bir ticaret. . . iTradeBarOnce == 1
Teşekkür ederim
Önümüzdeki günlerde daha çok çalışacağım. Ancak ayrılmış blok 2.1.1, mevcut pozisyonlara ek pozisyonlar sağlayacak bir fonksiyon için kullanılabilir mi? Örnek: mevcut bir uzun, ardından üç veya daha fazla uzun ekleme?
Halihazırda programda bulunan fonksiyonlar ile ek pozisyonlarda çakışmalar olur mu?
Her şey için tekrar teşekkürler. Kendine iyi bak
Şerefe

 

Merhaba Huckleberry,

Blok 2.2.3.1. dahil olmak üzere programın ana kısmına dikkatlice bir göz atalım:

 ////////////////////////////////////////////////////////////////////<        14>
// < 2.2.3. Code : Special : Start >                              //<          >
int       start   ()         //       - i       9 l       - o     //<          >
{                                                                 //<          >
// < 2.2.3.1. History data inspection 4 >`````````````````````````//<          >
static    int       iTrigger   = 0       ; if ( iTrigger == 0 ) { //<          >
  if  ( ( iTime ( 0 , 0 , 0 ) == 0                          )     //<          >
  ||    ( iBars ( 0 , 0     )  < iBaseLag     + iBaseBar    ) )   //<          >
          return                         ; else iTrigger  = 1 ; } //<          >
// </2.2.3.1. History data inspection 4 >`````````````````````````//<          >
//                                                                //<          >
// < 2.2.3.2. Main routine 3 >````````````````````````````````````//<          >
int       iTicket           = iGetTicket ()                     ; //<          >
//                                                                //<          >
if      ( iTicket < 0 )       iTryOpen   ()                     ; //<          >
else                          iTryClose  ()                     ; //<          >
// </2.2.3.2. Main routine 3 >````````````````````````````````````//<          >
//                                                                //<          >
// < 2.2.3.3. Exception handler 2 >```````````````````````````````//<          >
int       iTrap   =           GetLastError ()                   ; //<          >
if      ( iTrap   > 0 )       Alert  ( "Exception " , iTrap   ) ; //<          >
// </2.2.3.3. Exception handler 2 >```````````````````````````````//<          >
}                                                                 //<          >
// </2.2.3. Code : Special : Start >                              //<          >
////////////////////////////////////////////////////////////////////<         0>

Bu kod aşağıdaki şekilde çalışır:

1. Programın ilk bloğu olan 2.2.3.1. bloğu basit bir tetikleyicidir:
1.1. "static int iTrigger", programın ömrü boyunca kendi değerini saklar, örneğin "static";
1.2. başlangıçta "iTrigger == 0";
1.3. "if ( iTrigger == 0 )" ifadesi her tik üzerinde yürütülür;
1.4. ilk defa, "iTrigger == 0" olduğunda, {..} bloğu içinde geçmiş veri incelemesi yürütülür;
1.5. geçmiş verileri yanlışsa, "dönüş" ifadesi; Idam edildi;
1.6. bu, "start ()" ana işlevinin yürütülmesinin sona erdiği anlamına gelir;
1.7. sonraki onay deyiminde "if ( iTrigger == 0 )" yeniden yürütülür;
1.8. geçmiş verileri doğruysa, "iTrigger = 1 ;" ifadesi Idam edildi;
1.9. daha sonra "start ()" ana işlevinin yürütülmesi devam eder;
1.10. sonraki onay deyiminde "if ( iTrigger == 0 )" yeniden yürütülür;
1.11. "iTrigger"ın şimdiki ve gelecekteki değeri, statik olduğu için her zaman "== 1" olacaktır;
1.12. bu nedenle gelecekteki geçmiş veri incelemesinde her zaman atlanacaktır;
1.13. basit tetikleyici budur;

2. geçmiş veri incelemesi iki bölümden oluşur:
2.1. yerel geçmişin boş olup olmadığını kontrol edin "iTime (0, 0, 0 ) == 0";
2.2. "iATR ( 0, 0, iBaseLag, iBaseBar )" hesaplaması için yerel geçmiş boyutunun yeterli olup olmadığını kontrol edin, burada:
2.2.1. "iBaseBar", "iATR" için başlangıç çubuğudur;
2.2.2. "iBaseLag", "iATR" için ortalama alma çubuklarının sayısıdır;
2.2.3. "iBaseLag + iBaseBar" olağan bir ifadedir, sonuç her zaman "iBaseLag" ve "iBaseBar" toplamıdır;
2.2.4. başka bir deyişle, "iBaseLag + iBaseBar" ifadesi, "iBaseLag" ve "iBaseBar" toplamının eşdeğeridir;
2.2.5. 1.1.1 bloğundaki program girişinde "iBaseLag" ve "iBaseBar" için herhangi bir değer atayabiliriz.;
2.2.6. "iBaseLag = 100 ;" atayalım ve "iBaseBar = 7 ;";
2.2.7. yerel geçmişin boyutu 107 veya daha büyükse, "iATR ( 0, 0, iBaseLag, iBaseBar )"'nin doğru hesaplanması mümkün olacaktır, çünkü hesaplama için son çubuk numarası
#106'dır ve çubuk sayısı her zaman sıfır kabul edilir.

Herhangi bir programa herhangi bir sayıda fonksiyon eklemek mümkündür, blok 2.1.1 sadece olası uygulama örneğini gösterir.
Ek pozisyonlar sağlamak, fonksiyon 2.1.4'ten çok daha karmaşık pozisyon analizi ve yönetimi kodu gerektirecektir.
Ama her şey mümkün.

Şerefe

 

Merhaba Ayşe
Hızlı yanıtınız için teşekkür ederiz. Söylediklerinin çoğunu takip edebilirim. Özellikle iATR işlevi hakkında. iBaseLag + iBasebar ifadesini kullanmanın başlı başına formülün istisnai bir parçası olduğunu söylemeniz. Tanımlanmış bir fonksiyonun parametreleri içinde olmaları gerektiği ya da izin verilmediği izlenimine kapıldım. Bu, ilerlemek için gerçekten yeterli çubuk varsa, yerel geçmişin boyutunu kontrol etmek içindir. İşaret ettiğin şey bu mu? Çok daha fazla adım, ancak hedefe ulaşmak için gerekli adımlar. Göz ardı edilecek veya hafife alınacak adımlar.
Gerisini çok daha fazla çiğneyeceğim. Zaman ayırdığınız için teşekkür ederim.
Şerefe

 

Merhaba Huckleberry
MQL4, özellikle örneğin C veya montajcılarla karşılaştırıldığında çok arkadaş canlısı bir ortamdır.
Çeşitli kontroller ve diğer hileler için gereksinimler önemli ölçüde azaltılmıştır.
Ancak geliştirme ortamına mümkün olan maksimum denetimlerin uygulanması her zaman performansı düşürür.
Herhangi bir şekilde programcı, programın kötü davranışlarından her zaman sorumludur.
Bu yüzden benim için gereksiz yeniden kontrol, örneğin sınırların temel yozlaşmasından daha iyidir.
Şerefe

Neden: