我如何学习创建图形对象?MQL4。 - 页 2

 
barabashkakvn:
如果你知道你的点的时间和日期,你只需要调用bool TrendCreate()

谢谢你的建议。结果是比这更容易。

我是这样做的。

#property strict
#property script_show_inputs

//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
  long   chart_ID=0;        // ID графика
  string name="TrendLine";  // имя линии
  int    sub_window=0;      // номер подокна
//--- сбросим значение ошибки
   ResetLastError();
//--- создадим трендовую линию по заданным координатам
   if(!ObjectCreate(chart_ID,name,OBJ_TREND,sub_window,Time[41],1.0656,Time[65],1.0494))
     {
      Print(__FUNCTION__,
            ": не удалось создать линию тренда! Код ошибки = ",GetLastError());
      return;
     }
   
  }
//+------------------------------------------------------------------+

P.S. 我不明白的一点是,为什么例子中的数字是这样选择的。

InpDate1=35;        
InpPrice1=60;        
InpDate2=65;        
InpPrice2=40; 

从它们开始,趋势线就在范围的中间某处。

 
现在要解决的下一个问题是如何将这条线继续向右延伸,并获得EA中的线的值?
 
forexman77:

...

从他们那里,趋势线被放在范围的中间某处。

所以,这只是一个脚本,其主要任务是演示如何创建和使用OBJ_TREND对象。这些数字是为了清晰起见而采取的。
 
forexman77:
现在要解决的下一个问题是如何将这条线继续向右延伸,并获得EA中的线的值?

脚本代码里有这一切。

//+------------------------------------------------------------------+
//| Создает линию тренда по заданным координатам                     |
//+------------------------------------------------------------------+
bool TrendCreate(const long            chart_ID=0,        // ID графика
.
.
.
//--- включим (true) или отключим (false) режим продолжения отображения линии влево
   ObjectSetInteger(chart_ID,name,OBJPROP_RAY_LEFT,ray_left);
//--- включим (true) или отключим (false) режим продолжения отображения линии вправо
   ObjectSetInteger(chart_ID,name,OBJPROP_RAY_RIGHT,ray_right);
.
.
.
 
barabashkakvn:

脚本代码里有这一切。

1.当从测试器中调用时,交易被打开。如果我运行优化,到处都是零。当我启动任何优化运行时,交易都在那里。该怎么做?

2.如何使一个行在发生交易时被保存(在每个交易上),如果没有,则被删除?

  long   chart_ID=0;        // ID графика
  string name="TrendLine";  // имя линии
  int    sub_window=0;      // номер подокна
  ObjectDelete(chart_ID,name);
//--- сбросим значение ошибки
   ResetLastError();
//--- создадим трендовую линию по заданным координатам
   if(!ObjectCreate(chart_ID,name,OBJ_TREND,sub_window,Time[minbar],Low[minbar],Time[IPMIN],Low[IPMIN]))
     {
      Print(__FUNCTION__,
            ": не удалось создать линию тренда! Код ошибки = ",GetLastError());
      return(0);
     }
    ObjectSet("TrendLine",OBJPROP_TIME1,Time[minbar]);
    ObjectSet("TrendLine",OBJPROP_PRICE1,Low[minbar]);
    ObjectSet("TrendLine",OBJPROP_TIME2,Time[IPMIN]);
    ObjectSet("TrendLine",OBJPROP_PRICE2,Low[IPMIN]);

   if (IPMIN!=0){ double uroven= ObjectGetValueByTime(chart_ID,name,Time[1],sub_window);}
   
}
Print("uroven=",uroven);
if (Time[0] > b && Close[1] < uroven){Opn_B=true;}
 
你需要自己控制交易。但是,为了使每个交易都有自己的行,你需要在创建时给每个行一个独特的名字。
 
barabashkakvn:
交易需要由自己来控制。但是,为了使每个交易都有自己的行,你需要在创建时给每个行一个独特的名字。
如何?你能举个例子吗?
 
forexman77:
如何?我可以给你举个例子吗?
谁有例子,请帮忙。
 

测试期间的图形对象

在可视化测试中,专家顾问与真实图表进行互动。在正常的测试中,在没有可视化的情况下,专家顾问用一个没有渲染的 "虚拟 "图表进行操作;在这种情况下,一些微妙的情况是可能的。 当测试员处于优化模式时,不支持图形 对象。

两天的学习,结果发现不可能进行优化。

我想知道如果我创建一个指标。我是否能够通过它在我的专家顾问中获得线值?

谁必须说什么?也许,谁已经研究过这个问题了?

 
forexman77:

...

我想知道我是否可以做一个指标?我是否能够通过它获得EA中的线的价值?

...

如果指标创建了图形对象,然后获得它们的参数,则没有。

但通过使用指标来解决一切问题还是比较容易的。计算在指标中进行,其结果通过指标缓冲区显示。

还有一个选择。创建带有参数的全局变量而不是行,但这样一来,GetValueByShift()函数就不能工作了,你必须写出它的类似物。