거래 로봇을 무료로 다운로드 하는 법을 시청해보세요
당사를 Telegram에서 찾아주십시오!
당사 팬 페이지에 가입하십시오
스크립트가 흥미로우신가요?
그렇다면 링크 to it -
하셔서 다른 이들이 평가할 수 있도록 해보세요
스크립트가 마음에 드시나요? MetaTrader 5 터미널에서 시도해보십시오
Experts

Download all ticks of a symbol's history - MetaTrader 5용 expert

조회수:
70
평가:
(5)
게시됨:
MQL5 프리랜스 이 코드를 기반으로 한 로봇이나 지표가 필요하신가요? 프리랜스로 주문하세요 프리랜스로 이동

이 전문가 어드바이저 코드는 사용자의 브로커 마켓워치를 스캔하여 사용 가능한 모든 틱 또는 날짜까지의 틱을 다운로드할 심볼을 추출합니다.

백테스트의 모든 심볼 히스토리를 다운로드하거나 해당 틱으로 사용자 지정 차트를 만드는 데 도움이 될 수 있습니다.

단말기는 데이터 폴더에 틱을 캐시하므로 하드 드라이브 공간이 충분한지 확인하세요.

심볼을 쉽게 다운로드하려면 먼저 다운로드 관리자가 필요합니다.

CDownloadManager 구조체에는 우리가 보관해야 할 모든 정보가 들어 있습니다.

struct CDownloadManager
  {
   bool              m_started,m_finished;
   string            m_symbols[],m_current;
   int               m_index;

  • 다운로드 상태(시작/완료)
  • 스캔할 심볼 목록
  • 현재 심볼
  • 스캔 중인 심볼의 인덱스

또한 하드 드라이브에 읽고 쓸 필요가 있으며 심볼로 작업하기 때문에 바이너리 파일에서 문자열을 쓰고 읽는 두 가지 빠른 함수를 만듭니다.

파일에 문자열 저장 함수 :

void writeStringToFile(int f,string thestring)
  {
//기호 문자열 저장
   char sysave[];
   int charstotal=StringToCharArray(thestring,sysave,0,StringLen(thestring),CP_ACP);
   FileWriteInteger(f,charstotal,INT_VALUE);
   for(int i=0;i<charstotal;i++)
     {
      FileWriteInteger(f,sysave[i],CHAR_VALUE);
     }
  }

이 함수는 열린 파일의 :

  • 쓰기 위해 열린 파일의 파일 핸들 f와 바이너리 플래그 FILE_WRITE|FILE_BIN
  • 파일에 쓸 문자열

문자열에 몇 개의 문자가 있는지 정수 길이로 기록한 다음 각 문자를 문자열에 저장합니다.

파일에서 문자열 로드 함수:

string readStringFromFile(int f)
  {
   string result="";
//로드 심볼 문자열
   char syload[];
   int charstotal=(int)FileReadInteger(f,INT_VALUE);
   if(charstotal>0)
     {
      ArrayResize(syload,charstotal,0);
      for(int i=0;i<charstotal;i++)
        {
         syload[i]=(char)FileReadInteger(f,CHAR_VALUE);
        }
      result=CharArrayToString(syload,0,charstotal,CP_ACP);
     }
   return(result);
  }

파일에서 문자열 로드 함수는

  • 바이너리로 읽기 위해 열린 파일의 파일 핸들 f , FILE_READ|FILE_BIN 플래그

이 함수는 파일의 해당 지점에서 예상되는 문자 수를 정수 길이로 읽고, 각 문자를 문자 배열로 읽은 다음 해당 문자 배열에서 문자열을 생성하여 로드 결과로 문자열로 반환합니다.

CDownloadManager 구조체로 돌아갑니다. 매니저를 초기화하고 마켓 워치에서 채우는 방법이 필요합니다:

   //+------------------------------------------------------------------+
   //| 마켓 워치에서 심볼 잡기|
   //+------------------------------------------------------------------+
   void              grab_symbols()
     {
      //! 오직 MW에서만!
      int s=SymbolsTotal(true);
      ArrayResize(m_symbols,s,0);
      for(int i=0;i<ArraySize(m_symbols);i++)
        {
         m_symbols[i]=SymbolName(i,true);
        }
     }

아주 간단합니다 :

  • 마켓 워치에 몇 개의 심볼이 있는지 물어봅니다(활성 상태).
  • 이를 수신하기 위해 m_symbols 배열의 크기를 조정합니다.
  • 전체 심볼로 반복하고 심볼의 이름을 요청합니다.

또한 심볼 데이터의 다운로드를 관리해야 하므로 기본적으로 관리자 역할을 하는 함수가 필요합니다:

   //+------------------------------------------------------------------+
   //| 심볼 다운로드 프로세스 관리하기|
   //+------------------------------------------------------------------+
   void              manage(string folder,string filename)
     {
      //본질적으로 이것은 시작하거나 다음 기호로 이동합니다.
      //if set
      if(ArraySize(m_symbols)>0)
        {
         //시작하지 않은 경우
         if(!m_started)
           {
            m_started=true;
            //첫 번째 기호로 이동
            m_current=m_symbols[0];
            m_index=1;
            save(folder,filename);
            if(_Symbol!=m_current)
              {
               ChartSetSymbolPeriod(ChartID(),m_current,_Period);
              }
            else
              {
               ENUM_TIMEFRAMES new_period=PERIOD_M1;
               for(int p=0;p<ArraySize(TFS);p++)
                 {
                  if(_Period!=TFS[p])
                    {
                     new_period=TFS[p];
                     break;
                    }
                 }
               ChartSetSymbolPeriod(ChartID(),m_current,new_period);
              }
            return;
           }
         //if started
         else
           {
            m_index++;
            if(m_index<=ArraySize(m_symbols))
              {
               m_current=m_symbols[m_index-1];
               save(folder,filename);
               if(_Symbol!=m_current)
                 {
                  ChartSetSymbolPeriod(ChartID(),m_current,_Period);
                 }
               return;
              }
            else
              {
               m_finished=true;
               FileDelete(folder+"\\"+filename);
               Print("Finished");
               ExpertRemove();
               return;
              }
           }
        }
      else
        {
         Print("Please grab symbols first");
        }
      //if set가 여기서 끝나면
     }

시스템 작동 방식 :

  • 차트가 열리고 차트 1개가 필요하며 타이머가 설정됩니다.
  • 타이머가 실행되면 타이머를 취소합니다.
  • 새 다운로드인지 계속 다운로드인지 확인합니다.
  • 신규 다운로드인 경우 모든 기호를 가져와서 설정합니다.
  • 계속 다운로드인 경우 현재 심볼에 대한 데이터를 다운로드합니다.

이것이 타이머에 대한 다운로드를 수행하는 코드의 일부입니다:

//+------------------------------------------------------------------+
//|타이머|
//+------------------------------------------------------------------+
void OnTimer()
  {
//--- 동기화된 경우
   if(SymbolIsSynchronized(_Symbol)&&TerminalInfoInteger(TERMINAL_CONNECTED)==1)
     {
      EventKillTimer();
      //--- 여기에 시스템을 로드합니다.
      if(MANAGER.load(MANAGER_FOLDER,MANAGER_STATUS_FILE))
        {
         //--- 시스템이 로드되었으므로 여기서 심볼을 스캔합니다.
         Comment("System loaded and we are processing "+MANAGER.m_current);
         //--- 틱 로드

         //--- 먼저 브로커에서 사용 가능한 가장 오래된 틱을 찾습니다.
         int attempts=0;
         int ping=-1;
         datetime cursor=flatten(TimeTradeServer());
         long cursorMSC=((long)cursor)*1000;
         long jump=2592000000;//60*60*24*30*1000;

         MqlTick receiver[];
         long oldest=LONG_MAX;
         Comment("PleaseWait");
         while(attempts<5)
           {
            ping=CopyTicks(_Symbol,receiver,COPY_TICKS_ALL,cursorMSC,1);
            if(ping==1)
              {
               if(receiver[0].time_msc==oldest)
                 {
                  attempts++;
                 }
               else
                 {
                  attempts=0;
                 }
               if(receiver[0].time_msc<oldest)
                 {
                  oldest=receiver[0].time_msc;
                 }
               cursorMSC-=jump;
               if(limitDate&&receiver[0].time<=oldestLimit)
                 {
                  break;
                 }
              }
            else
              {
               attempts++;
              }

            Sleep(44);
            Comment("Oldest Tick : "+TimeToString((datetime)(oldest/1000),TIME_DATE|TIME_MINUTES|TIME_SECONDS)+"\nCursor("+TimeToString((datetime)(cursorMSC/1000),TIME_DATE|TIME_MINUTES|TIME_SECONDS)+")\nAttempts("+IntegerToString(attempts)+")\nPlease wait for response...");
           }
         //--- 이 시점에서 가장 오래된 틱이 있습니다.
         //--- 가장 오래된 것부터 최신 것까지 틱을 요청하기 시작합니다.
         if(oldest!=LONG_MAX)
           {
            ArrayFree(receiver);
            datetime newest_tick=0;
            //--- 심볼_시간에 저장된 이 심볼의 마지막 틱 시간을 수신합니다.
            datetime most_recent_candle=(datetime)SymbolInfoInteger(_Symbol,SYMBOL_TIME);
            while(newest_tick<most_recent_candle)
              {
               //--- 지정된 틱 제한을 사용하여 가장 오래된 시간부터 새 배치를 요청합니다.
               int pulled=CopyTicks(_Symbol,receiver,COPY_TICKS_ALL,oldest,tick_packets);
               if(pulled>0)
                 {
                  //--- 새 배치 업데이트를 가져오는 경우 다운로드 시간
                  newest_tick=receiver[pulled-1].time;
                  oldest=receiver[pulled-1].time_msc;
                  ArrayFree(receiver);
                 }
               //--- 서버 요청 시간 초과 , 원하는 경우 변경하십시오.
               Sleep(44);
               Comment("Pulled up to "+TimeToString(newest_tick,TIME_DATE|TIME_MINUTES|TIME_SECONDS)+" so far");
              }
           }
         else
           {
            Alert("Please close the terminal \n head over to the ticks folder \n and delete the empty folders");
            ExpertRemove();
           }
         //--- 관리자를 업데이트하고 계속 진행합니다.
         MANAGER.manage(MANAGER_FOLDER,MANAGER_STATUS_FILE);
        }
      else
        {
         //--- 마켓워치 심볼을 잡고 다운로드를 시작하세요.
         Comment("Grabbing MW and starting");
         MANAGER.grab_symbols();
         MANAGER.manage(MANAGER_FOLDER,MANAGER_STATUS_FILE);
        }
     }
  }


MetaQuotes Ltd에서 영어로 번역함.
원본 코드: https://www.mql5.com/en/code/56324

MACD 컬러 히스토그램 MACD 컬러 히스토그램

MACD 컬러 히스토그램은 기존 MACD(이동평균수렴발산) 지표의 향상된 버전으로, 시장 모멘텀을 보다 명확하고 직관적으로 시각적으로 분석할 수 있도록 설계되었습니다. 이 인디케이터는 기존 MACD 기능과 MACD 선과 신호선 사이의 관계에 따라 색상이 변하는 동적 히스토그램을 결합하여 트레이더가 시장의 추세, 반전 지점, 결정적 순간을 빠르게 파악할 수 있도록 합니다.

MACD Histogram, multi-timeframe, multi-color [v03] MACD Histogram, multi-timeframe, multi-color [v03]

히스토그램이 있는 MACD 지표는 모든 차트 주기(현재 차트 주기보다 높거나 낮은 주기)에 적용할 수 있습니다.

Functions to simplify work with orders Functions to simplify work with orders

우리가 원하는 것은 주문하는 방법의 구문과 값이 아니라 알고리즘과 메서드에 대해 생각하는 것입니다. 여기에는 MQL5에서 포지션을 관리하는 간단한 함수가 있습니다.

RSI multi-timeframe [v03] RSI multi-timeframe [v03]

RSI 지표는 모든 차트 주기(현재 차트 주기보다 높거나 낮은)에 적용할 수 있습니다.