NGMsoftware

NGMsoftware
로그인 회원가입
  • 매뉴얼
  • 팁 앤 테크
  • 매뉴얼

    팁과 테크니컬 노하우를 확인하세요.

    팁 앤 테크

    팁과 테크니컬 노하우를 확인하세요.

    본 사이트의 컨텐츠는 저작권법의 보호를 받으므로 무단 복사, 게재, 배포 등을 금합니다.

    커스텀 원하는 금액 이상이 되면 액션을 이동할 수 있는 커스텀 모듈 만들기. (코인, 주식, 선물 매매 호가창 비교 분석.)

    페이지 정보

    본문

    안녕하세요. 엔지엠소프트웨어입니다. 엔지엠 에디터에서 [ OCR 체크 ]와 [ 변수 ] 그리고, [ 숫자 체크 ] 액션을 이용해서 주식 또는 코인의 호가창을 모니터링할 수 있습니다. 하지만, 복잡하게 로직을 구성해야 하는 경우 여러가지 액션을 사용해서 복잡도를 올릴 필요는 없죠^^; 그래서, 내가 매매할 금액을 설정하고 호가창에서 주식이나 코인 가격이 설정한 금액보다 크거나 작으면 매매할 수 있는 커스텀 모듈을 만들어봤습니다.

    ihO0cpV.gif

     

     

    실시간으로 변화하는 코인 가격을 체크하고 있습니다. 설정 값은 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회 이상 체크해서 루틴을 이동할 수 있겠죠^^;

     

    개발자에게 후원하기

    MGtdv7r.png

     

    추천, 구독, 홍보 꼭~ 부탁드립니다.

    여러분의 후원이 빠른 귀농을 가능하게 해줍니다~ 답답한 도시를 벗어나 귀농하고 싶은 개발자~

    감사합니다~

    • 네이버 공유하기
    • 페이스북 공유하기
    • 트위터 공유하기
    • 카카오스토리 공유하기
    추천0 비추천0

    댓글목록

    등록된 댓글이 없습니다.