Auto-aprendizagem da linguagem MQL5 a partir do zero - página 21

 
Maxim Kuznetsov:

... As pessoas aqui estão tentando ajudar os recém-chegados por uma vez.

Bom dia e bom humor para todos!

Obrigado a todos que estão tentando me ajudar! O resultado de sua ajuda já está lá. Agora estou encontrando conscientemente as informações de que preciso (tutoriais, documentação do site, etc.), o que me ajuda a continuar o auto-aprendizagem. Gostaria de enfatizar que usei apenas a Referência MQL5 para escrever este código de script!

Hoje, estou colando o código do script New7.mq5 que é uma versão melhorada do script New6.mq5. O novo roteiro tem a capacidade de definir os níveis de Stop Loss (parar perda) e Take Profit (tirar lucro). Tentei descrever tudo neste roteiro como prometi anteriormente, de uma forma compreensível para um programador de primeira série.

Cumprimentos, Vladimir.

//+------------------------------------------------------------------+
//|                                                         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:

Bom dia e bom humor para todos!

Obrigado a todos que estão tentando me ajudar! Já existe um resultado de sua ajuda. Agora, conscientemente, encontro as informações de que preciso (tutorial, documentação do site, etc.), com a ajuda das quais continuo a estudar por conta própria. Gostaria de enfatizar que usei apenas a Referência MQL5 para escrever este código de script!

Hoje, estou colando o código do script New7.mq5 que é uma versão melhorada do script New6.mq5. O novo roteiro permite que você estabeleça os níveis de Stop Loss (para parar as perdas) e Take Profit (para obter lucros). Tentei descrever tudo neste roteiro como prometi anteriormente, de uma forma compreensível para um programador de primeira série.

Cumprimentos, Vladimir.

Há uma linha em seu código:

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

Isso significa que quando houver "orderType1" no código, ele será substituído por "BUY_STOP".

Ou seja, em vez da seguinte linha:

if( orderType1 == "BUY_STOP" )

"BUY_STOP" será substituído com a seguinte seqüência:

if( "BUY_STOP" == "BUY_STOP" )

É isso que você realmente quer?

 
Koldun Zloy:

Há uma linha em seu código:

Isso significa que quando 'orderType1' é encontrado no código, ele será substituído por 'BUY_STOP'.

Portanto, em vez da seguinte linha:

Será o fio:

É isto que você realmente quer?

Estudarei a documentação mais uma vez e lhe responderei mais tarde.

Atenciosamente, Vladimir.

 

Koldun Zloy:

... É isso realmente o que você quer?

Por enquanto, sim.

Com todo o respeito, Vladimir.

 
MrBrooklin:

Por enquanto, sim.

Aqui vamos nós...

 
Vasiliy Sokolov:

Aqui estamos nós...

Bem, o que eu lhe disse?))) Tem que haver uma base e uma base novamente. Primeiro você tem que ler/ler um livro didático por 3-4 meses e depois escrever algo. Após um ano, você pode começar a OOP.
 
MrBrooklin:

Por enquanto, sim.

Com todo o respeito, Vladimir.

Este é o ponto que eu deveria ter escrito com mais detalhes. É certamente uma opção de trabalho, mas muito inesperada))))

É melhor começar dando uma descrição do que o roteiro vai fazer, um algoritmo esquematicamente. Haverá menos perguntas e observações mais específicas)

 
MrBrooklin:

Por enquanto, sim.

Com todo o respeito, Vladimir.

Na verdade, a condição acima é sempre verdadeira, como 2 = 2. É por isso que se (o operador da condição) não trabalhar aqui, e o compilador irá gerar um aviso sobre tal código.
 
Реter Konow:
Bem, sobre o que eu lhe falei?))) Deve haver uma base e uma base novamente. Primeiro leia/reveja um livro didático por 3-4 meses e depois escreva algo. Após um ano, você pode começar a OOP.

Não se trata nem mesmo da base. A mente do homem é uma bagunça. O navio foi ao fundo, mas as velas (take-profit, stop-loss, trailing in the future) estão sendo cuidadosamente moldadas para ele.

ReTeg Konow:
Na verdade, a condição acima é sempre verdadeira, como 2 = 2. Portanto, se (operador da condição) não funcionar aqui, e o compilador dará um aviso sobre tal código.

Agora o autor do ramo deveria seguir seu conselho Peter, e dizer "Eu vejo dessa maneira, eu sou um artista!

 
Vasiliy Sokolov:

Aqui vamos nós...

Devo ter entendido mal alguma coisa, já que tive tal reação.

Escrevi a seguinte condição no script New6.mq5: "Para pedidos pendentes Buy Stop and Sell Stop, aplicar a diretiva #define em vez de input. Ele nos permitirá especificar no código do script os tipos necessários de ordens pendentes, mas elas não serão exibidas nos parâmetros de entrada do script quando ele for executado. Vamos definir variáveis definindo os tipos de pedidos pendentesType1 e OrderType2. Vamos nomear estas variáveis "BUY_STOP" e "SELL_STOP".

Por favor, me informe o que fiz de errado na implementação desta condição.

Cumprimentos, Vladimir.