来自一个 "傻瓜 "的问题 - 页 6

 
pusheax:

实际账户 中的一些DC为符号名称分配了各种前缀,如". "或 "FXF"。

我怎样才能使用这些前缀?

我这么做了。

#define DEF_SPEC "FXF"

string SymbolsTrade[] = {"AUDCAD" DEF_SPEC ...-不起作用

string SymbolsTrade[] = {"AUDCAD "+DEF_SPEC ...-它也不像那样工作

我得到的是FXF,而不是需要的AUDCADFXF。

你能告诉我如何实现这一点吗?


首先,只有在全局范围内才可以用枚举来填充数组,所以在这里没有+的作用,只有字符串常数。

其次,你的静态数组是不分布的,而动态数组不能用枚举来填充。

最简单的方法是写一个分配和填充动态数组的函数,它可以做任何事情,为常量添加定义,等等。

[删除]  
Urain:

首先,只有在全局范围内才可以用枚举来填充数组,所以在这里没有+的作用,只有字符串常数。

第二,你没有分布静态数组,而动态数组不能通过枚举来填充。

最简单的方法是写一个分配和填充动态数组 的函数,它可以做一切事情,用常量添加定义等。

你也可以尝试搜索BC/BROKER中存在的所有货币对,分析其中的复合货币。

之后,你可以创建一个动态的货币对阵列,同时考虑到添加任何前缀。

在我印象中,这是MT5的通用选项之一。

 
Urain:

首先,只有在全局范围内才可以用枚举来填充数组,所以在这里没有+的作用,只有字符串常数。

第二,你没有分布静态数组,而动态数组不能通过枚举来填充。

最简单的方法是写一个函数来分配和填充动态数组,它可以做任何事情,为常量添加定义,等等。

简而言之,如果我没有理解错的话,你不能在全局范围内创建一个复合常量的静态字符串数组,对吗?

 
uncleVic:

你可以在源代码中看到这些代码。有两种方法用于寻找分歧。

1.bool CSignalMACD::ExtState(int ind)方法为搜索数据做准备。

2.bool CSignalMACD::CompareMaps(int map,int count,bool minimax,int start)方法寻找一个具有指定参数的市场模型。

如果有帮助,这里有俄文的方法评论。

对于 bool CSignalMACD::ExtState(int ind) 方法来说

对于方法 bool CSignalMACD::CompareMaps(int map,int count,bool minimax,int start)

我还有一个问题--在使用MACD信号创建专家顾问 时,如何指定背离变量?在参考书中,有几种信号的变体。
 
strelec:
我还有一个问题,在使用MACD信号创建专家顾问 时,如何指定背离变量?手册中的信号有几种变体。

正如大家已经注意到的,任何信号 都可以检测到多种市场模式。要控制模式的 使用,可以调用PatternsUsage(int value)方法,其中值是模式使用的位图(位号和模式号相同)。位为1 - 使用模型,位为0 - 不使用模型(默认情况下所有位都是1)。模型以及比特的编号从0开始。

因此,如果你想只使用发散,你应该使用PatternsUsage(16);。为什么是16岁?16是二进制10000b(即第4位为1,其他所有位为0)。而只是 模型4 "震荡器和价格的背离"

唯一的 "但是",你将不得不 "手动 "完成它。

完成向导后,源代码将在编辑器中打开。在编辑器中找到这样的地方。

//--- Creating filter CSignalMACD
   CSignalMACD *filter0=new CSignalMACD;
   if(filter0==NULL)
     {
      //--- failed
      printf(__FUNCTION__+": error creating filter0");
      ExtExpert.Deinit();
      return(-3);
     }
   signal.AddFilter(filter0);
//--- Set filter parameters
   filter0.PeriodFast(Signal_MACD_PeriodFast);
   filter0.PeriodSlow(Signal_MACD_PeriodSlow);
   filter0.PeriodSignal(Signal_MACD_PeriodSignal);
   filter0.Applied(Signal_MACD_Applied);
   filter0.Weight(Signal_MACD_Weight);

并添加一行

filter0.PatternsUsage(16)。

你会得到它的。

//--- Creating filter CSignalMACD
   CSignalMACD *filter0=new CSignalMACD;
   if(filter0==NULL)
     {
      //--- failed
      printf(__FUNCTION__+": error creating filter0");
      ExtExpert.Deinit();
      return(-3);
     }
   signal.AddFilter(filter0);
//--- Set filter parameters
   filter0.PatternsUsage(16);
   filter0.PeriodFast(Signal_MACD_PeriodFast);
   filter0.PeriodSlow(Signal_MACD_PeriodSlow);
   filter0.PeriodSignal(Signal_MACD_PeriodSignal);
   filter0.Applied(Signal_MACD_Applied);
   filter0.Weight(Signal_MACD_Weight);

暂时就这些了。如果你有任何问题,请随时与我联系。

 
uncleVic:

正如大家已经注意到的,任何信号 都可以检测到多种市场模式。要控制图案 的使用,可以调用PatternsUsage(int value)方法,其中value是图案使用的位图(位号和图案号是一样的)。位为1 - 使用模型,位为0 - 不使用模型(默认情况下所有位都是1)。模型编号以及位数从0开始。

因此,如果你只想使用发散,你需要使用PatternsUsage(16);。为什么是16岁?16是10000b的二进制(即第4位为1,其他位为0)。而只是 模型4 "震荡器和价格的背离"

唯一的 "但是",你将不得不 "手动 "完成它。

完成向导后,源代码将在编辑器中打开。在编辑器中找到这样的地方。

并添加一行

filter0.PatternsUsage(16)。

你得到它。

暂时就这些了。如果你有任何问题,请随时与我联系。

谢谢你。明白了。而且马上就有更多的问题。在这种分歧的变体中,相邻的峰值(谷值)之间的时间间隔被考虑在内?
 
strelec:
谢谢你。它起作用了。而且马上就有更多的问题。在这种分歧的变体中,相邻的顶部(谷底)之间的时间间隔被考虑到了?
该区间不作分析。
 

我有一个专家,我试图用它来处理事件。

string event[10]=
{
"CHARTEVENT_KEYDOWN - событие нажатия клавиатуры, когда окно графика находится в фокусе",
"CHARTEVENT_OBJECT_CREATE — событие создания графического объекта",
"CHARTEVENT_OBJECT_CHANGE — событие изменения свойств объекта через диалог свойств",
"CHARTEVENT_OBJECT_DELETE — событие удаления графического объекта",
"CHARTEVENT_CLICK — cобытие щелчка мыши графике",
"CHARTEVENT_OBJECT_CLICK — событие щелчка мыши на графическом объекте, принадлежащего графику",
"CHARTEVENT_OBJECT_DRAG — событие перемещения графического объекта при помощи мыши",
"CHARTEVENT_OBJECT_ENDEDIT — событие окончания редактирования текста в поле ввода графического объекта LabelEdit",
"CHARTEVENT_CHART_CHANGE  — событие изменения графика",
"CHARTEVENT_CUSTOM+n — идентификатор пользовательского события, где n находится в диапазоне от 0 до 65535"
};
//+------------------------------------------------------------------+
//| ChartEvent function                                              |
//+------------------------------------------------------------------+
void OnChartEvent(const int id,
                  const long &lparam,
                  const double &dparam,
                  const string &sparam)
  {
   Print("id=(",id,") -- ",event[id],"  lparam=",lparam,"   dparam=",dparam,"   sparam=", sparam);
  }
//+------------------------------------------------------------------+

我得到的事件与行动并不对应。

准确地对应于对图表的点击和对按钮的点击

一个有争议的事件id=9(CHARTEVENT_CUSTOM) 它是在例如图表移位和有大约10个类似事件时产生的

没有检查CHARTEVENT_OBJECT_ENDEDIT 事件。

其他一切都不清楚。在手动创建对象时,要么描述与事件编号不匹配,要么创建对象的事件被错误地生成。

一般来说,请帮助。

 
kPVT:

我有一个专家,我试图用它来处理事件。

我得到的事件与行动并不对应。

准确地对应于对图表的点击和对按钮的点击

一个有争议的事件id=9(CHARTEVENT_CUSTOM) 它是在例如图表移位和有大约10个类似事件时产生的

没有检查CHARTEVENT_OBJECT_ENDEDIT 事件。

其他一切都不清楚。在手动创建对象时,要么描述与事件编号不匹配,要么创建对象的事件生成不正确。

总而言之,请大家帮忙。

你最初为已经分配的数字常数CHARTEVENT_XXXXXX...分配数字对应关系。

问题是这样的。

event[id]

你需要。

//--- нажатие мышкой на графическом объекте
   if(id==CHARTEVENT_OBJECT_CLICK)
     {
      Print("Нажатие кнопки мышки на объекте с именем '"+sparam+"'");
     }
//--- нажатие кнопки на клавиатуре
   if(id==CHARTEVENT_KEYDOWN)
     {
 
kPVT:

其余的就不清楚了。要么是描述与事件编号不匹配,要么是手动创建对象 时没有正确生成例如对象的事件。

不幸的是,你的问题并不清楚。究竟是什么出了问题?