Tutte le domande dei nuovi arrivati su MQL4 e MQL5, aiuto e discussione su algoritmi e codici - pagina 1324

 
Yurij Kozhevnikov:

Grazie, tale implementazione mi è venuta in mente, ma non è proprio la stessa a causa dell'assenza di Value1 stesso. Cioè, l'esempio che ho creato è, ovviamente, estremamente semplificato, ma è implicito che questo non è il valore principale della classe, che ci può essere un certo numero di tali valori e che per ognuno di essi può essere descritto un costrutto.

O per una tale implementazione, è possibile descrivere solo una classe o struttura separata in cui implementare l'overloading, e in questa classe descrivere le variabili del tipo creato? Ma, se altre variabili della classe sono coinvolte nell'operazione di assegnazione, allora di nuovo, i conti non tornano.

In realtà, volevo implementare qualcosa di simile ai metodi Let/Set/Get in vbs.

Non capisco bene la domanda, ma C++ / MQL non ha una proprietà chiave Proprietà

forse hai bisogno di una classe templatehttps://www.mql5.com/ru/docs/basis/oop/class_templates


UPD: Qui c'è un articolo su Habra sulla stessa cosahttps://habr.com/ru/post/121799/ , ma dubito che si applichi "direttamente" a MQL

 

Grazie mille!

È un po' al di là delle mie conoscenze, perché non ho mai studiato C++, ma sembra essere esattamente quello che volevo. Cercherò di capirlo.

 
Yurij Kozhevnikov:

Grazie mille!

È un po' al di là delle mie conoscenze, perché non ho mai studiato C++, ma sembra essere esattamente quello che volevo. Cercherò di capirlo.

Prova a formulare brevemente la tua domanda in questo thread:https://www.mql5.com/ru/forum/85652

ci sono dei programmatori davvero in gamba e fanno cose come questa... Beh, forse questo ti aiuterà a capirlo più velocemente

 

Sì, grazie.

Io, ricordando che ne avevo usato uno, avevo dimenticato che si chiamava Proprietà, ed ero stato ottuso nello spiegare ciò che volevo.

È stato menzionato nei commenti all'articolo che si può usare la sostituzione delle macro, mi ha fatto pensare che forse adottando un rigoroso accordo di sintassi con me stesso, si può implementare un caso non così comune molto più facilmente.

 
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();
  }
Una tale stampella può essere ritratta)
 
Vladimir Simakov:
Questo è il tipo di stampella che si può fare)

Grazie, questa stampella è ovviamente molto più semplice, sebbene anche con questa non capisco ancora tutto.

È impossibile mettere qualsiasi serie di caratteri in una sostituzione macro? Qualcosa del genere:

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

sovraccarica semplicemente DoubleToString, se restituisce la stringa "EMPTY_VALUE" altrimenti chiamare ::DoubleToString

Non capisco qui.

 
Fast235:

Non capisco qui.

ma per il resto

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

ma per il resto

in un caso raro, fare e cancellare la fonte in modo da non vederla più)


se il buffer fosse un buffer indicatore, potreste sostituirlo con EMPTY_VALUE

PlotIndexSetDouble(0,PLOT_EMPTY_VALUE,EMPTY_VALUE);

ma il numero di buffer è sconosciuto
 

Pomeriggio. Sto cercando di allegare uno stop loss letto dall'indicatore atr al mio EA. Le variabili di input sono le seguenti.

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

Sto aggiungendo i valori atr a una variabile per uno stop loss.

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

Poi cerco di aprire ordini come questo.


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

Ma niente funziona. Stampo il valore della variabile Stop Loss ma dice che il suo valore è 0. Cosa sto sbagliando e dove devo modificare per farlo funzionare?

Motivazione: