新人对MQL4和MQL5的任何问题,对算法和代码的帮助和讨论 - 页 740

 
Taras Slobodyanik:

在OnInit中对变量进行初始化(包括重新绘制对象)。


解释一下这是怎么回事。

我在创建了一个标签后把它加到了OnInit中

    ObjectSetInteger(0, objname, OBJPROP_YDISTANCE, y);
    ChartRedraw();


但结果是一样的。

 
psyman:


解释一下这是怎么回事。

我在创建标签后将其添加到OnInit中


但结果是一样的。

需要看到代码,那里有什么...

ps.上面的代码工作正常(没有故障)。
(https://www.mql5.com/ru/forum/160683/page739#comment_10290585)


哎呀,虽然我把Bid变量换成了Bid0

Любые вопросы новичков по MQL4, помощь и обсуждение по алгоритмам и кодам
Любые вопросы новичков по MQL4, помощь и обсуждение по алгоритмам и кодам
  • 2019.01.17
  • www.mql5.com
В этой ветке я хочу начать свою помощь тем, кто действительно хочет разобраться и научиться программированию на новом MQL4 и желает легко перейти н...
 
下午好,我如何写出当价格触及穆文吉时 开仓的订单?
 
Ivan Rozhkov:
下午好,我如何写出当价格触及穆文吉时开仓的订单?
if ((prev_bid>ma && curr_bid<=ma) || (prev_bid<ma && curr_bid>=ma))
   //открывается ордер
 
Taras Slobodyanik:

我必须看一下代码,看看有什么...

ps.上述代码运行良好(没有故障)。
(https://www.mql5.com/ru/forum/160683/page739#comment_10290585)


Oops. 虽然我把Bid变量替换成了Bid0

忘了补充,这是我在5中测试。在MT4中,当你打开图表 时,垂直标记确实会迅速移动到位,不需要等待刻度线或移动鼠标。有几次在横移时出现了故障,只有通过重新编译指标才能克服。

 
psyman:


试过了,你必须移动鼠标才能把标记找回来。这是同一根拐杖,但用的是不同的手 :-)

而在图表之间切换CHARTEVENT_CHART_CHANGE并不是一个事件

有谁能想到克服这种反常现象的方法?


如果我切换图表窗口,无论是向前还是向后切换,打印都会显示一个信息给我(我在MT4上,但MT4文档中没有写明图表切换可以作为CHARTEVENT_CHART_CHANGE 事件被捕获)。

void OnChartEvent(const int id,
                  const long &lparam,
                  const double &dparam,
                  const string &sparam)
{
  if(id==CHARTEVENT_CHART_CHANGE) Print("graph");
}

但是,是的,这仍然是一种拐杖方法。我们需要找出为什么在切换到另一个图表时,Y坐标会有所不同。但看一下代码,我们可以得出结论,ChartTimePriceToXY 由于某种原因给出了不同的结果。

 
psyman:

我忘了补充,我在5中测试这个。在MT4中,当图表被打开 时,垂直标记真的会迅速移动到合适的位置,不需要等待刻度线或移动鼠标。有几次在横移时出现了故障,只有通过重新编译指标才能克服。

嗯,5中有很多 "功能"--从图表上的队列到从分钟创建条形图,以及在当前init之后触发前一个deinit)

因此,你需要检查条形图/图形/对象--在什么时候发生错误,并纠正它。

 
Taras Slobodyanik:


一般来说--你需要检查条形/图形/物体--在哪一点上发生错误,并加以纠正。


如何做到这一点,从哪里开始?

 
psyman:


如何做,从哪里开始?

做一个随处可见的打印,即我们在oninit中打印出价(你也可以打印当前日期),然后在计算中也是如此......
我可以心灵感应,故事并没有立即建立起来,条条框框是后来出现的。

 
Taras Slobodyanik:

在任何地方进行打印,即在oninit中打印出价(你也可以打印当前日期),然后在计算时也进行打印...
我心照不宣,这个故事没有时间立即建立,酒吧出现的时间较晚。

对于下一个代码,一个图片的故事。

//+------------------------------------------------------------------+
//|                                              !_clr_indicator.mq5 |
//|                        Copyright 2018, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2018, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property indicator_chart_window


string objname="Bid";
input color Bid_color = clrCrimson;

int OnInit()
  {

int x,y;
double Bid0 = SymbolInfoDouble(Symbol(), SYMBOL_BID);
int width = (int)ChartGetInteger(0,CHART_WIDTH_IN_PIXELS,0);  //ширина графика



        Print("1 Bid0 = ", Bid0,  " x = ", x, " y = ", y," TimeCurrent()=", TimeCurrent() );

   ObjectCreate(0, objname, OBJ_LABEL,0, 0, 0);
   
   ObjectSetString(0, objname, OBJPROP_TEXT, DoubleToString(Bid0, _Digits-1));
        ObjectSetInteger(0, objname, OBJPROP_FONTSIZE, 12);
        ObjectSetInteger(0, objname, OBJPROP_COLOR, Bid_color);
        ObjectSetString(0, objname, OBJPROP_FONT, "Verdana");

        ChartTimePriceToXY(0, 0, TimeCurrent(), Bid0, x, y);
        Print("2 Bid0 = ", Bid0,  " x = ", x, " y = ", y," TimeCurrent()=", TimeCurrent() );
         
        ObjectSetInteger(0, objname, OBJPROP_XDISTANCE, width-60);

   ObjectSetInteger(0, objname, OBJPROP_YDISTANCE, y);

   

   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {

return(rates_total);

  }

void OnChartEvent(const int id,const long &lparam,const double &dparam,const string &sparam) 
  { 

int x2,y2;
double Bid2 = SymbolInfoDouble(Symbol(), SYMBOL_BID);
double  cprice;
datetime ctime;
int      cwindow=0;



if(id==CHARTEVENT_CHART_CHANGE) 
   {
   



           ChartTimePriceToXY(0, 0, TimeCurrent(), Bid2, x2, y2); 
      
      Print("5 Bid2 = ", Bid2,  " x2 = ", x2, " y2 = ", y2," TimeCurrent2()=", TimeCurrent() );
      
        ObjectSetInteger(0, objname, OBJPROP_YDISTANCE, y2);
   
   ChartXYToTimePrice(0,x2,x2,cwindow, ctime, cprice);
   

   }



  }



void OnDeinit(const int reason) 
   { 

      ObjectDelete(0,objname);
   } 
 
 


断开了网络,增加了一个指标

我切换到下一个图表


y2的值改变了,我回去了


y2已经返回了它的值,但标记被 "消失 "的值所计算我转动鼠标滚轮。

标记又回到了它的位置上!