Mt4 End desteği. - sayfa 30

 
Реter Konow :

Bilgisayardaki yük, geliştiricinin mekanizmasının tutarlılığı konusuna ihmalkar tutumu ile verilir. Sistemi iyileştirmede enerji tasarrufu yapma arzusu. İşlerini kolaylaştırmak adına bilgisayar kaynaklarının mantıksız tüketimi.

Bilgisayar verimsiz bir şekilde yazılmış kodla başarılı bir şekilde başa çıktığı sürece, geliştirici bilgi işlem gücü üzerinde "parazit" yapmaya devam edecektir. Bu çıkmaz bir yoldur.

Er ya da geç, verimsiz bir mekanizma gelişmeyi durduracak ve yerini daha gelişmiş bir analog alacaktır.

Bir insanın zamanı ve emeği boşa gidecek ve yavruları çöp tenekesine atılacaktır.

Rekabetçi dünyada bu risk her zaman mevcuttur.

Mekanizmaları tasarlarken, ilk etapta özelliklerini, ikinci sırada çalışma saatlerimizi geçirmenin rahatlığını ve rahatlığını düşünmeliyiz.))

Henüz prosedürel tarzda yeni bir çubuk tanımlamak için bir fonksiyon yazmadınız.

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

Mt4 End desteği.

Artyom Trishkin , 2017.09.10 23:21

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]));
            }
         }
      }

 
Реter Konow :

Evet, bunu dün tartışmıştık.

Daha önce, başka bir platformla ilgilendim ve orada tekliflerin gelmesinden bağımsız olarak çubuklar zamanında kuruldu (TWS'ye bakın).

Bunun MT'de olmadığı söylendi.

Yeni bir çubuğun ortaya çıkma olayını onaylamak için bir teklifin gelişi için bir çek ekleyeceğim.

Uzun süredir izliyorum. İlginç bir platform, ama anladığım kadarıyla ücretsiz değil ve kazanacağınızdan emin değilseniz, o zaman oyuncağı kullanmak için ödeme yapın, kurbağa boğuluyor ...

 

Görünüşe göre, kendi kendine öğretilen bakış açısını açıklamaya yönelik denemem başarısız oldu ...

 
Vladimir :

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ı.

Temel bir örnek, Expert Advisor'a farklı girdi parametreleriyle başka bir n-serisi girdi eklemektir.
Ve tabii ki, kapanana kadar bu n-konumlarını ayrı parametrelerle korumak.

... ve büyük olasılıkla ( oop kullanarak ) kod satırları daha az olacaktır. OOP kodunu şişirmek için taraftarlar olmasına rağmen)

 
Aleksey Altukhov :

Birisi önerdi mi bilmiyorum ama neden MT4'teki her şeyi MT5'e aktarmıyorsunuz, o zaman herkes geçiş yapardı.


Ve bu birikmiş Uzman Danışmanlar, göstergeler ve senaryolar dağını kim taşıyacak?

 

Sanırım OOP kullanılabilirliğinin ilkel bir örneğini buldum. İşte bir diziyi belirtilen bir değerle doldurmak için bir fonksiyon. Dizinin türüne bağlı olarak sekiz çeşidi vardır.

Bir parametre setini, sonra bir diğerini, sonra üçüncüsünü iletmeniz gereken bir fonksiyon yazmanız gerektiğini hayal edin... Algoritmik yaklaşımla, N farklı fonksiyon ismi alırsınız. Sorun değil gibi görünüyor, ArrayInitialize Int() A rrayInitializeDouble() ve benzeri gibi 8 yazabilirsiniz. Ama sonuçta, bir dizinin türünü düşünmeden her durumda bir işlevi basitçe uygulamak ne kadar güzel ve oraya hangi diziyi koyduğunuzu karıştırmak ne kadar güvenli ...

Документация по MQL5: Операции с массивами / ArrayInitialize
Документация по MQL5: Операции с массивами / ArrayInitialize
  • www.mql5.com
Операции с массивами / ArrayInitialize - справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 

Yeni çubuk işlevi için yeni bir çözüm geliştirdi. Daha basit ve özlü. Piyasa İzleme'de bulunan herhangi bir sembolde ve önceden ayarlanmış herhangi bir zaman diliminde yeni bir çubuk olayı hakkında bildirim alma yeteneğini uygular.

Hata görürseniz lütfen yorum yapın.

 //+------------------------------------------------------------------+
//|                                                  Новый бар 2.mq4 |
//|                                                      Peter Konow |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Peter Konow"
#property link        "https://www.mql5.com"
#property version    "1.00"
#property strict
//+------------------------------------------------------------------+
datetime Время_последнего_бара;

int      Частота_таймера        = 25 ;
int      Всех_символов;
int       Таймфреймы[ 7 ]          = { PERIOD_M1 , PERIOD_M5 , PERIOD_M15 , PERIOD_M30 , PERIOD_H1 , PERIOD_H4 , PERIOD_D1 };
int       Всех_таймфреймов       = 7 ;
int       Количество_баров[][ 7 ];
bool      События_нового_бара[][ 7 ];

string   Символы[];
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit ()
  {
//--- create timer
   EventSetMillisecondTimer ( 25 );
   //-------------------------------------------------------------
   //Записываем время последнего бара на момент загрузки эксперта.  
   //Для корректного начала работы, робота нужно запустить на М1. 
   //-------------------------------------------------------------
   Время_последнего_бара = Time [ 0 ];
   //-------------------------------------------------------------   
   //Узнаем сколько символов есть в обзоре рынка.
   //---------------------------------------------------------
   Всех_символов = SymbolsTotal ( true );
   //---------------------------------------------------------   
   //Устанавливаем размер массива Символы. Внутри него будут записаны
   //имена всех символов, которые есть в окне обзоре рынка.
   //---------------------------------------------------------
   ArrayResize (Символы,Всех_символов);
   //---------------------------------------------------------
   //Устанавливаем размеры массивов "Количество_баров[]" и "События_нового_бара[]".
   //В массиве "Количество_баров[]" будет записыватся текущее количество баров каждого символа
   //и каждого таймфрейма. А в массиве "События_нового_бара[]" устанавливаться флаги
   //события нового бара для каждого символа и каждого таймфрейма. 
   //---------------------------------------------------------
   ArrayResize (Количество_баров,Всех_символов);
   ArrayResize (События_нового_бара,Всех_символов);
   //---------------------------------------------------------
   //Записываем наименования символов обзора рынка в массив "Символы[]".
   //---------------------------------------------------------
   for ( int a1 = 0 ; a1 < Всех_символов; a1++)
     {
      Символы[a1] = SymbolName (a1 + 1 , true ); 
       //Возможно, нумерация символов в обзора рынка идет с нуля.
       //Тогда: Символы[a1] = SymbolName(a1,true);
     }
   //---------------------------------------------------------
   return ( INIT_SUCCEEDED );
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit ( const int reason)
  {
//--- destroy timer
   EventKillTimer ();
      
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick ()
  {
//---
   
  }
//+------------------------------------------------------------------+
//| Timer function                                                   |
//+------------------------------------------------------------------+
void OnTimer ()
{
 static bool Начало_отсчета;
 static int   Минута;
 //---------------------------
 //Нам нужен корректный старт отсчета. Это должно быть время начала бара.
 //---------------------------
 if (!Начало_отсчета && Time [ 0 ] != Время_последнего_бара)Начало_отсчета = true ; 
 //--------------------------- 
 if (Начало_отсчета)Минута++;
 //--------------------------- 
 //В следующем цикле, мы будем обращатся к функции iBars (раз в минуту) для получения количества баров на 
 //каждом из символов и таймфреймов, которые будем проходить в цикле.
 //Далее, будем сравнивать записанное количество баров с текущим и при 
 //наличии разницы установим флаг события нового бара в массив "События_нового_бара[]".
 //---------------------------
 if (Минута*Частота_таймера >= 60000 )
   {
     for ( int a1 = 0 ; a1 < Всех_символов; a1++)
      {
       string Этот_символ = Символы[a1];
       //---------------------------------
       for ( int a2 = 0 ; a2 < Всех_таймфреймов; a2++)
         {
           int Этот_таймфрейм = Таймфреймы[a2];
           //------------------------------------------
           int Текущее_количество_баров = iBars (Этот_символ,Этот_таймфрейм);
           //------------------------------------------
           if (Текущее_количество_баров > Количество_баров[a1][a2])
            {
             //------------------------------------------------------------
             //Если это не самая первая запись в массив Количества баров,
             //то фиксируем событие нового бара.
             //------------------------------------------------------------
             if (Количество_баров[a1][a2])События_нового_бара[a1][a2]  = true ;
             //------------------------------------------------------------
             //Устанавливаем новое значение текущего количества баров.
             //------------------------------------------------------------
             Количество_баров   [a1][a2]  = Текущее_количество_баров;
            }
           //------------------------------------------
         }
      }
     //---------
    Минута = 0 ;
   }
 //-----------------------------------------------
    
}
//+------------------------------------------------------------------+






//---------------------------------------------------------------------
//Функция Новый_бар() принимает наименование символа и таймфрейм.
//Она делает цикл по массиву символов, находит совпадение наименований и 
//с запрашиваемым символом, и далее ищет нужный таймфрейм для получения
//индекса ячейки массива в которой он находится. 
//Найдя индекс ячейки имени нужного символа и индекс ячейки нужного
//таймфрейма, функция обращается к массиву "События_нового_бара" и 
//возвращает факт события нового бара или его отсутствие.
//После возврата флага события, функция снимает этот флаг.
//Следовательно, флаг события можно получить только один раз за бар.
//---------------------------------------------------------------------
bool Новый_бар( string Символ, int Таймфрейм)
{
 bool Новый_бар;
 //-----------------------
 for ( int a1 = 0 ; a1 < Всех_символов; a1++)
   {
     if (Символы[a1] == Символ)
      {
       for ( int a2 = 0 ; a2 < Всех_таймфреймов; a2++)
         {
           if (Таймфреймы[a2] == Таймфрейм)
            {
             Новый_бар  = События_нового_бара[a1][a2];
             if (Новый_бар)События_нового_бара[a1][a2] = 0 ;
             return (Новый_бар);
            }
         }
      }
   }
 //-----------------------
 return ( false );
}
//+------------------------------------------------------------------+
 
Реter Konow :

Yeni çubuk işlevi için yeni bir çözüm geliştirdi. Daha basit ve özlü. Piyasa İzleme'de bulunan herhangi bir sembolde ve önceden ayarlanmış herhangi bir zaman diliminde yeni bir çubuk olayı hakkında bildirim alma yeteneğini uygular.

Hata görürseniz lütfen yorum yapın.


4 döngü harika değil, değil mi? piyasadaki 600 karakterde her dakika izle terminal ölecek ....

 
Реter Konow :

Yeni çubuk işlevi için yeni bir çözüm geliştirdi. Daha basit ve özlü. Piyasa İzleme'de bulunan herhangi bir sembolde ve önceden ayarlanmış herhangi bir zaman diliminde yeni bir çubuk olayı hakkında bildirim alma yeteneğini uygular.

Hatalar görürseniz lütfen yorum yapın.

Bu işlevin OnTimer'a () geçmesini beklemiyordum ve zaten fikrim hakkında konuştum

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

Mt4 End desteği.

Alexey Viktorov , 2017.09.11 10:09

Görünüşe göre, kendi kendine öğretilen bakış açısını açıklamaya yönelik denemem başarısız oldu ...


 
Реter Konow :

Yeni çubuk işlevi için yeni bir çözüm geliştirdi. Daha basit ve özlü. Piyasa İzleme'de bulunan herhangi bir sembolde ve önceden ayarlanmış herhangi bir zaman diliminde yeni bir çubuk olayı hakkında bildirim alma yeteneğini uygular.

Hatalar görürseniz lütfen yorum yapın.

Kod yorumuna gelince: Peki programda sadece cari dönemin ve sadece bir sembolün açılışını belirlemek gerekirse? Tüm bu yapı tüm döngüleri bükecek mi? mantıksız.

not; Ve neden bir milisaniye zamanlayıcı çalıştırıyorsunuz? Bir saniye yeterli değil mi?