问吧! - 页 21

 
billworld2:
有没有一种方法可以根据对象名称中的选择文本字符串来删除对象?

下面是一个例子。

datetime currentDay = StrToTime(Year()+". "+Month()+". "+Day()+" 00.00")。

for(int i=0;i<ObjectsTotal();i++)

{

string name = ObjectName(i);

if( ObjectGet(name,OBJPROP_TIME1) < currentDay && ObjectGet(name,OBJPROP_TIME2) < currentDay && ObjectGet(name,OBJPROP_TIME3) < currentDay)

{

ObjectDelete(ObjectName(i))。

返回(false)。

}

}

return(true);

 
billworld2:
我的一个学习项目是去定制tester.tpl,它规定了策略测试器的图表显示选项。我发现默认的图表风格非常难以视觉化。因此,我创建了一个新的模板,然后建立了一个脚本,将所有的箭头替换成更有吸引力的箭头。

然而,我也想抓取箭头名称中的信息,并将其作为文本显示在图表上。箭头名称包括 "#62买入 "或 "73卖出收盘 "等内容。这样,你就可以在图表上看到某个特定的交易#进入/退出的确切时间。我不知道为什么Strategy Tester没有像其他平台(例如TradeStation)那样默认包含这个功能。

总之,我想抓取相关的文本,并在图表上现有的箭头下方插入新的文本对象。但是,我不知道如何完成这个任务。

我怎样才能做到这一点呢?

谢谢

比尔

好吧,你可以写脚本,或者用函数 来读取箭头信息,并在其下方制作文本标签。然后在每次绘制新箭头时运行该脚本。或者把这个函数放在EA的主函数的最后。我不知道为什么这种信息在metatrader中不是标准的,但要编写这种功能的代码很简单。

 
Kalenzo:
你应该阅读日期和时间函数,并使用iBarShift函数来获得指定时间框架内指定月份的第一个条形的移动。

我知道这对你来说一定是微不足道的。我只是根据有限的文件(没有提供很多例子)还没有理解。你能不能提供一个例子来说明如何做到这一点?

谢谢。

比尔

 
Kalenzo:
你可以写一个脚本,或者一个函数,用来读取箭头信息,并在其下方制作文本标签。然后在每次绘制新箭头时运行该脚本。或者把这个函数放在EA的主函数的最后。我不知道为什么这种信息在metatrader中不是标准的,但编写这种功能的代码很简单。

谢谢,但是,我具体卡在了如何编写脚本的问题上。如果你有时间提供一个简短的例子,那将是非常感激的。

再次感谢。

比尔

 

我不确定我是否理解。明确地说,我在寻找一种方法来进行基于对象名称的子串匹配。例如,我有一组对象,其中有"-206 "字符串(还有其他文本)。我想找到并删除所有名称中包含"-206 "的对象。

在下面的例子中,让我困惑的是与OBJPROP_TIME1、OBJPROP_TIME2和OBJPROP_TIME3的关联。我知道对象最多可以有三个时间坐标。我不明白这与我想做的事情有什么关系。

Kalenzo:
下面是这个例子。

datetime currentDay = StrToTime(Year()+". "+Month()+". "+Day()+" 00.00")。

for(int i=0;i<ObjectsTotal();i++)

{

string name = ObjectName(i);

if( ObjectGet(name,OBJPROP_TIME1) < currentDay && ObjectGet(name,OBJPROP_TIME2) < currentDay && ObjectGet(name,OBJPROP_TIME3) < currentDay)

{

ObjectDelete(ObjectName(i))。

返回(false)。

}

}

return(true)。
 
billworld2:
我不确定我是否理解。明确地说,我在寻找一种方法,基于对象名称进行子串匹配。例如,我有一组包含"-206 "字符串的对象(还有其他文本)。在下面的例子中,让我困惑的是与OBJPROP_TIME1, OBJPROP_TIME2和OBJPROP_TIME3的关联。我知道对象最多可以有三个时间坐标。我不明白这与我想做的事情有什么关系。

好的,试试这个。

for(int i=0;i<ObjectsTotal();i++)

{

string name = ObjectName(i);

如果(StringSubstr( name, 0, 3)==206)

{

ObjectDelete(ObjectName(i))。

}

}

如果对象名称的前3个字母是206,那么该对象将被删除。

 
billworld2:
谢谢,但是,我被卡住了,不知道该如何编写脚本。如果你有时间提供一个简短的例子,那将是非常感谢的。

再次感谢。

比尔

首先声明全局变量(脚本中的全局)int objectCount。

然后在EA结束时处理所有的对象(例如,你可以通过名字来搜索它们)

for(int i=0;i>=ObjectsTotal(OBJ_ARROW) ;i++)

{

//然后,如果对象的标签不存在,就把它画出来。

//现有箭头的名称,并给它加上L标签,以识别它。

如果(ObjectFind(ObjectName(i)+"L")==-1)

{

ObjectCreate(ObjectName(i)+"L",OBJ_ARROW,0,ObjectGet(ObjectName(i), OBJPROP_TIME1),ObjectGet(ObjectName(i), (OBJPROP_PRICE1+3*Point))。

// 这就是它

}

}

这只是一个例子,我还没有时间检查它可能存在的错误 ,但这应该是可行的,而且你现在知道正确的方法。

 

好的。明白了。我实际上需要使用StringFind()。谢谢你的指点!

#property show_inputs

extern string stringname="blah";

//+------------------------------------------------------------------+

//| 脚本程序启动功能|

//+------------------------------------------------------------------+

int start()

{

//----

for(int i=0;i<ObjectsTotal();i++)

如果(StringFind(ObjectName(i),stringname,0)>0)

{

ObjectDelete(ObjectName(i))。

}

Kalenzo:
好的,试试这个。

for(int i=0;i<ObjectsTotal();i++)

{

string name = ObjectName(i);

如果(StringSubstr( name, 0, 3)==206)

{

ObjectDelete(ObjectName(i))。

}

}

如果对象名称的前3个字母是206,那么该对象将被删除。
 

谢谢,但是,这不起作用。首先,我把 "i>=ObjectsTotal "改为 "i<=ObjectsTotal"(打字错误)。然后,我注意到你正在创建另一个箭头对象,我们想在那里创建一个新的文本对象,其中包括箭头对象的名称。总之,下面的代码正在创建一堆箭头(大约50个),都重叠在同一个坐标上。

在这个问题上我还是很迷茫。如果你有机会再看一下,那将是非常感激的。明确地说,我想创建一个新的文本对象,它被定位在每个现有的箭头对象下面,文本对象的文本描述等于箭头对象的名称。

账单

Kalenzo:
首先声明全局变量(脚本的全局) int objectCount;

然后在EA结束时处理所有的对象(例如,你可以通过名称搜索它们)

for(int i=0;i>=ObjectsTotal(OBJ_ARROW) ;i++)

{

//然后,如果对象的标签不存在,就把它画出来。

//现有箭头的名称,并给它加上L标签,以识别它。

如果(ObjectFind(ObjectName(i)+"L")==-1)

{

ObjectCreate(ObjectName(i)+"L",OBJ_ARROW,0,ObjectGet(ObjectName(i), OBJPROP_TIME1),ObjectGet(ObjectName(i), (OBJPROP_PRICE1+3*Point))。

// 这就是它

}

}

这只是一个例子,我还没有时间检查它可能存在的错误, ,但这应该是可行的,而且你现在知道正确的方法。
 

基于包含的对象删除

有没有一种方法可以根据对象名称 中的选择文本字符串来删除对象?

编辑:用Kalenzo的指针弄明白了。答案在212号帖子中。