来自一个 "傻瓜 "的问题 - 页 262 1...255256257258259260261262263264265266267268269...277 新评论 Sergey Pavlov 2013.07.04 07:38 #2611 agvozdezkiy:刚开始学习MQL,在这里我写了一个EA,它画了一个iMA,并在iMA中的鼠标指针在时间轴上的位置画了一条切线(非常接近)。问题一。专家顾问的速度非常慢。这意味着切线被重绘了很长时间,而且它不跟随鼠标的移动...看看我的版本。//+------------------------------------------------------------------+ //| Antonio_Mouse.mq5 | //| Copyright 2013, MetaQuotes Software Corp. | //| https://www.mql5.com | //+------------------------------------------------------------------+ #property copyright "Copyright 2013, MetaQuotes Software Corp." #property link "https://www.mql5.com" #property version "1.00" //--- int Handle_iMA; double Buffer_iMA[]; string Name_iMA; datetime TimeArray[]; //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ int OnInit() { //---Устанавливаем свойство графика посылать события при движении мышы ChartSetInteger(0,CHART_EVENT_MOUSE_MOVE,true); //---Рисуем индикатор iMA Handle_iMA=iMA(NULL,0,10,0,MODE_SMA,PRICE_CLOSE); if(Handle_iMA!=INVALID_HANDLE) { ChartIndicatorAdd(0,0,Handle_iMA); Print("iMA скопировано в буффер."); } //--- string name="Line"; ObjectCreate(0,name,OBJ_TREND,0,0,0); ObjectSetInteger(0,name,OBJPROP_COLOR,clrRed); ObjectSetInteger(0,name,OBJPROP_WIDTH,10); ObjectSetInteger(0,name,OBJPROP_BACK,true); ObjectSetInteger(0,name,OBJPROP_RAY_LEFT,false); ObjectSetInteger(0,name,OBJPROP_RAY_RIGHT,true); //--- return(INIT_SUCCEEDED); } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ void OnDeinit(const int reason) { IndicatorRelease(Handle_iMA); } datetime CarrentBarTime[]; //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ void OnTick() { } double PriceCoord,Angle; datetime TimeCoord; int SubWindow,BarPos,X1,Y1,X2,Y2; int prevX=-1; //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ void OnChartEvent(const int id, const long &XCoord, const double &YCoord, const string &SParam) { if(id==CHARTEVENT_MOUSE_MOVE) { int x=(int)XCoord; int y=(int)YCoord; if(x==prevX) return; CopyTime(NULL,0,0,1,CarrentBarTime); //--- ChartXYToTimePrice(NULL,x,y,SubWindow,TimeCoord,PriceCoord); if(TimeCoord>CarrentBarTime[0]) return; CopyBuffer(Handle_iMA,0,TimeCoord+PeriodSeconds(),2,Buffer_iMA); //--- string name="Line"; ObjectSetDouble(0,name,OBJPROP_PRICE,0,Buffer_iMA[0]); ObjectSetInteger(0,name,OBJPROP_TIME,0,TimeCoord); ObjectSetDouble(0,name,OBJPROP_PRICE,1,Buffer_iMA[1]); ObjectSetInteger(0,name,OBJPROP_TIME,1,TimeCoord+PeriodSeconds()); //--- ChartRedraw(); prevX=x; } }在我的笔记本电脑上--一切都在飞翔! Andrew Petras 2013.07.04 12:35 #2612 我第一次调用对象创建 函数时得到错误5040(字符串类型的参数损坏)。void CreateTL(string name,datetime time1,double price1,datetime time2,double price2,bool ray_left,bool ray_right,color color_TL) { //------------ nTL,nTLh,nTLl,nTLe nTL="nTL_"+IntegerToString(MathRand()); nTLh="nTLh_"+IntegerToString(MathRand()); nTLl="nTLl_"+IntegerToString(MathRand()); nTLe="nTLe_"+IntegerToString(MathRand()); //------------ ObjectCreate(0,name,OBJ_TREND,0,time1,price1,time2,price2); ObjectSetInteger(0,name,OBJPROP_COLOR,color_TL); ObjectSetInteger(0,name,OBJPROP_STYLE,STYLE_DOT); ObjectSetInteger(0,name,OBJPROP_RAY_RIGHT,ray_left); ObjectSetInteger(0,name,OBJPROP_RAY_RIGHT,ray_right); ObjectSetInteger(0,name,OBJPROP_BACK,true); };如果在调用前设置nTL="";错误4002(内部调用客户终端函数时参数无效)。如果在调用前设置nTL="a";第一个对象将被命名为a。我这样称呼它if(hlp_var==high_low) { //CreateTL(nTL,dt[0],pr[0],dt[0],pr[1],false,false,nTL_color); CreateTL(nTL,dt[0],pr[0],dt[0],pr[1],false,false,nTL_color); CreateTL(nTLe,dt[1],pr[0],dt[1],pr[1],false,false,nTL_color); CreateTL(nTLh,dt[0],pr[0],dt[1],pr[0],false,true,nTL_color); CreateTL(nTLl,dt[0],pr[1],dt[1],pr[1],false,true,nTL_color); CreateTL(nTL,dt[0],pr[0],dt[1],pr[1],false,true,nTL_color); CreateTL(nTL,dt[0],pr[1],dt[1],pr[0],false,true,nTL_color); Print("CreateTL GetLastError "+IntegerToString(GetLastError())); };你能告诉我哪里有错误吗? Документация по MQL5: Основы языка / Операторы / Оператор создания объекта new www.mql5.com Основы языка / Операторы / Оператор создания объекта new - Документация по MQL5 Andrew Petras 2013.07.04 12:52 #2613 在旧版本中。ObjectCreate(0,nTL="nTL_"+IntegerToString(MathRand()),OBJ_TREND,0,time1,price1,time2,price2);从未发生过任何故障。是代码中的错误还是终端中的错误? TheXpert 2013.07.04 12:55 #2614 Silent:你能告诉我错误在哪里吗? 我不知道错误在哪里,但至少可以说,对对象名称 的处理是非常值得怀疑的。 Документация по MQL5: Стандартные константы, перечисления и структуры / Константы объектов / Свойства объектов www.mql5.com Стандартные константы, перечисления и структуры / Константы объектов / Свойства объектов - Документация по MQL5 Vasiliy Smirnov 2013.07.04 12:58 #2615 不清楚为什么你要在对象的名称中加入一个随机数,这也会导致错误。 [删除] 2013.07.04 13:01 #2616 Silent:我第一次调用对象创建 函数时得到错误5040(字符串类型的参数被破坏)。如果在调用前设置错误4002(内部调用客户终端函数时参数无效)。如果在调用前设置第一个对象将被命名为a。我是这样称呼的你能告诉我错误在哪里吗? 你是否因为Get LastError打印的内容不是零而担心?如果是这样,你应该只在函数报告失败时才调用错误。而且,你不应该在情节的最后要求出错,你可能会得到一个垃圾值。在MT4中是这样的,也许在这里是不同的。伪代码。if( ! ObjectCreate(...) ) Print( GetLastError() ); Sergey Gridnev 2013.07.04 13:02 #2617 Silent: 我第一次调用对象创建 函数时得到错误5040(字符串类型的参数被破坏)。 如果在调用前设置 错误4002(内部调用客户终端函数时参数无效)。 如果在调用前设置 第一个对象将被命名为a。 我这样称呼它 你能告诉我错误在哪里吗? 尝试通过StringConcatenate()来 "粘合 "字符串 Andrew Petras 2013.07.04 13:03 #2618 TheXpert: 我不知道错误出在哪里,但说句不好听的,对对象名称 的处理是非常有问题的。 我又要绞尽脑汁地想一个星期了。你能更详细地描述一下吗?(你可以很粗鲁 :))zfs。 不清楚为什么你需要在对象名称中加入一个随机数,这可能导致错误。对于几百个具有独特名称的对象,是否有其他选择?(一组对象的名称中应该有相同部分的字符串,以删除该组)。 Andrew Petras 2013.07.04 13:05 #2619 220Volt: 你是否因为Get Last Errors的打印结果不是零而担心?如果是这样,你应该只在函数报告失败的情况下询问错误。而且,你不应该在情节的最后要求出错,你可能会得到一个垃圾值。在MT4中是这样的,也许这里不同。 不是,因为第一次调用由于错误而没有创建一个对象。我复制了(目前)第一次调用的线路,然后从第二次运行中创建。 TheXpert 2013.07.04 13:14 #2620 220Volt: 你是否因为Get Last Errors的打印结果不是零而担心?那么,从逻辑上讲,如果该函数根本就设置了最后一个错误,那么在成功完成该函数时,应该有一个零错误或文档中描述的值。没有其他办法。也就是说,如果调用成功且错误非零,这种情况必须在文档中加以描述。沉默不语。我将这样绞尽脑汁,再过一周。我可以给你一些更多的细节吗?(你可能是粗鲁的:))通常同一类型的对象的名称是由共同部分组成的,以便于删除(在你的例子中是 "nTL_")和区别。我还使用了模块标识符,如果图表上可以同时有多个这样的非常模块。差异可以是任何东西,甚至是一个计数器,你每次创建一个对象时都会增加它。但最好按逻辑进行区分--对象时间、对象坐标,目标是实现保证唯一性。其副作用是,通过重复构建一个名称,你可以改变你需要的对象 的属性。随机并不提供这种 "保证的唯一性"。 Документация по MQL5: Основы языка / Операторы / Оператор создания объекта new www.mql5.com Основы языка / Операторы / Оператор создания объекта new - Документация по MQL5 1...255256257258259260261262263264265266267268269...277 新评论 您错过了交易机会: 免费交易应用程序 8,000+信号可供复制 探索金融市场的经济新闻 注册 登录 拉丁字符(不带空格) 密码将被发送至该邮箱 发生错误 使用 Google 登录 您同意网站政策和使用条款 如果您没有帐号,请注册 可以使用cookies登录MQL5.com网站。 请在您的浏览器中启用必要的设置,否则您将无法登录。 忘记您的登录名/密码? 使用 Google 登录
刚开始学习MQL,在这里我写了一个EA,它画了一个iMA,并在iMA中的鼠标指针在时间轴上的位置画了一条切线(非常接近)。
问题一。专家顾问的速度非常慢。这意味着切线被重绘了很长时间,而且它不跟随鼠标的移动...
看看我的版本。
在我的笔记本电脑上--一切都在飞翔!
我第一次调用对象创建 函数时得到错误5040(字符串类型的参数损坏)。
如果在调用前设置
nTL="";错误4002(内部调用客户终端函数时参数无效)。
如果在调用前设置
nTL="a";第一个对象将被命名为a。
我这样称呼它
你能告诉我哪里有错误吗?
在旧版本中。
从未发生过任何故障。
是代码中的错误还是终端中的错误?
你能告诉我错误在哪里吗?
我第一次调用对象创建 函数时得到错误5040(字符串类型的参数被破坏)。
如果在调用前设置
错误4002(内部调用客户终端函数时参数无效)。
如果在调用前设置
第一个对象将被命名为a。
我是这样称呼的
你能告诉我错误在哪里吗?
你是否因为Get LastError打印的内容不是零而担心?如果是这样,你应该只在函数报告失败时才调用错误。而且,你不应该在情节的最后要求出错,你可能会得到一个垃圾值。在MT4中是这样的,也许在这里是不同的。
伪代码。
我第一次调用对象创建 函数时得到错误5040(字符串类型的参数被破坏)。
如果在调用前设置
错误4002(内部调用客户终端函数时参数无效)。
如果在调用前设置
第一个对象将被命名为a。
我这样称呼它
你能告诉我错误在哪里吗?
尝试通过StringConcatenate()来 "粘合 "字符串
我不知道错误出在哪里,但说句不好听的,对对象名称 的处理是非常有问题的。
不清楚为什么你需要在对象名称中加入一个随机数,这可能导致错误。
对于几百个具有独特名称的对象,是否有其他选择?
(一组对象的名称中应该有相同部分的字符串,以删除该组)。
你是否因为Get Last Errors的打印结果不是零而担心?如果是这样,你应该只在函数报告失败的情况下询问错误。而且,你不应该在情节的最后要求出错,你可能会得到一个垃圾值。在MT4中是这样的,也许这里不同。
你是否因为Get Last Errors的打印结果不是零而担心?
那么,从逻辑上讲,如果该函数根本就设置了最后一个错误,那么在成功完成该函数时,应该有一个零错误或文档中描述的值。没有其他办法。
也就是说,如果调用成功且错误非零,这种情况必须在文档中加以描述。
我将这样绞尽脑汁,再过一周。我可以给你一些更多的细节吗?(你可能是粗鲁的:))
通常同一类型的对象的名称是由共同部分组成的,以便于删除(在你的例子中是 "nTL_")和区别。我还使用了模块标识符,如果图表上可以同时有多个这样的非常模块。
差异可以是任何东西,甚至是一个计数器,你每次创建一个对象时都会增加它。但最好按逻辑进行区分--对象时间、对象坐标,目标是实现保证唯一性。其副作用是,通过重复构建一个名称,你可以改变你需要的对象 的属性。
随机并不提供这种 "保证的唯一性"。