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

 
MrBrooklin :

기본 템플릿을 만들었습니다. 거기에 코드를 작성하기 시작했고 여기에 이미 작성된 조각을 배치하기 시작했습니다. 기능이 있는 알고리즘의 프레임워크는 생각지도 못했는데 제안해주셔서 감사합니다! 또한 네팅 계정에 대한 힌트를 주셔서 감사합니다!


추상적으로, 문맹 퇴치 프로그래밍의 트릭이 있습니다. 매우 빠르고 명확하게 작성할 수 있습니다.

일반적으로 문학적 형식으로 무엇을 할 것인지 댓글에 작성하십시오(주된 직접 시퀀스만).

// тралим стоп-лосс единственного ордера по сигналу от тиков

// прим.) трал - подтягиваем стоп-лосс следом за ценой, 

void TrallOnTick() {

// берём рыночный ордер (для 5-ки позицию)

        // смотрим сколько пунктов от текущей цены до стоп-лосс

        // если больше чем требуемая дистанция

        // переносим стоп-лосс

}

기본적으로 모든 것. 또한 각 주석 뒤에는 3-5줄(일반적으로 약간)의 코드가 작성됩니다. 당신은 처음부터 끝까지 전체 기능이 당신이보고있는 화면에 맞아야합니다. 더 많은 것이 밝혀지면 조각을 별도의 기능 / 메소드에 할당해야합니다.

이러한 기본 사항이 테스터에서 작동하기 시작하면 일반화하고 실제 생활에서 조건을 추가할 수 있습니다(예: 단계 또는 빈도 변경, 시장 조건 고려, 완벽에 제한 없음).

 
Maxim Kuznetsov :

추상적으로, 문맹 퇴치 프로그래밍의 트릭이 있습니다. 매우 빠르고 명확하게 작성할 수 있습니다.

일반적으로 문학적 형식으로 무엇을 할 것인지 댓글에 작성하십시오(주된 직접 시퀀스만).

// тралим стоп-лосс единственного ордера по сигналу от тиков

// прим.) трал - подтягиваем стоп-лосс следом за ценой, 

void TrallOnTick() {

// берём рыночный ордер (для 5-ки позицию)

        // смотрим сколько пунктов от текущей цены до стоп-лосс

        // если больше чем требуемая дистанция

        // переносим стоп-лосс

}

기본적으로 모든 것. 또한 각 주석 뒤에는 3-5줄(일반적으로 약간)의 코드가 작성됩니다. 당신은 처음부터 끝까지 전체 기능이 당신이보고있는 화면에 맞아야합니다. 더 많은 것이 밝혀지면 조각을 별도의 기능 / 메소드에 할당해야합니다.

이러한 기본 사항이 테스터에서 작동하기 시작하면 일반화하고 실제 생활에서 조건을 추가할 수 있습니다(예: 단계 또는 빈도 변경, 시장 조건 고려, 완벽에 제한 없음).

안녕하세요 맥심입니다! 팁으로 많은 도움이 되었습니다! 그리고 나서 나는 앉아서 고문의 표준 템플릿을 채우는 방법에 대해 생각합니다.

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

 
MrBrooklin :

친애하는 프로그래밍 전문가 여러분!

두 가지 질문에 대해 설명해 주십시오.

  1. 첫 번째 질문은 Magic Number에 관한 것입니다. 입력 매개변수에서 미결 주문 및 미결 포지션에 대해서만 생성됩니까(또는 미결 포지션에 대해서만?), 아니면 EA 자체에 대해서도 생성할 수 있습니까? 그리고 대답이 "가능합니다"라면 어떤 목적으로 수행되어야합니다. 이 질문에 머리가 복잡할 뿐인데 아직 합리적인 답을 찾지 못했습니다.
  2. Magic Number에 대한 두 번째 질문 - 현재 차트에 여러 개의 열린 위치가 있는 경우 다음 입력 매개변수를 사용하여 각 위치를 결정할 수 있습니다.

프로그래밍에서 Magic Number의 사용에 대한 올바른 이해가 전혀 없을 수 있습니다.

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

실행을 위해 주문이 수락되면 모든 특성(기호, 발주 시간, 주문 유형, 티켓)은 사용자가 아닌 터미널에서 할당합니다(사용자가 요청하지만 터미널에서 할당). 위치와 마찬가지로 위치는 주문에 대한 정보를 저장하지만 많이 있을 수 있습니다. 매직넘버는 사용자 ID입니다. 인용문:

새로운 보류 중인 요청을 생성할 때 어떻게든 표시해야 합니다. 그래야 프로그램이 이 보류 중인 요청에 대해 이 특정 주문이 미국에서 접수되었음을 알 수 있습니다. 즉, 주문이나 위치를 특정 항목과 고유하게 식별하고 연결해야 합니다 보류중인 요청.  

NAMI는 요점을 놓쳤습니다. 그리고 Artem은 주문의 분류를 Magic Number에 넣습니다. 처음 2자리는 주문 유형(예: 다음 4자리 또는 주문이 발행된 날짜)을 의미합니다.

어떤 것의 알고리즘에 대해. 먼저 초기 조건을 결정합니다. 우리의 상징에는 명령이 있으며 우리는 마법을 고려하지 않거나 고려합니다. 초기 조건이 없으면 알고리즘 생성 시 변경, 더욱이 코드는 영원할 수 있음)

 
Maxim Kuznetsov :

추상적으로, 문맹 퇴치 프로그래밍의 트릭이 있습니다. 매우 빠르고 명확하게 작성할 수 있습니다.

일반적으로 문학 스타일에서 무엇을 할 것인지 의견에 작성하십시오 (주요 직접 시퀀스 만) ...

... 기본적으로 모든 것. 또한 각 주석 뒤에는 3-5줄(일반적으로 약간)의 코드가 작성됩니다. 당신은 처음부터 끝까지 전체 기능이 당신이보고있는 화면에 맞아야합니다. 더 많은 것이 밝혀지면 조각을 별도의 기능 / 메소드에 할당해야합니다.

맥심, 봐주세요, 제가 힌트를 제대로 잡았나요, 아니면 추가해야 할 것이 있나요? 이것은 테스트 부분을 의미하기 때문입니다. 아직 코드를 작성하지 않았습니다.

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

 //+------------------------------------------------------------------+
//|                                                Trailing_Stop.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"
// установим входные параметры: "Уровень перестановки Stop Loss в безубыток" и "Шаг трейлинга"
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit ()
  {
//---
   
//---
   return ( INIT_SUCCEEDED );
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit ( const int reason)
  {
//---
   
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
//    тралим стоп-лосс единственной открытой позиции по сигналу от тиков
void OnTick ()
  {
//---

// 1. берём позицию Buy
// 2. смотрим сколько пунктов прошла текущая цена в нужном направлении от той цены, по которой открылась позиция:
//    - если количество пунктов больше, чем задано во входном параметре "Уровень перестановки Stop Loss в безубыток"
//    - тогда переносим стоп-лосс на уровень цены, по которой открылась эта позиция
// 3. смотрим сколько пунктов прошла текущая цена в нужном направлении от той цены, при которой мы перенесли 
//    стоп-лосс на уровень цены открытия позиции:
//    - если количество пунктов больше, чем задано во входном параметре "Шаг трейлинга"
//    - тогда переносим стоп-лосс на количество пунктов, укзанных во входном параметре "Шаг трейлинга"
// 4. берём позицию Sell и выполняем все те же действия, описанные в пунктах 2 и 3
  }
//+------------------------------------------------------------------+
 
MrBrooklin :

맥심, 봐주세요, 제가 힌트를 제대로 잡았나요, 아니면 추가해야 할 것이 있나요? 코드를 제외한 테스트 부분을 의미합니다.

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

초기 조건. 우리는 심볼에 위치가 있다고 생각하고 차트에서 볼 수 있습니다.

포지션의 경우 매수 또는 매도 중 하나입니다. 따라서 먼저 심볼에서 위치를 검색하십시오. 요청/수신 특성. 매수 또는 매도 포지션의 유형을 결정합니다. 그리고 텍스트에서 더.

 
Valeriy Yastremskiy :

실행을 위해 주문이 수락되면 모든 특성(기호, 발주 시간, 주문 유형, 티켓)은 사용자가 아닌 터미널에서 할당합니다(사용자가 요청하지만 터미널에서 할당). 위치와 마찬가지로 위치는 주문에 대한 정보를 저장하지만 많이 있을 수 있습니다. 매직넘버는 사용자 ID입니다. 인용문:

새로운 보류 중인 요청을 생성할 때 어떻게든 표시해야 합니다. 그래야 프로그램이 이 보류 중인 요청에 대해 이 특정 주문이 미국에서 접수되었음을 알 수 있습니다. 즉, 주문이나 위치를 특정 항목과 고유하게 식별하고 연결해야 합니다 보류중인 요청.  

NAMI는 요점을 놓쳤습니다. 그리고 Artem은 주문의 분류를 Magic Number에 넣습니다. 처음 2자리는 주문 유형(예: 다음 4자리 또는 주문이 발행된 날짜)을 의미합니다.

어떤 것의 알고리즘에 대해. 먼저 초기 조건을 결정합니다. 우리의 상징에는 명령이 있으며 우리는 마법을 고려하지 않거나 고려합니다. 초기 조건이 없으면 알고리즘 생성 시 변경, 더욱이 코드는 영원할 수 있음)

자세한 답변을 해주신 Valery에게 감사드립니다. 많은 것이 분명해졌습니다. 알고리즘에 대해서는 저도 같은 입장이지만, 이 Expert Advisor에서 Magic Number가 필요하지 않은 이유는 Vasily가 이미 설명했습니다.

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

 
MrBrooklin :

자세한 답변을 해주신 Valery에게 감사드립니다. 많은 것이 분명해졌습니다. 알고리즘에 대해서는 저도 같은 입장이지만, 이 Expert Advisor에서 Magic Number가 필요하지 않은 이유는 Vasily가 이미 설명했습니다.

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

글쎄, 그것은 정말로 필요하지 않습니다. 초기 조건에서 우리는 차트를 열었고 차트 기호에 위치가 있습니다. 우리는 어느 것을 손익분기점으로 삼고 다음 경우 손실을 줄이기 위해 SL을 추적하고 싶습니다. 가격 반전.

 

Valery의 수정 사항을 고려하여 의견이 있는 EA 템플릿이 새로운 모습으로 바뀌었습니다.

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

 //+------------------------------------------------------------------+
//|                                                Trailing_Stop.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"
// установим входные параметры для "Уровня перестановки Stop Loss в безубыток" и "Шага трейлинга"
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit ()
  {
//---
   
//---
   return ( INIT_SUCCEEDED );
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit ( const int reason)
  {
//---
   
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
//    тралим стоп-лосс единственной открытой позиции по сигналу от тиков
void OnTick ()
  {
//---
// 1. ищем все позиции на текущем символе:
//    - отправляем запрос на сервер и получаем характеристики открытых позиций
//    - определяем тип открытой позиции - Buy или Sell 
// 2. берём позицию Buy
// 3. смотрим сколько пунктов прошла текущая цена в нужном направлении от той цены, по которой открылась позиция:
//    - если количество пунктов больше, чем задано во входном параметре "Уровень перестановки Stop Loss в безубыток"
//    - тогда переносим стоп-лосс на уровень цены, по которой открылась эта позиция
// 4. смотрим сколько пунктов прошла текущая цена в нужном направлении от той цены, при которой мы перенесли 
//    стоп-лосс на уровень цены открытия позиции:
//    - если количество пунктов больше, чем задано во входном параметре "Шаг трейлинга"
//    - тогда переносим стоп-лосс на количество пунктов, укзанных во входном параметре "Шаг трейлинга"
// 5. берём позицию Sell и выполняем все те же действия, описанные в пунктах 2 и 3
  }
//+------------------------------------------------------------------+
 

블라디미르, 당신은 그것을 오랫동안 사용할 필요가 없습니다. 싸우자. 당신을 위해 원하는 후행에 대한 템플릿을 작성했습니다.

 //+------------------------------------------------------------------+
//|                                                  TestingTral.mq5 |
//|                        Copyright 2020, MetaQuotes Software Corp. |
//|                                              http://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2020, MrBrooklin"
#property link        "http://www.mql5.com"
#property version    "1.00"
input double BreakevenValue = 100.0 ; // Величина безубытка, в пунктах инструмента
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick ()
  {
   //-- Выбираем позиции по текущему символу. Если позиции нет выбирать нечего - выходим
   if (! PositionSelect ( Symbol ()))
       return ;
   //-- Стоп-лосс длинной позиции переставляем в безубыток и тралим его
   if ( PositionGetInteger ( POSITION_TYPE ) == POSITION_TYPE_BUY )
   {
      SetBreakevenForBuyPosition();
      TrailingStopLossForBuyPosition();
   }
   //-- Стоп-лосс короткой позиции переставляем в безубыток и тралим его
   else if ( PositionGetInteger ( POSITION_TYPE ) == POSITION_TYPE_SELL )
   {
      SetBreakevenForSellPosition();
      TrailingStopLossForSellPosition();
   }
  }
//+------------------------------------------------------------------+
//| Устанавливает sl позиции BUY в безубыток                         |
//+------------------------------------------------------------------+
void SetBreakevenForBuyPosition()
  {
   ;   
  }
//+------------------------------------------------------------------+
//| Тралит стоп-лосс позиции BUY вслед за ценой                      |
//+------------------------------------------------------------------+
void TrailingStopLossForBuyPosition()
  {
   ;   
  }
//+------------------------------------------------------------------+
//| Устанавливает sl позиции SELL в безубыток                        |
//+------------------------------------------------------------------+
void SetBreakevenForSellPosition()
  {
   ;   
  }
//+------------------------------------------------------------------+
//| Тралит стоп-лосс позиции BUY вслед за ценой                      |
//+------------------------------------------------------------------+
void TrailingStopLossForSellPosition()
  {
   ;   
  }
//+------------------------------------------------------------------+

함수 이름에 해당하는 논리로 함수를 채우기만 하면 됩니다. 보시다시피 템플릿은 기본입니다. 그리고 구조적으로 TK와 유사합니다.

나는 이 코드가 컴파일되었다는 점에 주목한다. 컴파일러의 관점에서 보면 맞습니다. 항상 이 상태를 위해 노력하십시오: 즉. 개발 중에 약간의 변경을 가하여 작성한 후 코드를 컴파일할 수 있습니다. 또한 컴파일러 메시지 "0 오류, o 경고"를 목표로 합니다. 물론 프로그램이 오류와 함께 시작될 수는 없지만 컴파일러 경고는 우리의 아버지처럼 받아들여야 합니다. 경고가 있으면 수정해야 합니다. 이 템플릿은 " 0 오류, o 경고"로 만들어졌습니다. 개발이 끝날 때까지 이 상태를 유지하세요.

로직을 파악하고 컴파일러를 파악하고 나면 필요한 로직을 함수에 제공하는 일만 남았습니다.

두 번째 매개변수인 트롤의 크기는 현재 다음 버전으로 이전됩니다. 추가로 필요합니다. 계산. 따라서 이 템플릿에는 포함되어 있지 않습니다. 트롤은 모든 진드기 를 끌어올 것입니다.

 
Vasiliy Sokolov :

블라디미르, 당신은 그것을 오랫동안 사용할 필요가 없습니다. 싸우자. 당신을 위해 원하는 후행에 대한 템플릿을 작성했습니다.

함수 이름에 해당하는 논리로 함수를 채우기만 하면 됩니다. 보시다시피 템플릿은 기본입니다. 그리고 구조적으로 TK와 유사합니다.

나는 이 코드가 컴파일되었다는 점에 주목한다. 컴파일러의 관점에서 보면 맞습니다. 항상 이 상태를 위해 노력하십시오: 즉. 개발 중에 약간의 변경을 가하여 작성한 후 코드를 컴파일할 수 있습니다. 또한 컴파일러 메시지 "0 오류, o 경고"를 목표로 합니다. 물론 프로그램이 오류와 함께 시작될 수는 없지만 컴파일러 경고는 우리의 아버지처럼 받아들여야 합니다. 경고가 있으면 수정해야 합니다. 이 템플릿은 " 0 오류, o 경고"로 만들어졌습니다. 개발이 끝날 때까지 이 상태를 유지하세요.

로직을 파악하고 컴파일러를 파악하고 나면 필요한 로직을 함수에 제공하는 일만 남았습니다.

두 번째 매개변수인 트롤의 크기는 현재 다음 버전으로 이전됩니다. 추가로 필요합니다. 계산. 따라서 이 템플릿에는 포함되어 있지 않습니다. 트롤은 모든 틱 을 끌어올 것입니다.

Vasily, 물론, 저를 위해 많은 일을 해주셔서 대단히 감사합니다. 그러나 이것은 이러한 함수와 연산자가 어디에서 왔는지, 가장 중요하게는 왜 등장했는지 이해하는 데 더 가까이 다가가지 못했습니다. 당신이 나에게 제안한 코드의 작성에 독립적으로 도달하는 것이 더 정확할 것입니다. 사실, 저는 이 모든 것을 직접 해보고 싶었고 이제는 거기에 도달하고 싶습니다.

나는 당신이 다른 많은 사람들과 마찬가지로 내가 끊임없이 모든 코드 라인을 씹고 시간을 표시하는 것에 이미 지쳤다는 것을 이해하지만 문제는 정확히 알고리즘에서 모든 것을 구축하는 원리를 아직 이해하지 못한다는 사실에 있습니다. 코드 작성. 여기에 영어 지식 부족도 추가해야합니다. 왜냐하면. 거의 모든 컴파일러 오류 및 경고 메시지, 기타 영어 단어를 Google 번역에 복사하여 붙여넣어야 합니다. 그건 그렇고, 누군가가 이 스레드에 게시된 마이크로, 심지어 나노 코드 를 실행하려고 하면 모두 " 0 error, 0 warnings" 와 함께 컴파일을 거쳤습니다.

이제 이러한 함수와 연산자가 왜 등장했는지 이해하거나 이해할 시간이 필요합니다. 한마디로 조용한 공포. 네, 그리고 제가 기초적인 것을 이해하지 못한다면 나쁜 학생입니다.

당신이 여전히 내 느린 생각을 용인하는 당신과 다른 모든 프로그래머에게 감사합니다. 동시에, 나는 당신의 인내심이 무한하지 않다는 것을 완벽하게 이해합니다.

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