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分もメッセージがない。13時のニュースにどう反応するか見ものです。

 
Artyom Trishkin:
数値はNaN - Not a Number - 数字ではありません。Zカウントの計算で数値を正規 化してみる

ありがとうございます、助かりました。

MathCeil() が動作しないのは不思議です。NormalizeDouble() number helped - == Z-scoreイコール=-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ピクセルほどずれることが確認できます。

戻ると、マーカーは「逃げ」てしまい、次のティックまで所定の位置になく、その後「母国へ」戻ってしまいます。これは何が原因なのでしょうか?

なぜなら、チャートは 次のティックにしか再描画 されないからです。しかし、今、チャートの強制再描画を設定するのは危険です。MT5の前2つのビルドは、幼稚なブレーキではありませんでした。MT4ではどうなのかわからないので、確認したほうがいいですね。

 
Alexey Viktorov:

この状況は、次のティックにのみチャートが再描画 されることにより 解決することができます。しかし、無理やりチャートを描き直すのは危険です。MT5の前2つのビルドは、かなり複雑でした。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で変数の初期 化を行う(オブジェクトの再描画を含む)。