Erros, bugs, perguntas - página 585

 
Posso utilizar os módulos de sinais comerciais separadamente dos EAs do Wizard? Para fins de teste, escrevi


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

Mas o que é mostrado em negrito não está na classe CSignalMA, mas compila bem, quando tento colocá-lo sobre o símbolo que dá


2011.11.29 15:36:27 1234 (EURUSD,M1) CExpertBase::Período: é proibida a alteração do prazo
2011.11.29 15:36:27 1234 (EURUSD,M1) CExpertBase::Símbolo: a mudança de símbolo é proibida

Como posso alterar o símbolo e o prazo dos sinais comerciais padrão?
Использование прямого и обратного преобразований Фишера для анализа рынков в MetaTrader 5
Использование прямого и обратного преобразований Фишера для анализа рынков в MetaTrader 5
  • 2011.08.16
  • investeo
  • www.mql5.com
Функция распределения рыночных данных не является гауссовой, скорее она похожа на распределение синусоподобной волны. Поскольку большинство индикаторов базируются на предположении о нормальном распределении цен, их нужно "скорректировать". Решением является использование преобразования Фишера, которое преобразует данные таким образом, чтобы они имели распределение, близкое к нормальному. В статье рассмотрена теория прямого и обратного преобразования Фишера и ее применение в трейдинге, разработан модуль торговых сигналов.
 
Konstantin83:
Posso utilizar os módulos de sinais comerciais separadamente dos EAs do Wizard? Para fins de teste, escrevi


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

Mas o que é mostrado em negrito não está na classe CSignalMA, mas compila bem, quando tento colocá-lo sobre o símbolo que dá


2011.11.29 15:36:27 1234 (EURUSD,M1) CExpertBase::Período: é proibida a alteração do prazo
2011.11.29 15:36:27 1234 (EURUSD,M1) CExpertBase::Símbolo: a mudança de símbolo é proibida

Como posso alterar o símbolo e o prazo para os sinais comerciais padrão?
Basicamente, pode. Mas inicializar o módulo de sinais comerciais é todo um "ritual". Receio não poder explicar todo o procedimento de inicialização "nos meus dedos".
 

O seguinte código:

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

Chama o construtor para etiqueta cada vez que a função é chamada.

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

Com o seguinte código: no primeiro caso o indicador está definido, no segundo caso não está (comutado com cortes).

#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()
 { }
 

A segunda opção desta biblioteca resulta 0. Todas as outras funções parecem funcionar.

#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()
 { 
 }
[Excluído]  
Karlson:

Para o código seguinte: no primeiro caso o indicador está definido, no segundo caso não está (comutado com cortes).

Tanto quanto sei, neste momento todos os três parâmetros são obrigatórios.

Portanto, deve especificar o número da janela (variantes: 0 - janela principal, ChartIndicatorsTotal() - nova janela, 0 aChartIndicatorsTotal()-1 - uma janela existente).

Isso é o que não dá erros não é bom.

Karlson:

Para esta biblioteca para a segunda opção, as saídas 0. Todas as outras funções parecem funcionar.

Provavelmente antes de se obter a actualização do preço deve ser utilizado (pelo menos RefreshRates).

A variante certa deve ter este aspecto

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

Obrigado. Funcionou realmente com Bid, depois de especificar refresh.

Mas a saída do indicador, usando a biblioteca, requer 2 parâmetros, uma subjanela e uma pega. Caso contrário, diz que o número de parâmetros está errado, não consigo perceber, porque a biblioteca usa o mesmo ChartIndicatorAdd.

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

Obrigado. Trabalhou com Bid, depois de especificar refresh.

Mas a saída do indicador, usando a biblioteca, requer 2 parâmetros, uma subjanela e uma pega. Caso contrário, diz que o número de parâmetros está errado. Não consigo perceber, porque a biblioteca usa o mesmo ChartIndicatorAdd, por isso funciona directamente, mas a chamada através da biblioteca não.

A utilização da biblioteca requer 2 parâmetros. Mapa e subjanela.
 
uncleVic:
A utilização da biblioteca requer 2 parâmetros. Mapa e subjanela.

Sem pega? E como é que o sistema saberá que mesa giratória utilizar? ... Até agora confiei no que está escrito :) O substrato e o cabo.

[Excluído]  
Karlson:

Sem pega? Como é que o sistema saberá qual o indicador a utilizar? Confiei nos textos até agora :) Subjanela e pega.

Sobre a biblioteca (da ajuda de classe)

IndicatorAdd

Adiciona um indicador com a asa especificada à janela do gráfico especificada.

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

Relativamente ao ChartIndicatorAdd direct work.

ChartIndicatorAdd

Adiciona um indicador com a asa especificada à janela do gráfico especificada.

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

Quanto à classe CChart.

A fim de evitar questões desnecessárias, tentamos seguir três regras básicas:

1. Olhamos para o código-fonte, se alguma coisa não estiver clara, referirmo-nos à documentação (o código-fonte dirá sempre a "verdade", mas a documentação também pode mentir);

2. Se a implementação do OOP é importante para nós, partimos da descrição de uma determinada classe e vamos até aos "implementadores directos". Se "trabalho real" é importante, o OOP deve ser estudado em último lugar (exame descendente/activo do código);

3. se depois de ler a documentação e as fontes algo não estiver claro, vá ao fórum.

Directamente sobre a implementação do método IndicatorAdd numa classe

Se olharmos para o código fonte, torna-se claro que o método fica subjanela e manuseamento (como referido na ajuda), e o terceiro parâmetro é retirado dos dados armazenados na própria classe (quero dizer o ID do gráfico).

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