[SERVICE DESK] 타이머에서 시니어 TF의 시간을 가져오는 동안 오류가 발생했습니다! - 페이지 15

 
Taras Slobodyanik :

지표는 데이터 업데이트를 추적하지 않습니다.
새 막대 는 브로커에서 제공되지만 확인하지 않습니다.
체크했을 때 모든 것이 올바르게 표시된다는 것을 보여주기 위해 몇 줄을 추가했습니다.

새 막대를 확인하는 작업 상황입니다.

그래 너 뭐야! 그리고 내가 새로운 막대를 추적해야한다고 생각하는 이유는 무엇입니까? 문서에 있습니까? 내 말은, 함수의 값을 가져와야 하고, 그런 다음 이전 값과 비교해야 합니까? 기능이 있습니다. 기능은 더 높은 시간 프레임에서 작동하도록 설계되었습니다. 함수는 데이터가 없을 때 오류를 반환하거나 잘못된 값(이 경우 0)을 반환할 수 있습니다. 모두. 프로그래머는 100% 정확한 값을 얻기 위해 무언가를 차단해서는 안 됩니다.

그러나 SeriesInfoInteger() 문서에서 찾은 것을 보십시오.

오류에 대한 자세한 정보를 얻으려면 GetLastError() 함수를 호출해야 합니다.

내 GetLastError() 코드에서 볼 수 있습니까? 다음은 수표입니다. 이 점검은 반드시 필요하고 충분해야 합니다! 다른 모든 것은 목발 솔루션입니다.
 
Alexey Kozitsyn :

그리고 제 첫 포스팅을 봐주세요. 거기에 오류 4066이 표시됩니까? 그런 다음 오류 0 및 잘못된 데이터 반환. 함수(이 경우 SeriesInfoInteger())가 데이터를 보내기 전에 유효성을 확인하지 않는 이유는 무엇입니까? 왜 그녀는 오류 플래그를 올리지 않습니까? 나중에 오류를 찾는 것보다 내부 검사가 통과할 때까지 조금 더 기다리는 것이 좋습니다.

하지만 그 후 조언을 많이 해주었지만 결과는 얻지 못했다. 그리고 그것은 타이머에서도 밝혀지지 않았습니다.

그래, 도움말을 읽어봐)

SeriesInfo정수

기록 데이터 의 상태에 대한 정보를 반환합니다.

역사적이라는 단어는 무엇을 의미합니까?
History가 로드되면 오류가 없습니다.


알렉세이 코지친 :

그래 너 뭐야! 그리고 내가 새로운 막대를 추적해야한다고 생각하는 이유는 무엇입니까? 문서에 있습니까? 내 말은, 함수의 값을 가져와야 하고, 그런 다음 이전 값과 비교해야 합니까? 기능이 있습니다. 기능은 더 높은 시간 프레임에서 작동하도록 설계되었습니다. 함수는 데이터가 없을 때 오류를 반환하거나 잘못된 값(이 경우 0)을 반환할 수 있습니다. 모두. 프로그래머는 100% 정확한 값을 얻기 위해 무언가를 차단해서는 안 됩니다.

그러나 SeriesInfoInteger() 문서에서 찾은 것을 보십시오.

내 GetLastError() 코드에서 볼 수 있습니까? 다음은 수표입니다. 이 점검은 반드시 필요하고 충분해야 합니다! 다른 모든 것은 목발 솔루션입니다.

당신은 아무것도 빚지지 않는다)
...브로커가 업데이트된 데이터를 전송합니다. 원하는 경우 계산에 사용하고, 그렇지 않은 경우에는 어떤 문제가 있는지, 이미 존재하는 기록에 따라 고려)


추신. 주말이고 시장이 닫혀 있습니다. 터미널에 잘못된 데이터가 있습니다!
그리고 오류 없음!!!

 
Taras Slobodyanik :

그래, 도움말을 읽어봐)

역사적이라는 단어는 무엇을 의미합니까?
History가 로드되면 오류가 없습니다.


당신은 아무것도 빚진 것이 없습니다)
...브로커가 업데이트된 데이터를 보냅니다. 원하는 경우 계산에 사용하고, 그렇지 않은 경우에는 어떤 문제가 있는지 기록에 따라 계산)

터미널에 온 각 틱 은 이미 기록입니다. 그리고 실제 값이나 오류를 받고 싶습니다. 모든 것이 당신에게 적합하다면 - 좋습니다.

 
Alexey Kozitsyn :

터미널에 온 각 틱 은 이미 기록입니다. 그리고 실제 값이나 오류를 받고 싶습니다. 모든 것이 당신에게 적합하다면 - 좋습니다.

예, 역사는 이미 로드된 것 또는 과거에 로드된 것입니다.
그리고 (마지막 견적 이후) 지금 업데이트되고 있는 것은 아직 기록이 아니며 새로운 원시 데이터입니다.

 
Taras Slobodyanik :

막대의 계산이 아니라 촛불의 시간을 확인하십시오.
이것이 올바르게 업데이트되는 방법입니다(확인됨).

Taras, 다음은 코드 결과입니다.

 2018.10 . 08 11 : 11 : 39.080 test_isNewDayInOnCalculate GBPUSD,M1: initialized
2018.10 . 08 11 : 11 : 39.788 test_isNewDayInOnCalculate GBPUSD,M1: test_isNewDayInOnCalculate.mq4: Время открытия недельного бара = 2018.09 . 30 00 : 00 . Ошибка # 0
2018.10 . 08 11 : 11 : 39.788 test_isNewDayInOnCalculate GBPUSD,M1: test_isNewDayInOnCalculate.mq4: Актуальное время открытия текущей недели = 2018.10 . 01 00 : 00 . Ошибка # 0
2018.10 . 08 11 : 11 : 39.788 test_isNewDayInOnCalculate GBPUSD,M1: test_isNewDayInOnCalculate.mq4: Время открытия текущего дня = 2018.10 . 05 00 : 00 . Ошибка # 0
2018.10 . 08 11 : 11 : 39.788 test_isNewDayInOnCalculate GBPUSD,M1: test_isNewDayInOnCalculate.mq4: Актуальное время открытия текущего дня = 2018.10 . 05 00 : 00 . Ошибка # 0
2018.10 . 08 11 : 11 : 39.788 test_isNewDayInOnCalculate GBPUSD,M1: test_isNewDayInOnCalculate.mq4: Время открытия текущего часа = 2018.10 . 05 23 : 00 . Ошибка # 0
2018.10 . 08 11 : 11 : 39.788 test_isNewDayInOnCalculate GBPUSD,M1: test_isNewDayInOnCalculate.mq4: Актуальное время открытия текущего часа = 2018.10 . 05 23 : 00 . Ошибка # 0
2018.10 . 08 11 : 11 : 39.788 test_isNewDayInOnCalculate GBPUSD,M1: OnCalculate : Данные старших ТФ загружены!
 
Alexey Kozitsyn :

Taras, 다음은 코드 결과입니다.

예, 이것은 완성된 이야기를 제공하는 첫 번째 눈금이며 사용 가능한 것입니다.
이 틱 이후( 새 막대 가 있는 경우) 두 번째 틱이 즉시 나타나서 내 코드가 변수를 업데이트하고 올바른 데이터를 표시합니다.

추신. 새 막대를 확인하기 위해 고유한 기능을 삽입할 수 있습니다.

pps. 나는 집에서 막대 수를 지속적으로 확인합니다. 숫자가 1 이상 변경되면 모든 것을 다시 계산해야합니다. 숫자가 1만큼 변경되면 새 막대를 의미합니다. 그리고 가장 치명적인 오류만 확인하고 이 지연 오류는 보이지 않습니다.

 
Taras Slobodyanik :

예, 이것은 완성된 이야기를 제공하는 첫 번째 눈금이며 사용 가능한 것입니다.
이 틱 이후( 새 막대 가 있는 경우) 두 번째 틱이 즉시 나타나서 내 코드가 변수를 업데이트하고 올바른 데이터를 표시합니다.

추신. 새 막대를 확인하기 위해 고유한 기능을 삽입할 수 있습니다.

pps. 나는 집에서 막대 수를 지속적으로 확인합니다. 숫자가 1 이상 변경되면 모든 것을 다시 계산해야합니다. 숫자가 1만큼 변경되면 새 막대를 의미합니다. 그리고 가장 치명적인 오류만 확인하고 이 지연 오류는 보이지 않습니다.

그런데 여기에 오류가 발생한다는 사실에 찬성하는 또 다른 주장이 있습니다. 표시기의 계산 오류입니다! 고문은 다음과 같이 썼습니다.

 #property version    "1.00"
#property strict
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
//--- Время открытия текущего часа, дня и недели
datetime _weekOpenTime = 0 ;
datetime _hourOpenTime = 0 ;
datetime _dayOpenTime= 0 ;
//--- Вести лог журнала
const bool inpFileLog= true ;
//--- Количество секунд в одном дне
const int SEC_PER_DAY= 86400 ;
//--- Флаг работоспособности индикатора
bool _isWorking= true ;
//--- Флаг соединения с торговым сервером (для таймера, получаем в OnCalculate())
bool _isConnected= false ;
//---
bool _firstLaunch = true ;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit ()
  {
   //--- Устанавливаем флаг первого запуска
   _firstLaunch = true ;
//--- Сбрасываем время открытия текущего часа, дня и недели
   _weekOpenTime= 0 ;
   _dayOpenTime = 0 ;
   _hourOpenTime= 0 ;
//--- Устанавливаем флаг работоспособности
   _isWorking= true ;
//--- Сбрасываем флаг установки соединения
   _isConnected= false ;
////--- Запускаем таймер
//   if(!EventSetMillisecondTimer(20))
//     {
//      Print(__FUNCTION__,": ОШИБКА #",GetLastError(),": таймер с частотой 20 не установлен!");
//      //--- Устанавливаем флаг неработоспособности индикатора
//      _isWorking=false;
//     }
//--- Запрос данных
   SeriesInfoInteger ( _Symbol , PERIOD_W1 , SERIES_LASTBAR_DATE );
   SeriesInfoInteger ( _Symbol , PERIOD_D1 , SERIES_LASTBAR_DATE );
   SeriesInfoInteger ( _Symbol , PERIOD_H1 , SERIES_LASTBAR_DATE );
//---
   return ( INIT_SUCCEEDED );
  }
//+------------------------------------------------------------------+
//|                                                                   |
//+------------------------------------------------------------------+
void OnDeinit ( const int reason)
  {
////--- Выключаем таймер
//   EventKillTimer();
  }
////+------------------------------------------------------------------+
////|                                                                  |
////+------------------------------------------------------------------+
//void OnTimer()
//  {
////---
//   if(!_isWorking)
//      return;
////---
//   if(!_isConnected)
//      return;
////---
//   Print(__FUNCTION__,": Данные старших ТФ загружены!");
////--- Отключаем таймер
//   EventKillTimer();
//  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnTick ()
  {
//--- Проверяем связь с сервером
   if (! IsConnected ())                               // Если не удалось установить связь с сервером
     {
       //--- Сбрасываем флаг соединения с сервером
      _isConnected= false ;
       //--- Выходим
       return ;
     }
         //--- Проверяем первый запуск эксперта
         if ( _firstLaunch )
                {
             //--- Проверяем, записано ли время открытия текущей недели
             if (!CheckCurrentWeekOpenTime())                               // Если время не записано
               return ;                                                 // Выходим
             //--- Проверяем, записано ли время открытия текущего дня
             if (!CheckCurrentDayOpenTime())                               // Если время не записано
               return ;                                                 // Выходим
             //--- Проверяем, записано ли время открытия текущего часа
             if (!CheckCurrentHourOpenTime())                               // Если время не записано
               return ;                                                 // Выходим
             ////--- Устанавливаем флаг соединения с сервером для запуска таймера
             //_isConnected=true;
             //---
             Print ( __FUNCTION__ , ": Данные старших ТФ загружены!" );
             //--- Сбрасываем флаг первого запуска
            _firstLaunch = false ;
                }
  }
//+------------------------------------------------------------------+
//| Проверяем, записано ли время открытия текущей недели             |
//+------------------------------------------------------------------+
bool CheckCurrentWeekOpenTime()
  {
//--- Проверяем, записано ли время
   if (_weekOpenTime== 0 ) // Если время не записано
     {
       //--- Получаем время открытия недельного бара
       ResetLastError ();
       const datetime weekBarOpenTime=( datetime ) SeriesInfoInteger ( _Symbol , PERIOD_W1 , SERIES_LASTBAR_DATE );
       const int err= GetLastError ();
       //---
       if (inpFileLog)
        {
         Print ( __FILE__ , ": Время открытия недельного бара = " + TimeToString (weekBarOpenTime)+ ". Ошибка #" ,err);
        }
       //--- Проверяем, получено ли время открытия недельного бара
       if (weekBarOpenTime== 0 || err!= 0 ) // Если время бара не получено или история обновляется
         return ( false );                               // Возвращаем ложь
       //--- Запоминаем время открытия текущей недели (время открытия недельного бара - воскресенье)
      _weekOpenTime=weekBarOpenTime+SEC_PER_DAY;
       //---
       if (inpFileLog)
        {
         Print ( __FILE__ , ": Актуальное время открытия текущей недели = " + TimeToString (_weekOpenTime)+ ". Ошибка #" ,err);
        }
       //--- Возвращаем истину
       return ( true );
     }
//--- Время открытия недели ранее записано. Возвращаем истину
   return ( true );
  }
//+------------------------------------------------------------------+
//| Проверяем, записано ли время открытия текущего дня                  |
//+------------------------------------------------------------------+
bool CheckCurrentDayOpenTime()
  {
//--- Проверяем, записано ли время
   if (_dayOpenTime== 0 ) // Если время не записано
     {
       //--- Получаем время открытия дневного бара
       ResetLastError ();
       const datetime tempDayOpenTime=( datetime ) SeriesInfoInteger ( _Symbol , PERIOD_D1 , SERIES_LASTBAR_DATE );
       const int err= GetLastError ();
       //---
       if (inpFileLog)
        {
         Print ( __FILE__ , ": Время открытия текущего дня = " + TimeToString (tempDayOpenTime)+ ". Ошибка #" ,err);
        }
       //--- Проверяем, получено ли время открытия дневного бара
       if (tempDayOpenTime== 0 || err!= 0 ) // Если время бара не получено
         return ( false );                                 // Возвращаем ложь
       //--- Сохраняем в глобальную переменную значение открытия текущего дня
      _dayOpenTime=tempDayOpenTime;
       //---
       if (inpFileLog)
        {
         Print ( __FILE__ , ": Актуальное время открытия текущего дня = " + TimeToString (_dayOpenTime)+ ". Ошибка #" ,err);
        }
       //--- Возвращаем истину
       return ( true );
     }
//--- Время открытия дня ранее записано. Возвращаем истину
   return ( true );
  }
//+------------------------------------------------------------------+
//| Проверяем, записано ли время открытия текущего часа              |
//+------------------------------------------------------------------+
bool CheckCurrentHourOpenTime()
  {
//--- Проверяем, записано ли время
   if (_hourOpenTime== 0 ) // Если время не записано
     {
       //--- Получаем время открытия часового бара
       ResetLastError ();
       const datetime tempHourOpenTime=( datetime ) SeriesInfoInteger ( _Symbol , PERIOD_H1 , SERIES_LASTBAR_DATE );
       const int err= GetLastError ();
       //---
       if (inpFileLog)
        {
         Print ( __FILE__ , ": Время открытия текущего часа = " + TimeToString (tempHourOpenTime)+ ". Ошибка #" ,err);
        }
       //--- Проверяем, получено ли время открытия часового бара
       if (tempHourOpenTime== 0 || err!= 0 ) // Если время бара не получено
         return ( false );                                 // Возвращаем ложь
       //---
      _hourOpenTime=tempHourOpenTime;
       //---
       if (inpFileLog)
        {
         Print ( __FILE__ , ": Актуальное время открытия текущего часа = " + TimeToString (_hourOpenTime)+ ". Ошибка #" ,err);
        }
       //--- Возвращаем истину
       return ( true );
     }
//--- Время открытия часа ранее записано. Возвращаем истину
   return ( true );
  }
//+------------------------------------------------------------------+

지표와 동일한 차트에서 시작됩니다. 결과를 보자:

 2018.10 . 09 08 : 45 : 42.627 test_isNewDayInOnTick GBPUSD,M1: OnTick : Данные старших ТФ загружены!
2018.10 . 09 08 : 45 : 42.627 test_isNewDayInOnTick GBPUSD,M1: test_isNewDayInOnTick.mq4: Актуальное время открытия текущего часа = 2018.10 . 09 06 : 00 . Ошибка # 0
2018.10 . 09 08 : 45 : 42.627 test_isNewDayInOnTick GBPUSD,M1: test_isNewDayInOnTick.mq4: Время открытия текущего часа = 2018.10 . 09 06 : 00 . Ошибка # 0
2018.10 . 09 08 : 45 : 42.627 test_isNewDayInOnTick GBPUSD,M1: test_isNewDayInOnTick.mq4: Актуальное время открытия текущего дня = 2018.10 . 09 00 : 00 . Ошибка # 0
2018.10 . 09 08 : 45 : 42.627 test_isNewDayInOnTick GBPUSD,M1: test_isNewDayInOnTick.mq4: Время открытия текущего дня = 2018.10 . 09 00 : 00 . Ошибка # 0
2018.10 . 09 08 : 45 : 42.627 test_isNewDayInOnTick GBPUSD,M1: test_isNewDayInOnTick.mq4: Актуальное время открытия текущей недели = 2018.10 . 08 00 : 00 . Ошибка # 0
2018.10 . 09 08 : 45 : 42.627 test_isNewDayInOnTick GBPUSD,M1: test_isNewDayInOnTick.mq4: Время открытия недельного бара = 2018.10 . 07 00 : 00 . Ошибка # 0
2018.10 . 09 08 : 45 : 41.479 test_isNewDayInOnTick GBPUSD,M1: initialized

2018.10.09 08:45:40.822	GBPUSD,M1: CheckCurrentHourOpenTime: Время открытия текущего часа = 2018.10.08 11:00
2018.10.09 08:45:40.822	GBPUSD,M1: CheckCurrentDayOpenTime: Время открытия текущего дня = 2018.10.08 00:00
2018.10.09 08:45:40.822	GBPUSD,M1: CheckCurrentWeekOpenTime: Время открытия текущей недели = 2018.10.08 00:00
2018.10.09 08:45:40.064	GBPUSD,M1: initialized

2018.10 . 09 08 : 45 : 40.022 Expert Other\test_isNewDayInOnTick GBPUSD,M1: loaded successfully

우리는 무엇을 볼 수 있습니다. 우리는 모든 것이 정상임을 봅니다. 모든 것이 로드되고 오류 없이 즉시 최신 데이터로 확인됩니다! 주요 질문: 일반적으로 Expert Advisor에서 더 높은 기간의 데이터를 얻을 수 있지만 표시기에서는 "탬버린과 함께 춤을 춰야" 하는 이유는 무엇입니까? 프로그램은 같은 방식으로 작동해야 하지 않습니까? 표시기와 EA의 동일한 코드가 다르게 작동하는 이유는 무엇입니까? 그렇게 해서는 안됩니다.

 
Alexey Kozitsyn :

그런데 여기에 오류가 발생한다는 사실에 찬성하는 또 다른 주장이 있습니다. 표시기의 계산 오류입니다! 고문은 다음과 같이 썼습니다.

지표와 동일한 차트에서 시작됩니다. 결과를 보자:

우리는 무엇을 볼 수 있습니다. 우리는 모든 것이 정상임을 봅니다. 모든 것이 로드되고 오류 없이 즉시 최신 데이터로 확인됩니다! 주요 질문: 일반적으로 Expert Advisor에서 더 높은 기간의 데이터를 얻을 수 있지만 표시기에서는 "탬버린과 함께 춤을 춰야" 하는 이유는 무엇입니까? 프로그램은 같은 방식으로 작동해야 하지 않습니까? 표시기와 EA의 동일한 코드가 다르게 작동하는 이유는 무엇입니까? 그렇게 해서는 안됩니다.

연결하고 로딩, 확인 등의 작업을 수행하는 것은 터미널에 달려 있기 때문에 모든 표시기는 동일한 스레드에 있고 스레드의 모든 것이 끝날 때까지(사실, OnCalculate에 대한 다음 호출까지) 새로운 일은 일어나지 않을 것입니다. , 즉. 스트림의 끝보다 빠르게 이 스트림에 있으면 여전히 아무 것도 얻지 못합니다. EA는 자체 스레드에 있으므로 실행될 때 데이터 업데이트, 데이터 업데이트 기간 동안 실행을 연기할 수 있습니다. 터미널의 다른 모든 것은 영향을 받지 않습니다. 태어날 때부터 이것은 어떤 식으로든 고칠 수 없기 때문입니다. metatrader4 환경은 묻혔습니다.

 
Unicornis :

연결하고 로딩, 확인 등의 작업을 수행하는 것은 터미널에 달려 있기 때문에 모든 표시기는 동일한 스레드에 있고 스레드의 모든 것이 끝날 때까지(사실, OnCalculate에 대한 다음 호출까지) 새로운 일은 일어나지 않을 것입니다. , 즉. 스트림의 끝보다 빠르게 이 스트림에 있으면 여전히 아무 것도 얻지 못합니다. EA는 자체 스레드에 있으므로 실행될 때 데이터 업데이트, 데이터 업데이트 기간 동안 실행을 연기할 수 있습니다. 터미널의 다른 모든 것은 영향을 받지 않습니다. 태어날 때부터 이것은 어떤 식으로든 고칠 수 없기 때문입니다. metatrader4 환경은 묻혔습니다.

예, 한 심볼의 모든 표시기가 하나의 스레드에 있고 각 Expert Advisor에는 고유한 스레드가 있다는 것을 알고 있습니다. 하지만 그게 핵심이 아닙니다. 개발자 - 그들은 자신의 창작물에서 오류를 수정하는 개발자입니다. 프로그램이 다르게 작동해서는 안됩니다! 표시기에 무언가를 할 시간이 없다면 오류가 발생하고 문제가 없습니다. 결국 전문가는 어떻게 든 오류없이 올바른 데이터를 즉시 받았습니다! 그래서 구현이 가능합니다. @Slava , 분명히 잘못된 동작이 수정되는지 여부에 대해 언급할 수 있습니까? 또는 최소한 문서에 추가(prev_calculated = 0이면 이전 시간 프레임의 올바른 데이터를 얻을 수 없음)는 무엇입니까?

 
Alexey Kozitsyn :

예, 한 심볼의 모든 표시기가 하나의 스레드에 있고 각 Expert Advisor에는 고유한 스레드가 있다는 것을 알고 있습니다. 하지만 그게 핵심이 아닙니다. 개발자 - 그들은 자신의 창작물에서 오류를 수정하는 개발자입니다. 프로그램이 다르게 작동해서는 안됩니다! 표시기에 무언가를 할 시간이 없다면 오류가 발생하고 문제가 없습니다. 결국 전문가는 어떻게 든 즉시 오류없이 올바른 데이터를 받았습니다! 그래서 구현이 가능합니다. @Slava , 분명히 잘못된 동작이 수정되는지 여부에 대해 언급할 수 있습니까? 또는 최소한 문서에 추가(prev_calculated = 0이면 이전 시간 프레임의 올바른 데이터를 얻을 수 없음)는 무엇입니까?

문서 어딘가에 전문가에게 데이터 수신을 시작하기 5초 전에 주어진다고 하는데, 이때 단말은 전문가를 위해 데이터 다운로드를 시도하고 있다. 지표가 기록 업데이트를 요청하지 않는 것처럼 지표에 제공되지 않는 것처럼 중요하지도 않습니다. 중요한 경우 Expert Advisor에서 고려하십시오. 주요 아이디어는 현재 구현에서 원하는 상태가 가능하지 않다는 것입니다. 본질적으로 TF는 타이머이고 이러한 여러 타이머가 한 순간에 일치하는 기간이 있습니다. 이것은 100% 동시 동기 프로세스(개방/종료 시간 제외)이기 때문입니다. 5분, 시 등의 첫 번째 분과 일치하는 현재 TF 분의 첫 번째 눈금 - 이것은 여러 변수에서 동일한 값의 레코드일 뿐이며 이 순간에 필요한 TF 세트를 설정하고 필요한 모든 데이터를 한 번에 수신할 수 있다는 것이 논리적입니다. 왜 개발자들은 이것을 했고 xs는 하지 않았습니까? 아마도 클라이언트-서버 분리 때문에 터미널의 기존 모델에서 이것을 하는 것이 불가능했기 때문입니다. 이제 지표에 전문가의 가능성을 제공하면 터미널이 중단됩니다.

지표 호출의 작동 방식, 지표가 다른 지표를 호출하는 방법, Expert Advisor(_asktfexp)가 지표(_asktf)를 호출하는 지표(_asktf_sample)를 호출하는 방법에 관심이 있는 사람들을 위해 하루의 끝을 볼 수 있습니다. Expert Advisor에서 표시기가 호출되면 표시기의 타이머가 시작되지 않으므로 표시기의 타이머가 있는 솔루션은 이 표시기가 차트에만 멈추고 호출되지 않는 경우에만 사용됩니다(일반적으로 논리적 ).

파일:
사유: