Mt4 지원 종료. - 페이지 30

 
Реter Konow :

컴퓨터의 부하는 메커니즘의 일관성 문제에 대한 개발자의 태만 한 태도에 의해 주어집니다. 시스템 개선에 에너지를 절약하려는 욕구. 업무를 용이하게 한다는 명목으로 컴퓨터 자원을 부당하게 사용하는 행위.

컴퓨터가 비효율적으로 작성된 코드에 성공적으로 대처하는 한 개발자는 계속해서 컴퓨팅 성능에 "기생"할 것입니다. 이것은 막다른 길입니다.

조만간 비효율적인 메커니즘이 개발을 중단하고 보다 발전된 아날로그로 대체될 것입니다.

사람의 시간과 노력은 낭비되고 그의 자손은 쓰레기통에 버려집니다.

경쟁이 치열한 세상에서 이러한 위험은 항상 존재합니다.

메커니즘을 설계할 때, 우리는 우선 그 특성에 대해 생각하고, 두 번째로 근무 시간을 보내는 편안함과 편의성에 대해 생각해야 합니다.))

아직 절차적 스타일로 새 막대를 정의하는 함수를 작성하지 않았습니다.

거래, 자동 거래 시스템 및 거래 전략 테스트에 관한 포럼

Mt4 지원 종료.

Artyom Trishkin , 2017.09.10 23:21

내 목표는 그의 절차적 스타일 코드가 다음과 같은 루프에서 실행되도록 하는 것이었습니다.

   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 :

예, 우리는 어제 이에 대해 논의했습니다.

이전에는 다른 플랫폼을 다루었고 따옴표의 도착에 관계없이 제 시간에 막대가 형성되었습니다(TWS 참조).

MT에서는 그렇지 않다고 들었습니다.

새로운 바 등장 이벤트를 확인하기 위해 견적 도착 체크를 추가하겠습니다.

오랜만에 시청합니다. 흥미로운 플랫폼이지만 내가 알기로는 무료가 아니며 수익이 날지 확신이 서지 않으면 장난감 사용 비용을 지불하면 두꺼비가 목을 조르고 있습니다 ...

 

독학으로 배운 관점을 설명하려는 시도는 분명히 실패했습니다 ...

 
Vladimir :

그런 예가 실제로 존재 합니까? 당신의 것이 아니라? 깊은 의문이 듭니다. 2000년대 초에 디버깅하고 작업한 코드 줄 수를 세는 것을 중단했는데, 백만 개를 초과했기 때문에 재미가 없었습니다.

기본적인 예는 다른 입력 매개변수를 사용하여 Expert Advisor에 또 다른 n 시리즈 입력을 추가하는 것입니다.
물론 닫을 때까지 별도의 매개변수를 사용하여 이러한 n-위치를 유지합니다.

...그리고 아마도 ( oop 을 사용하여 ) 코드 라인이 더 적을 것입니다. OOP 코드를 부풀리는 지지자가 있지만)

 
Aleksey Altukhov :

누가 제안했는지 모르겠지만 MT4에 있는 모든 것을 MT5로 옮기면 모두가 전환할 것입니다.


그리고 축적된 전문가 고문, 지표 및 스크립트의 이 산을 누가 수행할 것입니까?

 

OOP 사용성의 원시적인 예를 찾은 것 같습니다. 다음은 지정된 값으로 배열을 채우는 함수입니다. 배열 유형에 따라 8가지 종류가 있습니다.

한 세트의 매개변수를 전달해야 하는 함수를 작성해야 하는 경우를 상상해 보십시오. 그런 다음 다른 한 세트를 전달한 다음 세 번째 세트를 전달해야 합니다. 알고리즘 접근 방식을 사용하면 N개의 다른 함수 이름을 얻게 됩니다. ArrayInitialize Int() A rrayInitializeDouble() 등과 같이 8을 작성할 수 있기 때문에 괜찮은 것 같습니다. 하지만 결국 배열의 종류에 대해 생각하지 않고 어떤 경우에도 하나의 함수를 적용하는 것이 얼마나 좋은지, 그리고 거기에 어떤 배열을 넣을지 혼동하는 것이 얼마나 안전한지 ...

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

새로운 바 기능을 위한 새로운 솔루션을 개발했습니다. 더 간단하고 간결합니다. Market Watch에서 사용할 수 있는 모든 기호와 미리 설정된 시간 프레임에 대한 새 바 이벤트에 대한 알림을 수신하는 기능을 구현합니다.

오류가 보이면 댓글 부탁드립니다.

 //+------------------------------------------------------------------+
//|                                                  Новый бар 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 :

새로운 바 기능을 위한 새로운 솔루션을 개발했습니다. 더 간단하고 간결합니다. Market Watch에서 사용할 수 있는 모든 기호와 미리 설정된 시간 프레임에 대한 새 바 이벤트에 대한 알림을 수신하는 기능을 구현합니다.

오류가 보이면 댓글 부탁드립니다.


4사이클은 좋지 않죠? 600자에서 마켓워치 1분마다 단말기가 죽습니다....

 
Реter Konow :

새로운 바 기능을 위한 새로운 솔루션을 개발했습니다. 더 간단하고 간결합니다. Market Watch에서 사용할 수 있는 모든 기호와 미리 설정된 시간 프레임에 대한 새 바 이벤트에 대한 알림을 수신하는 기능을 구현합니다.

오류가 보이면 댓글 부탁드립니다.

이 함수가 OnTimer()로 마이그레이션될 거라고는 예상하지 못했고 이미 내 아이디어에 대해 이야기했습니다.

거래, 자동 거래 시스템 및 거래 전략 테스트에 관한 포럼

Mt4 지원 종료.

알렉세이 빅토 로프 , 2017.09.11 10:09

독학으로 배운 관점을 설명하려는 시도는 분명히 실패했습니다 ...


 
Реter Konow :

새로운 바 기능을 위한 새로운 솔루션을 개발했습니다. 더 간단하고 간결합니다. Market Watch에서 사용할 수 있는 모든 기호와 미리 설정된 시간 프레임에 대한 새 바 이벤트에 대한 알림을 수신하는 기능을 구현합니다.

오류가 보이면 댓글 부탁드립니다.

코드 주석의 경우: 현재 기간과 프로그램에서 단 하나의 기호만 여는 것을 결정해야 하는 경우? 이 모든 구성이 모든 주기를 비틀까요? 비합리적.

추신; 밀리초 타이머를 실행하는 이유는 무엇입니까? 1초면 충분하지 않습니까?