거래 로봇을 무료로 다운로드 하는 법을 시청해보세요
당사를 Telegram에서 찾아주십시오!
당사 팬 페이지에 가입하십시오
스크립트가 흥미로우신가요?
그렇다면 링크 to it -
하셔서 다른 이들이 평가할 수 있도록 해보세요
스크립트가 마음에 드시나요? MetaTrader 5 터미널에서 시도해보십시오
조회수:
272
평가:
(6)
게시됨:
업데이트됨:
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 지표는 어떤 시간대(현재 차트의 시간대보다 길거나 짧은 시간대)에도 적용할 수 있습니다.