Errori, bug, domande - pagina 585

 
Posso usare i moduli dei segnali di trading separatamente dagli EAs Wizard? A scopo di test, ho scritto


#include <Expert\Signal\SignalMA.mqh>


CSignalMA  SignalMA;
int        TickCount;
string     Str;

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
   TickCount=0;
 
   SignalMA.Symbol(Symbol());
   SignalMA.Period(PERIOD_H1);
   SignalMA.Weight(0.5);
 
   SignalMA.PeriodMA(20);
   SignalMA.Shift(0);
   SignalMA.Method(MODE_SMA);
   SignalMA.Applied(PRICE_CLOSE);

 
   return(0);
 
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
 
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
 
   TickCount++;
   Str = "LongCondition  = " + IntegerToString(SignalMA.LongCondition())+"; "+IntegerToString(TickCount)+ "\n";
   Str = Str + "ShortCondition = " + IntegerToString(SignalMA.ShortCondition())+"; "+IntegerToString(TickCount);
   Comment(Str);
 
  }
//+------------------------------------------------------------------+

Ma ciò che è mostrato in grassetto non è nella classe CSignalMA, ma compila bene, quando provo a metterlo sul simbolo dà


2011.11.29 15:36:27 1234 (EURUSD,M1) CExpertBase::Period: cambiare il timeframe è vietato
2011.11.29 15:36:27 1234 (EURUSD,M1) CExpertBase::Symbol: cambiare il simbolo è vietato

Come posso cambiare simbolo e timeframe per i segnali di trading standard?
Использование прямого и обратного преобразований Фишера для анализа рынков в MetaTrader 5
Использование прямого и обратного преобразований Фишера для анализа рынков в MetaTrader 5
  • 2011.08.16
  • investeo
  • www.mql5.com
Функция распределения рыночных данных не является гауссовой, скорее она похожа на распределение синусоподобной волны. Поскольку большинство индикаторов базируются на предположении о нормальном распределении цен, их нужно "скорректировать". Решением является использование преобразования Фишера, которое преобразует данные таким образом, чтобы они имели распределение, близкое к нормальному. В статье рассмотрена теория прямого и обратного преобразования Фишера и ее применение в трейдинге, разработан модуль торговых сигналов.
 
Konstantin83:
Posso usare i moduli dei segnali di trading separatamente dagli EAs Wizard? A scopo di test, ho scritto


#include <Expert\Signal\SignalMA.mqh>


CSignalMA  SignalMA;
int        TickCount;
string     Str;

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
   TickCount=0;
 
   SignalMA.Symbol(Symbol());
   SignalMA.Period(PERIOD_H1);
   SignalMA.Weight(0.5);
 
   SignalMA.PeriodMA(20);
   SignalMA.Shift(0);
   SignalMA.Method(MODE_SMA);
   SignalMA.Applied(PRICE_CLOSE);

 
   return(0);
 
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
 
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
 
   TickCount++;
   Str = "LongCondition  = " + IntegerToString(SignalMA.LongCondition())+"; "+IntegerToString(TickCount)+ "\n";
   Str = Str + "ShortCondition = " + IntegerToString(SignalMA.ShortCondition())+"; "+IntegerToString(TickCount);
   Comment(Str);
 
  }
//+------------------------------------------------------------------+

Ma ciò che è mostrato in grassetto non è nella classe CSignalMA, ma compila bene, quando provo a metterlo sul simbolo dà


2011.11.29 15:36:27 1234 (EURUSD,M1) CExpertBase::Period: cambiare il timeframe è vietato
2011.11.29 15:36:27 1234 (EURUSD,M1) CExpertBase::Symbol: cambiare il simbolo è vietato

Come posso cambiare il simbolo e il timeframe per i segnali di trading standard?
Fondamentalmente, è possibile. Ma l'inizializzazione del modulo dei segnali di trading è tutto un "rituale". Temo di non poter spiegare l'intera procedura di inizializzazione "sulle mie dita".
 

Il seguente codice:

RectLabel* GetLabel()
{
   static bool initialized = false;
   static RectLabel label("rectlabel sample", 0, 0);
   
   if (!initialized)
   {
      Pos leftTop = {100, 100};
      Rect rect(leftTop, 100, 50);
      
      label.Move(rect);
      label.SetBGColor(clrYellowGreen);
      label.SetTooltip(" -- Yuuuu! -- ");
      
      initialized = true;
   }

   return GetPointer(label);
}

Chiama il costruttore di label ogni volta che la funzione viene chiamata.

Документация по MQL5: Основы языка / Функции / Вызов функции
Документация по MQL5: Основы языка / Функции / Вызов функции
  • www.mql5.com
Основы языка / Функции / Вызов функции - Документация по MQL5
 

Con il seguente codice: nel primo caso l'indicatore è impostato, nel secondo caso no (scambiato con le barre).

#include <Charts\Chart.mqh>
CChart cc;
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int OnInit()
  {
   int f_h=iFractals(_Symbol,_Period);
   
   if (f_h==INVALID_HANDLE) {Print("Ошибка создания индикатора.");return(-1);}
   
   ChartIndicatorAdd(0,0,f_h);   // устанавливает индикатор
   
   //cc.IndicatorAdd(0,f_h);     // НЕ устанавливает индикатор
   
   if(GetLastError()>0) {Print("Ошибка  (",GetLastError(),") ");} ResetLastError();
   return(0);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnTick()
 { }
 

La seconda opzione di questa libreria produce 0. Tutte le altre funzioni sembrano funzionare.

#include <Trade\SymbolInfo.mqh>
CSymbolInfo si;
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int OnInit()
  {
   Print (SymbolInfoDouble("EURUSD",SYMBOL_BID)); // все правильно
   
   si.Name("EURUSD");
   Print (si.Bid());            // выводит 0
   
   if(GetLastError()>0) {Print("Ошибка  (",GetLastError(),") ");} ResetLastError();
   return(0);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnTick()
 { 
 }
 
Karlson:

Per il prossimo codice: nel primo caso l'indicatore è impostato, nel secondo caso non lo è (commutato con barre).

Per quanto ho capito, al momento tutti e tre i parametri sono obbligatori.

Pertanto, è necessario specificare il numero della finestra (varianti: 0 - finestra principale, ChartIndicatorsTotal() - nuova finestra, da 0 aChartIndicatorsTotal()-1 - una finestra esistente).

Ciò che non dà errori non è buono.

Karlson:

Per questa libreria per la seconda opzione stampa 0. Tutte le altre funzioni sembrano funzionare.

Molto probabilmente prima di ottenere il prezzo dovresti usare i refresh (almeno RefreshRates).

La variante giusta dovrebbe assomigliare a questa

  si.Name("EURUSD");
  si.Refresh();
  si.RefreshRates();
  Print(si.Bid());
 

Grazie, ha funzionato davvero con Bid, dopo aver specificato il refresh.

Ma l'uscita dell'indicatore, usando la libreria, richiede 2 parametri, una sottofinestra e un handle. Altrimenti dice che il numero di parametri è sbagliato, non riesco a capirlo, perché la libreria usa lo stesso ChartIndicatorAdd.

Документация по MQL5: Операции с графиками / ChartIndicatorAdd
Документация по MQL5: Операции с графиками / ChartIndicatorAdd
  • www.mql5.com
Операции с графиками / ChartIndicatorAdd - Документация по MQL5
 
Karlson:

Grazie, ha funzionato davvero con Bid, dopo aver specificato il refresh.

Ma l'uscita dell'indicatore, usando la libreria, richiede 2 parametri, una sottofinestra e un handle. Altrimenti dice che il numero di parametri è sbagliato, non riesco a capirlo, perché la libreria usa lo stesso ChartIndicatorAdd.

L'utilizzo della libreria richiede 2 parametri. Grafico e sottofinestra.
 
uncleVic:
L'utilizzo della libreria richiede 2 parametri. Grafico e sottofinestra.

Senza manico? E come farà il sistema a sapere quale giradischi usare? ...Finora mi sono fidato di ciò che è scritto :) Il substrato e la maniglia.

 
Karlson:

Senza manico? Come farà il sistema a sapere quale indicatore usare? Finora mi sono fidato dei testi :) Sottofinestra e maniglia.

Informazioni sulla biblioteca (dall'aiuto della classe)

IndicatoreAggiungi un appuntamento a

Aggiunge un indicatore con l'handle specificato alla finestra del grafico specificato.

bool  IndicatorAdd(
   int   sub_win         // номер подокна
   int   handle          // хэндл индикатора
   );

Per quanto riguarda il lavoro diretto di ChartIndicatorAdd.

ChartIndicatorAdd

Aggiunge un indicatore con l'handle specificato alla finestra del grafico specificato.

bool  ChartIndicatorAdd(
   long  chart_id,                 // идентификатор графика
   int   sub_window                // номер подокна
   int   indicator_handle          // хэндл индикатора
   );

Per quanto riguarda la classe CChart.

Per evitare domande inutili, cerchiamo di seguire tre regole fondamentali:

1. Guardiamo il codice sorgente, se qualcosa non è chiaro facciamo riferimento alla documentazione (il codice sorgente dirà sempre la "verità", ma la documentazione può anche mentire);

2. Se l'implementazione OOP è importante per noi, partiamo dalla descrizione di una classe particolare e arriviamo fino agli "implementatori diretti". Se il "lavoro reale" è importante, OOP dovrebbe essere studiato per ultimo (esame del codice verso il basso/alto);

3. se dopo aver letto la documentazione e le fonti qualcosa non è chiaro, andate nel forum.

Direttamente sull'implementazione del metodo IndicatorAdd in una classe

Se guardate il codice sorgente diventa chiaro che il metodo ottiene subwindow e handle (come notato nella guida), e il terzo parametro è preso dai dati memorizzati nella classe stessa (intendo l'identificatore del grafico).

class CChart : public CObject
  {
protected:
   long  m_chart_id; // chart identifier
public:
   //methods for working with indicators
   bool  IndicatorAdd(int subwin,int handle);
  }

bool CChart::IndicatorAdd(int subwin,int handle)
  {
//checking (проверка корректности идентификатора графика)
   if(m_chart_id<=0) return(false);
//Непосредственно в обработку выдаются три параметра
   return(ChartIndicatorAdd(m_chart_id,subwin,handle));
  }
Motivazione: