당사 팬 페이지에 가입하십시오
- 조회수:
- 22
- 평가:
- 게시됨:
- 2025.04.04 10:53
-
이 코드를 기반으로 한 로봇이나 지표가 필요하신가요? 프리랜스로 주문하세요 프리랜스로 이동
라이브러리에는 두 가지 유형의 디스플레이가 있습니다. 첫 번째인 LabelsDisplay는 CChartObjectLabel을 기반으로 합니다. 두 번째인 캔버스 디스플레이는 CCanvas를 기반으로 합니다. 이 디스플레이는 렌더링 빈도에 최적화되어 있습니다. 디스플레이 Demo.mq5의 작업을 시연하는 기본 전문가 어드바이저 외에, 테스터에서만 틱에 대한 측정을 수행하는 두 가지 변형인 CanvasVsLabelsTester.mq5가 더 있습니다. 그리고 테스터와 차트 모두에서 측정을 수행하는 범용 CanvasVsLabels.mq5가 있습니다. 이러한 측정값은 서로 비교할 수 있습니다. 디스플레이 속도 비교에 대한 자세한 내용은 캔버스 대 레이블 링크를 참조하세요.
//+------------------------------------------------------------------+ //|ChartDisplayDemo.mq5 | //|Copyright 2021, © Cyberdev | //| https://www.mql5.com/en/users/cyberdev/seller | //+------------------------------------------------------------------+ #property copyright "저작권 2021, © Cyberdev." #property link "https://www.mql5.com/en/users/cyberdev/seller" #property version "1.00" //+------------------------------------------------------------------+ //|| //+------------------------------------------------------------------+ #include "cyberdev\ChartDisplay.mqh" //+------------------------------------------------------------------+ //|| //+------------------------------------------------------------------+ enum OutType { otCanvas, // 캔버스 otLabels // 레이블 }; //+------------------------------------------------------------------+ //|| //+------------------------------------------------------------------+ input OutType outType = otLabels; // outType - 표시 유형 input int nLines = 50; // nLines - 디스플레이의 줄 수 input bool optimizeUpdate = false; // 최적화 업데이트 - 레이블 최적화 input int bWidth = 406; // b폭 - 표시 너비 input int lY_Dist = 14; // lY_Dist - 선 사이의 거리 input bool back = false; // 뒤로 - 레이블의 배경 //+------------------------------------------------------------------+ //|| //+------------------------------------------------------------------+ Strings * display; CChart Chart; //+------------------------------------------------------------------+ //| 전문가 초기화 기능| //+------------------------------------------------------------------+ int OnInit() { Chart.Attach(ChartID()); Chart.ShowGrid(false); Chart.ColorBackground(C'194,231,197'); Chart.ColorBarUp(clrDodgerBlue); Chart.ColorBarDown(clrBlueViolet); Chart.ColorCandleBull(clrDodgerBlue); Chart.ColorCandleBear(clrBlueViolet); Chart.ColorForeground(clrBlack); switch (outType) { case otCanvas: display = new CanvasDisplay(); break; case otLabels: display = new LabelsDisplay(); break; default: return INIT_FAILED; } if ((outType == otLabels && back && !dynamic_cast<LabelsDisplay *>(display).createExt(nLines, 10, 10, bWidth, lY_Dist)) || !display.create(nLines, 10, 15, bWidth, lY_Dist)) return INIT_FAILED; return(INIT_SUCCEEDED); } //+------------------------------------------------------------------+ //| 전문가 초기화 기능| //+------------------------------------------------------------------+ void OnDeinit(const int reason) { if (CheckPointer(display) == POINTER_DYNAMIC) delete display; Chart.Detach(); } //+------------------------------------------------------------------+ //|| //+------------------------------------------------------------------+ #define concatenate(_rate) \ ("Open: " + DoubleToString(rates[_rate].open, digits) + \ "; High: " + DoubleToString(rates[_rate].high, digits) + \ "; Low: " + DoubleToString(rates[_rate].low, digits) + \ "; Close: " + DoubleToString(rates[_rate].close, digits) + ".") //+------------------------------------------------------------------+ //| 전문가 틱 기능| //+------------------------------------------------------------------+ void OnTick() { MqlRates rates[]; int digits = (int)SymbolInfoInteger(_Symbol, SYMBOL_DIGITS); static datetime time = 0; datetime cTime; static bool firstRun = true; bool triggered = false; if (CopyRates(NULL, PERIOD_CURRENT, 0, 2, rates) != 2) return; display.setText(concatenate(1)); cTime = rates[0].time; if (cTime != time) { if (!firstRun) { display.push(); display.setText(concatenate(0)); } time = cTime; firstRun = false; triggered = true; } if(outType == otLabels && optimizeUpdate) { if (triggered) display.update(); else dynamic_cast<LabelsDisplay *>(display).updateOne(); } else display.update(); } //+------------------------------------------------------------------+
위쪽 줄을 업데이트하려면 사용 중인 클래스의 setText 메서드를 호출해야 합니다. 텍스트를 아래 줄로 이동하려면 사용한 클래스의 push 메서드를 호출합니다. 그리고 추가/업데이트된 텍스트를 디스플레이에 표시하려면 클래스의 업데이트 메서드를 사용합니다. 이 메서드 외에도 LabelsDisplay 클래스에는 디스플레이 속도를 두 배 이상 높일 수 있는 updateOne 메서드가 추가로 있습니다 . 이 메서드는 맨 위 줄을 업데이트해야 할 때만 호출됩니다. 푸시 메서드가 호출된 경우 그 후에는 updateOne 대신 업데이트 메서드를 호출해야 합니다 .
입력 매개변수
- outType - 표시 유형
- nLines - 디스플레이의 줄 수
- optimiseUpdate - 레이블최적화
- bWidth - 디스플레이 너비
- lY_Dist - 줄 사이의 거리
- back - 레이블의 배경
outType을 사용하면 캔버스 또는 레이블 값에서 표시 유형을 선택할 수 있습니다. nLines 변경은 푸시 방식으로 스크롤한 후 저장할 줄 수를 설정합니다. 최적화 업데이트 매개변수를 사용하면 푸시 메서드가 호출되지 않아 나머지 줄을 업데이트할 필요가 없는 경우 한 줄만 경제적으로 업데이트할 수 있습니다(위 참조). bWidth를 사용하면 디스플레이 너비를 설정할 수 있습니다(배경을 사용하는 캔버스 및 레이블과 관련됨). lY_Dist 매개변수를 사용하면 원하는 글꼴 크기를 얻을 수 있습니다. 글꼴 크기는 fDec 계수로 설정된 부분을 뺀 lY_Dist에서 가져오는데, 여기서 선 사이의 거리를 고려하지 않고 글꼴 크기가 아닌 실제 선 높이를 변경할 수 있습니다. back 매개변수는 레이블 모드에서 배경을 활성화합니다.
따라서 차트에 5가지 모드로 정보를 표시할 수 있습니다.
- 캔버스
- 레이블
- 텍스트출력이 최적화된 레이블
- 캔버스 배경이 있는 레이블
- 배경, 플러스, 최적화가있는 레이블
outType: 레이블 모드에서 배경을 사용하면 다른 추가 차트 개체를 사용하는 것과 거의 동일한 부하가 발생합니다. 즉, 디스플레이에 텍스트를 출력하는 데 걸리는 시간이 약간 늘어납니다.
MetaQuotes Ltd에서 러시아어로 번역함.
원본 코드: https://www.mql5.com/ru/code/33898

테스터에서 여러 번 실행/최적화.

4도의 다항식으로 움직이는 선을 만듭니다. 정현파와 그 축을 추정합니다. 구성된 선은 각 막대에서 하나의 값을 제거하고 다시 그려지지 않는 외삽된 값의 슬라이딩 선이 만들어집니다.

CDialog 클래스에 기반한 패널입니다. 현재 심볼에서 작업합니다. 포지션 그룹에서 삭제, 이익실현, 손익분기점 설정하기

표준 보조지표 iCHO(차이킨 오실레이터, CHO)와 사용자 지정 보조지표 'CCIDualOnMA'를 기반으로 한 전략