Autoaprendizaje del lenguaje MQL5 desde cero - página 21

 
Maxim Kuznetsov:

... La gente aquí está tratando de ayudar a los recién llegados por una vez.

¡Buen día y buen humor a todos!

Gracias a todos por intentar ayudarme. El resultado de su ayuda ya está ahí. Ahora encuentro conscientemente la información que necesito (tutoriales, documentación de la web, etc.), lo que me ayuda a seguir estudiando por mi cuenta. Me gustaría enfatizar que sólo he utilizado MQL5 Reference para escribir el código de este script.

Hoy pego el código del script New7.mq5 que es una versión mejorada del script New6.mq5. El nuevo script tiene la capacidad de establecer niveles de Stop Loss (tope de pérdidas) y Take Profit (toma de beneficios). He intentado describir todo en este script como prometí antes, de forma comprensible para un programador de primer grado.

Saludos, 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:

¡Buen día y buen humor a todos!

¡Gracias a todos los que intentan ayudarme! Ya hay un resultado de su ayuda. Ahora encuentro conscientemente la información que necesito (tutorial, documentación del sitio web, etc.), con la ayuda de la cual continúo el autoaprendizaje. Me gustaría enfatizar que sólo he utilizado MQL5 Reference para escribir el código de este script.

Hoy pego el código del script New7.mq5 que es una versión mejorada del script New6.mq5. El nuevo script permite establecer niveles de Stop Loss (para detener las pérdidas) y Take Profit (para tomar ganancias). He intentado describir todo en este script como prometí antes, de forma comprensible para un programador de primer grado.

Saludos, Vladimir.

Hay una línea en su código:

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

Significa que cuando haya 'orderType1' en el código, se sustituirá por "BUY_STOP".

Es decir, en lugar de la siguiente línea:

if( orderType1 == "BUY_STOP" )

"BUY_STOP" será sustituido por la siguiente cadena:

if( "BUY_STOP" == "BUY_STOP" )

¿Es eso lo que realmente quieres?

 
Koldun Zloy:

Hay una línea en su código:

Significa que cuando "orderType1" se encuentra en el código, será reemplazado por "BUY_STOP".

Así, en lugar de la siguiente línea:

Será la cadena:

¿Es esto lo que realmente quieres?

Estudiaré la documentación una vez más y te responderé más tarde.

Sinceramente, Vladimir.

 

Koldun Zloy:

... ¿Es eso lo que realmente quieres?

Por el momento, sí.

Respetuosamente, Vladimir.

 
MrBrooklin:

Por el momento, sí.

Aquí vamos...

 
Vasiliy Sokolov:

Aquí estamos...

Bueno, ¿qué te he dicho?)) Tiene que haber una base y otra de nuevo. Primero hay que leer/revisar un libro de texto durante 3-4 meses y luego escribir algo. Al cabo de un año puedes empezar con la OOP.
 
MrBrooklin:

Por el momento, sí.

Respetuosamente, Vladimir.

Este es el punto que debería haber escrito con más detalle. Sin duda es una opción que funciona, pero demasiado inesperada))))

Es mejor empezar dando una descripción de lo que hará el script, un algoritmo de forma esquemática. Habrá menos preguntas y más observaciones específicas)

 
MrBrooklin:

Por el momento, sí.

Respetuosamente, Vladimir.

De hecho, la condición anterior es siempre verdadera, como 2 = 2. Por eso, if (el operador de condición) no funciona aquí, y el compilador generará una advertencia sobre dicho código.
 
Реter Konow:
Bueno, ¿de qué te hablé?)) Debe haber una base y otra base de nuevo. Primero lee/revisa un libro de texto durante 3-4 meses y luego escribe algo. Al cabo de un año puedes empezar con la OOP.

Ni siquiera se trata de la base. La mente del hombre es un desastre. El barco se ha hundido, pero las velas (take-profit, stop-loss, trailing in the future) están siendo cuidadosamente moldeadas para ello.

ReTeg Konow:
De hecho, la condición anterior es siempre verdadera, como 2 = 2. Así que si (operador de condición) no funciona aquí, y el compilador dará una advertencia en tal código.

Ahora el autor de la rama debería seguir tu consejo Pedro, y decir "lo veo así, ¡soy un artista!".

 
Vasiliy Sokolov:

Aquí vamos...

Debo haber malinterpretado algo, ya que he tenido esa reacción.

Escribí la siguiente condición en el script New6.mq5: "Para las órdenes pendientes Buy Stop y Sell Stop, aplique la directiva #define en lugar de la entrada. Nos permitirá especificar en el código del script los tipos necesarios de órdenes pendientes, pero no se mostrarán en los parámetros de entrada del script cuando se ejecute. Establezcamos las variables que definen los tipos de órdenes pendientes orderType1 y orderType2. Llamemos a estas variables "BUY_STOP" y "SELL_STOP".

Por favor, aconséjeme qué he hecho mal en la aplicación de esta condición.

Saludos, Vladimir.

Razón de la queja: