Domande dai principianti MQL5 MT5 MetaTrader 5 - pagina 1384

 

leonerd #:
Здравствуйте. А как программно узнать символ и таймфрейм активного чарта в клиентском терминале? Т.е. чарта выбранного в настоящее время во вкладке. Есть какая-то функция из MQL5 для этого?

long  ChartGetInteger(
   long  chart_id,          // идентификатор графика
   int   prop_id,           // идентификатор свойства
   int   sub_window=0       // номер подокна, если требуется
   );

PORTA IL GRAFICO IN ALTO

Visualizza il grafico in cima a tutti gli altri grafici

bool


string  ChartSymbol(
   long  chart_id=0      // идентификатор графика
   );
ENUM_TIMEFRAMES  ChartPeriod(
   long  chart_id=0      // идентификатор графика
   );

Come si fa a definire un identificatore di grafico da mostrare?

Документация по MQL5: Операции с графиками
Документация по MQL5: Операции с графиками
  • www.mql5.com
Операции с графиками - Справочник MQL5 - Справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
Alexey Viktorov #:

PORTA IL GRAFICO IN ALTO

Visualizza il grafico in cima a tutti gli altri grafici

bool


Come si definisce un ID del grafico da mostrare?

https://www.mql5.com/ru/docs/constants/chartconstants/charts_samples#chart_foreground

Grazie. CHART_FOREGROUND è probabilmente il più adatto. Non ho bisogno di impostare forzatamente il grafico attivo, ho solo bisogno di determinare quale è attivo. Ho ragione a pensare che dovrò passare attraverso tutti i grafici aperti controllando CHART_FOREGROUND?

Документация по MQL5: Константы, перечисления и структуры / Константы графиков / Примеры работы с графиком
Документация по MQL5: Константы, перечисления и структуры / Константы графиков / Примеры работы с графиком
  • www.mql5.com
Примеры работы с графиком - Константы графиков - Константы, перечисления и структуры - Справочник MQL5 - Справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
leonerd #:

https://www.mql5.com/ru/docs/constants/chartconstants/charts_samples#chart_foreground

Grazie. CHART_FOREGROUND è probabilmente il più adatto. Non è che ho bisogno di impostare forzatamente il grafico attivo, ma solo di identificare quello che è attivo. Ho capito bene che devo passare attraverso tutti i grafici aperti controllando CHART_FOREGROUND?

CHART_FOREGROUND è un grafico in alto.

E per non farlo rispettare, dovreste sostituire ChartSetInteger con ChartGetInteger

 

Buon pomeriggio.
Puoi darmi un suggerimento - sto pensando a un robot e ci sono quattro diverse condizioni - non so ancora quali rimuovere: voglio scoprirlo più tardi quando ottimizzo per diversi timeframe.

Cioè: quattro condizioni (f1,f2,f3,f4). Ci possono essere molte combinazioni (0,0,1,1) o (1,0,1,0) e così via - un totale di 16 combinazioni. Esattamente 15 - la variante (0, 0, 0, 0) non viene considerata.

Domanda: come creare la logica del programma per non descrivere tutte le 15 combinazioni nel codice. C'è una funzione per controllare ciascuna di queste condizioni, e in quali combinazioni di queste condizioni si applicano - controlla come altro.

Sarei felice se potessi mostrarmi qualche Expert Advisor, che mi permette di inserire molte condizioni in un codice conciso.

 
qadexys #:

Buon pomeriggio.
Puoi darmi un suggerimento - sto pensando a un robot e ci sono quattro diverse condizioni - non so ancora quali rimuovere: voglio scoprirlo più tardi quando ottimizzo per diversi timeframe.

Cioè: quattro condizioni (f1,f2,f3,f4). Ci possono essere molte combinazioni (0,0,1,1) o (1,0,1,0) e così via - un totale di 16 combinazioni. Più precisamente 15 - la variante (0, 0, 0, 0) non è considerata.

Domanda: come creare la logica del programma per non descrivere tutte le 15 combinazioni nel codice. C'è una funzione per controllare ciascuna di queste condizioni, e in quali combinazioni di queste condizioni si applicano - controlla come altro.

Sarei felice se mi mostrassi qualche Expert Advisor, che mi permette di introdurre condizioni multiple in un codice conciso.

Potrei andare così:

input bool F1;
input bool F2;
input bool F3;
input bool F4;

   ...
   if(  ( !F1 || f1)
      &&( !F2 || f2)
      &&( !F3 || f3)
      &&( !F4 || f4)
     )
     {
      open_pos();
     }
   ...

O qualcosa del genere:

#define  MODE_f1    0x1
#define  MODE_f2    0x2
#define  MODE_f3    0x4
#define  MODE_f4    0x8

bool expert::create_strategy(ulong m, int om, int cm)
  {
   magic=m;
   open_mode=om;
   close_mode=cm;
   ...
  }

int OnInit()
  {
   ...
   my_strat[i].create_strategy(MAGIC, MODE_f1|MODE_f2|MODE_f4,MODE_c2|MODE_c3);
   ...
  }

expert::check_open()
  {
   ...
   if(  ((open_mode & MODE_f1)==0 || f1)
      &&((open_mode & MODE_f2)==0 || f2)
      &&((open_mode & MODE_f3)==0 || f3)
      &&((open_mode & MODE_f4)==0 || f4)
     )
     {
      open_pos();
     }
   ...
  }
 
Alexey Viktorov #:

CHART_FOREGROUND è il grafico in alto

E per non forzarlo, sostituite ChartSetInteger con ChartGetInteger

grazie

 
JRandomTrader #:

Si potrebbe fare così:

O qualcosa del genere:

Ed ecco la prima costruzione - quale sarebbe il comportamento del codice nelle condizioni (0, 1, 0, 1)?

Potresti spiegare il corpo della condizione If

 
qadexys #:

Ed ecco la prima costruzione - quale sarebbe il comportamento del codice nelle condizioni (0, 1, 0, 1)?

Potresti spiegare il corpo della condizione Se

Qui è molto semplice. Se F1==falso, allora ( !F1 || f1) sarà vero indipendentemente dalla condizione f1.

Cioè, se Fn==vero, la condizione fn viene controllata, e se Fn==falso, la condizione fn non viene controllata.

Di conseguenza, per (0, 1, 0, 1) solo le condizioni f2 e f4 saranno controllate, e se entrambe sono valide, il codice open_pos() sarà eseguito

 
JRandomTrader #:

Questo è molto semplice. Se F1==falso, allora ( !F1 || f1) sarà vero indipendentemente dalla condizione f1.

Cioè, se Fn==vero, la condizione fn viene controllata, e se Fn==falso, la condizione fn non viene controllata.

Corrispondentemente, per (0, 1, 0, 1) solo le condizioni f2 e f4 saranno controllate, e se entrambe sono valide, il codice open_pos() sarà eseguito

Ma per il caso in cui f1 e gli altri non sono solo 0 o 1. Pensavo che se la condizione f1 è soddisfatta per una posizione corta, allora ne viene restituita una. Se è per una posizione lunga, restituisce 2. Se la condizione non è affatto soddisfatta - 0.

Ma in una tale costruzione probabilmente non dovremmo contare su una tale varietà di valori dei parametri e formulare la condizione in qualche altro modo?

 
qadexys #:

Ma per il caso in cui f1 e gli altri non sono solo 0 o 1. Pensato che se la condizione f1 è soddisfatta per la posizione corta, allora viene restituito uno. Se per una posizione lunga restituisce 2. Se la condizione non è affatto soddisfatta - 0.

Ma forse non dovremmo contare su una tale diversità di valori dei parametri in questo costrutto e formulare la condizione in qualche altro modo, vero?

Gli insiemi di condizioni per l'apertura lunga e corta sono considerati separatamente.

Voglio dire, per esempio, così:

 ...
   if(  ( !F1 || f1==1 )
      &&( !F2 || f2==1 )
      &&( !F3 || f3==1 )
      &&( !F4 || f4==1 )
     )
     {
      open_short();
     }
   else if(  ( !F1 || f1==2 )
           &&( !F2 || f2==2 )
           &&( !F3 || f3==2 )
           &&( !F4 || f4==2 )
          )
     {
      open_long();
     }
 ...

Venderò anche un pezzo del mio codice reale - non rivelerà alcun know-how senza informazioni sui valori "da battaglia" delle variabili e sulle condizioni di tenuta delle posizioni.

Qui si può effettivamente specificare una delle 224 opzioni:

   if(true
      && ((OpenMode & MODE_St1)==0 || St_Buf[St_Rq-1]>80)
      && ((OpenMode & MODE_St2)==0 || St_Buf2[St_Rq-1]>80)
      && ((OpenMode & MODE_BB1)==0 || last_tick.bid > bb[BandsReq-1].U)
      && ((OpenMode & MODE_BB2)==0 || last_tick.bid > bb2[BandsReq-1].U)
      && ((OpenMode & MODE_D1)==0  || rt[RtReq-1].high<rt[RtReq-2].high) 
     )
     {
      switch(OpenMode & (MODE_VR|MODE_OR|MODE_A))
        {
         case 0 :
         case MODE_A :
           res=-2;
           break;
         case MODE_VR :
           if((1/VR)>VRO)
             res=-2;
           break;
         case MODE_OR :
           if((1/OR)>VRO)
             res=-2;
           break;
         case MODE_VR|MODE_A :
           if((1/AVR)>VRO)
             res=-2;
           break;
         case MODE_OR|MODE_A :
           if((1/AOR)>VRO)
             res=-2;
           break;
         case MODE_VR|MODE_OR :
           if((1/VR)>VRO && (1/OR)>VRO)
             res=-2;
           break;
         case MODE_VR|MODE_OR|MODE_A :
           if((1/AVR)>VRO && (1/AOR)>VRO)
             res=-2;
           break;
        }