MQL5 언어를 처음부터 자가 학습 - 페이지 14

 
MrBrooklin :

앞으로는 독학 계획에 따라 다음과 같이 스크립트의 단계적 수정을 수행하는 것이 과제입니다.

  1. 손절매를 추가하고 이익을 얻으십시오.
  2. 후행 추가;
  3. 최대 위험을 추가하십시오.
  4. 보류 중인 주문의 선택을 확장합니다.
안부 인사를 전합니다. 블라디미르.
물론 헛되이 교과서에서 배우는 조언을 따르지 않았습니다. 예를 들어 여기에서 라인, 주문 등의 방법에 대한 지식을 습득하지만 이론적 기반이 없기 때문에 여전히 전략을 작성할 수 없습니다. 이 모든 라인과 스크립트는 프로그래밍의 주요 사항을 이해하는 데 도움이 되지 않으며, 그들 없이는 멀리 가지 못할 것입니다. 처음 4개월은 공부만 하고 글을 쓸 생각도 하지 않았습니다. 물론 당신처럼 무례했을 수도 있지만 그러한 지식의 품질은 높지 않습니다. 매우 자주 미래에 채워야 할 초등학교의 격차가 있습니다 ...
 
Реter Konow :
물론 헛되이 교과서에서 배우는 조언을 따르지 않았습니다. 예를 들어 여기에서 라인, 주문 등의 방법에 대한 지식을 습득하지만 이론적 기반이 없기 때문에 여전히 전략을 작성할 수 없습니다. 이 모든 라인과 스크립트는 프로그래밍의 주요 사항을 이해하는 데 도움이 되지 않으며, 그들 없이는 멀리 가지 못할 것입니다. 처음 4개월은 공부만 하고 글을 쓸 생각도 하지 않았습니다. 물론 님처럼 뻔뻔할 수도 있겠지만 그런 지식의 질이 낮습니다. 미래에 채워야 할 초등학교의 공백이 종종 있습니다 ...

안녕 피터! 나는 필요에 따라 교과서를 공부한다. 지식의 격차를 볼 때. 이제는 좀 쉬고 교과서에 더 가까이 다가가야 겠다는 생각이 벌써부터 들었다. 포럼 참가자들의 모든 권장 사항을 메모하고 준수하려고 노력했습니다. 그 사이 에 MQL5 Reference 만 사용하여 이렇게 짧은 시간에 혼자서 최소한 무언가를 작성할 수 있다는 사실에 스스로도 놀랐습니다.

안부 인사를 전합니다. 블라디미르.

 
MrBrooklin :

모두 좋은 저녁이고 좋은 분위기입니다!

나는 새로운 스크립트 New6.mq5를 게시하고 있습니다. 이것은 현재 가격에서 특정 거리에 고정 로트 크기로 한 번에 하나의 BuyStop 및 SellStop 보류 중인 주문을 현재 차트에 배치하는 데 도움이 됩니다. 이 대본에서는 앞서 약속한 대로 프로그래밍 학교 1학년 학생을 위한 접근 가능한 프레젠테이션에서 모든 것을 그리려고 했습니다.

스크립트를 작성할 때 MQL5 Reference 에서 가져온 정보만 사용했습니다!

안부 인사를 전합니다. 블라디미르.

좋은 예입니다. 시작점으로 사용하는 것이 좋습니다. 기초.

브루클린 씨 :

앞으로는 독학 계획에 따라 다음과 같이 스크립트의 단계적 수정을 수행하는 것이 과제입니다.

  1. 손절매를 추가하고 이익을 얻으십시오.
  2. 후행 추가;
  3. 최대 위험을 추가하십시오.
  4. 보류 중인 주문의 선택을 확장합니다.
안부 인사를 전합니다. 블라디미르.

아니 아니. 아직 새로운 기능을 추가하지 마십시오. 이제 기존 논리를 개선하십시오. 동시에 스크립트 구현에서 문제를 제거하십시오(이미 표시됨). 정확히 무엇을 다시 작성해야하는지 관심이 있으시면 알려 드리겠습니다.

 
Vasiliy Sokolov :

좋은 예입니다. 시작점으로 사용하는 것이 좋습니다. 기초.

아니 아니. 아직 새로운 기능을 추가하지 마십시오. 이제 기존 논리를 개선하십시오. 동시에 스크립트 구현의 문제를 제거하십시오(이미 표시됨). 정확히 무엇을 다시 작성해야하는지 관심이 있으시면 알려 드리겠습니다.

안녕하세요 바실리님! 물론, 다시 작성해야 할 사항을 알려주세요. 저는 매우 관심이 있습니다!

안부 인사를 전합니다. 블라디미르.

 
MrBrooklin :

안녕하세요 바실리님! 물론, 다시 작성해야 할 사항을 알려주세요. 저는 매우 관심이 있습니다!

안부 인사를 전합니다. 블라디미르.

프로그래머에게는 컴파일러 오류와 아키텍처 문제라는 두 가지 문제가 있습니다. 초보자인 동안 컴파일러와 싸우는 데 집중하고 궁극적인 목표는 올바르게 작동하는 프로그램입니다. 그러나 초보자를위한 프로그램은 매우 빨리 작성자 자신이 곧 이해할 수없는 소위 스파게티 코드로 바뀝니다. 따라서 이제 컴파일러와 최종 스크립트의 정확성이 아니라 아키텍처 문제에 초점을 맞추는 것이 좋습니다. 그것은 피아노 연주를 배우는 것과 같습니다. 처음에는 손가락을 올바르게 잡고 악기에 올바르게 앉는 법을 가르쳐 주지만 아무도 바흐를 연주하는 데 초보자가 필요하지 않습니다.

 //+------------------------------------------------------------------+
//|                                                         New6.mq5 |
//|                        Copyright 2020, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2020, MetaQuotes Software Corp."
#property link        "https://www.mql5.com"
#property version    "1.00"
//---
#property script_show_inputs
//---

#define       orderType1 "BUY_STOP"    //Тип ордера UP
#define       orderType2 "SELL_STOP"    //Тип ордера DOWN
input int     Distance= 100 ;           //Отступ отложенного ордера от текущей цены
input double Lots= 0.01 ;               //Фиксированный размер лота
input long    Pending_magic= 86513 ;     //Магический номер ордера

//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart ()                                                    
  {
   MqlTradeRequest request={ 0 };
   MqlTradeResult result={ 0 };
   request.action= TRADE_ACTION_PENDING ;
   request.symbol= Symbol ();
   request.volume=Lots;
   request.deviation= 2 ;
   request.magic=Pending_magic;
   double price;
   double point= SymbolInfoDouble ( _Symbol , SYMBOL_POINT );
   int digits=( int ) SymbolInfoInteger ( _Symbol , SYMBOL_DIGITS );
   if (orderType1== "BUY_STOP" )
     {
      request.type= ORDER_TYPE_BUY_STOP ;
      price= SymbolInfoDouble ( Symbol (), SYMBOL_ASK )+Distance*point;
      request.price= NormalizeDouble (price,digits);
     }
   if (! OrderSend (request,result))
       PrintFormat ( "OrderSend error %d" , GetLastError ());
   if (orderType2== "SELL_STOP" )
     {
      request.type= ORDER_TYPE_SELL_STOP ; 
      price= SymbolInfoDouble ( Symbol (), SYMBOL_BID )-Distance*point;
      request.price= NormalizeDouble (price,digits);
     }
   if (! OrderSend (request,result))
       PrintFormat ( "OrderSend error %d" , GetLastError ());
   PrintFormat ( "retcode=%u  deal=%I64u  order=%I64u" ,result.retcode,result.deal,result.order);
  }

스크립트의 동작은 두 개의 매개변수 그룹에 의해 결정됩니다. 첫 번째 매개변수는 매크로 형태로 정적으로 설정됩니다. 두 번째는 차트 에서 스크립트를 로드 할 때 사용자가 설정합니다. 이제 사용자는 이 스크립트를 다시 컴파일하지 않고는 주문 유형을 선택할 수 없습니다. 이것은 나쁘다. 따라서 추가 매개변수를 위해 이러한 매크로를 포기하는 것이 좋습니다.

 enum ENUM_ORDER_TYPE_FLAGS
{
    BuyStop = 1 ,                 // Только BuyStop
    SellStop = 2 ,               // Только SellStop
    BuyStopAndSellStop = 4        // BuyStop и SellStop
};

input ENUM_ORDER_TYPE_FLAGS TypeSendOrders = BuyStop;   // Тип Выставляемого ордера(ов)

따라서 우리는 사용자를 위한 선택 매개변수로 구현한 새로운 열거형을 정의했습니다.

 
Vasiliy Sokolov :

프로그래머에게는 컴파일러 오류와 아키텍처 문제라는 두 가지 문제가 있습니다. 초보자인 동안 컴파일러와 싸우는 데 집중하고 궁극적인 목표는 올바르게 작동하는 프로그램입니다. 그러나 초보자를위한 프로그램은 매우 빨리 작성자 자신이 곧 이해할 수없는 소위 스파게티 코드로 바뀝니다. 따라서 이제 컴파일러와 최종 스크립트의 정확성이 아니라 아키텍처 문제에 초점을 맞추는 것이 좋습니다. 그것은 피아노 연주를 배우는 것과 같습니다. 처음에는 손가락을 올바르게 잡고 악기에 올바르게 앉는 법을 가르쳐 주지만 아무도 바흐를 연주하는 데 초보자가 필요하지 않습니다.

스크립트의 동작은 두 개의 매개변수 그룹에 의해 결정됩니다. 첫 번째 매개변수는 매크로 형태로 정적으로 설정됩니다. 두 번째는 차트 에서 스크립트를 로드 할 때 사용자가 설정합니다. 이제 사용자는 이 스크립트를 다시 컴파일하지 않고는 주문 유형을 선택할 수 없습니다. 이것은 나쁘다. 따라서 추가 매개변수를 위해 이러한 매크로를 포기하는 것이 좋습니다.

따라서 우리는 사용자를 위한 선택 매개변수로 구현한 새로운 열거형을 정의했습니다.

훌륭합니다. 사실, 당신은 스크립트의 단계별 수정의 4번째 단락에 쓰여진 것, 즉 보류 중인 주문 의 선택을 확장하는 것을 제안했습니다.

고맙습니다!

안부 인사를 전합니다. 블라디미르.

 

코드의 다음 문제는 코드가 긴 절차 시트로 확장된다는 것입니다. 모든 뉴비들은 이렇게 합니다. 그리고 이것은 수년 동안 그들에게 남아있는 문제입니다. 이 스크립트와 같은 기본 사항부터 시작하여 알고리즘을 여러 부분으로 나누는 방법을 배우십시오. 이를 수행하는 두 가지 방법이 있습니다. 함수와 클래스를 사용하는 것입니다. 클래스의 개념은 처음에는 이해하기가 너무 어려우므로 함수 작업에 집중하는 것이 좋습니다. 기능의 중요성에 대해 생각해 보십시오.

  • MQL로 작성된 모든 코드(예: CodeBase의 모든 스크립트, 표시기 및 Expert Advisors)는 시스템 기능 내부 또는 사용자 기능 내부에 있습니다.
  • 모든 MQL 코드는 수십 개의 내장 MQL 함수를 호출합니다. MetaTrader 및 거래 환경과의 모든 상호 작용은 하나 또는 다른 시스템 기능의 호출을 통해 발생합니다.
  • 외부 매개변수에 의존하지 않는 모든 함수는 항상 동일한 결과를 반환합니다. 이러한 기능은 한 스크립트/지표/전문가에서 다른 스크립트/지표/전문가로 간단히 복사할 수 있으며 올바르게 작동합니다. 반대로 임의의 절차 코드를 복사하면 작동하지 않을 가능성이 큽니다.
  • 유용한 작업을 수행하는 모든 사용자 정의 함수를 작성할 수 있습니다. 따라서 필요한 방식으로 MQL의 표준 기능을 확장합니다. 예를 들어, "MQL에 그런 기능이 있으면 좋을 텐데...."라고 생각합니다. 하지만 직접 작성해 보는 것은 어떨까요?
 
Vasiliy Sokolov :

코드의 다음 문제는 코드가 긴 절차 시트로 확장된다는 것입니다. 모든 뉴비들은 이렇게 합니다. 그리고 이것은 수년 동안 그들에게 남아있는 문제입니다. 이 스크립트와 같은 기본 사항부터 시작하여 알고리즘을 여러 부분으로 나누는 방법을 배우십시오. 이를 수행하는 두 가지 방법이 있습니다. 함수와 클래스를 사용하는 것입니다. 클래스의 개념은 처음에는 이해하기가 너무 어려우므로 함수 작업에 집중하는 것이 좋습니다. 기능의 중요성에 대해 생각해 보십시오.

  • MQL로 작성된 모든 코드(예: CodeBase의 모든 스크립트, 표시기 및 Expert Advisors)는 시스템 기능 내부 또는 사용자 기능 내부에 있습니다.
  • 모든 MQL 코드는 수십 개의 내장 MQL 함수를 호출합니다. MetaTrader 및 거래 환경과의 모든 상호 작용은 하나 또는 다른 시스템 기능의 호출을 통해 발생합니다.
  • 외부 매개변수에 의존하지 않는 모든 함수는 항상 동일한 결과를 반환합니다. 이러한 기능은 한 스크립트/지표/전문가에서 다른 스크립트/지표/전문가로 간단히 복사할 수 있으며 올바르게 작동합니다. 반대로 임의의 절차 코드를 복사하면 작동하지 않을 가능성이 큽니다.
  • 유용한 작업을 수행하는 모든 사용자 정의 함수를 작성할 수 있습니다. 따라서 필요한 방식으로 MQL의 표준 기능을 확장합니다. 예를 들어, "MQL에 그런 기능이 있으면 좋을 텐데...."라고 생각합니다. 하지만 그렇다면 직접 작성하지 않겠습니까?

Vasily님, 이렇게 자세한 조언을 해주셔서 감사합니다. 나는 확실히 메모하고 당신이 나에게 조언 한 모든 것을 이해하려고 노력할 것입니다.

안부 인사를 전합니다. 블라디미르.

 
Vasiliy Sokolov :

코드의 다음 문제는 코드가 긴 절차 시트로 확장된다는 것입니다. 모든 뉴비들은 이렇게 합니다. 그리고 이것은 수년 동안 그들에게 남아있는 문제입니다. 이 스크립트와 같은 기본 사항부터 시작하여 알고리즘을 여러 부분으로 나누는 방법을 배우십시오. 이를 수행하는 두 가지 방법이 있습니다. 함수와 클래스를 사용하는 것입니다. 클래스의 개념은 처음에는 이해하기가 너무 어려우므로 함수 작업에 집중하는 것이 좋습니다. 기능의 중요성에 대해 생각해 보십시오.

  • MQL로 작성된 모든 코드(예: CodeBase의 모든 스크립트, 표시기 및 Expert Advisors)는 시스템 기능 내부 또는 사용자 기능 내부에 있습니다.
  • 모든 MQL 코드는 수십 개의 내장 MQL 함수를 호출합니다. MetaTrader 및 거래 환경과의 모든 상호 작용은 하나 또는 다른 시스템 기능의 호출을 통해 발생합니다.
  • 외부 매개변수에 의존하지 않는 모든 함수는 항상 동일한 결과를 반환합니다. 이러한 기능은 한 스크립트/지표/전문가에서 다른 스크립트/지표/전문가로 간단히 복사할 수 있으며 올바르게 작동합니다. 반대로 임의의 절차 코드를 복사하면 작동하지 않을 가능성이 큽니다.
  • 유용한 작업을 수행하는 모든 사용자 정의 함수를 작성할 수 있습니다. 따라서 필요한 방식으로 MQL의 표준 기능을 확장합니다. 예를 들어, "MQL에 그런 기능이 있으면 좋을 텐데...."라고 생각합니다. 하지만 그렇다면 직접 작성하지 않겠습니까?
Vasily, 사람은 아직 배열을 마스터하지 못했습니다. 그런 강의를 듣기에는 너무 이르다.)
 
Реter Konow :
Vasily, 사람은 아직 배열을 마스터하지 못했습니다. 그런 강의를 듣기에는 너무 이르다.)

Peter, 당신을 포함한 모든 건설적인 조언은 나에게 중요합니다!

안부 인사를 전합니다. 블라디미르.