Mt4 End desteği. - sayfa 27

 
Реter Konow :
Doğrusal, doğrusal olmayan... Programlamada yine operadan mı bahsediyorsunuz?

imkanı yok

 
Реter Konow :

TAMAM. Çözümünüz yalnızca keneler üzerinde çalışır. Benimki bir zamanlayıcıda . Çubukların görünümüyle senkronize etme yöntemimin bir dezavantajı olduğunu düşünüyor musunuz? TAMAM. Öyle olsun. Yeni bir çubuğun bayrağını ayarlamadan önce bir teklifin gelişi için bir çek ekleyeceğim. Fonksiyona başka bir parametre ekleyeceğim - bir sembol. Kullanıcı, yeni bir çubuğun olayını alması gereken sembolü seçecek ve fonksiyona gönderecektir. İşlev, verilen sembolün son alıntısının zamanını kontrol edecektir. Ardından, çubuğun resmi görünüm zamanını ve teklif zamanını karşılaştırın ve olay bayrağını ayarlayın.

Bu konuyu yeni anlamaya başladım, ancak herhangi bir zorluk görmüyorum.

Ticaret, otomatik ticaret sistemleri ve ticaret stratejilerinin test edilmesi hakkında forum

Mt4 Sonu desteği.

Artyom Trishkin , 2017.09.10 22:27

Fiyat teklifi almayı biliyorum :)

Çoklu para birimi programında - gerekli semboller aracılığıyla bir döngüde bir zamanlayıcıda . Ve yeni bir çubuğun açılması ( sizinki gibi fiziksel, sanal değil - hatalı -) son alıntının zamanı ve bu zamanın sembolün sıfır çubuğunun zamanı ile karşılaştırılmasıyla kontrol edilir .

Bunu rastgele yaparsınız - var olmayabilecek sanal bir çubuk. Hafta sonları müsait değiller, ama iddiaya göre sizde var - bu örnek olarak gösterilebilecek en basit şey.

Ve bunu tek başına yapmayacağını anla. Gerisi doğru ve güvenli olanı yapar. Ama bu, elbette, sadece kendi işiniz.

Size bunu nasıl doğru yapacağınızı anlatmak ve aynı problemi çözerken OOP'de yazmanın basitliği ve prosedürel stildeki karmaşık kıvrımlar ve dönüşler arasında büyük bir fark göstermek istedim.

Ama muhtemelen daha fazlasını biliyorsun ve buna ihtiyacın yok. Artık senin önünde bir şey biliyormuş gibi görünmeye cesaret edemiyorum. Afedersiniz.


 
Galina Bobro :

Tabii, sorun değil. Müşteri bir manyaksa ve aynı anda tüm semboller üzerinde işlem yapacaksa, dizi operasyonlarının karşılaştırmasını kurtarmak için riskten korunma.

Ve öyle görünüyor ki, işlemlerden ve bellekten tasarruf edecek başka bir yer yok - sadece minimum

void OnTimer(){

   Alert(Fn_new_bar("EURUSD", PERIOD_D1)); }

//+------------------------------------------------------------------+

uint Sp_Adler32(string line){

   ulong s1 = 1;

   ulong s2 = 0;

   uint buflength=StringLen(line);

   uchar char_array[];

   ArrayResize(char_array, buflength,0);

   StringToCharArray(line, char_array, 0, -1, CP_ACP);

   for (uint n=0; n<buflength; n++){

      s1 = (s1 + char_array[n]) % 65521;

      s2 = (s2 + s1)     % 65521;}

   return ((s2 << 16) + s1);}

//+------------------------------------------------------------------+

bool Fn_new_bar(string symb, ENUM_TIMEFRAMES tf){

   static datetime st_time[]; 

   static uint     st_id[];

   

   //---- set

   datetime new_time = iTime(symb, tf, 0);     if(new_time==0) return(false); 

   uint     new_id   = Sp_Adler32(StringConcatenate(symb,EnumToString(tf))); 

   datetime old_time = 0; 

   uint     old_id   = 0;

   

   //---- find

   int size = ArraySize(st_time); 

   for(int i=0; i<size; i++){

      if(st_id[i]!=new_id) continue; 

      old_id   = st_id  [i]; 

      old_time = st_time[i];

      break;}

   

   //----add new element

   if(old_time==0){

      ArrayResize(st_time, size+1); st_time[size]=new_time;

      ArrayResize(st_id,   size+1); st_id  [size]=new_id; }

   

   //----

   return(old_time>0 && old_time<new_time);}


bugün yapı olarak en mantıklı kod bu gibi görünüyor. yeni bir sembol ve tf için bir kontrol var, istisnasız her şeyi kontrol etmiyor, sadece gerekli olanı kontrol ediyor, gereksiz işlemler yok, bu da oldukça hızlı bir şekilde yapılması gerektiği anlamına geliyor.

Samimi olarak.

PS Buraya eklenebilecek tek küçük şey, st_time ve st_id dizilerini bir yapı içinde birleştirmek, çünkü bunlar birbirine bağlı olduğundan, bu koddaki dizi artırma işlemlerinin sayısını azaltacaktır.

 
Artyom Trishkin :

Amacım, prosedürel stil kodunun şöyle bir döngüde çalışmasını sağlamaktı:

 ENUM_TIMEFRAMES array_timeframes[]=
      {
       PERIOD_M1 , PERIOD_M2 , PERIOD_M3 , PERIOD_M4 , PERIOD_M5 , PERIOD_M6 , PERIOD_M10 , PERIOD_M12 , PERIOD_M15 , PERIOD_M30 ,
       PERIOD_H1 , PERIOD_H2 , PERIOD_H3 , PERIOD_H4 , PERIOD_H6 , PERIOD_H8 , PERIOD_H12 , PERIOD_D1 , PERIOD_W1 , PERIOD_MN1
      };
   int total= SymbolsTotal ( true ), total_tf= ArraySize (array_timeframes);
   for ( int i= 0 ; i<total; i++){
       string symbol_name= SymbolName (i, true );
       for ( int j= 0 ; j<total_tf; j++){
         if (IsNewBar(symbol_name,array_timeframes[j])){
             Print ( "Новый бар на " ,symbol_name, " " , EnumToString (array_timeframes[j]));
            }
         }
      }


peki, bunun gibi bir şey (MQL5 kodu):

 int OnInit ()
  {
   IsNewBar();  // сбор информации - можно включить здесь, но не обязательно
   EventSetMillisecondTimer ( 100 );
   return ( INIT_SUCCEEDED );
  }

void OnDeinit ( const int reason)
  {
   EventKillTimer ();
  }

void OnTimer ()
  {
   IsNewBar();   // сбор информации - можно включить здесь, но не обязательно
                 // различные варианты проверки новых баров
   if (IsNewBar( true )) Print ( "Пришел новый бар текущего ТФ текущего инструмента" );   // режим вывода информации
   if (IsNewBar( true , PERIOD_H4 )) Print ( "Пришел новый бар H4 текущего инструмента" );   // режим вывода информации
   if (IsNewBar( true , PERIOD_D1 )) Print ( "Пришел новый бар D1 текущего инструмента" );   // режим вывода информации
   if (IsNewBar( true , PERIOD_M1 , "GBPUSD.m" )) Print ( "Пришел новый бар M1 GBPUSD" );     // режим вывода информации
   if (IsNewBar( true , PERIOD_M3 , "GBPUSD.m" )) Print ( "Пришел новый бар M3 GBPUSD" );      // режим вывода информации
   if (IsNewBar( true , PERIOD_M2 , "USDCHF.m" )) Print ( "Пришел новый бар M2 USDCHF" );      // режим вывода информации
  }

void OnTick ()
  {
   IsNewBar();   // сбор информации - можно включить здесь, но не обязательно
                 // различные варианты проверки новых баров
   if (IsNewBar( true )) Print ( "Пришел новый бар текущего ТФ текущего инструмента" );   // режим вывода информации
   if (IsNewBar( true , PERIOD_H4 )) Print ( "Пришел новый бар H4 текущего инструмента" );   // режим вывода информации
   if (IsNewBar( true , PERIOD_D1 )) Print ( "Пришел новый бар D1 текущего инструмента" );   // режим вывода информации
   if (IsNewBar( true , PERIOD_M1 , "GBPUSD.m" )) Print ( "Пришел новый бар M1 GBPUSD" );      // режим вывода информации
   if (IsNewBar( true , PERIOD_M3 , "GBPUSD.m" )) Print ( "Пришел новый бар M3 GBPUSD" );      // режим вывода информации
   if (IsNewBar( true , PERIOD_M2 , "USDCHF.m" )) Print ( "Пришел новый бар M2 USDCHF" );      // режим вывода информации
  }
//+---------------------------------------------------------------------------------------------------+
//|   Функция определения нового бара по всем ТФ всех инструментов в окне "Обзор рынка"               |
//|   два режима работы:                                                                              |
//|   - режим сбора информации, out=false (значение по умолчанию). Достаточно запустить IsNewBar();   |
//|   - режим вывода информации, out=true                                                             |
//|   tf - период таймфрейма, по умолчанию текущий ТФ (необходим только при выводе информации)        |
//|   Sym - символ инструмента, по умолчанию текущий символ (необходим только при выводе информации)  |
//+---------------------------------------------------------------------------------------------------+
bool IsNewBar( bool out= false , ENUM_TIMEFRAMES tf= PERIOD_CURRENT , string Sym= "" ) 
  {
   static const ENUM_TIMEFRAMES TF[ 22 ]=
     {
       PERIOD_CURRENT , PERIOD_M1 , PERIOD_M2 , PERIOD_M3 , PERIOD_M4 , PERIOD_M5 , PERIOD_M6 , PERIOD_M10 , PERIOD_M12 , PERIOD_M15 , PERIOD_M20 , PERIOD_M30 ,
       PERIOD_H1 , PERIOD_H2 , PERIOD_H3 , PERIOD_H4 , PERIOD_H6 , PERIOD_H8 , PERIOD_H12 , PERIOD_D1 , PERIOD_W1 , PERIOD_MN1
     };
   static bool newbar[];
   static long acb[]; // array of current bars
   static int N_Sym= 0 ;
   if (Sym== "" ) Sym= Symbol ();
   int total= SymbolsTotal ( true );
   int n_cur=- 1 ;
   for ( int i= 0 ; i<total; i++) if (Sym== SymbolName (i, true )){ n_cur=i; break ;}
   if (n_cur< 0 ) { Print ( "данного символа нет в списке MarketWatch(окошко слева - Обзор рынка)" ); return ( false );}
   if (out && N_Sym> 0 ) // если режим вывода информации 
     {
       int curtf= 0 ;
       while (TF[curtf]!=tf) curtf++;
       return (newbar[n_cur* 22 +curtf]);
     }
// режим сбора информации
   if (total!=N_Sym) { ArrayResize (acb, 22 *total); ArrayInitialize (acb, 0 ); ArrayResize (newbar, 22 *total); ArrayInitialize (newbar, false ); N_Sym=total;}
   for ( int j= 0 ,j1= 0 ; j<total; j++,j1+= 22 )
       for ( int i= 0 ;i< 22 ;i++)
        {
         long CurBars= SeriesInfoInteger ( SymbolName (j, true ),TF[i], SERIES_LASTBAR_DATE );
         if (acb[j1+i]<CurBars) // пришел новый бар
           {
             //if (acb[j1+i]>0) Print ("Новый бар: "+SymbolName(j,true)+"   "+EnumToString(TF[i]));
            acb[j1+i]=CurBars;
            newbar[j1+i]= true ;
           }
         else
           {
            newbar[j1+i]= false ;
             if (i== 1 ) for (;i< 22 ;i++) newbar[j1+i]= false ;   // если минутный бар тот же, то нет смысла продолжать проверять старшие ТФ
           }
        }
   return ( false );
  }

Ama tekrar ediyorum - Ben OOP'nin destekçisiyim.
Prosedürel programlama ile neler yapılamayacağını gösteren gerçekten kötü bir örnek.

 
Andrey Kisselyov :
Bu, bir Uzman Danışmanda bir işlevi çağırmakla ilgili değil, evrensel arabirimler (işleyiciler) yazmakla ilgilidir.

robot yazmak için 1000 referans şartınız var, aslında her biri
Açmak için 1 sinyal alma işlevi
2 sipariş açma fonksiyonu
3 sipariş takip fonksiyonu
Kapatmak için 4 sinyal alma işlevi
vb.
her robotun kendi işlevleri vardır, ancak 1000 proje içinde tekrarlanırlar. sonuç olarak, işlevleri evrensel modüllerde birleştirebilir ve göreve bağlı olarak doğru olanı arayabilirsiniz.

Eh, bu işlevler varsa, o zaman daha akıllıca hiçbir şeyin olması gerekmez. Fonksiyonun giriş parametreleri arayüzdür. Her ekstra bilgelik, olası hataların sayısını ve programcının çalışma süresini artırır.

 
Nikolai Semko :

peki, bunun gibi bir şey (MQL5 kodu):

Ama tekrar ediyorum - Ben OOP'nin destekçisiyim.
Prosedürel programlama ile neler yapılamayacağını gösteren gerçekten kötü bir örnek.

Böyle bir örnek gerçekten var mı? Seninki olmasın? Derin şüphelerim var. 2000'li yılların başında yazdığım kodların hata ayıklanmış ve çalışan satır sayısını saymayı bıraktım çünkü bir milyonu aştı, ilgimi çekmeye başladı. Ve görevlerin çeşitliliği ve kapsamı çok farklı olmasına rağmen, asla kendi sınıfınızı yaratmanıza gerek yoktu. Çalışmayı birkaç kişi için paralel hale getirmek gerektiğinde, prosedür tipi değişkenler kullanılmalıydı, ancak artık kullanılmamalıdır. Nedenmiş?

Bu arada, neden OOP'ye alternatif olarak prosedürel programlamadan bahsediyorsunuz? OOP'siz, temelde prosedürel olmayan (SQL) diller var, dillerin geliştirilmesi için bir yön bile var - işlevsel programlama https://ru.wikipedia.org/wiki/%D0%A4%D1% %83D0%BD%D0%BA%D1%%86D0%B8%D0%BE%D0%BD%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D0%B5_% D0%BF%D1%80%D0%BE% D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0% B0%D0%BD%D0%B8%D0% B5 : "Bazı kavramlar ve paradigmalar işlevsel programlamaya özgüdür ve çoğunlukla zorunlu programlamaya ( nesne yönelimli programlama dahil) yabancıdır", "İşlevsel programların bir diğer avantajı, hesaplamaların otomatik paralelleştirilmesi için en geniş olanaklar." OOP'nin hesaplamaların otomatik paralelleştirilmesini önlediği ortaya çıktı. Şimdi bu çok ciddi bir eksiklik olarak kabul edilmelidir, olasılık OOP için değildir.

 
Vladimir :

Böyle bir örnek gerçekten var mı? Seninki olmasın? Derin şüphelerim var.


Bence böyle bir örneğin bulunamaması oldukça olası. Şahsen, OOP'nin ana avantajlarının büyük projelerin daha uygun programlanması ve gelecekteki gelişmeleri kullanmak için uygun bir mekanizma olduğunu düşünüyorum. Bu, burada defalarca kez haklı olarak söylendi.

 
Andrei :

Görünüşe göre, tek bir arayüzün herhangi bir hesaplama görevinin programlanması için tamamen uygulanamaz olduğu daha önce tartışılmıştı... Arayüzler şeklinde güzelliği getirmek, sadece hazır koda uygulanabilen ve dahası, önleyen tamamen kozmetik bir prosedürdür. kodun daha fazla desteklenmesi ve iyileştirilmesi .. .

Hayır. "Tamamen uygulanamaz" değil, "başvurmanın bir anlamı yok" ile ilgiliydi.

Arayüzler, "bitmiş koda uygulanabilecek tamamen kozmetik bir prosedür" değildir.

Tam tersine - arayüzler sistem mimarisinin temelidir. Tasarımın başladığı yer. Arayüzler "destek ve iyileştirmeyi" hiçbir şekilde engellemezler, aksine izin verilenlerin sınırlarını net bir şekilde belirleyerek onlara yardımcı olurlar. Arayüzler yoksa, bu sınırları aşmak ve amaçlanmayan yerlerde değişiklikler yapmak kolaydır, bunun sonucunda hesaplaması zor hatalar meydana gelir.

Herhangi bir karmaşık sistem (sadece programlamada değil), sadece parçalarının etkileşimi için temel ilkelerin geliştirilmesiyle başlar. Ve programlamada - başlangıçta görevin kural olarak çok küçük olması nedeniyle - ters yöne giderler. İlk önce, parçalar yazılır ve daha sonra bir bütün halinde birleştirilirler, genellikle parçaların birbiriyle zayıf uyumlu olduğu gerçeğiyle karşı karşıya kalırlar - bu arada, "mevcut tüm değişkenlere erişime sahip olma" arzusunu tam olarak açıklayan şey budur. "

 

isNewBar() işlevinin doğada hiç olmaması dışında her şey yolunda. Böyle önemsiz bir şeyin etrafında bu kadar çok dans olması komik.

Bu sadece bir değişkendir ve sadece çubuğun zamanı ile karşılaştırılır, eğer tüm durumlar başarılı olursa, sonunda değişkene yeni çubuğun zamanı atanır. Aksi takdirde, tüm durumlar için yalnızca bir deneme tahsis edilir.

 
Dmitry Fedoseev :

isNewBar() işlevinin doğada hiç olmaması dışında her şey yolunda. Böyle önemsiz bir şeyin etrafında bu kadar çok dans olması komik.

Bu sadece bir değişkendir ve sadece çubuğun zamanı ile karşılaştırılır, eğer tüm durumlar başarılı olursa, sonunda değişkene yeni çubuğun zamanı atanır. Aksi takdirde, tüm durumlar için yalnızca bir deneme tahsis edilir.


+1