错误、漏洞、问题 - 页 585

 
我可以在Wizard EAs之外单独使用交易信号模块 吗?为测试目的,我写了


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

但黑体字显示的内容不在CSignalMA类中,但它编译得很好,当我试图把它放在符号上时,它给出的是


2011.11.29 15:36:27 1234 (EURUSD,M1) CExpertBase::Period: 禁止改变时间框架
2011.11.29 15:36:27 1234 (EURUSD,M1) CExpertBase::Symbol: 禁止更改符号。

我如何改变标准交易信号的符号和时间框架?
Использование прямого и обратного преобразований Фишера для анализа рынков в MetaTrader 5
Использование прямого и обратного преобразований Фишера для анализа рынков в MetaTrader 5
  • 2011.08.16
  • investeo
  • www.mql5.com
Функция распределения рыночных данных не является гауссовой, скорее она похожа на распределение синусоподобной волны. Поскольку большинство индикаторов базируются на предположении о нормальном распределении цен, их нужно "скорректировать". Решением является использование преобразования Фишера, которое преобразует данные таким образом, чтобы они имели распределение, близкое к нормальному. В статье рассмотрена теория прямого и обратного преобразования Фишера и ее применение в трейдинге, разработан модуль торговых сигналов.
 
Konstantin83:
我可以在Wizard EAs之外单独使用交易信号模块 吗?为测试目的,我写了


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

但黑体字显示的内容不在CSignalMA类中,但它编译得很好,当我试图把它放在符号上时,它给出的是


2011.11.29 15:36:27 1234 (EURUSD,M1) CExpertBase::Period: 禁止改变时间框架
2011.11.29 15:36:27 1234 (EURUSD,M1) CExpertBase::Symbol: 禁止更改符号。

我怎样才能改变标准交易信号的符号和时间框架?
基本上,你可以。但初始化交易信号模块是一个完整的 "仪式"。恐怕我无法解释整个初始化程序 "在我的手指上"。
 

下面的代码。

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

每次调用该函数 时,都会调用标签的构造函数。

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

通过以下代码:在第一种情况下,指标被设置,在第二种情况下,它没有被设置(用斜线切换)。

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

这个库中的第二个选项输出为0,其他功能似乎都能工作。

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

对于下一个代码:在第一种情况下,指标被设置,在第二种情况下,它不是(用斜线切换)。

据我所知,目前这三个参数都是强制性的。

因此,你必须指定窗口编号(变体:0-主窗口,ChartIndicatorsTotal() -新窗口,0到ChartIndicatorsTotal()-1-现有窗口)。

这就是不出错的原因,是不好的。

卡尔森

对于这个库来说,第二个选项的输出是0。 所有其他的功能似乎都能工作。

可能在获得价格刷新之前应该使用(至少是RefreshRates)。

右边的变体应该是这样的

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

谢谢你,在指定刷新后,它真的与Bid一起工作。

但是指标的输出,使用库,需要2个参数,一个子窗口和一个句柄。 否则它说参数的数量是错误的,我想不出来,因为库使用相同的ChartIndicatorAdd

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

谢谢你,在指定刷新后,它真的与Bid一起工作。

但是指标的输出,使用库,需要2个参数,一个子窗口和一个句柄。 否则它说参数的数量是错误的,我想不出来,因为库使用相同的ChartIndicatorAdd

使用该库需要2个参数。图表和子窗口
 
uncleVic:
使用该库需要2个参数。图表和子窗口

没有手柄?那么系统如何知道使用什么转盘呢? ......到目前为止,我一直相信所写的内容 :)基材和手柄。

 
Karlson:

没有手柄?系统将如何知道使用哪个指标? 到目前为止,我一直信任这些文本 :)子窗口和手柄。

关于图书馆(来自课堂帮助)

指示器添加

在指定的图表窗口中添加一个具有指定句柄的指标。

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

关于ChartIndicatorAdd 的直接工作。

图表指示器添加

在指定的图表窗口中添加一个具有指定句柄的指标。

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

至于CChart 类。

为了避免不必要的问题,我们试图遵循三个基本规则。

1.我们看源代码,如果有不清楚的地方就参考文档(源代码总是告诉我们 "真相",但文档也会撒谎)。

2.如果OOP的实现对我们来说很重要,我们就从某个特定的类的描述开始,一直到 "直接实现者"。如果 "实际工作 "很重要,OOP应该最后学习(对代码的向下/向上检查)。

3.如果在阅读了文件和资料后,有什么不清楚的地方,我们就到论坛去。

直接在类中实现IndicatorAdd方法

如果你看一下源代码,就会发现该方法获得了子窗口和句柄(如帮助中指出的),第三个参数来自于存储在类本身的数据(我指的是图形ID)。

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