Cualquier pregunta de los recién llegados sobre MQL4 y MQL5, ayuda y discusión sobre algoritmos y códigos - página 1324

 
Yurij Kozhevnikov:

Gracias, esa implementación se me ha ocurrido, pero no es del todo lo mismo debido a la ausencia del propio Value1. Es decir, el ejemplo que he creado es, por supuesto, extremadamente simplificado, pero se da a entender que éste no es el valor principal de la clase, que puede haber un número de tales valores y que para cada uno de ellos se puede describir una construcción.

O para tal implementación, ¿es posible describir sólo una clase o estructura separada en la que implementar la sobrecarga, y en esta clase describir las variables del tipo creado? Pero, si en la operación de asignación intervienen otras variables de la clase, de nuevo no cuadra.

En realidad, quería implementar algo similar a los métodos Let/Set/Get en vbs.

No entiendo bien la pregunta pero C++ / MQL no tiene una propiedad clave Propiedad

tal vez necesite una clase de plantillahttps://www.mql5.com/ru/docs/basis/oop/class_templates


UPD: Aquí hay un artículo en Habra sobre lo mismohttps://habr.com/ru/post/121799/ , pero dudo que se aplique "directamente" a MQL

 

¡Muchas gracias!

Esto va un poco más allá de mis conocimientos, porque nunca he estudiado C++, pero parece ser exactamente lo que quería. Intentaré averiguarlo.

 
Yurij Kozhevnikov:

¡Muchas gracias!

Está un poco más allá de mis conocimientos, porque nunca he estudiado C++, pero parece ser exactamente lo que quería. Intentaré averiguarlo.

Intente formular su pregunta brevemente en este hilo:https://www.mql5.com/ru/forum/85652

hay algunos programadores muy buenos allí y hacen cosas como esta... bueno, tal vez esto te ayude a resolverlo más rápido

 

Sí, gracias.

Yo, recordando que había usado uno, había olvidado que se llamaba Propiedad, y estaba siendo obtuso al explicar lo que quería.

Se mencionó en los comentarios del artículo que se puede utilizar la sustitución de macros, me hizo pensar que tal vez adoptando una sintaxis estricta de acuerdo conmigo, se puede implementar un caso no tan común mucho más fácil.

 
class TestClass
{
  private:
    double cValue1;
    double cValue2;
    double cValue3;
    int cIndex;
    void _Set(double mValue);
  public:
    TestClass():cIndex(-1){}
    double Value1()
    {return cValue1;}

    TestClass* Value(int param)
    {
      cIndex=param;
      return &this;
    }
    void operator =(double mValue) {_Set(mValue);}
};
//---------------------------------------------
void TestClass::_Set(double mValue){
   switch(cIndex){
      case 1:  cValue1=mValue; break;
      case 2:  cValue2=mValue; break;
      case 3:  cValue3=mValue; break;
   }
   cIndex=-1;
}

void TestFunction()
{
  TestClass test;
  test.Value(1)=0.5;
  Print(test.Value1());
}

void OnStart(void)
  {
   TestFunction();
  }
Tal muleta puede ser retratada)
 
Vladimir Simakov:
Este es el tipo de muleta que se puede hacer)

Gracias, esta muletilla es evidentemente mucho más sencilla, aunque incluso eso sigo sin entenderlo todo.

¿Es imposible poner cualquier conjunto de caracteres en una macro sustitución? Algo así:

#define .<один любой набор символов>()=<второй любой набор символов> Set<один любой набор символов>(<второй любой набор символов>)
#define .<один любой набор символов>(par1)=<второй любой набор символов> Set<один любой набор символов>(par1,<второй любой набор символов>)
 
Aleksey Mavrin:

simplemente sobrecarga DoubleToString, si devuelve la cadena "EMPTY_VALUE" si no, llama a ::DoubleToString

No lo entiendo aquí.

 
Fast235:

No lo entiendo aquí.

pero por lo demás

#define DoubleToString(value,digits)  (value!=EMPTY_VALUE?DoubleToString(value,digits):"EMPTY_VALUE") 
 
Aleksey Mavrin:

pero por lo demás

en un caso raro, hacer y borrar la fuente para no volver a verla)


si el búfer fuera un búfer indicador, podría sustituirlo por EMPTY_VALUE

PlotIndexSetDouble(0,PLOT_EMPTY_VALUE,EMPTY_VALUE);

pero se desconoce el número de buffers
 

Por la tarde. Estoy tratando de adjuntar un stop loss leído desde el indicador atr a mi EA. Las variables de entrada son las siguientes.

  extern   ENUM_TIMEFRAMES   PeriodForWork_sl        =  PERIOD_H4;           // ТФ РАСЧЁТА ЗНАЧЕНИЙ СТОП ЛОСА ПО АТР
  extern double sl= 14; // ПЕРИОД АТR СТОП ЛОССА

Estoy añadiendo los valores atr a una variable para un stop loss.

sl=iATR( NULL,PeriodForWork_sl,sl,1);// ПОЛУЧЕНИЕ ЗНАЧЕНИЙ АТР ДЛЯ ВЫСТАВЛЕНИЯ СТОПЛОССА

Entonces intento abrir órdenes como esta.


OrderSend(Symbol(),OP_BUY,lot,Ask,slippages,Bid-sl*Point,Bid+tp*Point,"ДИВЕРГЕНЦИЯ НА БАЙ АО"); // ОТКРЫВАЕМ БАЙ ОРДЕР

Pero nada funciona. Imprimo el valor de la variable Stop Loss pero me informa que su valor es 0. ¿Qué estoy haciendo mal? ¿Dónde tengo que arreglarlo y ajustarlo para que funcione?

Razón de la queja: