スクリプト: チャートの切り替え

 

チャートの切り替え:

このスクリプトは、開いているすべてのチャートを一定の間隔で切り替えます。特定な銘柄のチャートのみを表示することもできます。

作者: Vladimir Karputov

 
こんばんは!スクリプトをループさせることは可能ですか?そうすれば、オープンチャートが終了した後、作業を終了するのではなく、もう一度やり直すことができます。
 
Skyline Real:
こんばんは!スクリプトをループさせることは可能ですか?オープンチャートが終了したら、作業を終了するのではなく、また最初からやり直すような。
原理的には可能です。しかし、何回繰り返せばいいのでしょうか?それとも万華鏡のように一日中ですか?
 
Karputov Vladimir:
原則的にはできます。何サイクルやるんですか?それとも万華鏡のように一日中?
まあ、丸一日のほうがいいんだけど......。
 
Skyline Real:
まあ、丸一日の方が良いだろうが......。

その場合、OnTimer()でカルーセル全体を呼び出すEAが必要だ。考えてみます。

追記。テキストを修正しました。

 

とにかく、これが Expert Advisor だ。チャートが無限に表示されているとき、Expert Advisor をオフにしたりアンロードしたりするのはちょっと面倒だということを覚えておいてください :) 。従って、このExpert Advisorは「ナビゲーター」ウィンドウに表示されることをお忘れなく:

Expert Advisorが動作する "Navigator "ウィンドウ

これがそのExpert Advisorだ:

//+------------------------------------------------------------------+
//|チャートをトップに持ってくる。mq5
//|著作権© 2016, ウラジーミル・カルプトフ|||Copyright © 2016, Vladimir Karputov
//|http://wmua.ru/slesar/|( 英語
//+------------------------------------------------------------------+
#property copyright "Copyright © 2016, Vladimir Karputov"
#property link      "http://wmua.ru/slesar/"
#property version   "1.00"
#property description "The indicator switches all open charts after a certain interval."
//--- 入力パラメータ
//--- 入力パラメータ
input uchar Seconds=3;              // インターバル // インターバル
//---
bool        IsCicle=false;          // 真 - シクルの中 // 真 - シクルの中
//+------------------------------------------------------------------+
//| エキスパート初期化関数|
//+------------------------------------------------------------------+
int OnInit()
  {
//--- タイマーを作成する
   if(Seconds<3)
     {
      MessageBox("Interval must be greater than 3 seconds");
      EventSetTimer(3);
     }
   else
      EventSetTimer(Seconds);
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
|エキスパート初期化関数|
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//--- タイマーを破壊する
   EventKillTimer();

  }
//+------------------------------------------------------------------+
//| エキスパート・ティック機能|
//+------------------------------------------------------------------+
void OnTick()
  {
//---

  }
//+------------------------------------------------------------------+
//| タイマー機能|
//+------------------------------------------------------------------+
void OnTimer()
  {
//---
   if(IsCicle)
      return;
   IsCicle=true;
//---
   uchar temp_second;
   if(Seconds<3)
      temp_second=3;
// チャートID用の変数
   long currChart,prevChart=ChartFirst();
//--- 最初のグラフを表示する
//--- 最初のチャートを表示する
   ChartBringToTop(prevChart);
   Sleep((int)MathAbs(temp_second*1000));
   int i=0,limit=100;
//Print("ChartFirst = ",ChartSymbol(prevChart)," ID = ",prevChart);
// 私たちが開いているグラフは、おそらく100以上はないだろう。
// 私たちが開いているチャートは100を超えない。
   while(i<limit)// 
     {
      // 前のグラフを基に、新しいグラフを作成する。
      // 以前のチャートIDを使用して新しいチャートIDを取得する。
      currChart=ChartNext(prevChart);
      if(currChart<0) break;  // チャートリストの最後に達した // チャートリストの最後に達した
                              //Print(i," ",ChartSymbol(currChart)," ID =",currChart);
      ChartBringToTop(currChart);
      Sleep((int)MathAbs(temp_second*1000));
      // ChartNext()のために、現在のチャートのIDを記憶する。
      // ChartNext()のために、現在のチャートIDを保存しておこう。
      prevChart=currChart;
      // カウンターを増やすのを忘れないようにしよう
      // カウンターを増やすのを忘れないこと
      i++;
     }
   IsCicle=false;
  }
//+------------------------------------------------------------------+
//| ターミナルにコマンドを送り、グラフを他のすべてのグラフの上に表示させる。
//| ターミナルにコマンドを送り、チャートを他のものよりも上に表示させる。
//+------------------------------------------------------------------+
bool ChartBringToTop(const long chart_ID=0)
  {
//--- エラー値をリセットする
   ResetLastError();
//--- グラフを他のすべての上に表示する
   if(!ChartSetInteger(chart_ID,CHART_BRING_TO_TOP,0,true))
     {
      //--- エラーメッセージを "Experts "ログに出力する。
      Print(__FUNCTION__+", Error Code = ",GetLastError());
      return(false);
     }
   ChartRedraw(chart_ID);
//--- 実行成功
   return(true);
  }
//+------------------------------------------------------------------+
ファイル:
 
迅速な対応に感謝します。しかし、Expert Advisorが正しく動作しません。2つ以上のチャートを開いている場合、Expert Advisorは1つ目のチャートから最後のチャートにジャンプし、その間はスキップされます。また、最後のチャートから最初のチャートへの遷移もありません。
 
Skyline Real:
迅速な対応に感謝します。しかし、Expert Advisorが正しく動作しません。2つ以上のチャートを開いている場合、Expert Advisorは1つ目のチャートから最後のチャートにジャンプし、その間はスキップされます。また、最後のチャートから最初のチャートへの遷移はなく、カルーセルも機能しません。
端末はチャートを開く 順番を内部的に記録している。作業中にチャートをシャッフルしても、内部記録は変わりません。実験:すべてのチャートを閉じ、新たに5つのチャートを開き、3番のチャートにExpert Advisorをアタッチする。
 
Karputov Vladimir:
端末はチャートを開く 順番を内部的に管理している。作業中にチャートをシャッフルしても、内部会計は変わりません。すべてのチャートを閉じ、新たに5つのチャートを開き、3番目のチャートにExpert Advisorをアタッチする。

確認したところ、すべて同じだった。3番目のチャートから最後のチャートに切り替わり、そして停止する。最後のチャートから1番目のチャートには切り替わらず、カルーセルもない。

私はmt4を使っています。ファイル名をmt4に変更してコンパイルしてみた。以前のスクリプトは正しく切り替わるのですが...。

 

EAバージョン1.01.バグを修正し、変数名を入れ替えました。代わりに

Seconds

の代わりに

Seconds_
MQL4ではSecondsという単語を変数名として使用できないため。(Secondsに関する ヘルプ)。


Expert AdvisorはMetaTrader 5とMetaTrader 4の両方で使用できます(MT4の場合はファイル名を変更するだけです)。

Seconds - Документация на MQL4
  • docs.mql4.com
Seconds - Документация на MQL4
ファイル:
 

無限モードで利用可能なすべてのチャートを切り替える万華鏡 - EAが動作しているビデオ: