2017年4月20日木曜日

[MT4インジケータ]オーダー状態に変更があるたびにチャート画像を勝手に保存する

Twitterでエントリーとかイグジットとかの度に画像保存するインジケータご存じじゃないですか?と聞かれましたので、あーそーいえばFX-ONで最近見たなーと思いました。これです。
※他の方が販売されているものです。

外出先からいつでもチャート画像を取得可能!MT5でも使用可能。
【MT4】メール通知にチャート画像を添付[MetaTrader Mail Manager]
【MT4】メール通知にチャート画像を添付[MetaTrader Mail Manager] | fx-on.com

EA使用時のポジション監視に!
【MT4インジ】ポジション変化をアラートやメールで通知[MTP_PositionNotice]
【MT4インジ】ポジション変化をアラートやメールで通知[MTP_PositionNotice] | fx-on.com

高機能ですが、その分高いとのこと・・・・。

発注状態に変化がある度にPC内にチャート画像を保存するだけなら割と簡単にできます。


ということで、いろいろつけると手間がかかって高くなりますが、とりあえず口座履歴と時間で見比べればよいからチャートが保存されていると嬉しいという方向けに、単純に保存するだけのものを公開します。
ファイルはデータフォルダ\MQL\Filesの下に日付単位でフォルダを作成して保存します。

オーダーに変化があるたびにチャートを保存する
オーダーに変化があるたびにチャートを保存する
オーダーに変化があるたびにチャートを保存する | fx-on.com

チャートの画像はChartScreenShort関数で取得可能なのですが、ファイルの保存先はMQL\Files以下に限定されてしまうようです。

//------------------------------------------------------------------
// 画像保存
#property copyright "Copyright 2017,  Daisuke"
#property link      "http://mt4program.blogspot.jp/"
#property version   "1.00"
#property strict
#property indicator_chart_window

input int Width = 800;  //画像幅
input int Height = 600; //画像高さ

//------------------------------------------------------------------
//初期化
int OnInit()
{
   EventSetTimer(1);
   return(INIT_SUCCEEDED);
}

//------------------------------------------------------------------
//終了処理
void OnDeinit(const int reason)
{
   EventKillTimer();
}

//------------------------------------------------------------------
//タイマー処理
void OnTimer()
{
   static int beforeOrderTotal = 0;

   //ポジション数に変化があったら
   int ordersTotal = OrdersTotal();
   if( ordersTotal == beforeOrderTotal ) return ;

   MqlDateTime current;
   TimeToStruct(TimeCurrent(), current);

   // yyyyMMdd_HHmmss形式に変換
   string timestr = StringFormat("%04d%02d%02d_%02d%02d%02d", current.year, current.mon, current.day, current.hour, current.min, current.sec);

   beforeOrderTotal = ordersTotal;
   string name = Symbol() + "_" + PeriodToString(Period()) + "_" + timestr;

   //保存フォルダ 日毎に分ける
   string folder = StringFormat("%04d%02d%02d\\", current.year, current.mon, current.day);
   
   //ファイルはMQL4\Files\以下に保存される
   ChartScreenShot(0, folder + name + ".png", Width, Height);
}

//------------------------------------------------------------------
//計算イベント
int OnCalculate(const int rates_total,          //各レート要素数
                const int prev_calculated,      //計算済み要素数
                const datetime &time[],         //要素ごとの時間配列
                const double &open[],           //オープン価格配列
                const double &high[],           //高値配列
                const double &low[],            //安値配列
                const double &close[],          //クローズ価格配列
                const long &tick_volume[],      //ティック数(要素の更新回数)
                const long &volume[],           //実ボリューム(?)
                const int &spread[])            //スプレット
{
   return rates_total;
}

//------------------------------------------------------------------
//期間を文字列に変更する
string PeriodToString(int timeframe)
{
   if( timeframe == 0 )
   {
      timeframe = Period();
   }
   switch(timeframe)
   {
      case PERIOD_M1:
         return "M1";
      case PERIOD_M5:
         return "M5";
      case PERIOD_M15:
         return "M15";
      case PERIOD_M30:
         return "M30";
      case PERIOD_H1:
         return "H1";
      case PERIOD_H4:
         return "H4";
      case PERIOD_D1:
         return "D1";
      case PERIOD_W1:
         return "W1";
      case PERIOD_MN1:
         return "MN1";
   }
   return "";
}
//+------------------------------------------------------------------+

「MT4でFXを勝ち抜く研究をするブログ」で公開している無料インジケータは、こちらの一覧から。
インジケータ一覧

Twitterもよろしくお願いします。
https://twitter.com/mt4program

ブログランキングにご協力よろしくお願いします。m(._.)m
にほんブログ村 為替ブログ FX テクニカルトレード派へ
にほんブログ村

お約束ですが、本ブログは、投資に対する利益を約束する物ではありません。最終的には自己責任によるご判断よろしくお願いいたします。