Preguntas de los principiantes MQL4 MT4 MetaTrader 4 - página 124

 
Игорь:
¡Hola !
¿Me pueden decir cómo repintar las barras sin usar plantillas en mt4?
¿O cómo aplicar una combinación de colores?
Gráficodel menú contextual, propiedades, colores: ¿lo has probado?
 
Ihor Herasko:

Voy a simplificar un poco la respuesta para evitar confusiones. El signo (&) indica que el argumento de una función puede cambiar su valor en tiempo de ejecución y volverá al lugar desde donde se llamó a la función con un valor diferente. En este caso, la función SaveOrder puede cambiar el contenido de las matrices g_arrstBuyOrderInfo y g_arrstSellOrderInfo, así como las variables g_nBuyOrdersCnt y g_nSellOrdersCnt.

Gracias. Se aclara un poco más. No está claro cómo se puede averiguar todo esto sin remitirse al foro. No he encontrado esas explicaciones en los tutoriales.

Por favor, denme más consejos:

1) El compilador escribe - 'g_nBuyOrdersCnt' - declaración sin tipo ; 'g_nSellOrdersCnt' - declaración sin tipo. ¿Estoy en lo cierto al suponer que g_nBuyOrdersCnt y g_nSellOrdersCnt deben declararse globalmente para evitar un error del compilador?

2) Compilador:las expresiones 'for' no están permitidas en un ámbito global. Aquí no está claro.

3) En la funciónvoid SaveOrderInfo(OrderInfo &arrstOrderInfo[], int &nOrdersCnt), el compilador escribe: la declaración de 'arrstOrderInfo' oculta la declaración global. véase la declaración anterior de 'arrstOrderInfo'. Tampoco está muy claro.

4) 'nOrderCnt' es un identificador no declarado. ¿Por qué no se declara en ningún sitio?

Y una última cosa: sigo sin entender de dónde vienen y qué son los.n y los.f.




 
Игорь:

¡Hola !

¿Me pueden decir cómo repintar las barras sin usar plantillas en mt4?

¿O cómo aplicar una combinación de colores?

Si se hace mediante programación, ver las funciones ChartSetInteger() y ChartGetInteger().

 
novichok2018:

Gracias. Empieza a tener un poco más de sentido. No está claro cómo se puede averiguar todo esto sin remitirse a un foro. No he podido encontrar esas explicaciones en los libros de texto.

Por favor, denme más consejos:

1) El compilador escribe - 'g_nBuyOrdersCnt' - declaración sin tipo ; 'g_nSellOrdersCnt' - declaración sin tipo. ¿Estoy en lo cierto al suponer que g_nBuyOrdersCnt y g_nSellOrdersCnt deben declararse globalmente para evitar un error del compilador?

2) Compilador:las expresiones 'for' no están permitidas en un ámbito global. Aquí no está claro.

3) En la funciónvoid SaveOrderInfo(OrderInfo &arrstOrderInfo[], int &nOrdersCnt), el compilador escribe: la declaración de 'arrstOrderInfo' oculta la declaración global. véase la declaración anterior de 'arrstOrderInfo'. Tampoco está muy claro.

4) 'nOrderCnt' es un identificador no declarado. ¿Por qué no se declara en ningún sitio?

Así es como debería estar todo en el código si se mira el código en su conjunto:

#property strict

input       int i_nMagicNumber = 12876;

#define  MAX_ORDERS_CNT   int(500)
struct OrderInfo
{
   int      nTicket;
   int      nType;
   double   fOpenPrice;
   double   fSL;
   double   fTP;
   datetime dtOpenTime;
};

int         g_nBuyOrdersCnt, 
            g_nSellOrdersCnt;

OrderInfo   g_arrstBuyOrderInfo[MAX_ORDERS_CNT], 
            g_arrstSellOrderInfo[MAX_ORDERS_CNT];

//+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
//| Expert initialization function                                                                                                                                                                    |
//+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
int OnInit()
{
   return INIT_SUCCEEDED;
}
//+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
//| Expert deinitialization function                                                                                                                                                                  |
//+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
void OnDeinit(const int reason)
{
}
//+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
//| Expert tick function                                                                                                                                                                              |
//+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
void OnTick()
{
    FindOrders();
}
//+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
//| Fills the orders arrays                                                                                                                                                                           |
//+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
void FindOrders()
{
   g_nBuyOrdersCnt = 0;
   g_nSellOrdersCnt = 0;
   for (int i = OrdersTotal() - 1; i >= 0; --i)
   {
      if (!OrderSelect(i, SELECT_BY_POS))
         continue;
   
      if (OrderSymbol() != Symbol())   // Если нужны ордера только по текущему символу, к графику которого прикреплен советник
         continue;
   
      if (OrderMagicNumber() != i_nMagicNumber)  // Если имеется входной параметр советника i_nMagicNumber, в котором указан ID ордеров советника
         continue;
   
      if (OrderType() == OP_BUY)
         SaveOrderInfo(g_arrstBuyOrderInfo, g_nBuyOrdersCnt);
      if (OrderType() == OP_SELL)
         SaveOrderInfo(g_arrstSellOrderInfo, g_nSellOrdersCnt);
   }
}
//+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
//| Saves one selected order in the specified array                                                                                                                                                   |
//+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
void SaveOrderInfo(OrderInfo &arrstOrderInfo[], int &nOrdersCnt)
{
   if (nOrdersCnt >= MAX_ORDERS_CNT)
      return;

   arrstOrderInfo[nOrdersCnt].nTicket = OrderTicket();
   arrstOrderInfo[nOrdersCnt].nType = OrderType();
   arrstOrderInfo[nOrdersCnt].fOpenPrice = OrderOpenPrice();
   arrstOrderInfo[nOrdersCnt].fSL = OrderStopLoss();
   arrstOrderInfo[nOrdersCnt].fTP = OrderTakeProfit();

   ++nOrdersCnt;
}
 
novichok2018:

Una última cosa: sigo sin entender de dónde vienen los.n y los.f y qué son.

El operador "punto" indica el acceso a un miembro de una estructura o clase. En este caso, se trata de una estructura.

Las letras n y f son una forma de especificar el tipo de datos almacenados en una variable. Al fin y al cabo, con un gran número de variables, es imposible recordar el tipo de cada una. Y si en un nombre de una variable habrá una indicación de su tipo, la necesidad de recordar desaparece por sí misma. n es un signo de un número entero (de Numeric), f es un número real (de float - número de punto flotante). Esta forma de escribir los nombres de las variables se llama notación húngara.

 
Ihor Herasko:

El operador punto indica el acceso a un miembro de una estructura o clase. En este caso, una estructura.

Las letras n y f son una forma de especificar el tipo de datos que se almacenan en una variable. Al fin y al cabo, con un gran número de variables, es imposible recordar el tipo de cada una. Y si en un nombre de una variable habrá una indicación de su tipo, la necesidad de recordar desaparece por sí misma. n es un signo de un número entero (de Numeric), f es un número real (de float - número de punto flotante). Esta forma de notación de los nombres de las variables se llama notación húngara.

¡¡Ahí está!! ¡¡¡Resulta queg_ yg_n no son sólo una abreviatura, sino prefijos que dicen que son variables enteras globales y globales!!! Ugh... Y no pude entender por qué esos guiones en las designaciones de las variables... ¿Cómo es posible que un principiante, que no está familiarizado con estas sutilezas, escriba código utilizando matrices, estructuras, etc.? Pensé que mi sencilla estrategia podía escribirse en un lenguaje simple, sin sumergirse en las zonas salvajes.

¿Podría darme un enlace a un tutorial detallado (ampliado) sobre mcl4 para estudiarlo junto a sus consejos?

¿Y podría escribir el código anterior sin utilizar la notación húngara para la comparación? ¿Está seguro de que la plataforma MT4 lo entiende claramente?


Y una pregunta sobre el código: ¿para qué sirve elcontinue;?

for (int i = OrdersTotal() - 1; i >= 0; --i)
   {
      if (!OrderSelect(i, SELECT_BY_POS))
         continue;
Si un pedido no se selecciona en la primera iteración, no se seleccionará en las siguientes y el ciclo continuará indefinidamente? Porque el número de pedidos no cambia. ¿No sería más correctoromper con un mensaje de error?
 
STARIJ:
Gráficos del menú contextual, propiedades, colores... ¿lo has probado?

¡¡¡Gracias ya lo he encontrado !!!

 
Ihor Herasko:

Si se hace mediante programación, ver las funciones ChartSetInteger() y ChartGetInteger().

¡¡¡Gracias por encontrarlo ya con tu ayuda!!!

 
novichok2018:

¡¡Ahí está!! ¡¡¡Resulta queg_ yg_n no son una simple abreviatura, sino prefijos que dicen que son variables globales y enteras globales!!! Ugh... Y no pude entender por qué esos guiones en las designaciones de las variables... ¿Cómo es posible que un principiante, que no está familiarizado con estas sutilezas, escriba código utilizando matrices, estructuras, etc.? Pensé que mi sencilla estrategia podía escribirse en un lenguaje simple, sin sumergirse en las zonas salvajes.

Para hacer algo, hay que profundizar en las sutilezas. No hay otra manera.

¿Podría darme un enlace a un tutorial detallado (ampliado) sobre mcl4 para estudiar junto a sus consejos?

Sólo conozco un libro de texto sobre MQL4: el de Sergey Kovalev.

¿Y podría escribir el código anterior sin utilizar la notación húngara para la comparación? ¿Está seguro de que la plataforma MT4 lo entiende claramente?

Acostúmbrate a un formato de código adecuado de inmediato )) La notación húngara ha sido inventada por programadores bastante experimentados.

Y una pregunta sobre el código: ¿para qué sirve elcontinue;?

Entonces, si un pedido no se selecciona en la primera iteración, no se seleccionará en las siguientes y el bucle seguirá hasta el infinito? Porque el número de pedidos no cambia. ¿No sería más correctoromper con un mensaje de error?

Si no conseguimos seleccionar un pedido, no significa que no podamos seleccionar el siguiente. Por lo tanto, es razonable continuar el bucle.

Учебник по MQL4
Учебник по MQL4
  • book.mql4.com
В настоящее время персональный компьютер стал незаменимым помощником в жизни каждого человека. Благодаря развитию Интернета и увеличению мощности современных компьютеров открылись новые возможности во многих областях деятельности. Ещё десять лет назад торговля на финансовых рынках была доступна только банкам и узкому кругу специалистов. Сегодня...
 
Ihor Herasko:

El hecho de no seleccionar un pedido no significa que no se pueda seleccionar el siguiente. Por lo tanto, es razonable continuar el ciclo.

¿Y no es necesario mostrar un mensaje de error? Probablemente sería útil saber por qué no se encuentra una orden y cómo evitarlo?