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

 
Ilya Prozumentov:

这要靠作者自己去想。最好把OnTick()的代码拿来。

我联系了作者。我没有帮助。他自己几乎不知道该怎么做。"在这里检查你的条件,我不会帮助你"。

我可以(!)对我的那部分代码负责,但我不能对你的负责"。

下面是OnTick()的代码。

void OnTick()
  {RefreshRates();
//---
   string TextDisplay="";

/*  Check News   */
   bool trade=true; string nstxt=""; int NewsPWR=0; datetime nextSigTime=0;
   if(MidleNews || HighNews) 
     {RefreshRates();
      if(SourceNews==0)
        {// Investing
        RefreshRates();
         if(CheckInvestingNews(NewsPWR,nextSigTime)){ trade=false; } // news time
        }
     }
   if(trade)
     {// No News, Trade enabled
      nstxt="No News, Waiting";
      if(ObjectFind(0,"NS_Label")!=-1){ ObjectDelete(0,"NS_Label"); }

        }else{// waiting news , check news power
      color clrT=LowColor;
      if(NewsPWR>3)
        {
         nstxt= "Waiting Non-farm Payrolls News";
         clrT = HighColor;
           }else{
         if(NewsPWR>2)
           {
            nstxt= "Waiting High News";
            clrT = HighColor;
              }else{
            if(NewsPWR>1)
              {
               nstxt= "Waiting Midle News";
               clrT = MidleColor;
                 }else{
               nstxt= "Waiting Low News";
               clrT = LowColor;
              }
           }
        }
      // Make Text Label
      if(nextSigTime>0){ nstxt=nstxt+" "+TimeToString(nextSigTime,TIME_MINUTES); }
      if(ObjectFind(0,"NS_Label")==-1)
        {
         LabelCreate(StringConcatenate(nstxt),clrT);
        }
      if(ObjectGetInteger(0,"NS_Label",OBJPROP_COLOR)!=clrT)
        {
         ObjectDelete(0,"NS_Label");
         LabelCreate(StringConcatenate(nstxt),clrT);
        }
     }
   nstxt="\n"+nstxt;
/*  End Check News  */ 


   if(trade && oppoz)  
     {// No news and Trade Allowed
     Fun_New_Bar();
            
      if(New_Bar)      
     { 
      Alert("Открыть позицию"); ManageTrade(); // Your trade functions
     }
     oppoz=false;
     }

   TextDisplay=TextDisplay+nstxt;
   Comment(TextDisplay);

   return;
  }
 
Alekseu Fedotov:

尝试更换

用这句话。

我想这是在工作!已经有20分钟没有消息了。让我们看看它对下午1点的新闻有何反应。

 
Artyom Trishkin:
这个数字是NaN - 不是一个数字 - 不是一个数字。尝试在Z-count计算中使数字正常化

谢谢你,这很有帮助。

奇怪的是,MathCeil() 不起作用。NormalizeDouble() number helped - == Z-score equals = -92233720368547.77 .数字很赞,但平衡性几乎没有变化




 
Alekseu Fedotov:

尝试更换

用这句话。

哦,那太好了一切都按照设置工作,没有出现故障。谢谢你!

我喜欢简单的解决方案和简单的代码。

也感谢每一个关注并试图帮助一个完全业余的人的人。

 

我把价格标记附在Bid上,观察到它工作正常,切换到另一个图表,看到垂直坐标立即移动了大约15像素。

我回去了,标记 "逃跑 "了,直到下一次打勾才到位,然后它又回到了 "祖国"。这可能是什么原因造成的?




//+------------------------------------------------------------------+
//|                                              !_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 Bid = SymbolInfoDouble(Symbol(), SYMBOL_BID);
int width = (int)ChartGetInteger(0,CHART_WIDTH_IN_PIXELS,0);  //ширина графика

   ObjectCreate(0, objname, OBJ_LABEL,0, 0, 0);
   
   ObjectSetString(0, objname, OBJPROP_TEXT, DoubleToString(Bid, _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(), Bid, x, y); 
   ObjectSetInteger(0, objname, OBJPROP_XDISTANCE, width-60);

   Print("y=", y, "  ", ObjectGetInteger(0,objname,OBJPROP_TIME,0));

   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[])
  {


int x2,y2;
double Bid2 = SymbolInfoDouble(Symbol(), SYMBOL_BID);


           ChartTimePriceToXY(0, 0, TimeCurrent(), Bid2, x2, y2); 
      
        ObjectSetInteger(0, objname, OBJPROP_YDISTANCE, y2);

   Print("x2=", x2, "  y2=", y2, "  ", "  Bid=",Bid2);

   return(rates_total);
  }


void OnDeinit(const int reason) 
   { 

      ObjectDelete(0,objname);
   } 
 
 
 
psyman:

我把价格标记附在Bid上,观察到它工作正常,切换到另一个图表,看到垂直坐标立即移动了大约15像素。

我回去了,标记 "逃跑 "了,直到下一次打勾才到位,然后它又回到了 "祖国"。这可能是什么原因造成的?

因为图表 只在下一个tick上重绘。但现在设置强制重绘图表是很危险的。MT5的前两个版本并不是幼稚的刹车。我不知道MT4的情况如何,我应该检查一下。

 
Alexey Viktorov:

这种情况可以得到解决,因为图表 只在下一个tick上重新绘制。但强行重新绘制图表是危险的。MT5的前两个版本相当复杂。我不知道在MT4中是怎样的,我应该检查一下。

这就是后果,目前还不清楚是什么导致了这种转变。

同样的事情发生在水平方向上,最令人不快的是,标记与价格重叠,我剪掉了大部分的代码来了解情况。

如何摆脱这种情况?

 
psyman:

这就是后果,目前还不清楚是什么导致了这种转变。

同样的事情发生在水平方向上,最令人不快的是,标记与价格重叠,我剪掉了大部分的代码来了解情况。

如何摆脱这种情况?

尝试以同样的方式并在CHARTEVENT_CHART_CHANGE事件 中更新标记坐标

if(id==CHARTEVENT_MOUSE_MOVE || id==CHARTEVENT_CHART_CHANGE)
 
Ilya Prozumentov:

尝试以与CHARTEVENT_CHART_CHANGE事件 相同的方式更新标记坐标


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

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

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

 
psyman:


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

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

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

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

原因: