初心者の方からの質問 MQL5 MT5 MetaTrader 5 - ページ 465

 
kashi_ann:

私は何を間違えているのだろう?

このインジケータには入力パラメータはないのですか?(iCustom(...)関数のことです)

(ここで閉じ括弧だけ抜けているといいのですが)

また、2項目しかコピーしていないので、静的に確保されたバッファに コピーしているのでしょうか?

 
拝啓。

NT7用インジケータのコードを開いてみました。
を含んでいる if ( v>=a && v<b)
もう一つ条件を追加する必要があります:25に等しくないこと

でいいのでしょうか?
if ( v>=a && v<b && v<25 && v>25)
 

Artyom Trishkin
:

1.iMaOnArray()を使用することができます。
2.もしかしたら、間違ったMomentumを見てしまったのでは?指標→オシレーター→モメンタム
3.サブウインドウのMAが変ですね。どこで調達しているのですか?指標→トレンド→移動平均

Artyomさん、返信ありがとうございます!メニューの中にあることが判明しました...。インディケータを間違えてしまいました :) 「Navigator」ウィンドウでIndicatorsMomentumをクリックしましたが、毎回新しいサブウィンドウに追加され、見た目がぐちゃぐちゃになってしまいます。
この手順を何度も繰り返す場合、プロセッサへの負担が少ないものを教えてください。
1) サブウィンドウに私の(複雑な)インジケータを配置し、ここから値を取得する。
または
2)(MQL4)iCustomを 使用して、OnTime()でインジケータ値を読み取る。
私の理解が正しければ、2)の場合、インジケータはウィンドウに描画されず、要求に応じて計算されることになります。しかし、インジケーターの実行コードが一度だけロードされるのか、呼び出されるたびにロードされるのか、よくわかりません.
追伸:2つ目のインジケータは、メニューから新しいサブウィンドウに追加されたままです ...サブウィンドウに既にあるインジケーターに追加する方法は?

 

Александр:
Уважаемые,

открыл код индикатора к NT7
вижу в нём if ( v>=a && v<b)
а мне надо добавить ещё условие: неравно числу 25

правильно ли будет следующее?
if ( v>=a && v<b && v<25 && v>25)

決してうまくはいかない、から。"v<25 && v>25 "は常に偽 です。

こんな感じでいいんじゃないでしょうか。

v!=25

 
Yury Kirillov:

決してうまくいかない、から。"v<25 && v>25 "は常に偽 です。

こんな感じでいいんじゃないでしょうか。

v!=25

ありがとうございます!そうですね。

if ( v>=a && v<b && (v<25|| v>25)) orif ( v>=a && v<b && v!=25)

 
Александр:
ありがとうございます!他のフォーラムでは、次のように提案されています: if ( ( v>=a && v<b && (v<25|| v>25)))

私の場合、こう書きます。

{if((v>=a)&&(v<b)&&(v!=25)) 
{
        //разные действия 
}}//if((v>=a)&&(v<b)&&(v!=25)) 

 
 
Oksana Berenko:

このインジケータには入力パラメータはないのですか?(iCustom(...)関数のことです)

(ここだけ閉じ括弧があるのは見逃してほしい)

また、2項目しかコピーしていないので、静的に確保されたバッファに コピーしているのでしょうか?

このインジケータは、多くの入力パラメータを備えています。

どこの括弧が抜けているのか理解できない。

スタティック・バッファの意味がよくわからないのですが。差し支えなければ、ご説明をお願いします。

 
Mike:

Artemさん、返信ありがとうございます!メニューにあることが判明しました...。インジケータの場所を間違えてしまいました :) ナビゲータウィンドウでIndicatorsMomentumをクリックしましたが、毎回新しいサブウィンドウに追加され、見た目がぐちゃぐちゃになっています。
この手順を何度も繰り返す場合、プロセッサへの負担が少ないものを教えてください。
1) サブウィンドウに私の(複雑な)インジケータを配置し、ここから値を取得する。
または
2)(MQL4)iCustomを 使用して、OnTime()でインジケータ値を読み取る。
私の理解が正しければ、2)の場合、インジケータはウィンドウに描画されず、要求に応じて計算されることになります。しかし、インジケーターの実行コードが一度だけロードされるのか、呼び出されるたびにロードされるのか、よくわかりません.
追伸:2つ目のインジケータは、メニューから新しいサブウィンドウに追加されたままです ...サブウィンドウに既にあるインジケーターに追加する方法は?

iCustom()でインジケータを呼び出すと、そのバッファはウィンドウに表示されませんが、私の知る限り(MTの古いバージョンでは間違いなくそうでした)、インジケータが表示するすべてのグラフィックオブジェクトは、チャートウィンドウに表示されます。

インジケータを他のインジケータのウィンドウに配置するには、ナビゲータウィンドウから必要なインジケータのウィンドウにマウスでドラッグしてください。

プロセッサーの消費時間が少ないことについて - 確認していないのでわかりません。

 

条件出し、アイデア出し、条件に合わせてグラフにマークをつけるのは簡単ですか?

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
     
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
   
  }
  //+------------------------------------------------------------------+
void OnTick()
{
        // скорость тиков
        int nTicksSpeed = TicksSpeed();
}
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
int TicksSpeed()
{
        MqlTick oTicks[5];
        ZeroMemory(oTicks);
        
        int nTicksCopied = CopyTicks(_Symbol, oTicks, COPY_TICKS_TRADE, 0, 5);
        
        int nSpeed = 0;

        if(nTicksCopied > 0)
        {
                // скорость роста
                if(oTicks[0].bid > oTicks[1].bid)
                {
                        if(oTicks[4].bid > 0 && oTicks[0].bid > oTicks[1].bid && oTicks[1].bid > oTicks[2].bid && oTicks[2].bid > oTicks[3].bid && oTicks[3].bid > oTicks[4].bid)
                                nSpeed = 4;
                        else if(oTicks[3].bid > 0 && oTicks[0].bid > oTicks[1].bid && oTicks[1].bid > oTicks[2].bid && oTicks[2].bid > oTicks[3].bid)
                                nSpeed = 3;
                        else if(oTicks[2].bid > 0 && oTicks[0].bid > oTicks[1].bid && oTicks[1].bid > oTicks[2].bid)
                                nSpeed = 2;
                                
                        else if(oTicks[1].bid > 0 && oTicks[0].bid > oTicks[1].bid)
                                nSpeed = 1 ;
                        
                }
        
                // скорость снижения
                if(oTicks[0].bid < oTicks[1].bid)
                {
                        if(oTicks[4].bid > 0 && oTicks[0].bid < oTicks[1].bid && oTicks[1].bid < oTicks[2].bid && oTicks[2].bid < oTicks[3].bid && oTicks[3].bid < oTicks[4].bid)
                                nSpeed = -4;
                        else if(oTicks[3].bid > 0 && oTicks[0].bid < oTicks[1].bid && oTicks[1].bid < oTicks[2].bid && oTicks[2].bid < oTicks[3].bid)
                                nSpeed = -3;
                        else if(oTicks[2].bid > 0 && oTicks[0].bid < oTicks[1].bid && oTicks[1].bid < oTicks[2].bid)
                                nSpeed = -2; 
                        else if(oTicks[1].bid > 0 && oTicks[0].bid < oTicks[1].bid)
                                nSpeed = -1 ; 
                }
        }
        
        return(nSpeed);
}

//+------------------------------------------------------------------+

if( nTickSpeed==-1)  отмечаем это место на графике g_Label.Text("-1 ")

if( nTickSpeed==-2)  отмечаем это место на графике g_Label.Text("-2 ")

if (nTickSpeed==-3)  отмечаем это место на графике g_Label.Text("-3 ")

if( nTickSpeed==-4)  отмечаем это место на графике g_Label.Text("-4 ")




if( nTickSpeed==1)  отмечаем это место на графике g_Label.Text("1 ")

if( nTickSpeed==2)  отмечаем это место на графике g_Label.Text("2 ")

if( nTickSpeed==3)  отмечаем это место на графике g_Label.Text("3 ")

if( nTickSpeed==4)  отмечаем это место на графике g_Label.Text("4 ")
 

最後のifを入れ替えればいい。

   switch(nTickSpeed)
     {
      case -4:
         g_Label.Text("-4");
         break;
      case -3:
         g_Label.Text("-3");
         break;
      case -2:
         g_Label.Text("-2");
         break;
      case -1:
         g_Label.Text("-1");
         break;
      case 1:
         g_Label.Text("1");
         break;
      case 2:
         g_Label.Text("2");
         break;
      case 3:
         g_Label.Text("3");
         break;
      case 4:
         g_Label.Text("4");
         break;
     }
理由: