读取设置为图表的指标缓冲区 - 页 3

[删除]  
comp:

课题。

拼对了,你就会很高兴。
[删除]  
Dmitry Fedoseev:
那么?

启动指标,然后 - 专家顾问

#property strict

#define  PAUSE 100

sinput int BufferIndex = 0;     // Номер буфера индикатора
sinput bool TimerEvent = FALSE; // Использование события Timer

string IndicatorName;

string GetBetweenString( string &SourceString, const string BeginString, const string EndString = "" )
{
  string Str = SourceString;
  int Pos1 = 0;
  int Pos2 = 0;

  if (BeginString != "")
    Pos1 = StringFind(SourceString, BeginString);

  if (Pos1 >= 0)
  {
    Pos1 += StringLen(BeginString);

    Pos2 = StringFind(SourceString, EndString, Pos1);

    if (Pos2 != Pos1)
      Str = StringSubstr(SourceString, Pos1, Pos2 - Pos1);
    else
      Str = "";
  }

  SourceString = StringSubstr(SourceString, Pos2 + StringLen(EndString));

  return(Str);
}

string FileToString( const string FileName )
{
  string Res = "";

  const int handle = FileOpen(FileName, ::FILE_READ|::FILE_BIN);

  if (handle != INVALID_HANDLE)
  {
    uchar Array[];

    FileReadArray(handle, Array);

    Res = CharArrayToString(Array);

    FileClose(handle);
  }

  return(Res);
}

string GetIndicatorName( const long Chart_ID = 0 )
{
  string Res = "";

  const string FileName = ::WindowExpertName() + ".tpl";

  if (ChartSaveTemplate(Chart_ID, "..\\MQL4\\Files\\" + FileName))
  {
    string Str = FileToString(FileName);

    if (StringFind(Str, "name=Custom Indicator") > 0)
      Res = GetBetweenString(Str, "<indicator>\r\nname=Custom Indicator\r\n<expert>\r\nname=", "\r\n");
  }

  return(Res);
}

string GetIndicatorString( const int Pos = -1 )
{
  static int PrevPos = 0;

  if (Pos != -1)
    PrevPos = Pos;

  const string Str = ((PrevPos < 0) || (IndicatorName == "")) ? "" : IndicatorName + "[" + (string)BufferIndex + "][" + (string)PrevPos + " - " + (string)Time[PrevPos] +
                                                                     "] = " + (string)iCustom(Symbol(), Period(), IndicatorName, BufferIndex, Pos);
  return(Str);
}

void OnInit( void )
{
  IndicatorName = GetIndicatorName();

  ChartSetInteger(0, CHART_EVENT_MOUSE_MOVE, TRUE);

  if (TimerEvent)
    EventSetMillisecondTimer(PAUSE);

  return;
}

void OnDeinit( const int reason )
{
  if (TimerEvent)
    EventKillTimer();

  Comment("");

  return;
}

void OnTimer( void )
{
  Comment(GetIndicatorString());

  return;
}

void OnChartEvent( const int id, const long& lparam, const double& dparam, const string& sparam )
{
  if (id == CHARTEVENT_MOUSE_MOVE)
  {
    datetime time;
    double price;
    int SubWindow;

    ChartXYToTimePrice(0, (int)lparam, (int)dparam, SubWindow, time, price);
    const int Pos = iBarShift(Symbol(), Period(), time, TRUE);

    Comment(GetIndicatorString(Pos));
  }

  return;
}

你注意到指标的缓冲值(CTRL+D)与iCustom值不一致(它们被打印在专家顾问的图表注释中)。

在我们的测试中,iCustom将给出EMPTY_VALUE或零。

 

已检查。不是不匹配,而是根本不存在。相当酷。

 
comp:

从沉默来看,自从这个问题在第四个论坛上公开宣布以来,已经有七年多的时间了(google记得),开发者还没有创建一个功能。

由于某些原因,他们仍然不能从图表中对指标数据进行人工读出!这 听起来很疯狂,但确实如此。

问题出在问题陈述中。

你只是把指标用于错误的目的。它们的设计不是为了定时和对事件作出反应,而是为了经济地重新制作时间序列。

从另一个角度来处理你的任务,你会发现一个很好的和经济的解决方案。

 
这不是读取缓冲区的问题,而是通过iCustom()调用的指标没有计时器,也没有图表事件。
 
Dmitry Fedoseev:
这不是读取缓冲区的问题,而是通过iCustom()调用的指标没有计时器,也没有图表事件。

它们是用来做什么的?

嗯,说真的,为了什么?

 
Andrey Khatimlianskii:

它们是用来做什么的?

嗯,说真的,为什么?

我不需要它。但在这里,有人需要它,事实证明。
[删除]  
Andrey Khatimlianskii:

问题出在问题陈述中。

你只是将指标用于错误的目的。它们的设计不是为了定时和对事件作出反应,而是为了经济地重做时间序列。

从另一个角度来处理你的任务,你会发现一个很好的和经济的解决方案。

做出这样的声明,就像一记重锤敲在头上。我决定在kodobase中寻找指标。我还没有发现任何使用通常的方法:事件驱动模型+OOP。

很难说什么更重要:对这种状况的挫折感或失望感。事实证明,指标必须以原始方式书写。

是否有人在指标中使用事件模型+OOP?

好吧,这仍然不能否定你不能以编程方式获得你在图表上用眼睛看到的东西的困惑!

[删除]  
在用iCustom编写测试专家顾问 时,我遇到了一个无法解决的MQL问题。要知道指标的文件名(见代码)和输入参数的值--没有问题。但之后就不可能将指标的输入参数插入到iCustom中。iCustom的叫法是,任何指标的通用解决方案只适合在默认输入参数的情况下使用。否则我们就得进入代码。这种解决方案并不方便。我们可以将指标输入作为一个带有适当字符串字段的结构来传递。但我们使用了省略号,这就扼杀了该呼吁的普遍性。又是一个奇怪的限制!
 
comp:

做出这样的声明,就像在头上踢了一脚。我决定在kodobase中寻找指标。我还没有找到任何使用我习惯的东西:事件驱动模型+OOP。

很难说什么更重要:对这种状况的挫折感或失望感。事实证明,指标必须以原始方式书写。

是否有人在指标中使用事件模型+OOP?

好吧,这仍然不能否定你不能以编程方式获得你在图表上用眼睛看到的东西的困惑!

为什么?一切都已经在我们面前被偷走了,有OnCalculate函数--tick事件。如果你想使用OOP--使用它,但它是为了什么,把它放在哪里?