무료 매크로 프로그램 다운로드
http://ngmsoftware.com/bbs/board.php?bo_table=product1&wr_id=32
엔지엠소프트웨어
엔지엠 매크로는 복잡한 반복작업을 자동화할 수 있습니다. PC 게임, 모바일 게임을 최적으로 지원하며 모든 PC 프로그램 및 업무에 적용할 수 있습니다.
www.ngmsoftware.com
#매크로 #매크로프로그램 #메크로 #g매크로 #마우스매크로 #키보드매크로 #엑셀매크로 #키매크로 #수강신청매크로 #로지텍마우스매크로 #매크로키보드 #파이썬매크로 #매크로뜻 #매크로마우스 #로지텍매크로 #ld플레이어매크로 #오토마우스매크로 #키보드마우스매크로 #오토핫키매크로 #이미지매크로 #이미지인식매크로 #하드웨어매크로 #화면인식매크로 #선착순구매매크로 #이미지서치매크로 #한글매크로 #짜맥
- 엔지엠 무료: 무료 (전체 기능의 50프로)
- 엔지엠 커뮤니티 월 이용료: 4,500원, 1년 이용료: 55,000원 (전체 기능의 80프로)
- 엔지엠 얼티밋 월 이용료: 6,500원, 1년 이용료: 77,000원 (전체 기능의 90프로)
- 엔지엠 엔터프라이즈 월 이용료: 9,200원, 1년 이용료: 110,000원 (전체 기능 사용)
안녕하세요. 엔지엠소프트웨어입니다. 오늘은 사용자가 설정한 시간동안~ 주식, 선물 또는 코인과 같은 시세(호가)를 수집해서 최대값과 최소값을 어떻게 수집하는지 알아보도록 하겠습니다. 웹 API를 사용해도 되지만, 이번에는 OCR 기능을 이용해서 만들었습니다. 또한, 엔지엠 매크로에 있는 [ OCR 체크(문자 판독기) ] 액션을 이용해서 처리해도 됩니다. 커스텀 모듈로 만든 이유는 간단합니다. 최대한의 퍼포먼스를 뽑아내기 위함인데요. 시시각각 변화하는 시세를 놓치면 안되기 때문입니다. 아래는 1분간 수집한 데이타입니다.
①1분동안 총 702회 문자를 판독했습니다. ②중복을 제거하고 7번 변동이 있었습니다. 변동 값 중에 최대값은 ③74,153,000원이고 최소값은 ④74,065,000원입니다.
현재는 최대값과 최소값만 뽑아봤지만 소스상에서 여러가지 통계를 적용해서 사용하시면 됩니다. 커스텀 모듈을 만들기 위해 Visual Studio를 실행하고, 라이브러리 프로젝트를 추가하세요. 그리고, 엔지엠 커스텀 모듈 개발 라이브러리를 참조에 추가하세요. 자세한 내용은 [ 커스텀 모듈 만들기 ] 예제를 처음부터 읽어보시면 됩니다. 익숙해지면 그렇게 어렵지는 않을거예요^^; 아래와 같이 using을 추가 해줍니다.
using NGM.Interface;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Linq;
아래 그림을 참고해서 모듈 참조도 추가 해주세요. (실제 참조 관련 내용은 커스텀 모듈 만들기 예제 참고)
대부분의 예제가 도구 상자에 추가할 수 있는 커스텀 모듈이었습니다. 하지만, 이번에는 여러가지 엔지엠의 공통 기능을 사용해야 하기 때문에 함수 상자 커스텀으로 만들어야 합니다. 아래와 같이 NGM.Models.Interface.BaseCustomFunctionModel을 상속 받고, 구현하세요.
namespace CustomMinMaxNumber
{
[Serializable]
public class MinMaxValueModel : NGM.Models.Interface.BaseCustomFunctionModel
{
BaseCustomFunctionModel의 추상 프로퍼티와 메소드를 추가하세요.
/// <summary>
/// 도구 상자에 표시될 카테고리 이름을 가져옵니다.
/// </summary>
public override string DisplayCategory => "NGMsoftware";
/// <summary>
/// 도구 상자에 표시될 액션 이름을 가져옵니다.
/// </summary>
public override string DisplayName => "최대값 최소값 추출";
public override void Execute(IMainView mainView, IPlayer player)
{
}
여러가지 옵션을 사용자에게 제공해야 하기 때문에 필요한 프로퍼티들을 추가했습니다. 설명들이 적혀있으니 이해하는데 어려움은 없을겁니다^^;
/// <summary>
/// 최대값 최소값을 계산하기 위해 데이터를 수집하는 시간입니다.
/// </summary>
[Category("Action")]
[DisplayName("수집 시간")]
[Description("최대값 최소값을 계산하기 위해 데이터를 수집하는 시간입니다. (단위: 초)")]
[Browsable(true)]
[DefaultValue(60)]
public int CollectionTime { get; set; } = 60;
[Category("Action")]
[DisplayName("모델 선택")]
[Description("문자 판독에 사용되는 모델을 선택합니다.")]
[Browsable(true)]
[DefaultValue(typeof(NGM.Definition.OcrModel), "Normal")]
public NGM.Definition.OcrModel ModelOption { get; set; } = NGM.Definition.OcrModel.Normal;
[Category("Action")]
[DisplayName("OCR 영역")]
[Description("OCR 문자 판독 영역을 설정하세요.")]
[Browsable(true)]
[DefaultValue(typeof(System.Drawing.Rectangle), "0,0,0,0")]
[Editor(typeof(NGM.Models.TypeEditor.AreaCaptureEditor), typeof(System.Drawing.Design.UITypeEditor))]
public Rectangle SearchArea { get; set; }
[Category("Data")]
[DisplayName("최대값")]
[Description("판독한 숫자에서 가장 큰 값을 표시합니다.")]
[Browsable(true)]
[DefaultValue(0)]
[ReadOnly(true)]
public double Max { get; set; }
[Category("Data")]
[DisplayName("최소값")]
[Description("판독한 숫자에서 가장 작은 값을 표시합니다.")]
[Browsable(true)]
[DefaultValue(0)]
[ReadOnly(true)]
public double Min { get; set; }
[Category("Data")]
[DisplayName("인식 횟수")]
[Description("문자 판독 인식 횟수입니다.")]
[Browsable(true)]
[DefaultValue(0)]
[ReadOnly(true)]
public int Count { get; set; }
[Category("Data")]
[DisplayName("인식 숫자 목록")]
[Description("OCR 문자 판독으로 읽은 숫자의 목록입니다. (중복 제거)")]
[Browsable(true)]
[DefaultValue(null)]
public List<double> Numbers { get; set; } = new List<double>();
가장 중요한 핵심 코드는 아래와 같습니다.
public override void Execute(IMainView mainView, IPlayer player)
{
if (SearchArea.IsEmpty)
{
mainView.WriteOutput("필수 입력값이 누락되었습니다. OCR 영역을 선택하세요.");
return;
}
Image Target = null;
if (Numbers == null)
Numbers = new List<double>();
else
Numbers.Clear();
Count = 0;
var checkTime = DateTime.Now.AddSeconds(CollectionTime);
while (checkTime > DateTime.Now)
{
Count++;
if (player.MainHandle == IntPtr.Zero)
Target = NGM.Utility.ScreenCaptureManager.ScreenShot.GetActiveImage(SearchArea, player);
else
Target = NGM.Utility.ScreenCaptureManager.ScreenShot.GetInactiveImage(player, ControlWindowRectangle, SearchArea, true);
if (Target == null)
continue;
string number = NGM.Utility.OCRManager.Converter.ImageToText(
(Image)Target.Clone(),
NGM.Definition.Language.English,
ModelOption,
NGM.Definition.TesseractEngine.Default,
NGM.Definition.PageSegMode.SingleBlock,
false,
null,
null);
Target?.Dispose();
Target = null;
if (!string.IsNullOrEmpty(number) && double.TryParse(System.Text.RegularExpressions.Regex.Replace(number, @"[^0-9.]", ""), out double n))
{
if (!Numbers.Contains(n))
Numbers.Add(n);
}
}
if (Numbers.Count > 0)
{
Max = Numbers.Max();
Min = Numbers.Min();
}
}
기본적인 사용 방법은 OCR 체크와 비슷합니다. 숫자를 인식할 범위를 선택하고, 해당 범위의 이미지를 문자로 변환해줍니다. 엔지엠 에디터 또는 플레이어, 커스텀등등 성능 테스트 자료를 참고하시면 왜 커스텀을 사용해야 하는지 이해할 수 있을겁니다. 속도가 중요한 작업의 경우 하나씩 액션으로 처리하기에는 무리가 많습니다. 각각의 액션이 실행 전과 실행 후 처리해야 할 내용들이 많기 때문입니다. 커스텀은 이런 부분들을 제거하고, 필요한 부분만 최적화해서 사용할 수 있습니다. 많은 장점이 존재하지만~ 러닝 커브가 커서 아무나 쉽게 할수는 없죠^^;
엔지엠 에디터에서 [ OCR 체크 ]와 [ 변수 ] 그리고, [ 숫자 체크 ] 액션을 이용해서 주식 또는 코인의 호가창을 모니터링할 수 있습니다. 하지만, 복잡하게 로직을 구성해야 하는 경우 여러가지 액션을 사용해서 복잡도를 올릴 필요는 없죠^^; 그래서, 내가 매매할 금액을 설정하고 호가창에서 주식이나 코인 가격이 설정한 금액보다 크거나 작으면 매매할 수 있는 커스텀 모듈을 만들어봤습니다.
실시간으로 변화하는 코인 가격을 체크하고 있습니다. 설정 값은 79,950,000원입니다. 이 값보다 코인 가격이 크면 True로 이동하게 됩니다. 현재 이 글을 작성하고 있는 시점에 코인이 8천만원을 넘어섰네요. 코인에 투자하시는 분들은 정말 엄청난 수익을 내고 있을거 같아 부럽습니다^^; 자동 매매 관련된 내용은 홈페이지에 많이 있으므로, 참고하셔서 스크립트를 완성하면 됩니다. 이 커스텀 모듈을 만들기 위한 전체 코드는 아래와 같습니다.
using NGM.Interface;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace CustomNumberCheckModule
{
[Serializable]
public class NumberCheckModel : NGM.Models.Interface.BaseCustomConditionFunctionModel
{
/// <summary>
/// 도구 상자에 표시될 카테고리 이름을 가져옵니다.
/// </summary>
public override string DisplayCategory => "NGMsoftware";
/// <summary>
/// 도구 상자에 표시될 액션 이름을 가져옵니다.
/// </summary>
public override string DisplayName => "숫자 체크 타이머";
private Rectangle ControlWindowRectangle { get; set; }
[Category("Data")]
[DisplayName("결과 값")]
[Description("사용자가 설정한 조건에 맞는 값을 표시합니다.")]
[Browsable(true)]
[DefaultValue(0)]
[ReadOnly(true)]
public double Result { get; set; }
/// <summary>
/// 최대값 최소값을 계산하기 위해 데이터를 수집하는 시간입니다.
/// </summary>
[Category("Action")]
[DisplayName("판단 시간")]
[Description("설정한 시간동안 숫자를 판단합니다. 제한 시간 없이 판단하려면 -1을 입력하세요. (단위: 초)")]
[Browsable(true)]
[DefaultValue(60)]
public int CheckTime { get; set; } = 60;
[Category("Action")]
[DisplayName("모델 선택")]
[Description("문자 판독에 사용되는 모델을 선택합니다.")]
[Browsable(true)]
[DefaultValue(typeof(NGM.Definition.OcrModel), "Normal")]
public NGM.Definition.OcrModel ModelOption { get; set; } = NGM.Definition.OcrModel.Normal;
[Category("Action")]
[DisplayName("OCR 영역")]
[Description("OCR 문자 판독 영역을 설정하세요.")]
[Browsable(true)]
[DefaultValue(typeof(System.Drawing.Rectangle), "0,0,0,0")]
[Editor(typeof(NGM.Models.TypeEditor.AreaCaptureEditor), typeof(System.Drawing.Design.UITypeEditor))]
public Rectangle SearchArea { get; set; }
[Category("Action")]
[DisplayName("비교 값")]
[Description("인식한 숫자 값이 이 값보다 크면 같음(True) 속성에 설정한 아이디로 이동합니다.")]
[Browsable(true)]
[DefaultValue(0.0)]
public double CheckNumber { get; set; }
public override bool? Execute(IMainView mainView, IPlayer player)
{
if (SearchArea.IsEmpty)
{
mainView.WriteOutput("필수 입력값이 누락되었습니다. OCR 영역을 선택하세요.");
return null;
}
Image Target = null;
Result = 0;
DateTime checkTime = DateTime.Now;
if (CheckTime < 0)
checkTime = DateTime.MaxValue;
else
checkTime = DateTime.Now.AddSeconds(CheckTime);
while (checkTime > DateTime.Now)
{
if (player.MainHandle == IntPtr.Zero)
Target = NGM.Utility.ScreenCaptureManager.ScreenShot.GetActiveImage(SearchArea, player);
else
Target = NGM.Utility.ScreenCaptureManager.ScreenShot.GetInactiveImage(player, ControlWindowRectangle, SearchArea, true);
if (Target == null)
continue;
string number = NGM.Utility.OCRManager.Converter.ImageToText(
(Image)Target.Clone(),
NGM.Definition.Language.English,
ModelOption,
NGM.Definition.TesseractEngine.Default,
NGM.Definition.PageSegMode.SingleBlock,
false,
null,
null);
Target?.Dispose();
Target = null;
if (!string.IsNullOrEmpty(number) && double.TryParse(System.Text.RegularExpressions.Regex.Replace(number, @"[^0-9.]", ""), out double n))
{
if (n > CheckNumber)
{
Result = n;
return true;
}
}
}
return false;
}
}
}
커스텀 모듈 사용 방법을 모르시는 분은 [ 여기 ] 학습 및 예제를 참고하세요.
커스텀 모듈을 다운로드 하려면 [ 여기 ]를 참고하세요.
이 커스텀 모듈을 약간 손보면 서버 시간과 동기화해서 뭔가 실행할 수 있는 모듈을 만들 수 있을겁니다. 네이버 시계나 엔코 시계를 판독하면 됩니다. 제 컴퓨터 기준으로 1분에 약 470회 정도 문자를 판독해서 읽어들일 수 있었습니다. 만약, 플레이어로 한다면 500회 이상 체크해서 루틴을 이동할 수 있겠죠^^;
[ 각종 자동화 매크로 및 RPA 프로그램 제작 해드립니다. ]
[ 초보자도 쉽게 따라할 수 있는 기초 학습 강좌 보기 ]
원본 글 보기
http://ngmsoftware.com/bbs/board.php?bo_table=tip_and_tech
엔지엠소프트웨어
엔지엠 매크로는 복잡한 반복작업을 자동화할 수 있습니다. PC 게임, 모바일 게임을 최적으로 지원하며 모든 PC 프로그램 및 업무에 적용할 수 있습니다.
www.ngmsoftware.com
#비활성매크로 #g102매크로 #철권매크로 #레이저마우스매크로 #ghub매크로 #녹화매크로 #키보드반복매크로 #로지텍마우스광클매크로 #플라스크매크로 #윈도우매크로 #비활성g매크로 #오토매크로 #자동사냥 #주식매크로 #오토핫키키보드 #오토핫키마우스 #오토핫키이미지 #지존오토 #기계식매크로 #하드웨어매크로 #무한반복매크로 #대량이메일발송매크로 #엑셀VBA매크로 #주식모니터링매크로 #이미지맥스 #심플핫키 #오토클리커 #UiPath #Brity #스푸퍼 #DKOM #모바일게임매크로 #다클라매크로 #다계정매크로 #인스타그램매크로 #짜맥매크로
'프로그래밍' 카테고리의 다른 글
파이선 매크로 기본패키지 (0) | 2023.07.06 |
---|---|
오토핫키 IME_CHECK (0) | 2023.07.06 |
오토핫키 한영키 감지 (0) | 2023.05.22 |
인스타 자동 업로드 매크로 (0) | 2023.03.08 |
화장장예약 매크로 (0) | 2023.03.08 |
댓글