Quaisquer perguntas de recém-chegados sobre MQL4 e MQL5, ajuda e discussão sobre algoritmos e códigos - página 1324

 
Yurij Kozhevnikov:

Obrigado, tal implementação me ocorreu, mas não é bem a mesma devido à ausência do próprio Valor1. Ou seja, o exemplo que eu criei é, naturalmente, extremamente simplificado, mas está implícito que este não é o valor principal da classe, que pode haver uma série de tais valores e que para cada uma dessas construções pode ser descrita.

Ou, para tal implementação, é possível descrever apenas uma classe ou estrutura separada na qual implementar a sobrecarga, e nesta classe descrever variáveis do tipo criado? Mas, se outras variáveis da classe estiverem envolvidas na operação de atribuição, então, novamente, ela não se soma.

Na verdade, eu queria implementar algo semelhante aos métodos Let/Set/Get em vbs.

Não entendo bem a pergunta, mas C++ / MQL não tem uma propriedade chave Propriedade

talvez você precise de uma classe modelohttps://www.mql5.com/ru/docs/basis/oop/class_templates


UPD: Aqui está um artigo sobre Habra sobre a mesma coisahttps://habr.com/ru/post/121799/ , mas duvido que se aplique "diretamente" à MQL

 

Muito obrigado!

Isto está um pouco além do meu conhecimento, porque nunca estudei C++, mas parece ser exatamente o que eu queria. Vou tentar descobrir.

 
Yurij Kozhevnikov:

Muito obrigado!

Isto está um pouco além do meu conhecimento, porque nunca estudei C++, mas parece ser exatamente o que eu queria. Vou tentar descobrir.

Tente formular sua pergunta brevemente neste tópico:https://www.mql5.com/ru/forum/85652

há lá programadores muito legais e eles fazem coisas assim... bem, talvez isso o ajude a descobrir mais rapidamente

 

Sim, obrigado.

Eu, lembrando que havia usado um, havia esquecido que se chamava Propriedade e estava sendo obtuso ao explicar o que eu queria.

Foi mencionado nos comentários ao artigo que você pode usar a substituição macro, me fez pensar que talvez ao adotar um acordo de sintaxe estrita comigo mesmo, você possa implementar um caso não tão comum muito mais 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();
  }
Uma muleta assim pode ser retratada)
 
Vladimir Simakov:
Este é o tipo de muleta que você pode fazer)

Obrigado, esta muleta é obviamente muito mais simples, embora mesmo com esta eu ainda não entenda tudo.

É impossível colocar qualquer conjunto de caracteres em uma macro substituição? Algo parecido com isto:

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

simplesmente sobrecarregar DoubleToString, se devolver a string "EMPTY_VALUE ". caso contrário, chamar ::DoubleToString

Eu não entendo isso aqui.

 
Fast235:

Eu não entendo isso aqui.

mas fora isso

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

mas fora isso

em um caso raro, faça e apague a fonte para que você não a veja novamente)


se o buffer fosse um buffer indicador, você poderia substituí-lo por EMPTY_VALUE

PlotIndexSetDouble(0,PLOT_EMPTY_VALUE,EMPTY_VALUE);

mas o número de amortecedores é desconhecido
 

Boa tarde. Estou tentando anexar um indicador de stop loss lido do atr ao meu EA. As variáveis de entrada são as seguintes.

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

Estou adicionando os valores atr a uma variável para um stop loss.

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

Então, tento abrir pedidos como este.


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

Mas nada funciona. Imprimo o valor da variável Stop Loss, mas ela diz que seu valor é 0. O que estou fazendo de errado e onde preciso afiná-lo para que funcione?

Razão: