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

 
C-4:
揃える」とはどういう意味ですか?仮数を小数点以下の 桁数で正規化する?- そのためのNormalizeDouble関数です。それ以外の場合は、より詳細に記述してください。

入力時は任意の正の2倍、出力時はこの楽器であり得る実価格に丸められる。

価格ステップが0.25であれば、0.25に丸める。こんな感じ。

double RoundPrice(const double price)
{
   if(price<=0) return(-1);
   double tick_size=SymbolInfoDouble(Symbol(),SYMBOL_TRADE_TICK_SIZE);
   double p=round(price/tick_size);
   return(NormalizeDouble(p*tick_size,_Digits));
}

しかし、だからといって、オフセット(0.13、0.38、0.63、0.88など)があれば、それはカウントされるのです。それから。

を入力1.0に出力1.13に表示します。

入力として1.25、出力として1.38。

1,5 ---> 1,63...

APIレベルでは、これはいくつかのアセンブリ言語コマンドにエンコードすることができ、明らかに基本的な機能であると言えます。あると思ったんだけどな =/。

 
Live updateで新しいビルドにアップデートする方法。ライブアップデートはどこですか?
 
Newalligator:
Live updateで新しいビルドにアップデートする方法。このLiveアップデートはどこにあるのでしょうか?
MetaQuotes-Demoサーバーにデモ口座を開設し、時々接続して更新を確認する必要があります。MetaQuotes-Demoサーバーでのデモ口座開設方法
 
返信ありがとうございます。私はライブで取引しており、MT5は常にオンになっています。ソフトにアップデートが必要だと書いてあればそれでいいのですが、そうでない場合、ライブアップデートはどこにあるのでしょうか?
 
Newalligator:
返信ありがとうございます。私はライブで取引しており、MT5は常にオンになっています。プログラム自体がアップデートを促してくれるならいいのですが、そうでない場合、このLiveのアップデートはどこにあるのでしょうか?
MetaQuotes-Demoサーバーのアカウントに接続すると、MetaTraderが自動的に更新をチェックします。アップデートがある場合は、自動的に新しいバージョンをダウンロードします。
 

皆さんこんにちは!問題があります。 他のカスタムインジケータの読み取り値をカスタムインジケータで 使用することができません。私のやり方が間違っているのはほぼ確実ですが、とりあえずコードを貼り付けておきます。

int OnCalculate(const int rates_total, const int prev_calculated, const int begin, const double &price[]) {
   
   if(rates_total < iPeriod ) {
      return(0);
   }
   
   int first;
   
   if ( prev_calculated == 0 ) {
      first = iPeriod + begin;
   } else {
      first = prev_calculated - 1;
   }
      
   // Пользовательский индикатор ROC для EURUSD   
   double aRocRatesEURUSD[];
   int iRocHandleEURUSD = iCustom("EURUSD", 0, "Examples\\ROC");   
   CopyBuffer(iRocHandleEURUSD, 0, 0, rates_total, aRocRatesEURUSD);

   for(int bar = first; bar < rates_total; bar++) {

このコードでは、Rate Of Changes インジケータ(aRocRatesEURUSD)のバッファは使用できません。このインジケーターの接続方法が正しく理解できないので、教えてください。

 
jommerbot:

皆さんこんにちは!問題があります。 他のカスタムインジケータの読み取り値をカスタムインジケータで 使用することができません。私のやり方が間違っているのはほぼ確実ですが、とりあえずコードを貼り付けておきます。

このコードでは、Rate Of Changes インジケータ(aRocRatesEURUSD)のバッファは使用できません。このインジケーターの接続方法が正しく理解できないので、ご教授ください。

インジケータ・ハンドルは、OnInit()で宣言する必要があります。

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
// Пользовательский индикатор ROC для EURUSD   
   double aRocRatesEURUSD[];
   int iRocHandleEURUSD = iCustom("EURUSD", 0, "Examples\\ROC");   
  }
そうでなければ、OnCalculate()を呼び出すたびに新しいカスタムインジケータを作成することが判明します。
 
barabashkakvn:

インジケータ・ハンドルは、OnInit()で宣言すること。

これもダメなんです。バッファ配列の末尾は空か、左辺の値で一杯になります。
 
jommerbot:
これもうまくいきません。その結果、バッファを持つ配列は空か左の値で一杯になってしまいます。
とはいえ、OnInit()でインジケータ・ハンドルを宣言するのは正しいことです。もう一つの問題は、なぜ新しいティックが来るたびに書く必要があるのか(OnCalculate()関数)
rates_total,      // размер входных таймсерий

をバッファーに

aRocRatesEURUSD

?これでは、端末が本当に遅くなってしまいます。それに、これはとても深い話なんです。

経済的な指標再計算の原則」の記事を読んでいただくと、面白いと思います。

また、OnCalculate()関数のヘルプを読んでください。

 

なるほど、一番シンプルなケースでもうまくいかないんですね。

#property indicator_chart_window
#property indicator_buffers 1
#property indicator_plots   1
#property  indicator_type1   DRAW_LINE
#property  indicator_color1  Red

double ExtLineBuffer[];   
int iRocHandleEURUSD;  
int iPlotShift = 0;
int iPeriod = 6;
 
void OnInit() {
   SetIndexBuffer(0, ExtLineBuffer, INDICATOR_DATA);
   PlotIndexSetInteger(0, PLOT_SHIFT, iPlotShift);
   PlotIndexSetInteger(0, PLOT_DRAW_BEGIN, iPeriod - 1);
   
   int iRocHandleEURUSD = iCustom("EURUSD", 0, "Examples\\ROC");    
   if( iRocHandleEURUSD == INVALID_HANDLE )
   {
      Print("Не удалось получить хендл индикатора ROC EURUSD");  
   }
}

int OnCalculate(const int rates_total, const int prev_calculated, const int begin, const double &price[]) {
   
   if(rates_total < iPeriod ) {
      return(0);
   }
   
   int first;
   double aRocRatesEURUSD[]; 
   
   if ( prev_calculated == 0 ) {
      first = iPeriod + begin;
   } else {
      first = prev_calculated - 1;
   }
   
   for(int bar = first; bar < rates_total; bar++) {
      CopyBuffer(iRocHandleEURUSD, 0, bar, 1, aRocRatesEURUSD);
      Print(aRocRatesEURUSD[ 0 ]);   
      ExtLineBuffer[ bar ] = NormalizeDouble(aRocRatesEURUSD[ 0 ], SYMBOL_DIGITS);
   }
     
   return(rates_total);
}

自分のミスがどこにあるのか理解できない。EAと スクリプトで同じインジケータ バッファをコピーするとうまくいくが、インジケータではうまくいかない。インジケーターハンドルはエラーなく初期化されます。

理由: