Qualsiasi domanda da principiante, per non ingombrare il forum. Professionisti, non passate oltre. Da nessuna parte senza di te - 6. - pagina 886

 
evillive:

Perché dovrebbe esserci una variabile in più? Il controllo diretto funziona bene:

Una variabile dovrebbe essere creata quando si vuole vedere il valore di una funzione da diversi punti del programma, in modo da non doverla chiamare più volte.
La variabile è usata per facilitare la comprensione di un nuovo arrivato. È chiaro ora a cosa serve?
 
Vinin:
Fare il check-in più spesso. Ci saranno meno domande. Ci sarà una migliore conoscenza.
Ignorare.
 

Buon pomeriggio. Ho bisogno di chiudere in qualche modo una posizione a fine giornata (puramente Expert Advisor; barre giornaliere). La modellazione è per aperture o per zecche. Cioè o ci accontentiamo delle aperture o cadiamo sulla nostra testa cercando di analizzare i giorni precedenti su qualche timeframe di 15 minuti e cogliere l'inizio e la fine di quello attuale. Ci sono soluzioni a questo problema? Vedo diverse opzioni virtuali-ipotetiche:

1) Hacking: chiudere una posizione a qualsiasi prezzo e in qualsiasi momento. Supponiamo ingiusto, ma potremmo semplicemente chiudere la posizione al prezzo richiesto senza perversione.

2) Per simulare l'apertura e la chiusura in una barra. Cioè prima un tick aperto, poi un tick chiuso.

3) Impostare un ordine che si chiuda automaticamente a una certa ora (cioè a fine giornata).

Qualsiasi aiuto sarebbe apprezzato. Grazie.

 

Un bug?

int OnInit()
  {
   int subwindow = ChartWindowFind(ChartID(),WindowExpertName());
   Print("Подокно запрашиваемого индикатора: ",subwindow);
   
   return(INIT_SUCCEEDED);
  }

int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
   return(rates_total);
  }


2015.04.13 20:51:10.710 indi AUDJPY,H1: Sottoquadro indicatore richiesto: -1


 
tuner:

Un bug?


2015.04.13 20:51:10.710 indi AUDJPY,H1: Sottoquadro indicatore richiesto: -1


No, non è un bug.

Valore di ritorno.

Numero di sottofinestra in caso di successo. Zero indica la finestra principale del grafico. Restituisce -1 in caso di fallimento.

 
AlexeyVik:

No, non è un bug.


Qual è il fallimento se alla funzione viene passato l'ID del grafico corrente dove l'indicatore è in esecuzione e il nome dell'indicatore corrente che è in esecuzione sul grafico corrente?
 
tuner:
Qual è il fallimento se la funzione passa l'ID del grafico corrente, su cui l'indicatore è in esecuzione, e il nome dell'indicatore corrente che è in esecuzione sul grafico corrente?

Se ho capito bene e hai bisogno del numero della sottofinestra in cui funziona il tuo codice di prova dell'indicatore allegato, allora, in base alla descrizione della funzione, è meglio applicare la sua seconda versione.

Codice di prova (ho aggiunto alcune righe al tuo):

#define  LINE    __LINE__,": "
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
   int subwindow=ChartWindowFind(ChartID(),WindowExpertName());
   Print(LINE,"Подокно запрашиваемого индикатора: ",subwindow);
   
   int subwindow1=ChartWindowFind();
   Print(LINE,"Подокно запрашиваемого индикатора: ",subwindow1);

   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
   return(rates_total);
  }
//+------------------------------------------------------------------+

L'aiuto per la funzione ChartWindowFind() ha un buon esempio ancora su questo argomento (anche in termini di commenti):

//+------------------------------------------------------------------+
//| Сообщает номер окна графика с указанным индикатором              |
//+------------------------------------------------------------------+
int GetIndicatorSubWindowNumber(long chartID=0,string short_name="")
  {
   int window=-1;
//--- 
   if((ENUM_PROGRAM_TYPE)MQLInfoInteger(MQL_PROGRAM_TYPE)==PROGRAM_INDICATOR)
     {
      //--- функция вызвана из индикатора,имя не требуется
      window=ChartWindowFind();
     }
   else
     {
      //--- функция вызвана из эксперта или скрипта
      window=ChartWindowFind(0,short_name);
      if(window==-1) Print(__FUNCTION__+"(): Error = ",GetLastError());
     }
//---
   return(window);
  }
 
DiPach:

Se ho capito bene e hai bisogno del numero della sottofinestra in cui funziona il tuo codice di prova dell'indicatore allegato, allora, in base alla descrizione della funzione, è meglio applicare la sua seconda versione.

Codice di prova (ho aggiunto alcune righe al tuo):

L'aiuto della funzione ChartWindowFind() ha un buon esempio ancora su questo argomento (anche in termini di commenti):

Grazie per il suggerimento, ma ho un compito leggermente diverso, a causa del quale l'uso della seconda variante della funzione non ha senso: voglio contare il numero di indicatori con un nome specificato in tutti i grafici aperti del terminale. Il compito è già stato risolto, ma voglio semplificare il codice risultante usandoChartWindowFind() della prima variante ma si è scoperto che questa funzione non funziona non solo con altre finestre ma anche con quella corrente.
 

Buona sera!

Non riesco a capire: nella funzione di inizio, il compilatore richiede "return" - la funzione deve restituire un valore".

Quale valore deve ritornare in questo caso?

int start()
{
if (Ordini!=0||Ord > 0)
{
CritCloseBuy();
CritCloseSell();
}
else
{
CritOpen();
}
return;
}

Potrebbe essere questa la ragione per cui OrderClose() non vede una posizione aperta?

 
rapid_minus:

Buona sera!

Non riesco a capire: nella funzione di inizio, il compilatore richiede "return" - la funzione deve restituire un valore".

Quale valore deve ritornare in questo caso?

int start()

Può essere questa la ragione per cui OrderClose() non vede una posizione aperta?

fare void start() e non ci sarà alcun errore
Motivazione: