Mt4 End desteği. - sayfa 34

 

Konunun konusuna dönersek. Yaklaşık iki saat önce "Hangi platformu kullanıyorsunuz?" anketinin sonuçları geldi. http://ru.forexmagnates.com/rezultatyi-oprosa-kakoy-platformoy-vyi-polzuetes/ :

"Dolayısıyla, oylama sonuçlarına göre, ticaret yazılımı sağlayıcısı MetaQuotes'in MetaTrader 4 platformu, katılımcıların %63'ü tarafından tercih edilen önemli bir avantajla kazandı. Aynı sağlayıcının amiral gemisi ürünü MetaTrader 5 platformu, 19 kazandı. Oy kullananların oylarının yüzdesi. Aynı zamanda, oy verenlerin yüzde 21'i listelenmemiş "diğer" ticaret platformlarını kullanıyor."

Результаты опроса «Какой платформой вы пользуетесь?» | Forex Magnates
Результаты опроса «Какой платформой вы пользуетесь?» | Forex Magnates
  • Vadim Sviderski
  • ru.forexmagnates.com
В конце прошлой недели редакция Forex Magnates провела среди пользователей ресурса опрос на тему «Какой платформой вы пользуетесь?». Сегодня мы опубликуем результаты и выясним, какой торговой платформе отдают предпочтение розничные участники внебиржевого рынка Форекс. Итак, по результатам голосования, с существенным преимуществом побеждает...
 
Dmitry Fedoseev :

Belki de "hızlı"nın ne anlama geldiğini bilmiyorsunuz?

Sanırım hala biliyorum))
Şu anda bunu kanıtlamak için zaman yok.
Piotr'un kodunu ayrıntılı olarak incelemedim, ancak onu profil oluşturma yoluyla çalıştırdım. Tüm veri oluşturma döngüsü yaklaşık 1 mikrosaniye sürmüştür. Bu, kodun tamamen işlevsel hale gelmesi için küresel olarak sabitlenmesi gerekmemesi koşuluyla şimdiye kadarki en iyi sonuçtur.
 
Реter Konow :

Çözümünüz iyi çalışıyor mu? Eğer iyiyse, o zaman harikadır.

Ve yüzlerce enstrümanda olduğu gibi, bindirmeler olmayacak mı?

Hemen "bu bir başyapıt değil" dediğim gibi, bu sadece OOP'de ustalaşmak için kendi kendine öğretilen girişimler. Ama sorunsuz çalışıyor. Bu sürümden önce, mql4'te çalışan varyantlar mql5'te başarısız oldu. Bir yerde bir konu var, bir kuzuyla yüksek tonlarda uzun uzun tartıştım...

Belki yüzlerce enstrüman için işlevin bir versiyonunu daha eklemek gerekecek, ancak adı aynı kalacak. Ve bu, bence, OOP'deki en hoş artı. OOP daha derinden öğrenilirse, daha hoş artılar olabilir, ama ... benim için, bu hayatta değil ...

 
Nikolai Semko :
Sanırım hala biliyorum))
Şu anda bunu kanıtlamak için zaman yok.
Piotr'un kodunu ayrıntılı olarak incelemedim, ancak onu profil oluşturma yoluyla çalıştırdım. Tüm veri oluşturma döngüsü yaklaşık 1 mikrosaniye sürmüştür. Bu, kodun tamamen işlevsel hale gelmesi için küresel olarak sabitlenmesi gerekmemesi koşuluyla şimdiye kadarki en iyi sonuçtur.

Yine de bilmediğinizi kanıtladınız.

 
Dmitry Fedoseev :

Yine de bilmediğini kanıtladın.

Tamam, nasıl istersen. bilmeme izin ver. Yenildim ve ayağın göğsümde. Tebrikler!!! Zevk almak!
 
Dmitry Fedoseev :

Ne tür bir delilik gösterdiğin hakkında hiçbir fikrin yok, sadece tam bir paragraf. Ama özellikle hangi yerde olduğunu göstermeyeceğim, çünkü hepiniz benim görüşüme ilgi duymuyorsunuz)))

Herhangi bir kişi, yalnızca ağır argümanlarla bir görüşle ilgilenir.

"Bunu yapmak gerekiyor, çünkü ben yapıyorum" argümanı kimseyi ilgilendirmez.

Bu özel durumda, değişken adları kabul edilen, zayıf argümanla eşleşmez. Bu CodeBase için yazılmadı.

 

Hepinizin burada pokerde oturmanız komik. Oturmaya devam edin, etrafınızdaki dünyayı daha eğlenceli hale getirir.

 
Dmitry Fedoseev :

Hepinizin burada pokerde oturmanız komik. Oturmaya devam edin, etrafınızdaki dünyayı daha eğlenceli hale getirir.


Aferin Dmitry!
Peter yangınları körüklemede ustaysa, o zaman onları söndürmede ustasın))))

 
Alexey Volchanskiy :

Şimdiye kadar, IAFT bile MT5'i desteklemiyor, bu benim için hayal kırıklığı yaratıyor, çünkü oradaki spreadleri yendim. Ve destek ne anlama geliyor? Yeni sürümlerin yayınlanması? Eh, kritik hatalar yoksa, yenileri olmayabilir.

MT5'te kısmen süründüm, ancak Dmitry'nin haklı olarak belirttiği gibi, koşullar MT4'te daha iyi.

Bu doğru değil. MT5'teki emir yürütme hızı ve kalitesi, en iyiye alışmak için hoş bir ortam yaratır (akıllı, likidite dönemlerinde çok düşük spreadler dahil, aslında bir örnek var - aynı Robo (MT5)). Bu da belirli likidite seviyelerinde limit emirlerin avantajlarını sağlar. /*<= ve bu, genel giderleri fazlasıyla telafi edebilir (hesapta komisyon varsa yayılma ve komisyon).*/

Bu örneklerden /* yeşil oklar - belirlenen sınırın seviyeleri ve kırmızıdan mavi oklara - aslında bu şekilde çalıştı */:

 

Fonksiyonun bu versiyonunda New_bar() fonksiyonu yoktur;

Bu, sağladığım en kaynak tasarrufu sağlayan seçenek. Ayrıca başka bir avantajı daha vardır: Kullanıcı kodu timer veya tick olayında yürütülürken yeni bar olayı her zaman kaydedilir.

Önceden, bu olayı yalnızca bir kez almak mümkündü ve bayrak New_bar() işlevi tarafından kaldırıldı. Şimdi özel işlev "Events_of_new_bar[][]" dizisini dakikada bir temizler ve yalnızca kullanıcı kodunun yürütülmesinden sonra çağrılır.

Özel işlevler, diziye doğrudan erişebilir ve kodun timer veya tick olayında yürütüldüğü her zaman yeni bar olayı hakkında bilgi alabilir.

Kaynaklar daha da fazla kaydedilir.

 //+------------------------------------------------------------------+
//|                                                  Новый бар 3.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     Всех_символов;

string Символы[];
int     Таймфреймы[ 7 ]    = { PERIOD_M1 , PERIOD_M5 , PERIOD_M15 , PERIOD_M30 , PERIOD_H1 , PERIOD_H4 , PERIOD_D1 };
int     Всех_таймфреймов = 7 ;

int     Количество_баров[][ 7 ];
bool    События_нового_бара[][ 7 ];

//+------------------------------------------------------------------+
#define M1     0
#define M5     1
#define M15   2
#define M30   3
#define H1     4
#define H4     5
#define D1     6
//+------------------------------------------------------------------+
//| 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 ;
   }
 //-----------------------------------------------
 //Здесь наш код...
 //Здесь наш код...
 //Здесь наш код...
 //-----------------------------------------------
 //После завершения всех вызовов на этом событии таймера
 //снимаем флаги событий нового бара.
 if (!Минута)Снять_событие_нового_бара();
 //-----------------------------------------------   
}
//+------------------------------------------------------------------+
//Функция снимает флаги событий нового бара.
//Эта процедура осуществляется после выполнения всего пользовательского
//кода один раз в минуту. Вплоть до момента очищения массива флагов 
//новых баров, все функции могут их видеть обращаясь к массиву напрямую.
//+------------------------------------------------------------------+
void Снять_событие_нового_бара()
{
 for ( int a1 = 0 ; a1 < Всех_символов; a1++)
   {
     for ( int a2 = 0 ; a2 < Всех_таймфреймов; a2++)
      {
       События_нового_бара[a1][a2] = false ;
      }
   }
}
//+------------------------------------------------------------------+


//+------------------------------------------------------------------+
//Пример использования событий нового бара в пользовательском функционал.
//Просто обращаемся к глобальному массиву "События_нового_бара[a1][a2]" напрямую
//и используем событие в наших торговых алгоритмах.
//+------------------------------------------------------------------+
void Моя_стратегия_торговли_на_новых_барах()
{
   for ( int a1 = 0 ; a1 < Всех_символов; a1++)
   {
     string Этот_символ    = Символы[a1];
     //----------------------------------
     for ( int a2 = 0 ; a2 < Всех_таймфреймов; a2++)
      {
       bool    Новый_бар      = События_нового_бара[a1][a2];
       int     Этот_таймфрейм = Таймфреймы[a2];
       //----------------------------------
       if (Новый_бар && Этот_символ == "EURUSD" && Этот_таймфрейм == PERIOD_M15 )
         {
           //Купить();
         }
       //---------------------------------- 
       if (Новый_бар && Этот_символ == "AUDUSD" && Этот_таймфрейм == PERIOD_M30 )
         {
           //Продать();
         }
       //----------------------------------        
      }
   }
}
//+------------------------------------------------------------------+
Neden: