MQL4、MQL5に関する初心者からの質問、アルゴリズムやコードに関するヘルプ、ディスカッションなど。 - ページ 371

 

フォーラムメンバーの皆様へご挨拶申し上げます。

どのチャートに設定しても、特定のシンボルでインジケータを動作させることができるようにするのを助けてください。

外部パラメータでシンボルを変更するのはわかるが

input string   Symb   ="GBPJPY";
次に何をすればいいのかわからない

インジケータを添付します

ファイル:
Fisher.mq4  3 kb
 

新しいバーが表示されたときにバッファーをリセットする方法を教えてください。ただし、以前のデータは消去されずにチャートに表示されます。な ぜかバッファをゼロにリセット できず、新しいバーが表示さ れると、古い蓄積データの上に新しいデータが重なって 表示されます。私のコードのどこが間違っているのでしょうか?分かりやすい説明ありがとうございます。

void OnInit()
{
   IndicatorDigits(0);
   SetIndexBuffer(0,Buf_1);
   SetIndexBuffer(1,Buf_2);
   Bid1=Bid;
  
   
}
 
 
//+------------------------------------------------------------------+
//| 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[])
{
   datetime Вр=Time[0];   // Время текущего бара
   if(Вр>Время)           // Если новый бар
   {
      Время=Вр;           // Запомнить
      Buf_1[0]=0;         // и обнулить последний элемент буфера
      Buf_2[0]=0;
   }
   
      
   if(Bid > Bid1) 
   {
   V1 = iVolume(NULL, 0, 0);
   V2 = V1 + V2;
   Buf_1[0]= V2;
   }                             
   else 
   {
   V3 = iVolume(NULL, 0, 0);
   V4 = V3 + V4;
   Buf_2[0]= (V4*-1);
   }
   Bid1=Bid;
   
   
  return(rates_total);
}
 
Alekseu Fedotov:

然もありなん


私はコードで質問を持って、それは閉鎖されていない現在のろうそくは、ろうそくが閉じるまで、インジケータは時間のろうそくが閉じられていないため、描画されるべきではない画面領域に赤い立っている期間の価格の閉鎖を、閉じて時間を持っていることが判明しました。それはコンパイル時間であり、その後コンパイルは、各閉じたろうそくの描画が来る、もちろんあなたは時間のバーを見つけることによって、別の方法を解決することができますが、私は簡単な方法を望んで、私は以前に書いたので

for(i=limit; i>0; i--)
{
yesterday_weekday = TimeHour(iTime(Symbol(),0,i+1))-TimeHour(iTime(Symbol(),0,i));
if(yesterday_weekday!=0)

問題への他の解決策?コンパイル時に確認したいのですが、もっと簡単な解決策があればと思いました。

 
MakarFX: どのチャートに設定しても、特定のシンボルでインジケータが動作するようにしたいのですが、ご教授ください。

彼らは時代遅れである、より良いiHigest、iLowestと 賞賛悪名高いフィッシャーすぐに引き分けに合意(V.Vysotsky)を呼び出すハイエスト、ローエストでこのパラメータを記述する必要があります。

 
PokrovMT5:
私はコードで質問を持って、それは閉鎖されていない現在の1時間のろうそくは、ろうそくが閉じるまで、インジケータが立っている期間の価格の閉鎖を描く、スクリーンショットの赤い領域は、1時間のろうそくが閉じていないため、描かれるべきではありませんクローズ時間を持っていることが判明しました。もちろん、1時間のバーを見つけることによって別の方法を解決することができますが、私はより簡単な方法を望んで、私は以前に書いた

問題に別の解決策はありますか?

ありがとうございます。

私の理解が正しければ、チャートに1時間ごとのCloseをマークしたいのですね?

// (только для TF меньше часа) для всех свечей внутри часа поставить HourCloseBuff=цена закрытия часа

// предполагается что close индексирован как тайм-серия

for(int back=i+1;back<=limit && TimeHour(time[back]==TimeHour(time[i+1]);back++) {

  HourCloseBuff[back]=close[i+1];

}

 
STARIJ:

我々は、最高、最低の呼び出しにこのパラメータを書き込む必要があります - 彼らは時代遅れであり、より良いiHigest、iLowestと賞賛された悪名高いフィッシャーがすぐに引き分けに合意した(V.Vysotsky)。

#property  copyright "Copyright © 2005, Yura Prokofiev"
#property  link      "Yura.prokofiev@gmail.com"

#property  indicator_separate_window
#property  indicator_buffers 3
#property  indicator_color1  Black
#property  indicator_color2  Lime
#property  indicator_color3  Red
 
input string   Symb     ="GBPJPY";
extern int     period   =10;

double         ExtBuffer0[];
double         ExtBuffer1[];
double         ExtBuffer2[];


int init()
  {
   
   
   SetIndexStyle(0,DRAW_HISTOGRAM,STYLE_SOLID,2,Red);
   SetIndexStyle(1,DRAW_HISTOGRAM,STYLE_SOLID,2,Lime);
   SetIndexStyle(2,DRAW_HISTOGRAM);
   IndicatorDigits(Digits+1);

   SetIndexBuffer(0,ExtBuffer0);
   SetIndexBuffer(1,ExtBuffer1);
   SetIndexBuffer(2,ExtBuffer2);

   IndicatorShortName("Fisher");
   SetIndexLabel(1,NULL);
   SetIndexLabel(2,NULL);

   return(0);
  }


int start()
  {
   //int     period=10;
   int    limit;
   int    counted_bars=IndicatorCounted();
   double prev,current,old;
   double Value=0,Value1=0,Value2=0,Fish=0,Fish1=0,Fish2=0;
   double price;
   double MinL=0;
   double MaxH=0;  
   

   if(counted_bars>0) counted_bars--;
   limit=Bars-counted_bars;


   for(int i=0; i<limit; i++)
    {  MaxH = High[iHighest(Symb,0,MODE_HIGH,period,i)];
       MinL = Low[iLowest(Symb,0,MODE_LOW,period,i)];
      price = (High[i]+Low[i])/2;
      Value = 0.33*2*((price-MinL)/(MaxH-MinL)-0.5) + 0.67*Value1;     
      Value=MathMin(MathMax(Value,-0.999),0.999); 
      ExtBuffer0[i]=0.5*MathLog((1+Value)/(1-Value))+0.5*Fish1;
      Value1=Value;
      Fish1=ExtBuffer0[i];
      
    }


   bool up=true;
   for(i=limit-2; i>=0; i--)
     {
      current=ExtBuffer0[i];
      prev=ExtBuffer0[i+1];
           
      if (((current<0)&&(prev>0))||(current<0))   up= false;    
      if (((current>0)&&(prev<0))||(current>0))   up= true;
      
      if(!up)
        {
         ExtBuffer2[i]=current;
         ExtBuffer1[i]=0.0;
        }
        
       else
         {
          ExtBuffer1[i]=current;
          ExtBuffer2[i]=0.0;
         }
     }

   return(0);
  }
したのですが、それでは問題が解決しないので
price = (High[i]+Low[i])/2;
HighとLowは現在のシンボルを使用します。
 
Maxim Kuznetsov:

私の理解が正しければ、チャートに1時間ごとのCloseをマークしたいのですね?

// (только для TF меньше часа) для всех свечей внутри часа поставить HourCloseBuff=цена закрытия часа

// предполагается что close индексирован как тайм-серия

for(int back=i+1;back<=limit && TimeHour(time[back]==TimeHour(time[i+1]);back++) {

  HourCloseBuff[back]=close[i+1];

}

Maximさん、こんにちは!バリアントをありがとうございます、私のもほとんど同じで、それも動作します、しかしAlekseu Fedotovが それを提案し、私はそれについて書きました、それを修正するアイデアは何でしょうか?



for(i=limit; i>=0; i--)
     {
      T = iTime(NULL,0,i); 
      shift=iBarShift(NULL,60,T); 
      C=iClose(NULL,60,shift);
      CC[i]=C;
     }
 

新しいバーが表示されたときにバッファをリセットする方法を教えてください。ただし、前のデータは消去されずにチャートに表示されます。な ぜかバッファをゼロにリセット できず、新しいバーが表示さ れると、古い蓄積データの上に新しいデータが重なって 表示されます。私のコードのどこが間違っているのでしょうか?分かりやすい説明ありがとうございます。

 datetime Вр=Time[0];   // Время текущего бара
   if(Вр>Время)           // Если новый бар
   {
      Время=Вр;           // Запомнить
      Buf_1[0]=0;         // и обнулить последний элемент буфера
      Buf_2[0]=0;
   }
   
      
   if(Bid > Bid1) 
   {
   V1 = iVolume(NULL, 0, 0);
   V2 = V1 + V2;
   Buf_1[0]= V2;
   }                             
   else 
   {
   V3 = iVolume(NULL, 0, 0);
   V4 = V3 + V4;
   Buf_2[0]= (V4*-1);
   }
   Bid1=Bid;
   
   
  return(rates_total);
 

誰も助けてくれないのか?

 

皆さん、ごきげんよう。正しいチャートウィンドウに切り替えるにはどうしたらいいですか?

異なるペアのウィンドウをたくさん開いていて、それぞれにEAがあり、取引シグナルが表示されますが、通貨はマザーファッカー次第で、シグナルが出た正確なチャートを素早くアクティブにする必要があります。

Symbol() コマンドは知っているが、通貨ペアを指定してウィンドウをアクティブにする方法がわからない。もしかしたら、この課題に直面したことがある人もいるかもしれませんね。