Mt4 지원 종료. - 페이지 34

 

스레드의 주제로 돌아갑니다. 약 2시간 전 "어떤 플랫폼을 사용하세요?"라는 설문조사 결과가 나왔다. http://ru.forexmagnates.com/rezultatyi-oprosa-kakoy-platformoy-vyi-polzuetes/ :

"따라서 투표 결과에 따르면 거래 소프트웨어 제공업체 MetaQuotes의 MetaTrader 4 플랫폼은 참가자의 63%가 선호하는 상당한 이점으로 승리했습니다. 동일한 제공업체의 주력 제품인 MetaTrader 5 플랫폼은 19점을 얻었습니다. 투표 참가자의 득표 비율 동시에 투표한 사람들의 21%는 목록에 없는 "기타" 거래 플랫폼을 사용합니다."

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

"빠르다"가 무슨 뜻인지 모르시겠습니까?

나는 아직도 알고 있다고 생각한다))
지금 당장 그것을 증명할 시간이 없습니다.
Piotr의 코드를 자세히 공부하지는 않았지만 프로파일링을 통해 실행했습니다. 전체 데이터 생성 주기는 약 1마이크로초가 소요되었습니다. 이것은 코드가 완전히 작동하기 위해 전역적으로 수정될 필요가 없다는 조건에서 지금까지 최고의 결과입니다.
 
Реter Konow :

솔루션이 잘 작동합니까? 그것이 좋다면 그것은 훌륭합니다.

그리고 수백 개의 악기의 경우처럼 오버레이가 없을까요?

바로 "이건 걸작이 아니다"라고 말했듯이 OOP를 마스터하기 위해 독학으로 시도한 것입니다. 그러나 그것은 완벽하게 작동합니다. 이 버전 이전에는 mql4에서 작동하던 변형이 mql5에서 실패했습니다. 어딘가 화제가 되는 곳에서 양고기와 오랜만에 고음으로 의논했는데...

아마도 수백 개의 기기에 대해 기능의 버전을 하나 더 추가해야 하지만 이름은 그대로 유지됩니다. 그리고 이것은 제 생각에 OOP에서 가장 즐거운 플러스입니다. OOP를 더 깊이 마스터하면 더 즐거운 플러스가있을 수 있지만 ... 나를 위해,이 삶에서는 ...

 
Nikolai Semko :
나는 아직도 알고 있다고 생각한다))
지금 당장 그것을 증명할 시간이 없습니다.
Piotr의 코드를 자세히 공부하지는 않았지만 프로파일링을 통해 실행했습니다. 전체 데이터 생성 주기는 약 1마이크로초가 소요되었습니다. 이것은 코드가 완전히 작동하기 위해 전역적으로 수정될 필요가 없다는 조건에서 지금까지 최고의 결과입니다.

그러나 당신은 당신이 모른다는 것을 증명했습니다.

 
Dmitry Fedoseev :

그러나 당신은 당신이 모른다는 것을 증명했습니다.

좋아, 원하는 대로 모르게 해주세요. 나는 패배했고 당신의 발은 내 가슴에 있습니다. 축하합니다!!! 즐기다!
 
Dmitry Fedoseev :

당신은 당신이 어떤 종류의 미친 짓을 보여 줬는지 전혀 모릅니다. 단지 완전한 단락입니다. 그러나 당신 모두가 내 의견에 관심이 없기 때문에 나는 구체적으로 어느 곳에서 보여주지 않을 것입니다)))

모든 사람은 독점적으로 중요한 주장이 있는 의견에 관심이 있습니다.

"내가 그렇게 하기 때문에 그렇게 해야 한다"는 주장은 아무도 관심을 갖지 않는다.

이 특별한 경우에는 변수 이름이 허용되는 약한 인수와 일치하지 않습니다. 이것은 CodeBase용으로 작성되지 않았습니다.

 

여기 건너편 포커에 어떻게 앉았는지 웃기네요. 계속 앉아 있으면 주변 세상이 더 재미있어집니다.

 
Dmitry Fedoseev :

여기 건너편 포커에 어떻게 앉았는지 웃기네요. 계속 앉아 있으면 주변 세상이 더 재미있어집니다.


잘했어 드미트리!
Peter가 부채질의 대가라면 당신은 불을 끄는 대가입니다)))))

 
Alexey Volchanskiy :

지금까지 IAFT조차도 MT5를 지원하지 않습니다. MT5에서 스프레드를 이겼기 때문에 실망스럽습니다. 그리고 지원은 무엇을 의미합니까? 새 버전의 출시? 중요한 오류가 없으면 새 오류가 없을 수도 있습니다.

나는 MT5에서 부분적으로 크롤링했지만 Dmitiry가 올바르게 지적했듯이 MT4에서 조건이 더 좋습니다.

이것은 사실이 아닙니다. MT5 의 주문 실행 속도와 품질은 최상의 상태에 익숙해질 수 있는 쾌적한 환경을 만듭니다(유동성 기간 동안 매우 낮은 스프레드를 포함하여 사실, 동일한 예가 있습니다 - 동일한 Robo(MT5)). 이는 차례로 특정 수준의 유동성에서 지정가 주문의 이점을 제공합니다. /*<= 및 이것은 간접비(계정에 커미션이 있는 경우 스프레드 및 커미션)를 상쇄할 수 있습니다.*/

이 /* 녹색 화살표의 예에서 - 설정된 한계의 수준과 빨간색에서 파란색 화살표로 - 이것이 실제로 작동한 방식입니다 */:

 

이 버전의 함수에는 New_bar() 함수가 전혀 없습니다.

이것은 내가 제공한 가장 자원을 절약하는 옵션입니다. 또한 타이머 또는 틱 이벤트에서 사용자 코드가 실행되는 동안 새 막대 이벤트가 항상 저장된다는 또 다른 이점이 있습니다.

이전에는 이 이벤트를 한 번만 받을 수 있었고 플래그는 New_bar() 함수에 의해 제거되었습니다. 이제 특수 함수는 분당 한 번씩 "Events_of_new_bar[][]" 배열을 지우고 사용자 코드를 실행한 후에만 호출됩니다.

사용자 정의 함수는 배열에 직접 액세스하고 타이머 또는 틱 이벤트 에서 코드가 실행될 때마다 새 막대 이벤트에 대한 정보를 수신할 수 있습니다.

리소스가 훨씬 더 절약됩니다.

 //+------------------------------------------------------------------+
//|                                                  Новый бар 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 )
         {
           //Продать();
         }
       //----------------------------------        
      }
   }
}
//+------------------------------------------------------------------+