专家顾问 - 杂项问题 - 页 13

 

你可以这样写一个函数

void DrawLabel(string name, string text, int x, int y, int fontsize=10)

如果你调用它而不输入最终值,将使用默认值,即字体大小将是10

DrawLabel("MyLabel","Hello,World!",50,50); // final parameter not passed (default value used)

或者你可以明确地覆盖默认的字体大小 值。

DrawLabel("MyLabel","Hello,World!",50,50,24); // fontsize parameter is 24

这是你的意思吗?

 
honest_knave:

你是这个意思吗?

也许我的英语水平无法理解你的评论。
谢谢你的评论。
如果我没有理解错的话,我是这样理解你的。我可以为Label写1个Void函数,我可以用以下两种方法来使用它。(我可以用一个虚函数来处理带字体大小参数和不带字体大小参数的标签对象这样做对吗?)

DrawLabel("MyLabel","Hello,World!",50,50);    // #1
DrawLabel("MyLabel","Hello,World!",50,50,24); // #2

所以,我想说的是,我花了几个小时来研究这个电子表格对象,这个问题是怎么来的,我怎么才能解决它
所以,我觉得问题来自下面的代码,而不是来自Label函数,因为我有2个Label函数,我去掉了其中一个,买入和卖出价格指标(市场价格)仍然运行良好,但Spreadsheet不能使用Label函数。在没有Label函数的情况下,电子表格运行良好。

我需要分享电子表格中的一些代码。我怀疑下面的代码。(甚至--我需要再次提到,当我为电子表格创建没有Label功能的Label对象时,下面的代码工作得很好)

double  spread                                                 ;
        spread       = MarketInfo  ( symbol, MODE_SPREAD ) / 10;
        spreadstring = DoubleToStr ( spread, 1           )     ;

谢谢你所做的一切。

 

这是一个很好的做法,可以验证你试图创建的东西是否真的被创建。

例如,当涉及到屏幕尺寸时,许多用户使用不同的分辨率,无论什么原因,当创建的对象超过了图表宽度或高度的界限时,该对象就不会被绘制,或者消失。

或者,例如错误4200会显示你试图创建的对象已经存在。

如果你想给你的对象分配不同的值,这很重要,如果创建失败,新的值将不会被分配。

这就是为什么这些函数会返回一个值,以便你可以检查创建是否成功。

检查函数是否成功由你决定,但一个好的编码员会检查结果。

如果你写一个无效函数,它不会返回任何东西,所以你不能通过分析你调用它时返回的东西来检查结果。

但你也可以简单地在函数本身进行检查,并在出错时发出一个简单的警报。

如果你这样做,那么你就不会正常地看到这些警报,但只要出了问题,它就会立即把你指向问题本身。


对于第二个问题,你很多时候可以省略至少一些参数,如果你这样做,那么函数将承担默认值。

因此,除非你需要或想要转移标准参数,否则你要指定它们。

字体大小是一个很好的例子,当你不指定它时,它将简单地使用默认设置。

另外,某些对象之间也有细微的差别,这在分析传递给函数的参数时可以看到。

它们并不都是共享同一组变量,所以看一下什么可以和什么不可以作为引用传递是很重要的。

我不确定你想用传播线做什么,也许你可以多解释一下它的用途,以及你想如何使用它?

 
Marco vd Heijden:

我不确定你想用点差字符串做什么,也许你可以多解释一下它的用途,以及你想如何使用它?

我使用标签对象功能,用于出价要价电子表格 等。一切工作都很完美,没有电子表格- 我删除并重写它,没有好的效果。

在我使用@honest_knave 方法的错误代码进行错误描述后。我没有 看到任何 警告4200。
正如我提到的,我在两个地方使用了'Spreadsheet',#1 在Init()函数中,#2 在OnTick()函数中,但我也在两个地方使用了Bid, Ask与'Spreadsheet',它们没有任何错误和警告。但这个电子表格没有给我任何警告,但也没有更新。

在我的EA代码中,任何对象的创建都绝对成功,没有错误,没有警告。

我不知道我是好的编码员还是什么?(我不认为我是编码员或程序员。) 但我看到了结果。因此,我可以只使用标签对象(没有函数,只是为了电子表格)。

Void函数返回的结果是我想要的,而且这个函数为最初的传播值创建了对象,但没有更新。



我不确定你想用spreadstring做什么,也许你可以多解释一下它的用途以及你想如何使用它?

好的,我只是想这样使用它。我只想让它在我打开/添加我的EA到图表上时,给我提供Spreadsheet Size(/值),目前。然后我将尝试为当前的小时价差高/低尺寸(/值)编写代码。

谢谢你。

 

你也可以把它存储在一个双数组[]中,然后比较所有的双数组,看看哪里的差价最低。


double spread[];
--

ArrayResize(spread,SymbolsTotal(1),0);
   for(int i=0;i<SymbolsTotal(1);i++)
     {
      spread[i]=MarketInfo(SymbolName(i,1),13);
     }
 

当我删除下面的代码后,电子表格开始完美工作。
因此,我只需要帮助,我如何才能写出好的(/最佳) 代码,而不是它,请?

{
    Print(__FUNCTION__, ": failed to create text label! Error code = ", GetLastError());
    return(false);
}

我只是保留了下面的标签对象 功能的代码。

if( !ObjectCreate( chart_ID, name, OBJ_LABEL, sub_window, 0, 0 ) ) 

谢谢。

(如果这个问题真的是一个问题--我希望MetaQuotes会解决它--因为它花了我几个小时,帮助其他在这个代码行业的新手)

 

删除 "return(false)",但保留Print语句并运行你的代码。

我想你可能会得到一些信息。我想你是在试图一次又一次地创建标签,而不是改变值。

 
honest_knave:

删除 "return(false)",但保留Print语句并运行你的代码。

这到底是怎么回事!?
玩意 花了我几个小时,我不知道我还能说什么。
我可以把它从我所有的对象函数 中删除吗?
另外,你能让我知道它是如何工作的吗?

return(false);

只是谢谢你,伙计。

 
Max Enrik:

这到底是怎么回事?
可以 从我所有的Objects函数 中删除它

是的,但最好保留它并解决错误的根源。

Max Enrik:

什么是地狱!?
另外
,你能让我知道它是如何工作的吗?

return(false);

返回操作符 只是告诉函数立即退出。如果函数返回一个值(在你的例子中,它是一个bool),你也必须返回一个值。

如果你在创建对象之前检查该对象是否存在,你就会摆脱你的错误(4200,对吗?

Return Operator - Operators - Language Basics - MQL4 Reference
Return Operator - Operators - Language Basics - MQL4 Reference
  • docs.mql4.com
Return Operator - Operators - Language Basics - MQL4 Reference
 
honest_knave:

谢谢你的明确意见,伙计。

我已经用你的方法取代了它,就像下面的代码。( 用于标签对象 功能 )

以前是 - 在你对错误描述的评论之前。

if( !ObjectCreate( chart_ID, name, OBJ_LABEL, sub_window, 0, 0 ) )
{
    Print( __FUNCTION__, ": failed to create text label! Error code = ", GetLastError() );
    return(false);
}

// which one this code gives me error no: 4200 

之后。

if( !ObjectCreate( chart_ID, name, OBJ_LABEL, sub_window, 0, 0 ) )
{
    if( errorcode !=0 ) printf( "Error %i: %s", errorcode, ErrorDescription( errorcode ) );
    return(false);
}

// prevent error no: 4200 - but was not update spreadsheet values 

现在--工作得非常好。

if( !ObjectCreate( chart_ID, name, OBJ_LABEL, sub_window, 0, 0 ) )
{
    if( errorcode !=0 ) printf( "Error %i: %s", errorcode, ErrorDescription( errorcode ) );
    return(false); // removed this line
}

// now spreadsheet values updates, no any more error no: 4200 

祝你一切顺利。