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

 
Maxim Kuznetsov :

... 여기 사람들은 한 번 새 이민자를 돕습니다.

좋은 하루와 좋은 분위기 모두!

나를 도우려고 노력하는 모든 사람에게 감사합니다! 당신의 도움의 결과는 이미 거기에 있습니다. 이제 나는 필요한 정보(교과서, 사이트 문서 등)를 의식적으로 찾고 독학을 계속합니다. 이 스크립트에 대한 코드를 작성하기 위해 MQL5 참조만 사용했다는 사실에 특히 주목합니다!

오늘은 New6.mq5 스크립트의 수정 버전인 New7.mq5 스크립트의 코드를 포스팅하려고 합니다. 새 스크립트는 손절매(손절매) 및 이익실현 (이익실현) 수준을 설정하는 기능을 구현합니다. 이 대본에서는 앞서 약속한 대로 프로그래밍 학교 1학년 학생을 위한 접근 가능한 프레젠테이션에서 모든 것을 그리려고 했습니다.

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

 //+------------------------------------------------------------------+
//|                                                         New7.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
//---
/* Продолжаем изучение языка программирования MQL5. В этот раз мы добавим в код скрипта, созданный
   нами ранее под именем New6.mq5, возможность устанавливать уровни Stop Loss (остановить убыток)
   и Take Profit (взять прибыль). Данные уровни позволят в ходе торговли автоматизировать процесс
   ограничения убытков и фиксации прибыли в то время, когда у нас отсутствует возможность находиться 
   перед торговым терминалом. Во входных параметрах скрипта создадим две переменные: SL (стоп лосс)
   и TP (тейк профит). Для них применим модификатор input и тип данных double. Чтобы постоянно не
   повторять комментарии, написанные в предыдущем скрипте New6.mq5, мы уберем всё лишнее и будем
   пояснять только те участки кода, которые добавим в данном скрипте. Итак, приступим. По нашей
   задумке нужно написать часть кода скрипта, который будет отвечать за Stop Loss и Take Profit.
   Снова обращаемся к Справочнику MQL5, в котором ищем раздел MqlTradeRequest. В нём мы находим
   информацию о том, что необходимо создать ещё два запроса: request.sl (для уровня Stop Loss ордера)
   и request.tp (для уровня Take Profit ордера). Дописываем в скрипт недостающие части кода.*/

/* Добавим в код скрипта необходимые переменные SL и TP.*/
input double SL= 300 ;                 //Стоп лосс
input double TP= 500 ;                 //Тейк профит
//---
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 );
     {
      request.type= ORDER_TYPE_BUY_STOP ;
      price= SymbolInfoDouble ( Symbol (), SYMBOL_ASK )+Distance*point;
      request.price= NormalizeDouble (price,digits);

/* Теперь создаем два запроса на торговый сервер: request.sl и request.tp, в котором указываем, где
   должны находиться уровни стоп лосс и тейк профит относительно цены отложенного ордера "BUY_STOP".
   Уровень SL должен быть ниже цены (поэтому пишем price-SL*point), а уровень TP должен быть выше цены
   (поэтому пишем price+TP*point). Для нормализации уровней SL и TP мы применим функцию преобразования
   данных NormalizeDouble, где обязательно умножим каждый из уровней на point (размер одного пункта)
   и укажем digits (количество знаков после запятой).*/
      request.sl= NormalizeDouble (price-SL*point,digits);      
      request.tp= NormalizeDouble (price+TP*point,digits);
//---
     }
   if (! OrderSend (request,result))
       PrintFormat ( "OrderSend error %d" , GetLastError ());
   PrintFormat ( "retcode=%u  deal=%I64u  order=%I64u" ,result.retcode,result.deal,result.order);
     {
      request.type= ORDER_TYPE_SELL_STOP ;
      price= SymbolInfoDouble ( Symbol (), SYMBOL_BID )-Distance*point;
      request.price= NormalizeDouble (price,digits);
      
/* Точно также создадим ещё два новых запроса на торговый сервер: request.sl и request.tp, в котором укажем,
   где должны находиться уровни стоп лосс и тейк профит относительно цены отложенного ордера "SELL_STOP".
   Уровень SL теперь должен находиться выше цены (поэтому пишем price+SL*point), а уровень TP должен 
   находиться ниже цены (поэтому пишем price-TP*point). Снова для нормализации уровней SL и TP мы применим
   функцию преобразования данных NormalizeDouble, где обязательно умножим каждый из уровней на point (размер
   одного пункта) и укажем digits (количество знаков после запятой).*/
      request.sl= NormalizeDouble (price+SL*point,digits);      
      request.tp= NormalizeDouble (price-TP*point,digits);
     }
   if (! OrderSend (request,result))
       PrintFormat ( "OrderSend error %d" , GetLastError ());
   PrintFormat ( "retcode=%u  deal=%I64u  order=%I64u" ,result.retcode,result.deal,result.order);
  }

/* Всё! Наш новый скрипт готов. Компилируем и запускаем скрипт. Как компилировать и запускать скрипт мы
   уже узнали, когда создавали скрипт New2.mq5.*/

//+------------------------------------------------------------------+
 
MrBrooklin :

좋은 하루와 좋은 분위기 모두!

나를 도우려고 노력하는 모든 사람에게 감사합니다! 당신의 도움의 결과는 이미 거기에 있습니다. 이제 나는 필요한 정보(교과서, 사이트 문서 등)를 의식적으로 찾고 독학을 계속합니다. 이 스크립트에 대한 코드를 작성하기 위해 MQL5 참조만 사용했다는 사실에 특히 주목합니다!

오늘은 New6.mq5 스크립트의 수정 버전인 New7.mq5 스크립트의 코드를 포스팅하려고 합니다. 새 스크립트는 손절매(손절매) 및 이익실현 (이익실현) 수준을 설정하는 기능을 구현합니다. 이 대본에서는 앞서 약속한 대로 프로그래밍 학교 1학년 학생을 위한 접근 가능한 프레젠테이션에서 모든 것을 그리려고 했습니다.

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

코드에 다음 줄이 있습니다.

 #define       orderType1 "BUY_STOP"    //Тип ордера UP

이는 코드에서 'orderType1'이 발견되면 "BUY_STOP"으로 대체됨을 의미합니다.

즉, 줄 대신:

 if ( orderType1 == "BUY_STOP" )

다음과 같은 줄이 있을 것입니다.

 if ( "BUY_STOP" == "BUY_STOP" )

그게 정말 당신이 원하는 것입니까?

 
Koldun Zloy :

코드에 다음 줄이 있습니다.

이는 코드에서 'orderType1'이 발견되면 "BUY_STOP"으로 대체됨을 의미합니다.

즉, 줄 대신:

다음과 같은 줄이 있을 것입니다.

그게 정말 당신이 원하는 것입니까?

이제 문서를 더 자세히 읽은 다음 답변하겠습니다.

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

 

Koldun Zloy :

... 그게 정말 당신이 원하는 것입니까?

현재 "예"입니다.

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

 
MrBrooklin :

현재 "예"입니다.

여기 그들이 온다...

 
Vasiliy Sokolov :

여기 그들이 온다...

글쎄, 내가 당신에게 무엇에 대해 이야기 했습니까?))) 기본과 다시 기본이 있어야합니다. 먼저 3~4개월 동안 교과서를 읽고/개요한 다음, 무언가를 씁니다. 1년이면 OOP를 시작할 수 있습니다.
 
MrBrooklin :

현재 "예"입니다.

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

이것은 좀 더 자세히 기술해야 할 요점입니다. 이것은 물론 작동하는 옵션이지만 너무 예상치 못한 것입니다))))

먼저 스크립트가 수행할 작업, 즉 도식적 알고리즘에 대한 설명을 제공하는 것이 좋습니다. 더 적은 질문과 더 구체적인 의견이 있을 것입니다)

 
MrBrooklin :

현재 "예"입니다.

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

기본적으로 위의 조건은 2 = 2와 같이 항상 참입니다. 따라서 if(조건문)는 여기에서 작동하지 않으며 컴파일러는 이러한 코드에 대해 경고를 발행합니다.
 
Реter Konow :
글쎄, 내가 당신에게 무엇에 대해 이야기 했습니까?))) 기지가 있어야하고 다시 기지가 있어야합니다. 먼저 3~4개월 동안 교과서를 읽고/개요한 다음, 무언가를 씁니다. 1년이면 OOP를 시작할 수 있습니다.

예, 기초까지가 아닙니다. 남자는 머리에 혼란이 있습니다. 배는 바닥에 갔지만 돛은 부지런히 그것에 매달려 있습니다 (이익을 취하고, 손실을 막고, 미래에 후행).

피터 코노우 :
기본적으로 위의 조건은 2 = 2와 같이 항상 참입니다. 따라서 if(조건문)는 여기에서 작동하지 않으며 컴파일러는 이러한 코드에 대해 경고를 발행합니다.

이제 지점의 작성자는 Peter, 당신의 조언을 따라야 하고 "내가 보기에 나는 예술가다!"라고 말해야 합니다.

 
Vasiliy Sokolov :

여기 그들이 온다...

그런 반응 이후로 뭔가 잘못 이해했을 가능성이 큽니다.

New6.mq5 스크립트에서 저는 다음과 같은 조건 을 썼습니다. "입력 대신에 Buy Stop 및 Sell Stop 보류 중인 주문의 경우 새로운 #define 지시문을 사용할 것입니다. 이를 통해 스크립트 코드에서 보류 주문의 필수 유형이지만 실행 시 스크립트의 입력 매개변수에 표시되지 않습니다. 보류 주문 orderType1 및 orderType2의 유형을 정의하는 변수를 설정합시다. 이름 "BUY_STOP"을 작성하고 이 변수의 경우 "SELL_STOP"입니다.

조건 을 구현하는 측면에서 내가 무엇을 잘못했는지 말해달라고 요청합니다.

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