English Русский 中文 Español Deutsch 日本語 Português Français Italiano Türkçe
더 나은 프로그래머 (Part 06): 효율적인 코딩으로 이끄는 9가지 습관

더 나은 프로그래머 (Part 06): 효율적인 코딩으로 이끄는 9가지 습관

MetaTrader 5 | 14 4월 2022, 14:58
242 0
Omega J Msigwa
Omega J Msigwa

소개

코딩을 시작하기 전에 코딩 시간 내내 집중하기 위해서는 코딩을 하면서 지켜야 하는 습관이 있습니다. 대부분의 경우 우리는 코딩을 하고 있을 것이지만 집중력이 부족하거나 계획이 없거나 실행 계획이 좋지 않다는 등의 이유로 인해 우리가 효과적이지 못하게 코딩을 하고 있다는 것을 깨닫지 못하게 됩니다.

효과적인 코딩

내용:

  • 코딩하기 전에 프로젝트 계획하기
  • 코드 스니펫 만들기
  • 루틴 만들기
  • 작업 일정 잡기
  • 하나의 작은 기능을 만들고 테스트하기
  • 주석 쓰기, 자기 자신을 위해
  • 터치 타이핑 습관
  • 최고의 도구 사용
  • 버전 관리

주의:

이 문서에 사용된 모든 코드 스니펫과 코딩 예제는 교육 목적으로만 사용됩니다. 그들 중 일부는 주의 깊게 테스트/디버깅되지 않았습니다. 그것들은 단지 요점을 명확히 하기 위해 사용됩니다. 이들 코드들 중 하나를 사용하기로 결정한 경우 잘못 작동되는 위험이 있을 수 있습니다.

01: 코딩을 하기 전에 프로젝트 계획하기


만약 코딩을 시작하기 전에 100명의 프로그래머에게 시스템에 대한 계획이 있는지를 묻는다면 그중 10명 미만은 키보드로 코드를 작성하기 시작하기 전에 작업 계획을 한다고 말할 것입니다.

이것이 우리가 효과적으로 코딩하기를 원할때 해결해야 하는 주요 문제입니다.

어디로 가는지도 모른 채 대중버스를 탈 수 있습니까? 절대 그렇지 않습니다.

키보드에서 코드 입력을 시작하기 전에 필요한 프로그램 종류, 도구, 내부에서 사용할 라이브러리 등을 메모 해 두십시오.

프리랜스에 보면 작업 사양이라는 것이 있습니다. 이는 모든 개발자가 코딩을 시작하기 전에 가져야 하는 작업 계획과 정확히 같은 것입니다.

펜과 공책 또는 종이가 없는 경우 다음과 같은 무료 프로그램을 사용할 수 있습니다. 마이크로 소프트 워드 또는 WPS로 작업 계획을 세웁니다. 필요한 것을 설명하기 위해 다이어그램이나 작업도를 그릴 수도 있습니다.

나는 Charles Kettering이 다음과 같이 말한 것에 강력하게 동의합니다. "잘 설명된 문제는 절반이 해결된 것입니다."

예를 들어 저는 지금 라부쉐르 자금 관리 시스템이 들어 있는 Simple Grid Expert Advisor를 만든다고 합시다.

다음은 간단한 작업 계획입니다.

메모: 아래의 모든 초기값은 최적화 가능/입력 변수임

Initial Values: Lotsize = 0.01; xgrid = 100; LotIncrement = 0.01;

저의 전략

포지션 유형별 랏 크기 공식

그리드 조건(전략적이지만 더 명확한 방법)

자금 관리

라이브러리

조건 01: 오픈 포지션이 없을 때 매수 포지션과 매도 포지션을 동시에 오픈(유형별 단일 포지션)

X = Lotsize + (LotIncrement * Number Of Position By Position Type)

 예: BuyLotsize = 0.01 + ( 0.01 * 매수 포지션의 개수);

매수 포지션의 수가 0일 때 매수 조건이 발생합니다. 또는 이미 매수 포지션이 있고 비드 가격이 최근 매수 포지션의 오픈 가격에서 엑스그리드 포인트를 뺏을때 보다 낮을때  

StopLoss = 0 (by default)

 

표준 포지션 클래스 라이브러리

표준 심볼 정보 클래스

표준 거래 클래스 라이브러리

조건 02 (매도조건): 시장 가격이 이전 매도 포지션의 엑스그리드 포인트만큼 상승하면 이전 매도 포지션의 랏 사이즈에 LotIncrement값을 더한 만큼의 랏 사이즈로 매도 포지션을 엽니다. .    매도 포지션이 0일 때 발생하는 매도 조건또는 이미 매도 포지션이 있고 매도 호가가 최종 매도 포지션보다 높은 경우는 다음과 같습니다. 오픈 가격에엑스그리드 포인트만큼 더합니다.

TakeProfit = 100 (by defaul)

 
조건 03 (매수조건): 시장 가격이 이전 매수 포지션의 엑스그리드 포인트만큼 하락하면 이전 매도 포지션의 랏 사이즈에 LotIncrement값을 더한 만큼의 랏 사이즈로 매수 포지션을 엽니다.        

간단한 작업 계획만 보아도 막연히 코딩을 시작하는 것보다는 이렇게 작업을 실행하는 것이 훨씬 쉽다는 것을 알 수 있습니다. 더 나은 계획은 학습해야 할 영역을 구분하거나 잊어버린 경우를 대비하여 스스로를 상기시키는 데 도움이 될 수 있습니다.

코딩을 시작하기 전에 작업에 대해 잘 설명된 계획이 있는지 확인하십시오. 명확 할수록 더 좋습니다

02: 코드 스니펫 모음 만들기


Expert Advisors, 지표 또는 스크립트와 같은 여러 프로그램에서 함수 또는 클래스를 여러 번 정의해야 하는 경우 반복해서 정의하지 않고 여러 번 재사용할 수 있도록 해당 모음이 필요할 수 있습니다. 이것을 가장 효과적으로 할 수 있는 것은 객체 지향 프로그래밍(OOP)입니다.

작업 계획 예제에 있는 EA에서 두 가지의 기능을 생성해야 함을 보았습니다. 

  1. 유형별로 포지션을 세는 함수
  2. 마지막 포지션의 포지션 타입별 오픈 가격을 제공하는 함수

이러한 함수는 거의 모든 그리드 EA에 필요하므로 Include(.mqh) 파일 그리드 모듈 그리고 main에 포함시킬 수 있도록 그 안에 두 함수를 mq5파일에 저장합니다.

gridmodule.mqh의 안

//+------------------------------------------------------------------+
//|                                                  gridmodule.mqh |
//|                                     Copyright 2021, Omega Joctan |
//|                        https://www.mql5.com/en/users/omegajoctan |
//+------------------------------------------------------------------+
#property copyright "Copyright 2021, Omega Joctan"
#property link      "https://www.mql5.com/en/users/omegajoctan"
//+------------------------------------------------------------------+
//| Libraries                                                        |
//+------------------------------------------------------------------+ 
#include <Trade\PositionInfo.mqh>
#include <Trade\SymbolInfo.mqh>

CSymbolInfo   m_symbol;
CPositionInfo m_position;
//+------------------------------------------------------------------+
//| DLL imports                                                      |
//+------------------------------------------------------------------+
class CGrid
  {
   protected:
     int                   MagicNumber;
  
   public:
                           CGrid(void);
                          ~CGrid(void);
      void                 InitializeModule(int magic) { MagicNumber = magic; }
      double               LastPositionOpenPrice(ENUM_POSITION_TYPE type);
      int                  CountPositions(ENUM_POSITION_TYPE type);
   
  };
//+------------------------------------------------------------------+
//|               Constructor                                        |
//+------------------------------------------------------------------+
CGrid::CGrid(void)
 {
 
 }
//+------------------------------------------------------------------+
//|                Destructor                                        |
//+------------------------------------------------------------------+
CGrid :: ~CGrid(void)
 {
 
 }
//+------------------------------------------------------------------+
//|           Last Position Open Price By Position Type              |
//+------------------------------------------------------------------+
double CGrid::LastPositionOpenPrice(ENUM_POSITION_TYPE type)
 {
  double LastPrice = -1;
  ulong  LastTime = 0; 
   for (int i=PositionsTotal()-1; i>=0; i--)
     if (m_position.SelectByIndex(i))
       if (m_position.Magic() == MagicNumber && m_position.Symbol()==Symbol() && m_position.PositionType()==type)
          {
             ulong positionTime = m_position.TimeMsc();
             if ( positionTime > LastTime ) //FInd the latest position
               {
                  LastPrice = m_position.PriceOpen();
                  LastTime = m_position.TimeMsc();
               }
          }
       return LastPrice;
 }
//+------------------------------------------------------------------+
//|                Count Positions By Type                           |
//+------------------------------------------------------------------+
int CGrid::CountPositions(ENUM_POSITION_TYPE type)
 {
   int counter = 0; //variable to store our positions number
   for (int i=PositionsTotal()-1; i>=0; i--)
     if (m_position.SelectByIndex(i)) // Select position by its index
        if (m_position.Magic() == MagicNumber && m_position.Symbol() == Symbol() && m_position.PositionType() == type)
          {
            counter++; 
          }
      return counter;
 }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+

이렇게 하면 코드를 쉽게 디버깅할 수 있으므로 많은 이점을 얻을 수 있습니다. 디버깅은 하나의 장소에서 이루어져야 합니다. 그러면 .mq5 파일에서 작업할 양이 줄어듭니다.

03: 루틴 만들기

루틴은 일반적으로 생산성을 향상시키는 데 큰 도움이 될 수 있는 마인드를 가지는데 도움이 됩니다. 또한 일의 동력을 유지하고 언제나 일관되게 일하는 프로그래머가 되도록 돕는 가장 좋은 방법입니다.

예를 들어 매일 오전 08:00부터 오전 11:00까지 코딩하는 루틴이 있을 수 있습니다.

같은 루틴을 고수하다 보면 몇 주 또는 몇 달 후에는 그 시간 동안 PC를 사용할 때마다 코딩 하고 싶은 마음이 생긴다는 것을 알게 될 것입니다.

당신에게 가장 잘 맞는 시간표를 만드세요.


04: 작업 일정 잡기

현대인들은 너무 많은 일에 정신이 팔리기 쉽습니다. 요즘은 특히 코딩할 때나 여러 상황이 안 좋을 때 집중하기가 어렵습니다. 우리가 창의력을 발휘할수 있는 시간은 하루 중 단 몇 분/시간이라는 점에 유의하십시오.

종종 우리의 마음은 그 수준에 도달하기 위해 산만함 없이 오랫동안 일해야 합니다. 그 상태에 도달할 수 있으려면 긴 시간 동안 논스톱으로 코딩하는 일정을 잡아야 합니다.

우리가 일상적인 일과를 하는 동안 직면하는 힘든 일을 해결 할 수 있으려면 오랜 시간의 집중력 있는 작업이 필요합니다. 나는 모든 코더에게 당신이 방해받지 않고 열심히 일할 특정한 날을 잡을 것을 권장합니다.

05: 단일 목적 함수를 만들고 테스트 하십시오

하나의 함수 내에서 너무 많은 작업을 수행하지 마십시오. 중요한 작업을 위해 코딩해야 한다는 것을 깨달을 때마다 또다른 함수를 만드는 것을 명심하십시오.

Ontick 함수(또는 다른 주요 함수나 딸린 함수)에 루프가 너무 많으면 이는 곧 귀하에게 도움이 될 것이 없을 것입니다. 이는 주머니에 넣고 있던 수류탄의 핀을 꺼내는 것과 같습니다.

모든 로직이 한 곳에 나타나도록 함으로써 간단한 알고리즘을 복잡하게 만드는 것은 돈과 인생, 시간에서 가장 귀중한 자원을 소모하게 하는 버그를 만드는 가장 좋은 방법 중 하나입니다.

코딩은 코딩을 할때의 대부분의 시간이 즐거워야 꾸준히 할 수 있는 것입니다. 코드를 읽는 사람이 아무리 경험이 많고 영리하더라도 복잡한 알고리즘은 재미가 없는 것입니다. 각 함수가 하나의 작업을 수행하는지 확인하고 나아가 읽기 쉽고 기능이 무엇인지 이해하기 쉬우려면 함수 이름이 중요합니다.

이전의 예에서 포지션 유형별 argument와 CountPositions 함수를 살펴보십시오:

int CGrid::CountPositions(ENUM_POSITION_TYPE type)
 {
   int counter = 0; //variable to store our positions number
   for (int i=PositionsTotal()-1; i>=0; i--)
     if (m_position.SelectByIndex(i)) // Select position by its index
        if (m_position.Magic() == MagicNumber && m_position.Symbol() == Symbol() && m_position.PositionType() == type)
          {
            counter++; 
          }
      return counter;
 }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+

함수 이름만 보면 누구나 이 함수가 유형별로 포지션을 계산하는 것임을 알 수 있습니다. 함수 내부에서 수행된 작업은 그 이상도 그 이하도 아닙니다.

주석 쓰기, 자기 자신을 위해

코드에 주석을 추가하는 습관은 간단하지만 너무 초보적인 코딩 방법으로 볼 수 있습니다. 그러나 그것을 효과적으로 사용하는 방법을 아는 사람들에게는 게임 체인저가 될 수 있습니다.

input    group        "Money management"
input    double       InitialLots = 0.01; //Initial position volume
input    int          EquityUse = 50;  // Percentage of equity to be used in all trading operations
input    group        "Average True Range";
input    int          AtrBarSignal = 1; //Atr value will be calculation taken from this candle

지금 작성하는 대부분의 변수, 함수 및 코드 스니펫은 몇 주 또는 며칠 후에는 잊어버릴 것입니다. 의미 있는 주석이 없으면 이전에 작성한 코드에 익숙하지 않을 것입니다(얼마나 어리석은 것인지 생각해보세요!!).

MQL5에 주석을 추가하면 IDE 메타에디터를 통해 사용하고 싶을 때마다 쉽게 기억할 수 있습니다.

메타에디터 주석 안내

메타에디터는 당신을 돕고자 하는데 이를 어렵게 만드는 이유는 무엇입니까? 메타 에디터를 활용하세요.

당신은 혼자가 아닙니다. 그래서 당신은 항상 코드베이스나 무언가에서 다른 개발자가 만든 쉽게 만든 코드를 갖고 싶어하며 이를 위해 당신이 할 것은 읽기 쉽고 이해하기 쉬운 코드를 갖는 것입니다. 이는 댓글로도 가능합니다.

07: 타이핑 습관


효과적으로 코딩하려면 키보드를 잘 쓰는 사람이 되어야 한다는 사실을 잊지 마십시오. 모든 코더는 키보드 타이핑 능력을 개발하고 향상시키기 위해 노력해야 합니다. 코드 타이핑을 잘하는 가장 좋은 방법은 터치 타이핑 습관을 기르는 것입니다: 터치 타이핑이란 실제로 키보드를 보지 않고 키보드에서 정확한 문자를 입력하는 것을 말합니다.

대부분의 경우 우리는 키보드와 화면을 동시에 보면서 하고 그것은 프로페셔널 하지 못한 타이핑 형태라는 것을 깨닫지 못한 채 코딩하는 경향이 있습니다.

독수리 타법에서 벗어나 키보드를 보지 않고(화면만 보고) 타이핑 하는 습관을 기르고 타자를 치는 훈련을 하십시오. 이것은 몸이 기억하는 타이핑을 통해 가능합니다.

이 습관을 기르는 것이 조금 더 어렵지만 일단 습관이 되면 타이핑은 자동화된 습관이 됩니다.

저는 keybr.com라는 무료 사이트에서 몇 주 동안 연습한 후에 이 습관을 기를 수 있었습니다. 이 습관을 기르고 싶은 모든 이들에게 추천하는 최고의 사이트입니다.

08: 최고의 도구 사용 


도구는 프로그래머로서 전반적인 생산성을 향상시키는 데 큰 역할을 할 수 있으며 최고의 도구가(하드웨어와 소프트웨어 모두) 있는 것이 아니라면 언제나 더 나은 도구의 필요성을 느껴야 합니다.

항상 최고의 라이브러리를 사용하고 있는지 확인하고(MQL5 표준 라이브러리 권장), 막혔을 때나 새로운 것을 배우고 시도해야 할 때도 최고의 정보 소스가 있어야 합니다(자세한 내용은 이 글을 읽어 보십시오 기사) 그리고 무엇보다도 유능한 PC와 좋은 인터넷이 필요합니다.

09: 버전 관리


프로그램을 코딩할 때 몇 가지 변경 사항을 적용한 후 어떤 이유로 인해 이전에 작성한 코드로 돌아가고 싶은 생각이 드는 적이 있지 않나요?

진행 상황을 추적하고 원할 때 언제든지 이전 버전의 코드로 돌아갈 수 있도록 코드의 버전을 만드는 것은 항상 좋은 습관입니다.

저는 두 가지 방법을 알고 있습니다. 첫 번째는 Git을 사용하는 것이고 두 번째는 텍스트 파일에 복사하여 붙여 넣고 저장하는 수동 프로세스입니다.

Git 사용하기

여러분이 Git이나 깃허브에 익숙하지 않을 경우 Git 문서를 읽어 보기를 권합니다. 이 부분은 간단하게 설명하기 힘든 부분입니다.

텍스트 파일을 통한 방법

프로젝트와 관련한 폴더를 만들고 해당 프로젝트에 필요한 모든 파일을 추가합니다. 그런 다음 파일 탐색기에서 해당 폴더를 열어 폴더에 있는 내용을 확인합니다(이전 예제의 아래 이미지 참조).

텍스트 파일을 통해


새로운 함수를 추가하는 것과 같이 크게 변경이 있으면 코드 버전과 추가된 내용이 무엇인지 나타내는 이름으로 텍스트 파일을 만들어야 합니다. 이미지를 봐 보세요

텍스트 파일을 통한 버전 관리

main .mq5와 함께 텍스트 파일을 열 수 있습니다. 또는 .mqh 파일을 만들고 Ctrl+F7로 한 번의 클릭으로 둘 다 저장하고 에디터에 열려 있는 모든 파일을 한번에 컴파일 할 수 있습니다. 성공적인 컴파일 후에는 해당 텍스트 파일에 나타나는 모든 오류를 무시하고 닫을 수 있습니다.

텍스트 파일과 mq5 파일


결론

이상입니다. 저는 여러분이 더 나은 프로그래머가 되기 위해 한 단계 더 나아가는 긍정적인 무언가를 얻으셨기를 바랍니다. 누락된 지혜의 진주가 있으면 아래 토론 섹션에서 저와 다른 프로그래머와 공유해 주십시오. 이 기사에 사용된 모든 코드는 아래에 첨부되어 있습니다.

감사합니다.


MetaQuotes 소프트웨어 사를 통해 영어가 번역됨
원본 기고글: https://www.mql5.com/en/articles/9923

파일 첨부됨 |
gridmodule.mqh (3.58 KB)
더 나은 프로그래머 (Part 07): 성공적인 프리랜서 개발자가 되기 위한 참고 사항 더 나은 프로그래머 (Part 07): 성공적인 프리랜서 개발자가 되기 위한 참고 사항
MQL5에서 성공적인 프리랜스 개발자가 되고 싶습니까? 그렇다면 이 기사를 읽어 보시기 바랍니다.
더 나은 프로그래머 (Part 05): 어떻게 하면 빠르게 개발하는 개발자가 될 수 있을까요 더 나은 프로그래머 (Part 05): 어떻게 하면 빠르게 개발하는 개발자가 될 수 있을까요
모든 개발자는 코드를 더 빨리 작성할 수 있기를 바랍니다. 그러나 이렇게 더 빠르고 효율적으로 코드를 작성할 수 있는 것은 소수의 사람들이 가지고 태어난 일종의 특별한 능력이 아닙니다. 그것은 배워서 얻을 수 있는 기술이며 이것이 제가 이 기사에서 알려드리고자 하는 것입니다.
MQL 언어를 사용하여 아무것도 없는 상태에서 심층 신경망(Deep Neural Network) 프로그래밍 하기 MQL 언어를 사용하여 아무것도 없는 상태에서 심층 신경망(Deep Neural Network) 프로그래밍 하기
이 기사는 MQL4/5 언어를 사용하여 심층 신경망을 만드는 방법을 열려주는 것을 목표로 합니다.
트레이딩에서의 수학: 샤프 및 소르티노 비율 트레이딩에서의 수학: 샤프 및 소르티노 비율
투자에 따른 수익은 투자자와 초보 트레이더가 거래의 효율성을 분석하기 위해 사용하는 가장 확실한 지표입니다. 전문적인 트레이더는 샤프 및 소르티노 비율과 같은 전략을 분석하기 위해 보다 안정적인 도구를 사용합니다.