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

 

インジケーターのHighとLowの値を空にするにはどうしたらいいですか?例えば、最大値を100、最小値を0に設定し、すべてを可視化するインジケーターが必要な場合、どのように整理すればよいでしょうか。問題は、いくつかのモードを持つインジケータを書き、そのうちの1つは最大値と最小値を使用しますが、入力パラメータでモードを切り替えた後、最大値は100のままで、最小値も0になることです。


MQL5

 
Alekseu Fedotov:

すでに、Deviation(Kanal) が返す値をEnvelopes(......) 関数に呼び出して渡していますね。

そして、Envelopes(......) 関数自体で、最後のパラメータを宣言します。


このように

ありがとうございます、より理解できました。

 

アドバイスに従ってMT5用のコードを少し修正したところ、以下のようになりました。

input  string Parametrs_Indicator       = "Настройки Индикатора";// Настройки Индикатора

input  ENUM_TIMEFRAMES   Time_Frames    = PERIOD_M5;             // Временной период
       int                Ma_Period     = 120;                   // Период
       int                Ma_Shift      = 0;                     // Cдвиг средней
       ENUM_MA_METHOD     Ma_Method     = MODE_SMMA;             // Mетод усреднения
       ENUM_APPLIED_PRICE Applied_Price = PRICE_CLOSE;           // Tип цены
//************************************************************************************************/
void OnTick()
{
//---------------------------------------------------
   double Signal_Sell = Envelopes(0, Deviation(1)); // Сигнал на Продажу
   Print ("Signal_Sell = ", Signal_Sell);
    if (Signal_Sell < 0) { Print("Signal_Sell error #",GetLastError()); }
   double  Signal_Buy = Envelopes(1, Deviation(1));  // Сигнал на Покупку
   Print ("Signal_Buy = ", Signal_Sell);
     if (Signal_Buy < 0) { Print("Signal_Buy error #",GetLastError()); }
//---------------------------------------------------
   double Signal_Sell_2 = Envelopes(0, Deviation(2));
   Print ("Signal_Sell_2 = ", Signal_Sell);
      if (Signal_Sell_2 < 0) { Print("Signal_Sell_2 error #",GetLastError()); }
   double  Signal_Buy_2 = Envelopes(1, Deviation(2));
   Print ("Signal_Buy_2 = ", Signal_Sell);
       if (Signal_Buy_2 < 0) { Print("Signal_Buy_2 error #",GetLastError()); }
//---------------------------------------------------
}
//************************************************************************************************/
double Envelopes(int buff, double _Deviation)
{
  double buf[1];
  int handle=iEnvelopes(Symbol(), TimeFrames, Ma_Period, Ma_Shift, Ma_Method, Applied_Price, _Deviation);
   if(handle<0)
   {
    Print("Failed to create handle iEnvelopes, Error: ",GetLastError());
    return(WRONG_VALUE);
   } else
   {
    if(CopyBuffer(handle,buff,0,1,buf)<0)
    {
     Print("Failed to copy data from the indicator iEnvelopes, Error: ",GetLastError());
     return(WRONG_VALUE);
    }
   }
   return(buf[0]);
}
//************************************************************************************************/

ただ今は、なぜ毎ティックごとに 最初の計算値があちこちに書き込まれるのかが理解できません。

算出方法

どうすれば直るのか、教えてください。
 
Alexander Layzerevich:

アドバイスに従ってMT5用のコードを少し修正したところ、以下のようになりました。

ただ今は、なぜ1ティックごとに 1つの計算値があちこちに書き込まれるのかが理解できません。

//---------------------------------------------------
   double Signal_Sell = Envelopes(0, Deviation(1)); // Сигнал на Продажу
   Print ("Signal_Sell = ", Signal_Sell);
    if (Signal_Sell < 0) { Print("Signal_Sell error #",GetLastError()); }
   double  Signal_Buy = Envelopes(1, Deviation(1));  // Сигнал на Покупку
   Print ("Signal_Buy = ", Signal_Sell);
     if (Signal_Buy < 0) { Print("Signal_Buy error #",GetLastError()); }
//---------------------------------------------------
   double Signal_Sell_2 = Envelopes(0, Deviation(2));
   Print ("Signal_Sell_2 = ", Signal_Sell);
      if (Signal_Sell_2 < 0) { Print("Signal_Sell_2 error #",GetLastError()); }
   double  Signal_Buy_2 = Envelopes(1, Deviation(2));
   Print ("Signal_Buy_2 = ", Signal_Sell);
       if (Signal_Buy_2 < 0) { Print("Signal_Buy_2 error #",GetLastError()); }
//---------------------------------------------------

すぐにわかります。強調表示されなくても

 
Artyom Trishkin:

すぐに目に飛び込んでくる。ハイライトなしでも

ありがとうございます。

 

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

WinProject(ウィンプロジェクト) 2019.05.07 18:38

同じコードがMT4で動作し、MT5で動作しない理由を教えてください。MT5では変数strNumは常に=1ですが、MT4では++カウンターがそのまま動作し、strNum=ファイル内の行数となっています。

int strNum;
void OnStart()
  {
 FileNum();
 Alert1();
  } 

  void FileNum()
{
      int handle=FileOpen("File.csv",FILE_CSV|FILE_READ,';');
      strNum=0; 
      while(!FileIsEnding(handle))
{
      FileReadString(handle);
      strNum++;
      if(FileIsEnding(handle)==true)
      break;
}
      FileClose(handle);
}

      void Alert1()
{
      Alert (strNum);
}

自分への回答ですが、MT5で配列や構造体にファイルを開いたり読み込んだりするときにループがない人には便利かもしれませんね。MT5では、MT4と異なり、.csvファイルを読み込む際に、ファイルオープンフラグ FILE_ANSIを追加で設定 する必要があります。

つまり、MT5では以下のようなラインになるはずです。

int handle=FileOpen("File.csv",FILE_READ|FILE_ANSI|FILE_CSV,";");

なぜだろう、わからない、もしかしたら誰か知っているかも?

 
EAのログにこのような形式の通知 - uninit reason 3(通知はTMが切り替わったため)が表示されても、ロボットがチャートから削除されない場合、変数の値や受信したすべての計算は保持されますか。
 

理由は不明ですが、"OrderSend error 130 "が発生しました。プログラムはデモ口座のストラテジーテスターで実行されているので、私が理解する限り、ブローカーからの制限はありません。テスト中に一定の間隔でこのエラーが発生し、ストップはすべての取引でATRのパーセンテージで固定されていますが、正常に発注されるものとされないものがあります。

      Print("!!!long level = ", level, ", stop = ", NormalizeDouble(level - stop, Digits));
      if(Bid < level) {
         tickets[orders] = OrderSend(symbol, OP_BUYSTOP, volume, level, 5, NormalizeDouble(level - stop, Digits), 
                            NormalizeDouble(level + take, Digits), NULL, magicNum, TimeLocal() - TimeLocal() % 1800 + 7200, clrBlue);                                                                           
         orderLevels[orders] = level;
         directions[orders] = true;
         orderIsTheLast[orders] = lastOrder;          
         firstTouchTimes[orders] = firstTouchTime;
         orders++;                   
      }       
      else { 
         tickets[orders] = OrderSend(symbol, OP_BUYLIMIT, volume, level, 5, NormalizeDouble(level - stop, Digits), 
                            NormalizeDouble(level + take, Digits), NULL, magicNum, TimeLocal() - TimeLocal() % 1800 + 7200, clrBlue);                
         orderLevels[orders] = level;
         directions[orders] = true;
         orderIsTheLast[orders] = lastOrder;
         firstTouchTimes[orders] = firstTouchTime;
         orders++;    
      }

何度も注文を断られ、合格することもありますが...。



 

CodeBaseで同じコードを異なる言語の読者向けに公開するにはどうしたらよいでしょうか (例えば、対応する言語のマーケットプレイスでフォームに記入するにはどうしたらよいでしょうか)。


私はすでにCodeBaseでこれを見たことがありますが、以下に例を示します。


どうすれば同じことができるのか?

 

例えば、マウスでローソク足の目盛りを限界まで小さくすると、インジケータの読みが変わりますが、インジケータコード内の何千ものローソク足は、ローソク足のサイズの変化について何も言っていません。 例えば、4時方向のボリュームを縮小して表示すると一つの値になりますが、ローソク足の目盛りをわずかに大きくすると、別の設定が正しいものとみなされるのです。