Creación de un robot - página 8

 

¡¡¡MUCHAS GRACIAS A TODOS!!!

El código del programa que crea el indicador ZigZagColor en el gráfico actual y lo elimina después de cerrar el EA tiene el siguiente aspecto

en el bloque de inicialización de EA

//--- create handle of the indicator iCustom
   handle_iCustom=iCustom(m_symbol.Name(),Period(),"Examples\\ZigzagColor",
                          Inp_ZZ_Depth,
                          Inp_ZZ_Deviation,
                          Inp_ZZ_Backstep);
   ChartIndicatorAdd(ChartID(),0,handle_iCustom);

en el bloque de desinicialización del Asesor Experto

¡(ADVERTENCIA para los que vayan a utilizar este código! Esta versión del código es intermedia y sólo es aplicable a las configuraciones del indicador Inp_ZZ_Depth = 80; Inp_ZZ_Deviation = 20; Inp_ZZ_Backstep = 0; con otras configuraciones, el indicador no se eliminará. Para que el indicador se borre con otros ajustes en el bloque de desinicialización, especifíquelos en lugar de 80,20,0).

//---
  ChartIndicatorDelete(0,0,"ZigZag(80,20,0)");

Ahora quiero entender cómo hacer que se borre el indicador después de cambiar su configuración. He probado la siguiente variante:

//---
  ChartIndicatorDelete(0,0,"ZigZag("+Inp_ZZ_Depth+","+Inp_ZZ_Deviation+","+Inp_ZZ_Backstep+")");

Borra el indicador de todas las configuraciones, pero al compilar el EA el editor genera 3 advertencias sobre la conversión implícita de número a cadena:

implicit conversion from 'number' to 'string'   ZigZag_Fibonacci_(M1).mq5       230     38

Sospecho que se trata de estos valores: "+Inp_ZZ_Depth+", "+Inp_ZZ_Deviation+","+Inp_ZZ_Backstep+". Bueno, tengo que estudiar más el lenguaje de programación MQL5.

Gracias una vez más por su amable ayuda.

Sinceramente, Vladimir.

 
MrBrooklin:

¡¡¡MUCHAS GRACIAS A TODOS!!!

El código final que crea el indicador ZigZagColor en el gráfico actual y lo elimina después de que el EA se cierre tiene el siguiente aspecto

en el bloque de inicialización de EA

en bloque de desinicialización de EA

¡(ADVERTENCIA para los que vayan a utilizar este código! Esta versión del código es intermedia y sólo es aplicable a las configuraciones del indicador Inp_ZZ_Depth = 80; Inp_ZZ_Deviation = 20; Inp_ZZ_Backstep = 0; con otras configuraciones, el indicador no se eliminará. Para que el indicador se borre con otros ajustes en el bloque de desinicialización, especifíquelos en lugar de 80,20,0).

Ahora tengo que entender cómo hacer que se borre el indicador después de cambiar su configuración. He probado la siguiente variante:

Borra el indicador de todas las configuraciones, pero al compilar el EA el editor genera 3 advertencias sobre la conversión implícita de número a cadena:

Sospecho que se trata de estos valores: "+Inp_ZZ_Depth+", "+Inp_ZZ_Deviation+","+Inp_ZZ_Backstep+". Bueno, tengo que estudiar más el lenguaje de programación MQL5.

Gracias una vez más por su amable ayuda.

Sinceramente, Vladimir.

 ChartIndicatorDelete(0,0,"ZigZag("+(string)Inp_ZZ_Depth+","+(string)Inp_ZZ_Deviation+","+(string)Inp_ZZ_Backstep+")");

La advertencia sobre una conversión de tipo implícita. Para una implementación estricta, la conversión implícita da una advertencia.

Debes escribirlo explícitamente. Y en MT5 siempre es una ejecución estricta. En MT4 se puede seleccionar y no especificar en las propiedades #property strict

 
SanAlex:

Soy autodidacta - y yo mismo copio de los códigos disponibles, - El problema es que no sé explicar cómo esculpir!? - algo en mi interior me dice cómo esculpir.

----------------------------------

Sé que lo que he moldeado, faltando allí, es también un Arrastre para la línea.

He añadido una red de arrastre.

input string   t0="---- Trailing Line:      -----";              //
input ushort   InpObjTrailingStop           = 0;                 // Obj: Trailing Stop (distance from price to object, in pips)
input ushort   InpObjTrailingStep           = 0;                 // Obj: Trailing Step, in pips (1.00045-1.00055=1 pips)
input string   t1="---- Line Name           -----";              //
input string   InpObjUpName                 = "Имя Линии Up";    // Obj: Up (Trailing Horizontal Line) or Trend Line)
input ENUM_TRADE_COMMAND InpTradeCommand    = UpName_s;          // Obj:  command: UP
input string   InpObjDownName               = "Имя Линии Down";  // Obj: Down (Trailing Horizontal Line) or Trend Line)
input ENUM_TRADE_COMMAND InTradeCommand     = DownName_b;        // Obj:  command: DOWN
input ushort   InpObjStep                   = 15;                // Obj: Step (distance from price to object, in pips)
Archivos adjuntos:
0006.mq5  109 kb
 
Valeriy Yastremskiy:

Advertencia sobre la conversión de tipos no explícita. para la ejecución directa (estricta) una conversión no explícita da una advertencia.

Deberías fundir explícitamente los tipos. Y en MT5 siempre es de ejecución estricta. En MT4 se puede seleccionar y no especificar en las propiedades #property strict

¡Tienes razón, Valery! Tal como está, todo funciona como debería. La versión final en el bloque de inicialización de EA:

//--- create handle of the indicator iCustom
   handle_iCustom=iCustom(m_symbol.Name(),Period(),"Examples\\ZigzagColor",
                          Inp_ZZ_Depth,
                          Inp_ZZ_Deviation,
                          Inp_ZZ_Backstep);
   ChartIndicatorAdd(ChartID(),0,handle_iCustom);

en el bloque de desinicialización de EA:

ChartIndicatorDelete(0,0,"ZigZag("+(string)Inp_ZZ_Depth+","+(string)Inp_ZZ_Deviation+","+(string)Inp_ZZ_Backstep+")");

Gracias por el consejo.

Saludos, Vladimir.

 
Роман Жилин:

Oooh, muchas gracias, con tanta información se pueden hacer muchas cosas...

Estoya punto de salir de viaje de negocios, así que estoy pensando en profundizar en los materiales que me han dado, pero la codificación... También podría hacerlo en una hoja de papel, sería una buena herramienta de entrenamiento...


Saludos, Roman

¡Buenos días a todos!

Mientras Roman está de viaje de negocios y no participa en este tema, yo seguiré haciendo preguntas sobre el lenguaje de programación MQL5. Encontré la librería del Máximo Porcentaje de Riesgo Patrimonial en CodeBase en https://www.mql5.com/ru/code/2142. Decidí intentar implementar la apertura de posiciones de compra y venta en un simple Asesor Experto, pero no con un lote fijo, sino con el máximo porcentaje de riesgo de la renta variable.

Aquí está el código fuente (he eliminado todas las cosas innecesarias para centrarse en la tarea principal):

//+------------------------------------------------------------------+
//|                                                  11111111111.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"

input int      TakeProfit=300; //Тейк-профит
input int      StopLoss=250;  //Стоп-лосс
input double   lot=0.1;        //Лот

double Ask;
double Bid;
//+------------------------------------------------------------------+
//| Функция открытия длинной (Long) позиции.                         |
//+------------------------------------------------------------------+
int OpenLong(double volume=0.1,
             int slippage=10,
             string comment="Long",
             int magic=0)
  {
   MqlTradeRequest my_trade;
   MqlTradeResult my_trade_result;
   ZeroMemory(my_trade);
   my_trade.action=TRADE_ACTION_DEAL;
   my_trade.symbol=Symbol();
   my_trade.volume=NormalizeDouble(volume,1);
   my_trade.price=NormalizeDouble(Ask,_Digits);
   my_trade.sl=NormalizeDouble(Ask-StopLoss*_Point,_Digits);
   my_trade.tp=NormalizeDouble(Ask+TakeProfit*_Point,_Digits);
   my_trade.deviation=slippage;
   my_trade.type=ORDER_TYPE_BUY;
   my_trade.type_filling=ORDER_FILLING_FOK;
   my_trade.comment=comment;
   my_trade.magic=magic;
   ResetLastError();

   if(OrderSend(my_trade,my_trade_result))
     {
      Print("Код результата операции - ",my_trade_result.retcode);
     }
   else
     {
      Print("Код результата операции - ",my_trade_result.retcode);
      Print("Ошибка открытия ордера = ",GetLastError());
     }
   return(0);
  }
//+------------------------------------------------------------------+
//| функция открытия короткой (Short) позиции.                       |
//| Аналогична функции открытия длинной позиции.                     |
//+------------------------------------------------------------------+
.
.
.
.
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
   return(0);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason){}
//+------------------------------------------------------------------+
//| Expert OnTick function                                           |
//+------------------------------------------------------------------+
void OnTick()
  {
.   double Open[];
.
.
         if(Open[1]>(Open[2]))
           {
            OpenShort(lot,10,"Short",1234);
            return;
           }
         if((Open[1]<Open[2])
           {
            OpenLong(lot,10,"Long",1234);
            cantrade=false;
            return;
           }
        }
     }
   return;
  }
//+------------------------------------------------------------------+

He insertado en él el código de la biblioteca especificada. He obtenido el siguiente código:

//+------------------------------------------------------------------+
//|                                                  11111111111.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"

#include <Trade\SymbolInfo.mqh> // добавлено из библиотеки

input int      TakeProfit=300; //Тейк-профит
input int      StopLoss=250;  //Стоп-лосс
input double   lot=0.1;        //Лот
input double   MaximumPercentageRisk=25; //Риск - добавлено из библиотеки

bool UseMaximumPercentageRisk=true; // добавлено из библиотеки
double Ask;
double Bid;
//--- этот блок добавлен из библиотеки
//+------------------------------------------------------------------+
//|  GetLotSize RPTrade                                              |
//+------------------------------------------------------------------+
double GetLotSize(double lotsize)
  {
//--- Gets pair specs  
   CSymbolInfo symInfo;
   int  digits_bn=symInfo.Digits();
   double  points_bn=symInfo.Point();
   string symbol_bn=_Symbol;
//--- adjust lot 
   int tmpdecimal=1;
   double old_lot=lotsize;
//---
   if((NormalizeDouble(AccountInfoDouble(ACCOUNT_FREEMARGIN)*(MaximumPercentageRisk/100)/1000.0,tmpdecimal)<lotsize) 
   && UseMaximumPercentageRisk) //лот подходит под риск ?
     {
      lotsize=NormalizeDouble(AccountInfoDouble(ACCOUNT_FREEMARGIN)
      *(MaximumPercentageRisk/100)/1000.0,tmpdecimal);  //расчет нового размера лота 

      if(lotsize<SymbolInfoDouble(symbol_bn,SYMBOL_VOLUME_MIN)) //размер лота подходит под минимльный размер лота брокера ?
        {
         lotsize=SymbolInfoDouble(symbol_bn,SYMBOL_VOLUME_MIN); //Нет! Настройка размера лота под минимальный размер лота брокера
         Print(_Symbol," Lot adjusted from ",old_lot," для уменьшения размера разрешенного сервером ",lotsize);
        }
      else
        {
         Print(_Symbol," Lot adjusted from ",old_lot,
         " to ",lotsize," для соответствия условию максимального риска. В каждой сделке рисковать можно только ",
         MaximumPercentageRisk,"% от свободной маржи.");   //Да! 
         if(MathAbs(lotsize/SymbolInfoDouble(symbol_bn,SYMBOL_VOLUME_STEP)
         -MathRound(lotsize/SymbolInfoDouble(symbol_bn,SYMBOL_VOLUME_STEP)))>1.0 E-10) //Размер лота подходит под разрешенный шаг брокера ?
           {
            lotsize=SymbolInfoDouble(symbol_bn,SYMBOL_VOLUME_STEP)
            *NormalizeDouble(lotsize/SymbolInfoDouble(symbol_bn,SYMBOL_VOLUME_STEP),0);   //НЕТ! Перерасчет размера лота.    
            Print("M-",_Symbol," Warning: Your calculated percentage at risk lot size of was not a multiple of minimal step",
            SymbolInfoDouble(symbol_bn,SYMBOL_VOLUME_STEP),". Размер лота изменился до",lotsize);
           }
        }
     }
   return(lotsize);
 }

//+------------------------------------------------------------------+
//| Функция открытия длинной (Long) позиции.                         |
//+------------------------------------------------------------------+
int OpenLong(double volume=0.1,
             int slippage=10,
             string comment="Long",
             int magic=0)
  {
   MqlTradeRequest my_trade;
   MqlTradeResult my_trade_result;
   ZeroMemory(my_trade);
   my_trade.action=TRADE_ACTION_DEAL;
   my_trade.symbol=Symbol();
   my_trade.volume=NormalizeDouble(volume,1);
   my_trade.price=NormalizeDouble(Ask,_Digits);
   my_trade.sl=NormalizeDouble(Ask-StopLoss*_Point,_Digits);
   my_trade.tp=NormalizeDouble(Ask+TakeProfit*_Point,_Digits);
   my_trade.deviation=slippage;
   my_trade.type=ORDER_TYPE_BUY;
   my_trade.type_filling=ORDER_FILLING_FOK;
   my_trade.comment=comment;
   my_trade.magic=magic;
   ResetLastError();

   if(OrderSend(my_trade,my_trade_result))
     {
      Print("Код результата операции - ",my_trade_result.retcode);
     }
   else
     {
      Print("Код результата операции - ",my_trade_result.retcode);
      Print("Ошибка открытия ордера = ",GetLastError());
     }
   return(0);
  }
//+------------------------------------------------------------------+
//| функция открытия короткой (Short) позиции.                       |
//| Аналогична функции открытия длинной позиции.                     |
//+------------------------------------------------------------------+
.
.
.
.
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
   return(0);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason){}
//+------------------------------------------------------------------+
//| Expert OnTick function                                           |
//+------------------------------------------------------------------+
void OnTick()
  {
.   double Open[];
.
.
         if(Open[1]>(Open[2]))
           {
            OpenShort(lot,10,"Short",1234);
            return;
           }
         if((Open[1]<Open[2])
           {
            OpenLong(lot,10,"Long",1234);
            cantrade=false;
            return;
           }
        }
     }
   return;
  }
//+------------------------------------------------------------------+

Pero el Asesor Experto sigue trabajando por un lote fijo, es decir, el riesgo no se considera. Por favor, aconséjenme qué hacer para que el porcentaje de riesgo de la plusvalía sea el adecuado.

Saludos, Vladimir.

Maximum Percentage of Equity Risk
Maximum Percentage of Equity Risk
  • www.mql5.com
Change Chart and Timeframe Модифицированные скрипты для быстрого изменения графиков и таймфреймов на всех графиках при помощи горячих клавиш. Apply Template Простой скрипт для применения шаблона и/или таймфрейма ко всем открытым графикам. Long position Простой скрипт...
 
Señores, sólo hay una página de discusión en todo el hilo, el resto es código. ¿No basta con introducir los códigos?
 
MrBrooklin:

¡Buenos días a todos!

Mientras Roman está de viaje de negocios y no participa activamente en este hilo, seguiré haciendo preguntas sobre el lenguaje de programación MQL5. Encontré la librería del Máximo Porcentaje de Riesgo Patrimonial en CodeBase en https://www.mql5.com/ru/code/2142. Decidí intentar implementar la apertura de posiciones de compra y venta en un simple Asesor Experto, pero no con un lote fijo, sino con el máximo porcentaje de riesgo de la renta variable.

Aquí está el código fuente (he eliminado todas las cosas innecesarias para centrarse en la tarea principal):

He insertado en él el código de la biblioteca especificada. He obtenido el siguiente código:

Pero el Asesor Experto sigue trabajando por un lote fijo, es decir, el riesgo no se considera. Por favor, aconséjenme qué hacer para que el porcentaje de riesgo de la plusvalía sea el adecuado.

Mis respetos Vladimir.

Tal y como lo has escrito, así es como funciona. Necesita una línea, si Lot==0, entonces cuenta el lote arriesgado y asigna el valor del cálculo a la variable Lot al final.

En el Cuaternario esta forma, a través de la variable adicional Lts

bool CheckMoneyForTrade()
 {
 RefreshRates();                              // Обновление данных
   Min_Lot=MarketInfo(Symb,MODE_MINLOT);        // Миним. колич. лотов 
   Free   =AccountFreeMargin();                 // Свободн средства
   One_Lot=MarketInfo(Symb,MODE_MARGINREQUIRED);// Стоимость 1 лота
   Step   =MarketInfo(Symb,MODE_LOTSTEP);       // Шаг изменен размера
 
   if (Lots > 0)                                // Если заданы лоты,то 
      Lts =Lots;                                // с ними и работаем 
   else                                         // % свободных средств
      Lts=MathFloor(Free*Prots/One_Lot/Step)*Step;// Для открытия
 
   if(Lts < Min_Lot) Lts=Min_Lot;               // Не меньше минимальн
   if (Lts*One_Lot > Free)                      // Лот дороже свободн.
     {
      Alert(" Not enough money for ", Lts," lots");
     Work=false;
      return(false) ;                                   // Выход из функции()
     }
     return(true);
     }
 
VVT:
Señores, todo el tema es una página de discusión, el resto es código. ¿No basta con introducir los códigos?

¿Cómo se ayuda entonces?

 
SanAlex:

¿Cómo se ayuda entonces?

Poner sólo lo que se pide

 
Valeriy Yastremskiy:

Así es como está escrito y cómo funciona. Necesitamos una línea si Lot==0 entonces contamos lote arriesgado y al final asignamos el valor del cálculo a la variable Lot.

En el Cuaternario es así, a través de la variable adicional Lts

Gracias, Valery, ¡lo probaré por la noche!

Sinceramente, Vladimir.

Razón de la queja: