English Русский 中文 Español Deutsch 日本語 Português Français Italiano Türkçe
Expert Advisor에서의 자금 관리용 함수들

Expert Advisor에서의 자금 관리용 함수들

MetaTrader 5트레이딩 | 5 7월 2021, 10:22
77 0
MetaQuotes
MetaQuotes

시작하며

MQL5 언어는 현재의 mql5-프로그램터미널 상태에 관한 자세한 정보를 얻을 수 있게 해주며, 금융 상품이나 거래 계좌 또한 파악할 수 있게 해줍니다. 자산 관리 함수를 체계화하기 위해서는 마지막 두 개의 열거된 부분의 속성을 이해하여야고, 이하의 함수 역시 숙지해야 합니다.

이 글에서는 Expert Advisors의 함수 사용에 주안점을 두고 있지만, 이 해설들은 인디케이터와 스크립트에도 적용할 수 있습니다.

계좌 잔고 정보를 얻기

거래 계좌의 첫 두 가지 중요한 특징은 잔고와 자본입니다. 이 값들을 얻기 위해서는 AccountInfoDouble() 함수를 써야합니다

   double balance=AccountInfoDouble(ACCOUNT_BALANCE);
   double equity=AccountInfoDouble(ACCOUNT_EQUITY);

다음 우리가 볼 흥미로운 파트는 오픈 포지션에 대한 예금 자금의 규모와 모든 오픈 포지션에 대한 계좌의 총 변동 손익입니다.

   double margin=AccountInfoDouble(ACCOUNT_MARGIN);
   double float_profit=AccountInfoDouble(ACCOUNT_PROFIT);

새로운 포지션을 열거나 기존 포지션을 강화할 수 있으려면 예금 참여가 아닌 자유 자원이 필요합니다.

   double free_margin=AccountInfoDouble(ACCOUNT_FREEMARGIN);

여기서 상기 값은 통화 용어로 표현된다는 점을 유념해야 합니다.

AccountInfoDouble() 함수의 리턴 값으로서 얻을 수 있는 통화 값은 예금 통화에 적혀있습니다. 예금 통화를 확인하려면 AccountInfoString() 함수를 쓰십시오.

string account_currency=AccountInfoString(ACCOUNT_CURRENCY);

개인 자금의 레벨

이 계좌에는 또 다른 중요한 특성이 있습니다 - 스탑 아웃(오픈 포지션 유지에 필요한 개인 자금 부족으로 인한 강제 청산)이 발생하는 레벨. 이 값을 얻으려면 AccountInfoDouble() 함수를 다시 사용하십시오.

double stopout_level=AccountInfoDouble(ACCOUNT_MARGIN_SO_SO);

함수는 값 자체를 반환할 뿐, 이 값이 어떤 단위 유형으로 표현되는지 설명하지 않습니다. 스탑 아웃 레벨 사양에는 백분율과 통화의 두 가지 모드가 있습니다. 이 모드를 확인하려면 AccountInfoInteger() 함수를 사용하십시오:  

//--- Get account currency
string account_currency=AccountInfoString(ACCOUNT_CURRENCY);

//--- Stop Out level
   double stopout_level=AccountInfoDouble(ACCOUNT_MARGIN_SO_SO);

//--- Stop Out mode
   ENUM_ACCOUNT_STOPOUT_MODE so_mode=(ENUM_ACCOUNT_STOPOUT_MODE)AccountInfoInteger(ACCOUNT_MARGIN_SO_MODE);
   if(so_mode==ACCOUNT_STOPOUT_MODE_PERCENT)

      PrintFormat("Stop Out level in percents %.2f%%",stopout_level);
   else
      PrintFormat("Stop Out level in currency %.2f %s",stopout_level,account_currency);


계정에 대한 추가 정보

계산을 할 때엔 종종 거래 계좌 레버리지로 제공된 사이즈를 알아야할 경우가 있습니다. 이 정보는 AccountInfoInteger() 함수를 통해 얻을 수있죠:

   int leverage=(int)AccountInfoInteger(ACCOUNT_LEVERAGE);
의도치않게 비규제 Expert Advisors를 실행하는 것을 방지하려면, 계좌의 유형을 알아두어야합니다. 
   ENUM_ACCOUNT_TRADE_MODE mode=(ENUM_ACCOUNT_TRADE_MODE)AccountInfoInteger(ACCOUNT_TRADE_MODE);
   switch(mode)
     {
      case ACCOUNT_TRADE_MODE_DEMO:    Comment("Account demo");               break;
      case ACCOUNT_TRADE_MODE_CONTEST: Comment(com,"Account Contest");        break;
      case ACCOUNT_TRADE_MODE_REAL:    Comment(com,"Account Real");           break;
      default:                         Comment(com,"Account unknown type");
     }
모든 계좌가 거래에 사용될 수 있는 것은 아닙니다. 예를 들어, 경쟁 계좌에서의 거래 작업은 경쟁의 초반이 지난 후에만 가능합니다. 이 정보는 AccountInfoInteger() 함수를 통해 얻을 수 있습니다:
   bool trade_allowed=(bool)AccountInfoInteger(ACCOUNT_TRADE_ALLOWED);
   if(trade_allowed)
      Print("Trade is allowed");
   else
      Print(com,"Trade is not allowed");

이 계정에 대한 거래가 허용된다고 하더라도, Expert Advisor가 거래 권한을 갖는 것은 아닙니다. 해당 Expert Advisor가 거래 권한을 취득했는지 알아보려면 다음과 같이 쓰십시오:

   if(trade_allowed)
     {
      bool trade_expert=(bool)AccountInfoInteger(ACCOUNT_TRADE_EXPERT);
      if(trade_expert)
         Print("Experts are allowed to trade");

      else
         Print("Experts are not allowed to trade");

본 예시들은 첨부에 있는 Expert Advisor Account_Info.mq5에서 찾아볼 수 있습니다. 어떠한 복잡도의 MQL5 프로그램에도 사용될 수 있습니다.


상품에 관한 정보

각각의 금융상품은 그 나름의 설명을 가지고 있으며, 이 금융상품이 특징짓는 경로 상에 위치합니다. 만약 우리가 터미널에서 EURUSD 속성 창을 연다면 이런걸 볼 수 있게 됩니다:

이 경우, EURUSD 설명은 - "EURUSD, 유로 vs 미국 달러" 가 될 것입니다. 이 정보를 얻기 위해 우리는 SymbolInfoString() 함수를 씁니다:

   string symbol=SymbolInfoString(_Symbol,SYMBOL_DESCRIPTION);
   Print("Symbol: "+symbol);

   string symbol_path=SymbolInfoString(_Symbol,SYMBOL_PATH);
   Print("Path: "+symbol_path);

표준 계약의 크기를 체크하려면 SymbolInfoDouble()를 씁니다:

   double lot_size=SymbolInfoDouble(_Symbol,SYMBOL_TRADE_CONTRACT_SIZE);
   Print("Standard contract: "+DoubleToString(lot_size,2));

한 화폐를 파는 것과 동시에 다른 화폐를 사는 것이 외환거래 상품의 특징입니다. 구매에 필요한 화폐로 계약이 표시되어 있습니다. 이 통화는 기본 통화이며, SymbolInfoString() 함수를 사용하여 얻을 수 있습니다.

   string base_currency=SymbolInfoString(_Symbol,SYMBOL_CURRENCY_BASE);
   Print("Base currency: "+base_currency);

금융상품의 가격변동은 매입자산의 가격변동으로 이어지며, 따라서 오픈 포지션에 대한 이익변동으로 이어집니다(포지션이 상실되는 경우 이익은 마이너스가 될 수 있습니다). 따라서, 가격변동은 특정 통화로 표현되는 소득의 변화로 이어집니다. 이 통화를 호가 통화라고 합니다. 통화 쌍 EURUSD의 경우 기준 통화는 보통 유로이며, 호가 통화는 미국 달러. 호가 통화를 받아오기 위해서 역시 SymbolInfoString() 함수를 활용할 수 있습니다:

   string profit_currency=SymbolInfoString(_Symbol,SYMBOL_CURRENCY_PROFIT);

   Print("Currency quotes: "+profit_currency);

금융상품에 대한 포지션을 열기 위해서는 자금이 필요하며, 이러한 펀드는 또한 특정 통화로 표현됩니다. 이 통화를 통화 마진 또는 예금이라고 합니다. 외환거래 금융상품의 경우 일반적으로 마진과 기준 통화는 동일합니다. 예금 통화 값을 받아오려면 SymbolInfoString() 함수를 쓰십시오:

   string margin_currency=SymbolInfoString(_Symbol,SYMBOL_CURRENCY_MARGIN);
   Print("Currency deposit: "+margin_currency);

지금까지 설명한 함수들은 Symbol_Info.mq5  Expert Advisor 코드 안에서 확인할 수 있습니다. 아래를 보시면 Comment() 함수를 이용하여 EURUSD 정보를 처리한 결과를 보실 수 있습니다 .


예금 사이즈 계산하기

거래자에게 가장 필요한 금융상품에 대한 정보는 금융상품을 개설하는 데 필요한 자금의 크기입니다. 정해진 수의 랏을 구입하거나 판매하기 위해 얼마나 많은 돈이 필요한지 모른다면, 자본 관리를 위한 Expert Advisor 시스템을 구현할 수 없습니다. 게다가, 계좌 잔고 관리도 어려워집니다.

만약 내용을 이해하기에 어려움이 있다면 이 글 외환거래 가나다를 읽어보시는 것을 추천해드립니다. 저 글에서 설명하는 것은 이 글에도 적용할 수 있습니다.

지금부터는 예금 통화 마진의 사이즈를 계산할 필요가 있는데, 예를 들면 주어진 계좌 레버리지의 양으로 획득량을 나누는 방식으로 담보대출 통화에서 예금 통화로의 예금량을 재계산하는 것이 있겠습니다. To do this we write the GetMarginForOpening() function:
//+------------------------------------------------------------------+
//|  Return amount of equity needed to open position                 |
//+------------------------------------------------------------------+
double GetMarginForOpening(double lot,string symbol,ENUM_POSITION_TYPE direction)
  {
   double answer=0;
//--- 
    ...
//--- Return result - amount of equity in account currency, required to open position in specified volume
   return(answer);
  }

해설:

  • 랏 - 오픈 포지션의 양;
  • 심볼 - 금융 상품의 이름;
  • 주장된 포지션 방향.
따라서, 우리는 마진 규모(개방형 대출에 대한 자금)를 계산하기 위해 다음과 같은 정보를 가지고 있습니다.
  • 예금 통화
  • 담보 통화
  • 통화 시세 (교차 통화쌍을 위해 필요할지도 모르는)
  • 계약 규모

MQL5으로 이걸 적어보세요:

//--- Get contract size
   double lot_size=SymbolInfoDouble(symbol,SYMBOL_TRADE_CONTRACT_SIZE);

//--- Get account currency
   string account_currency=AccountInfoString(ACCOUNT_CURRENCY);

//--- Margin currency
   string margin_currency=SymbolInfoString(_Symbol,SYMBOL_CURRENCY_MARGIN);

//--- Profit currency
   string profit_currency=SymbolInfoString(_Symbol,SYMBOL_CURRENCY_PROFIT);

//--- Calculation currency
   string calc_currency="";
//--- Reverse quote - true, Direct quote - false
   bool mode;

모드 변수는 계약금 통화로 계약 규모를 계산하는 방법에 영향을 미칩니다. 이 사례를 기반으로 앞으로는 예금 통화가 미국 달러라고 가정해 보겠습니다.

통화쌍은 일반적으로 세 가지 범주로 나뉩니다.

  • 직접 통화쌍 - 미국 달러를 다른 특정 통화로 바꿀때의 환율 예시: USDCHF, USDCAD, USDJPY, USDSEK;
  • 역 통화쌍 - 특정 통화에서 미국 달러. 예: EURUSD, GBPUSD, AUDUSD, NZDUSD;
  • 교차 통화쌍 - 두 개의 특정 통화 간의 환율, 예외는 미국 달러. 예: AUDCAD, EURJPY, EURCAD. 


1. EURUSD - 역 통화쌍

우리는 호가 통화가 계정 통화인 통화쌍을 역 통화쌍이라고 지칭합니다. 우리의 예에서, 계정 통화는 미국 달러이고, 그래서 통화쌍의 분류가 흔히 나뉘는 분류와 일치할 것입니다. 그러나 거래 계좌가 (USD가 아닌) 다른 통화를 사용하는 경우에는 일치하지 않습니다. 이런 경우엔 추가 설명을 이해하기 위해서 계정 통화에 조금 더 신중을 기하시기 바랍니다.

EURUSD의 계약 규모는 - 100 000 유로입니다. 우리는 100 000 유로를 표현해야합니다 - 미국 달러. 이를 위해서는 유로화를 달러로 계산할 수 있는 환율을 알아야 합니다. 여기에서 계산 통화 개념을 소개합니다, 즉 담보대출 통화를 예금 통화로 변환하는 데 필요한 통화입니다.

//--- Calculation currency
   string calc_currency="";

다행히 이 EURUSD 통화쌍은 유로 대 달러의 환율을 표시하기 때문에, 우리가 하고자 하는 대로 담보대출 사이즈를 계산하려면 필요한 것은 환율입니다:

//--- If profit currency and account currency are equal
   if(profit_currency==account_currency)
     {
      calc_currency=symbol;
      mode=true;
     }

모드의 값을 true로 잡았는데, 이는 유로를 달러로 바꾼다는 뜻 (대출 통화는 예금통화로 바꿀 수 있음) 으로, 우리는 EURUSD의 현 환율을 계약의 사이즈에 곱하게 됩니다. 만약 모드  = false 라면, 우리는 계약 규모를 계산 통화의 환율로 나눕니다. 해당 상품의 현 시세를 확인하려면 SymbolInfoTick() 함수를 사용하십시오.

//--- We know calculation currency, let's get its last prices
   MqlTick tick;
   SymbolInfoTick(calc_currency,tick);

이 함수는 현 시세와 가장 최근 업데이트 때의 시간을 MqlTick 타입 변수에 저장하는데 - 이 구조 이 용도로 특수 설계 되었습니다. 

따라서 이 심볼에 대한 최신 가격을 얻고, 계약 크기에 곱한 다음 랏 수를 곱하면 충분합니다. 그런데 이 상품에 대한 구매 가격과 판매 가격이 있다는 점을 고려하면 어느 정도의 계산 가격을 택해야 할까요? 논리적으로 말하자면, 만약 우리가 구매한다면, 계산가격은 매도호가와 같으며, 우리가 판매한다면, 매수호가를 따져야 할 것입니다.

//--- Now we have everything for calculation 
   double calc_price;
//--- Calculate for Buy
   if(direction==POSITION_TYPE_BUY)
     {
      //--- Reverse quote
      if(mode)
        {
         //--- Calculate using Buy price for reverse quote
         calc_price=tick.ask;
         answer=lot*lot_size*calc_price;
        }
     }

//--- calculate for Sell
   if(direction==POSITION_TYPE_SELL)
     {
      //--- Reverse quote
      if(mode)
        {
         //--- Calculate using Sell price for reverse quote

         calc_price=tick.bid;
         answer=lot*lot_size*calc_price;
        }
     }

그런 이유에서, 본 예시의 EURUSD 심볼에서 예금 통화는 유로이며, 계약 규모는 100 000, 그리고 최종 매도 호가  = 1.2500. 계정 통화 - 미국 달러, 그리고 계산 통화는 동일하게 EURUSD 통화쌍. 100 000에 1.2500을 곱해서 125 000 미국 달러를 얻습니다 - 이것이 바로 1 EURUSD 랏을 구매하는 표준 계약이 얼마나 되는가에 대한 해답입니다, 만약 매수호가가 =1.2500 라면. 

우리는 만약 호가 통화가 계정 통화와 같다면, 계정통화의 1 랏 만큼의 가치를 얻기 위해, 우리는 그 위치의 의도된 방향에 따라 적절한 가격, 입찰 또는 요청과 계약 크기를 곱하면 된다고 결론 내릴 수 있습니다.

margin=lots*lot_size*rate/leverage;

2. USDCHF - 직접 통화쌍

USDCHF에 대한 대출 통화와 계정 통화는 미국 달러. 대출 통화와 계좌 통화가 동일한 통화쌍은 직접 통화쌍이라고 불립니다. 계약 규모 - 100 000. 가장 단순한 상황이니, 단순하게 곱한 값을 돌려보내면 됩니다

//--- if the base currency symbol and the deposit currency are the same
   if(margin_currency==account_currency)
     {
      calc_currency=symbol;
      //--- Just return the contract value, multiplied by the number of lots
      return(lot*lot_size);
     }

만약 예금 통화가 계좌 통화와 일치한다면, 계좌 통화의 예금 가치는 표준 계약에 랏(계약) 수를 곱한 후 레버리지의 크기로 나눈 값과 같다.

마진= 랏 수*랏 크기/레버리지;

3. CADCHF - 교차통화쌍

CADCHF 통화쌍은 예시적인 목적으로 사용되며, 예금 통화와 견적 통화가 계정 통화와 일치하는 다른 모든 쌍을 사용할 수 있습니다. 이러한 통화쌍들은 교차라고 불리는데, 그 이유는 그 통화쌍들의 마진과 이익을 계산하기 위해서, 우리는 다른 통화쌍들의 환율을 알아야 하기 때문입니다. 이것은 통화쌍들 중 하나에 대한 그것들과 교차하기 때문입니다.

일반적으로, 교차 통화쌍에는 다른 쌍에 자주 들어가는 이 통화가 빠집니다, 미국 달러. 그러나 우리는 모든 쌍들을 체크는 하지만, 그 쌍들이 계좌 통화나 교차통화쌍들에 속하진않습니다. 따라서, 만약 계좌통화가 유로라면 GBPUSD 통화쌍은 교차 통화쌍인데 이는 예금통화가 영국 파운드이고 통화 시세는 미국 달러. 이 경우 마진을 계산하려면 파운드(GBP)를 유로(EUR)로 표현해야 합니다.

그러나 지금은 심볼이 통화쌍 CADCHF인 예를 계속 고려할 것입니다. 예금 통화는 캐나다 달러 (CAD)이며 미국 달러 (USD)와 일치하지 않습니다. 호가 통화는 스위스 프랑이며 미국 달러와도 일치하지 않습니다.

우리는 1 랏의 포지션 오픈에 필요한 예금이 10만 캐나다 달러에 해당한다고만 말할 수 있습니다. 여기서 우리가 해야할 일은 예금을 계좌 통화로 변경하는 것입니다. 이 경우엔 미국 달러. 이걸 하기 위해서는 우리는 통화쌍을 찾아야하는데, 이는 미국 통화와 예금통화 - 이 경우엔 CAD 간의 교환비를 말합니다. 다 합쳐 두가지의 잠재 옵션이 있습니다:

  • CADUSD
  • USDCAD

CADCHF를 위한 결과 데이터를 얻었습니다:

margin_currency=CAD (Canadian dollar)
profit_currency=CHF (Swiss frank)

우리는 어떤 통화쌍이 터미널에 존재하는지 미리 알지 못하며, MQL5 언어의 경우 어느 옵션도 선호되지 않습니다. 따라서 우리는 계산을 위해 일치하는 첫 통화쌍을 돌려주는 GetSymbolByCurrencies() 함수를 씁니다.

//+------------------------------------------------------------------+
//| Return symbol with specified margin currency and profit currency |
//+------------------------------------------------------------------+
string GetSymbolByCurrencies(string margin_currency,string profit_currency)
  {
//--- In loop process all symbols, that are shown in Market Watch window
   for(int s=0;s<SymbolsTotal(true);s++)
     {
      //--- Get symbol name by number in Market Watch window
      string symbolname=SymbolName(s,true);

      //--- Get margin currency
      string m_cur=SymbolInfoString(symbolname,SYMBOL_CURRENCY_MARGIN);

      //--- Get profit currency (profit on price change)
      string p_cur=SymbolInfoString(symbolname,SYMBOL_CURRENCY_PROFIT);

      //--- if If symbol matches both currencies, return symbol name
      if(m_cur==margin_currency && p_cur==profit_currency) return(symbolname);
     }
   return(NULL);
  }

코드에서 볼 수 있듯이 "Market View" 창에서 확인 가능한 모든 심볼을 체크해보기 시작할 것입니다 (SymbolsTotal() 함수에 "true" 패러미터를 쓰면 이 값을 줍니다). "Market View" 리스트 상의 숫자와 각 심볼의 이름을 받아오려면, SymbolName() 함수와 true 패러미터를 함께 쓰면 됩니다!  만약 패러미터가 "false"로 세팅 될 경우 거래 서버에 있는 모든 심볼을 받아올 것이고 이는 보통 터미널에서 선택한 것보다 훨씬 많습니다.

  이제 현재 예금통화와 호가통화를 받아오기위해 심볼의 이름을 사용할 것이고, GetSymbolByCurrencies() 함수에 넘겨진 것들과 비교할 것ㅇ비니다 성공 시, 우리는 심볼의 이름을 받을 수 있으며, 함수의 작업이 성공적으로 완료되어 일정보다 앞당겨집니다. 만약 루프가 끝나고 함수 마지막 줄에 도달했는데도 아무 것도 매칭이 없고 심볼ㄹ이 발견되지 않았다면 - NULL을 돌려줍니다.

이제 GetSymbolByCurrencies() 함수를 통해 교체통화쌍을 위한 계산통화를 얻었으니 두가지 시도를 해볼 것입니다: 첫 시도에서는 우리는 심볼, margin_currency (CADCHF의 예금통화 - CAD), 호가통화는 계좌통화 (USD)인 것을 찾아볼 것입니다. 다시 말해 우리는 CADUSD와 비슷한 쌍을 찾고 있습니다.

//--- If calculation currency is still not determined
//--- then we have cross currency
   if(calc_currency="")
     {
      calc_currency=GetSymbolByCurrencies(margin_currency,account_currency);
      mode=true;
      //--- If obtained value is equal to NULL, then this symbol is not found
      if(calc_currency==NULL)
        {
         //--- Lets try to do it reverse
         calc_currency=GetSymbolByCurrencies(account_currency,margin_currency);
         mode=false;
        }
     }

만약 이 시도가 실패하면 다른 옵션을 시도합니다: 예금통화가 account_currency (USD)이고 호가통화는 margin_currency (CADCHF의 예금 통화 - CAD)인 심볼을 찾아보는 것입니다. USDCAD와 비슷한 무언가를 찾아보고 있습니다.

이제 계산 통화쌍을 찾았으니, 이는 직접 또는 역의 두 가지 중 하나입니다. 역 통화쌍일 경우 모드 변수는 "true"값일 것으로 가정합니다. 직접 통화쌍이 있으면 값은 "false"이 됩니다. "true" 값일 경우, 화폐쌍의 환율을 곱하고, 만약 "false" 일경우엔 계좌 통화에서 표준 계약의 예금 값으로 나눕니다.

다음은 발견된 계산 통화에 대한 계정 통화의 예금 크기에 대한 최종 계산입니다. 이는 직접 통화 쌍과 역 통화 쌍 모두에도 적합합니다.

//--- We know calculation currency, let's get its last prices
   MqlTick tick;
   SymbolInfoTick(calc_currency,tick);

//--- Now we have everything for calculation
   double calc_price;
//--- Calculate for Buy
   if(direction==POSITION_TYPE_BUY)
     {
      //--- Reverse quote
      if(mode)
        {
         //--- Calculate using Buy price for reverse quote
         calc_price=tick.ask;
         answer=lot*lot_size*calc_price;
        }
      //--- Direct quote 
      else
        {
         //--- Calculate using Sell price for direct quote
         calc_price=tick.bid;
         answer=lot*lot_size/calc_price;
        }
     }

//--- Calculate for Sell
   if(direction==POSITION_TYPE_SELL)
     {
      //--- Reverse quote
      if(mode)
        {
         //--- Calculate using Sell price for reverse quote
         calc_price=tick.bid;
         answer=lot*lot_size*calc_price;
        }
      //--- Direct quote 
      else
        {
         //--- Calculate using Buy price for direct quote
         calc_price=tick.ask;
         answer=lot*lot_size/calc_price;
        }
     }

확보한 결과를 리턴합니다

 //--- Return result - amount of equity in account currency, required to open position in specified volume
return  (Answer);

GetMarginForOpening() 함수는 이 시점에서 작업을 완료합니다. 마지막으로 해야 할 일은 획득된 값을 제공된 레버리지의 크기로 나누는 것으로 - 그 다음엔 미리 가정해둔 방향으로 지정된 볼륨을 가진 오픈 포지션의 마진 값을 구할 것입니다. 역방향 또는 교차 통화 쌍을 나타내는 기호는 틱에 따라 마진 값이 달라진다는 점을 잊지 말기 바랍니다.

이것이 SymbolInfo_Advanced.mq5  Expert Advisor 코드의 일부입니다. 전체 코드는 첨부파일로 붙여두었습니다.

//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//--- String variable for comment
   string com="\r\n";
   StringAdd(com,Symbol());
   StringAdd(com,"\r\n");

//--- Size of standard contract
   double lot_size=SymbolInfoDouble(_Symbol,SYMBOL_TRADE_CONTRACT_SIZE);

//--- Margin currency
   string margin_currency=SymbolInfoString(_Symbol,SYMBOL_CURRENCY_MARGIN);
   StringAdd(com,StringFormat("Standard contract: %.2f %s",lot_size,margin_currency));
   StringAdd(com,"\r\n");

//--- Leverage
   int leverage=(int)AccountInfoInteger(ACCOUNT_LEVERAGE);
   StringAdd(com,StringFormat("Leverage: 1/%d",leverage));
   StringAdd(com,"\r\n");

//--- Calculate value of contract in account currency
   StringAdd(com,"Deposit for opening positions in 1 lot consists ");

//--- Calculate margin using leverage
   double margin=GetMarginForOpening(1,Symbol(),POSITION_TYPE_BUY)/leverage;
   StringAdd(com,DoubleToString(margin,2));
   StringAdd(com," "+AccountInfoString(ACCOUNT_CURRENCY));

   Comment(com);
  }

이 작업의 결과는 차트로 마련되어있고요.


마치며

이 예시들이 거래 계좌의 가장 중요한 특성과 금융상품의 속성에 대한 정보를 얻는 것이 얼마나 쉽고 간단한지를 보여줍니다.

MetaQuotes 소프트웨어 사를 통해 러시아어가 번역됨.
원본 기고글: https://www.mql5.com/ru/articles/113

다른 인디케이터 기반으로 인디케이터를 쓰는 방법에 관하여 다른 인디케이터 기반으로 인디케이터를 쓰는 방법에 관하여
MQL5은 인디케이터를 백지로부터 만들어갈 수 있게도 해주지만, 클라이언트 터미널에 이미 빌트인 된 것이나 커스텀 인디케이터 등 이미 존재하는 다른 인디케이터 기반으로 만들 수 있는 옵션 또한 제공합니다. 고르고 나면 여기서도 두가지 선택지가 있습니다 - 새 계산이나 그래픽 스타일을 추가하는 방식으로 인디케이터를 개선하는 것, 그리고 iCustom() 이나 IndicatorCreate() 함수를 써서 클라이언트 터미널에 내장된 것이나 커스텀 인디케이터를 쓰는 것.
구글 차트 API와 표준 라이브러리 클래스를 이용하여 정보 보드 만들기 구글 차트 API와 표준 라이브러리 클래스를 이용하여 정보 보드 만들기
MQL5 프로그래밍 언어는 주로 자동화된 거래 시스템과 복잡한 기술 분석 수단을 만드는 것을 목표로 합니다. 하지만 이것 외에도, 그것은 우리가 시장 상황을 추적하기 위한 흥미로운 정보 시스템을 만들 수 있게 해주며, 거래자와의 반품 연결을 제공합니다. 본 문서는 MQL5 표준 라이브러리 구성요소를 다룰 것이며, 목표 달성을 위한 실전 사례 또한 적어두었습니다. 또한 차트 작성에 쓰인 구글 차트 API의 실제 예시 또한 실려있습니다.
20 MQL5에서의 매매 신호들 20 MQL5에서의 매매 신호들
본 문서는 매매시스템이 필요한 매매 신호를 어떻게 받는지 가르쳐줄 것입니다. 이 문서에서 다룰 20개의 매매 신호를 만드는 예시는 Expert Advisor 개발에 쓸 수 있는 별도의 커스텀 함수로 되어있습니다. 편의를 위해서, 본 문서에서 사용된 모든 함수는 미래에 Exper Advisor에 손쉽게 연결할 수 있도록 하나의 mqh include 파일에 들어 있습니다.
초보자를 위한 MQL5 Expert Advisor 코드 작성 가이드 초보자를 위한 MQL5 Expert Advisor 코드 작성 가이드
MQL5의 Expert Advisors 프로그래밍은 간단하며 쉽게 배울 수 있습니다. 이 단계별 가이드를 통해 개발된 거래 전략에 따라 간단한 Expert Advisor를 작성할 때 필요한 기본 단계를 확인할 수 있습니다. Expert Advisor의 구조, 내장 기술 인디케이터 및 거래 기능의 사용, 디버그 모드의 세부 사항 및 Strategy Tester의 사용 등이 소개되어 있습니다.