Erreurs, bugs, questions - page 585

 
Puis-je utiliser les modules de signaux de trading séparément des EAs Wizard ? À des fins de test, j'ai écrit


#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);
 
  }
//+------------------------------------------------------------------+

Mais ce qui est montré en gras n'est pas dans la classe CSignalMA, mais il compile bien, quand j'essaie de le placer sur le symbole, il donne


2011.11.29 15:36:27 1234 (EURUSD,M1) CExpertBase::Period : le changement d'horizon temporel est interdit
2011.11.29 15:36:27 1234 (EURUSD,M1) CExpertBase::Symbol : le changement de symbole est interdit

Comment modifier le symbole et l'horizon temporel des signaux de trading standard ?
Использование прямого и обратного преобразований Фишера для анализа рынков в MetaTrader 5
Использование прямого и обратного преобразований Фишера для анализа рынков в MetaTrader 5
  • 2011.08.16
  • investeo
  • www.mql5.com
Функция распределения рыночных данных не является гауссовой, скорее она похожа на распределение синусоподобной волны. Поскольку большинство индикаторов базируются на предположении о нормальном распределении цен, их нужно "скорректировать". Решением является использование преобразования Фишера, которое преобразует данные таким образом, чтобы они имели распределение, близкое к нормальному. В статье рассмотрена теория прямого и обратного преобразования Фишера и ее применение в трейдинге, разработан модуль торговых сигналов.
 
Konstantin83:
Puis-je utiliser les modules de signaux de trading séparément des EAs Wizard ? À des fins de test, j'ai écrit


#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);
 
  }
//+------------------------------------------------------------------+

Mais ce qui est montré en gras n'est pas dans la classe CSignalMA, mais il compile bien, quand j'essaie de le placer sur le symbole, il donne


2011.11.29 15:36:27 1234 (EURUSD,M1) CExpertBase::Period : le changement d'horizon temporel est interdit
2011.11.29 15:36:27 1234 (EURUSD,M1) CExpertBase::Symbol : le changement de symbole est interdit

Comment puis-je changer le symbole et la période de temps pour les signaux de trading standard ?
En gros, vous pouvez. Mais l'initialisation du module des signaux de trading est un tout autre "rituel". Je crains de ne pas pouvoir expliquer toute la procédure d'initialisation "sur mes doigts".
 

Le code suivant :

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);
}

Appelle le constructeur de l'étiquette à chaque fois que la fonction est appelée.

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

Avec le code suivant : dans le premier cas, l'indicateur est activé, dans le second cas, il ne l'est pas (commutation avec des barres obliques).

#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 deuxième option de cette bibliothèque produit 0. Toutes les autres fonctions semblent fonctionner.

#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:

Pour le code suivant : dans le premier cas, l'indicateur est activé, dans le deuxième cas, il ne l'est pas (commutation avec des barres obliques).

D'après ce que j'ai compris, pour l'instant, les trois paramètres sont obligatoires.

Par conséquent, vous devez spécifier le numéro de la fenêtre (variantes : 0 - fenêtre principale, ChartIndicatorsTotal() - nouvelle fenêtre, 0 àChartIndicatorsTotal()-1 - une fenêtre existante).

Ce qui ne donne pas d'erreurs n'est pas bon.

Karlson:

Pour cette bibliothèque, la deuxième option imprime 0. Toutes les autres fonctions semblent fonctionner.

Avant d'obtenir le prix, vous devriez probablement utiliser les rafraîchissements (au moins les RefreshRates).

La bonne variante devrait ressembler à ceci

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

Merci. Cela a vraiment fonctionné avec Bid, après avoir spécifié le rafraîchissement.

Mais la sortie de l'indicateur, en utilisant la bibliothèque, nécessite 2 paramètres, une sous-fenêtre et un handle. Sinon, il est dit que le nombre de paramètres est incorrect, je n'arrive pas à comprendre, car la bibliothèque utilise le même ChartIndicatorAdd.

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

Merci. Cela a vraiment fonctionné avec Bid, après avoir spécifié le rafraîchissement.

Mais la sortie de l'indicateur, en utilisant la bibliothèque, nécessite 2 paramètres, une sous-fenêtre et un handle. Sinon, il est dit que le nombre de paramètres est incorrect, je n'arrive pas à comprendre, car la bibliothèque utilise le même ChartIndicatorAdd.

L'utilisation de la bibliothèque nécessite 2 paramètres. Graphique et sous-fenêtre.
 
uncleVic:
L'utilisation de la bibliothèque nécessite 2 paramètres. Graphique et sous-fenêtre.

Sans poignée ? Et comment le système saura-t-il quelle platine utiliser ? ... Jusqu'à présent, j'ai fait confiance à ce qui est écrit :) Le substrat et la poignée.

 
Karlson:

Sans poignée ? Comment le système saura-t-il quel indicateur utiliser ? J'ai fait confiance aux textes jusqu'à présent :) Sous-fenêtre et poignée.

À propos de la bibliothèque (extrait de l'aide de la classe)

IndicateurAjouter

Ajoute un indicateur avec la poignée spécifiée à la fenêtre graphique spécifiée.

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

En ce qui concerne le travail direct de ChartIndicatorAdd.

ChartIndicatorAdd

Ajoute un indicateur avec la poignée spécifiée à la fenêtre graphique spécifiée.

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

Quant à la classe CChart.

Afin d'éviter les questions inutiles, nous essayons de suivre trois règles de base :

1. Nous regardons le code source, si quelque chose n'est pas clair, nous nous référons à la documentation (le code source dira toujours la "vérité", mais la documentation peut aussi mentir) ;

2. Si l'implémentation de la POO est importante pour nous, nous partons de la description d'une classe particulière et allons jusqu'aux "implémenteurs directs". Si le "vrai travail" est important, la POO devrait être étudiée en dernier (examen du code de bas en haut) ;

3. si après avoir lu la documentation et les sources, quelque chose n'est pas clair, allez sur le forum.

Directement sur l'implémentation de la méthode IndicatorAdd dans une classe

Si vous regardez le code source, il est clair que la méthode obtient la sous-fenêtre et le handle (comme indiqué dans l'aide), et le troisième paramètre est pris dans les données stockées dans la classe elle-même (je veux dire l'identifiant du graphique).

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));
  }