[ARCHIVE!] フォーラムを散らかさないように、どんなルーキーの質問でも。プロフェッショナルは、通り過ぎないでください。あなたなしではどこにも行けない - 4. - ページ 131

 
alsu:
win_idxはうまくいくのでしょうか?

win_indが正しいことが判明。

ObjectCreate("max",OBJ_HLINE,win_idx,0,top); は、正しいウィンドウに描画します。


ObjectSet("max",OBJPROP_COLOR,Yellow); は、正しい色で描画します。

ObjectSet("max",OBJPROP_WIDTH,0); は、正しい線を描きます。

のトップパラメータを定義していない。

double top=WindowPriceMax(win_idx)。

であり、topBuffer[]は空である。


コード

#property indicator_separate_window
#プロパティ indicator_buffers 3
#property indicator_color1 ライム
#property indicator_color2 レッド
//--- バッファ
double ExtMapBuffer1[]。
double ExtMapBuffer2[]。
double topBuffer[];


bool initFinished=false; // 初期化の状態を記憶する変数を追加する。
// false - 初期化がまだ行われていない。
// true - 初期化されました。
//+------------------------------------------------------------------+
//| カスタムインジケータ初期化関数
//+------------------------------------------------------------------+
int init()
{
//---- インジケータ
SetIndexStyle(0,DRAW_LINE)を設定します。
SetIndexBuffer(0,ExtMapBuffer1)を設定します。
SetIndexStyle(1,DRAW_LINE)を設定します。
SetIndexBuffer(1,ExtMapBuffer2)を設定。
SetIndexStyle(2,DRAW_NONE)を設定します。
SetIndexBuffer(2,topBuffer)を設定。

IndicatorDigits(5)です。
//----
return(0)です。
}
//+------------------------------------------------------------------+
//| カスタムインジケーター初期化関数
//+------------------------------------------------------------------+
int deinit()
{
//----

//----
return(0)です。
}
//+------------------------------------------------------------------+
//| カスタムインジケータ反復関数
//+------------------------------------------------------------------+
int start()
{
int counted_bars=IndicatorCounted(),
制限を受けます。

if(counted_bars>0)
counted_bars--。

limit=Bars-counted_bars。
//----
for(int i=0;i<limit;i++)

{
ExtMapBuffer1[i]=iMACD(0,0,12,26,9,PRICE_CLOSE,MODE_MAIN,i)とする。
ExtMapBuffer2[i]=iMACD(0,0,12,26,9,PRICE_CLOSE,MODE_SIGNAL,i)とする。

if(initFinished==false)
{
IndicatorShortName("MACD_max-min")。

int win_idx=WindowFind("MACD_max-min");
// インジケータサブウインドウの番号を調べる

if(win_idx<0)
{
// サブウィンドウ番号が -1 の場合はエラー
Print("Window not found");
return(0)です。
}

double top=WindowPriceMax(win_idx)。
//現在のチャートの指定されたサブウインドウの垂直スケールの最大値を求める


ObjectCreate("max",OBJ_HLINE,win_idx,0,top)。
// インジケーターのサブウィンドウに水平線を描画します。

ObjectSet("max",OBJPROP_COLOR,Yellow)。
ObjectSet("max",OBJPROP_WIDTH,0)。

WindowRedraw()。
// ラインを見るためにウィンドウを再描画する

initFinished=true とする。
// 描画を終了する

}

topBuffer[i]=top;


}

//----
return(0)です。
}
//+------------------------------------------------------------------+

 
MK07:

win_indが正しいことが判明。

ObjectCreate("max",OBJ_HLINE,win_idx,0,top); は、正しいウィンドウに描画します。


ObjectSet("max",OBJPROP_COLOR,Yellow); は、正しい色で描画します。

ObjectSet("max",OBJPROP_WIDTH,0); は、正しい線を描きます。

のトップパラメータを定義していない。

double top=WindowPriceMax(win_idx)。

であり、topBuffer[]は空である。


コード

#property indicator_separate_window
#プロパティ indicator_buffers 3
#property indicator_color1 ライム
#property indicator_color2 レッド
//--- バッファ
double ExtMapBuffer1[]。
double ExtMapBuffer2[]。
double topBuffer[];


bool initFinished=false; // 初期化の状態を記憶する変数を追加する。
// false - 初期化がまだ行われていない。
// true - 初期化されました。
//+------------------------------------------------------------------+
//| カスタムインジケータ初期化関数
//+------------------------------------------------------------------+
int init()
{
//---- インジケータ
SetIndexStyle(0,DRAW_LINE)を設定します。
SetIndexBuffer(0,ExtMapBuffer1)を設定します。
SetIndexStyle(1,DRAW_LINE)を設定します。
SetIndexBuffer(1,ExtMapBuffer2)を設定。
SetIndexStyle(2,DRAW_NONE)を設定します。
SetIndexBuffer(2,topBuffer)を設定。

IndicatorDigits(5)です。
//----
return(0)です。
}
//+------------------------------------------------------------------+
//| カスタムインジケーター初期化関数
//+------------------------------------------------------------------+
int deinit()
{
//----

//----
return(0)です。
}
//+------------------------------------------------------------------+
//| カスタムインジケータ反復関数
//+------------------------------------------------------------------+
int start()
{
int counted_bars=IndicatorCounted(),
制限を受けます。

if(counted_bars>0)
counted_bars--。

limit=Bars-counted_bars。
//----
for(int i=0;i<limit;i++)

{
ExtMapBuffer1[i]=iMACD(0,0,12,26,9,PRICE_CLOSE,MODE_MAIN,i)とする。
ExtMapBuffer2[i]=iMACD(0,0,12,26,9,PRICE_CLOSE,MODE_SIGNAL,i)とする。

if(initFinished==false)
{
IndicatorShortName("MACD_max-min")。

int win_idx=WindowFind("MACD_max-min");
// インジケータサブウインドウの番号を調べる

if(win_idx<0)
{
// サブウィンドウ番号が -1 の場合はエラー
Print("Window not found");
return(0)です。
}

double top=WindowPriceMax(win_idx)。
//現在のチャートの指定されたサブウインドウの垂直スケールの最大値を求める


ObjectCreate("max",OBJ_HLINE,win_idx,0,top)。
// インジケーターのサブウィンドウに水平線を描画します。

ObjectSet("max",OBJPROP_COLOR,Yellow)。
ObjectSet("max",OBJPROP_WIDTH,0)。

WindowRedraw()です。
// ラインを見るためにウィンドウを再描画する

initFinished=true とする。
// 描画を終了する

}

topBuffer[i]=top;


}

//----
return(0)です。
}
//+------------------------------------------------------------------+



お節介ですいません。

topBuffer[i]をループの後ろに置いて描画する場合、次のようにしてみてください。

int start()
  {
   int counted_bars=IndicatorCounted(),
       limit;  
       
    if(counted_bars>0)
      counted_bars--;
   
      limit=Bars-counted_bars;
//----
   for(int i=0;i<limit;i++)
       
      { 
        ExtMapBuffer1[i]=iMACD(0,0,12,26,9,PRICE_CLOSE,MODE_MAIN,i);
        ExtMapBuffer2[i]=iMACD(0,0,12,26,9,PRICE_CLOSE,MODE_SIGNAL,i);
        
          if(initFinished==false)
           { 
             int win_idx=WindowFind("MACD_max-min");
             // находим номер подокна нашего индикатора
      
             if(win_idx<0)
              {
               // если номер подокна равен -1, то возникла ошибка
                 Print("Окно не найдено");
                 return(0);
              }  
              
             double   top=WindowPriceMax(win_idx); 
              //находим максимальное значение вертикальной шкалы указанного подокна текущего графика
             topBuffer[i]=top;
             Comment( "\n"," top = ",top); 

             ObjectCreate("max",OBJ_HLINE,win_idx,0,0);
             // рисуем горизонтальную линию в подокне нашего индикатора
             ObjectSet("max", OBJPROP_PRICE1, top);  
             ObjectSet("max",OBJPROP_COLOR,Yellow);
             ObjectSet("max",OBJPROP_WIDTH,0);
 
             WindowRedraw();      
             // перерисовываем окно, чтобы увидить линиию   
      
             initFinished=true;
            // рисование закончено  
        
           } 
        
            
                
        
      }  
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
 
//Пробуйте с учетом мнения alsu. 
#property indicator_separate_window
#property indicator_buffers 2
#property indicator_color1 Lime
#property indicator_color2 Red
double ExtMapBuffer1[],ExtMapBuffer2[];
int init(){SetIndexStyle(0,DRAW_LINE);SetIndexBuffer(0,ExtMapBuffer1);
SetIndexStyle(1,DRAW_LINE);SetIndexBuffer(1,ExtMapBuffer2);
IndicatorShortName("MACD_max-min");return(0);}
int deinit(){return(0);}
//+------------------------------------------------------------------+
int start(){int counted_bars=IndicatorCounted(),limit,win_idx;double top;
if(counted_bars>0)counted_bars--;limit=Bars-counted_bars;win_idx=WindowFind("MACD_max-min");
for(int i=0;i<limit;i++){ExtMapBuffer1[i]=iMACD(0,0,12,26,9,PRICE_CLOSE,MODE_MAIN,i);
  ExtMapBuffer2[i]=iMACD(0,0,12,26,9,PRICE_CLOSE,MODE_SIGNAL,i);}
  top=WindowPriceMax(win_idx);ObjectDelete("max");
  if(ObjectFind("max")!=win_idx){ObjectCreate("max",OBJ_HLINE,win_idx,Time[0],top);
  ObjectSet("max",OBJPROP_COLOR,Yellow);ObjectSet("max",OBJPROP_WIDTH,0);}return(0);}
//+------------------------------------------------------------------+
 
私は初心者で、デモのMetaFXとエキスパート-アドバイザーをインストールし、すべての作品とオリジナルで動作するようにしたくないだけ立つことはありませんです。
 

こんにちは。

ご指摘をお願いします。

同じ型の外部変数がN個与えられている。MathMaxは2つの値の最大値を返しますが、それが例えば20だったら?

あるいは、このデータから配列を作成し、ArrayMaximumを適用 するにはどうしたらよいでしょうか。

extern int A = 10;
extern int .......;

extern int N = 1253;

ありがとうございました。

 
Roll:

https://docs.mql4.com/ru/array/ArrayMaximum

int ArrayMaximum( double array[], int count=WHOLE_ARRAY, int start=0)
最大値を持つ要素を検索する。この関数は,配列中の最大要素の位置を返します.
パラメータ
array[] - 検索される数値の配列.
count - 検索する要素の数.
Start - 検索の開始インデックスです。

double num_array[15]={4,1,6,3,9,4,1,6,3,9,4,1,6,3,9};
int maxValueIdx=ArrayMaximum(num_array);
Print("最大値 = ", num_array[maxValueIdx]);


しかし、形としては

int Max [N] = {A,.....,N};

の場合、配列は作成されません。

ここで、A,......N は同じ型の指定された変数である。変数の数 = N

 

外部変数から文字列配列を作成する例(スクリプト)。

extern string sym1="GBPUSD";
extern string sym2="GBPJPY";
extern string sym3="EURUSD";
extern string sym4="EURJPY";
extern string sym5="AUDUSD";
extern string sym6="AUDJPY";
extern string sym7="NZDUSD";
extern string sym8="USDCAD";

string sym[8];
//+------------------------------------------------------------------+
int init(){sym[1]=sym1;sym[2]=sym2;sym[3]=sym3;sym[4]=sym4;
   sym[5]=sym5;sym[6]=sym6;sym[7]=sym7;sym[8]=sym8;return(0);}

int start(){Alert("символ  ",sym[1]);return(0);}
 
Roll:

外部変数から文字列配列を作成する例(スクリプト)。


ありがとうございました。

うまくいきましたが、修正点があります。

int init(){sym[1]=sym1;............

次のことをする

int init(){sym[0]=sym1;.......

を実行し、全要素をカウントする。

 
r772ra:

乱入してすみませんでした。

topBuffer[i]のループと描画の後ろは、このようにしてみてください。

あなたのオプションは機能しませんが、あなたの注意力、努力、他の人の問題への理解に大きな感謝を捧げます。
 
Roll:

ありがとうございました。

あなたのバージョンのインジケータが動作します

MQL4のチュートリアルやインジケーターの例で解決しようとしたのですが、何もうまくいきませんでした。

その理由を解明するために、意欲と時間と気持ちがあれば。

1.あなたは、インジケータ線をインストールすると、0(ゼロ)の値を受信し、唯一の最初のティックの到着と変数トップの値を取る、またはパラメータウィンドウを開き、すぐにそれを閉じる必要があります。

2.init()内に以下の行がありますが、パラメータtopは4番目の符号まで計算されています。

IndicatorDigits(Digits+1)です。

とライン

top=WindowPriceMax(win_idx)。

で置き換えました。

top=NormalizeDouble((WindowPriceMax(win_idx)),Digits+1);

役に立ちません!また、表示窓の目盛りの数値は5桁です。

3.インジケーターの削除に伴い、コメントは チャートから削除されません。



コード

--------

#property indicator_separate_window
#property indicator_buffers 2
#property indicator_color1 Lime
#property indicator_color2 Red
double ExtMapBuffer1[],
ExtMapBuffer2[];
//--------------------------------
int init()
{
SetIndexStyle(0,DRAW_LINE);
SetIndexBuffer(0,ExtMapBuffer1);
SetIndexStyle(1,DRAW_LINE);
SetIndexBuffer(1,ExtMapBuffer2);
IndicatorShortName("MACD_max-min_v2");

IndicatorDigits(Digits+1);

return(0);
}
//--------------------------------
int deinit()
{

return(0);
}
//+------------------------------------------------------------------+
int start()
{
int counted_bars=IndicatorCounted(),limit,win_idx;
double top;

if(counted_bars>0)counted_bars--;
limit=Bars-counted_bars;
win_idx=WindowFind("MACD_max-min_v2");

for(int i=0;i<limit;i++)
{
ExtMapBuffer1[i]=iMACD(0,0,12,26,9,PRICE_CLOSE,MODE_MAIN,i);
ExtMapBuffer2[i]=iMACD(0,0,12,26,9,PRICE_CLOSE,MODE_SIGNAL,i);
}

// top=WindowPriceMax(win_idx);
top=NormalizeDouble((WindowPriceMax(win_idx)),Digits+1);
Comment( "\n"," top = ",top);
ObjectDelete("max");

if(ObjectFind("max")!=win_idx)
{
ObjectCreate("max",OBJ_HLINE,win_idx,Time[0],top);
ObjectSet("max",OBJPROP_COLOR,Yellow);
ObjectSet("max",OBJPROP_WIDTH,0);
}

return(0);
}
//+------------------------------------------------------------------+


ファイル: