당사 팬 페이지에 가입하십시오
- 조회수:
- 70
- 평가:
- 게시됨:
-
이 코드를 기반으로 한 로봇이나 지표가 필요하신가요? 프리랜스로 주문하세요 프리랜스로 이동
이 전문가 어드바이저 코드는 사용자의 브로커 마켓워치를 스캔하여 사용 가능한 모든 틱 또는 날짜까지의 틱을 다운로드할 심볼을 추출합니다.
백테스트의 모든 심볼 히스토리를 다운로드하거나 해당 틱으로 사용자 지정 차트를 만드는 데 도움이 될 수 있습니다.
단말기는 데이터 폴더에 틱을 캐시하므로 하드 드라이브 공간이 충분한지 확인하세요.
심볼을 쉽게 다운로드하려면 먼저 다운로드 관리자가 필요합니다.
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 Histogram, multi-timeframe, multi-color [v03]](https://c.mql5.com/i/code/indicator.png)
히스토그램이 있는 MACD 지표는 모든 차트 주기(현재 차트 주기보다 높거나 낮은 주기)에 적용할 수 있습니다.

우리가 원하는 것은 주문하는 방법의 구문과 값이 아니라 알고리즘과 메서드에 대해 생각하는 것입니다. 여기에는 MQL5에서 포지션을 관리하는 간단한 함수가 있습니다.
![RSI multi-timeframe [v03]](https://c.mql5.com/i/code/indicator.png)
RSI 지표는 모든 차트 주기(현재 차트 주기보다 높거나 낮은)에 적용할 수 있습니다.