private void btn_csv_read_Click(object sender, EventArgs e) { try { Dictionary <string, string> dict = File_CTRL.csv_reader("all_setting.txt"); dict[@"C:\Users\GFIT\u00001105\┗Ava-Demo\5997487\USDJPY\H1\ReloadTemplateEA.mq4"] = "AAA"; System.Console.WriteLine(File_CTRL.csv_writer("all_setting.txt", dict)); } catch (System.Exception ex) { Console.WriteLine(ex.Message); } }
/// <summary> /// フォルダパス(MT4インストール)のキー値を使用して最終指示を上書き更新します /// </summary> /// <param name="folder_path">MT4のインストールパス</param> /// <param name="last_order">最終指示内容</param> /// <returns></returns> public static bool last_order_rewrite(string folder_path, string last_order) { try { Dictionary <string, string> dict = File_CTRL.csv_reader("all_setting.txt"); // キーの存在有無に関わらず、書き込みを行います。存在チェックをする場合はキー値で値を取り出すとエラートラップできます。 // string test = dict[folder_path]; // この様な形でやるとキーエラーが発生します。 dict[folder_path] = last_order; return(csv_writer("all_setting.txt", dict)); } catch (System.Exception ex) { // ファイルを開くのに失敗したとき logger.Error(" 最終指示情報更新失敗: " + ex.Message); return(false); } }
public MainForm() { InitializeComponent(); //起動後にキュータイマー稼働 Retry_Timer = new retry_timer(); Retry_Timer.NewTimer(); Retry_Timer.StartTimer(); // テストサーバーへの接続を設定 rdo_stg.Checked = true; // マシン名のファイル読み込み // con_setting.txtに設定ファイルを統一 // machine_name = File_CTRL.file_Read(@"./Machine_Name.txt"); // lbl_Machine_Name.Text = machine_name; // 起動時の設定読み込み Dictionary <string, string> dict = File_CTRL.csv_reader(@"./con_setting.txt"); // 各種起動時動作を行う foreach (var pair in dict) { switch (pair.Key) { case "machine_name": // マシン名のファイル読み込み サーバー名文字列 System.Console.WriteLine(pair.Value); machine_name = pair.Value; lbl_Machine_Name.Text = pair.Value; break; case "real_server_url": // 本番接続先を設定フェイルから読み出します。 if (pair.Value != "") { real_server_url = pair.Value; } break; case "stc_server": // STC_CONの接続先サーバー test…STG環境、real…本番環境 System.Console.WriteLine(pair.Value); switch (pair.Value) { case "test": // STG環境へ接続 rdo_stg.Checked = true; break; case "real": // 本番環境へ接続 rdo_real.Checked = true; break; default: // 当てはまらない場合はSTG環境へ接続 rdo_stg.Checked = true; break; } break; case "recover_start": // 起動時実行状態再現 true…再現実行、false…再現はしない System.Console.WriteLine(pair.Value); if (pair.Value == "true") { MT4_CTLR.recover_MT4(); } break; case "request_timer": // リクエストポーリングタイマー true…起動時実行、false…起動時実行しない System.Console.WriteLine(pair.Value); if (pair.Value == "true") { tgl_reuest.Checked = true; } else { tgl_reuest.Checked = false; } break; case "sock_connect": // 監視ソケット true…起動時受入状態、false…起動時受け入れない System.Console.WriteLine(pair.Value); if (int.TryParse(pair.Value, out port_no)) { tgl_socket.Checked = true; } else { tgl_socket.Checked = false; } break; case "MT4_watch": // MT4接続監視 true…監視する、false…監視しない System.Console.WriteLine(pair.Value); if (pair.Value == "true") { tgl_MT4_watch.Checked = true; mt4_opt = true; } else { tgl_MT4_watch.Checked = false; mt4_opt = false; } break; case "MT4_option": // MT4起動時オプション /portable /skipupdate true…有効、false…無効 System.Console.WriteLine(pair.Value); if (pair.Value == "true") { tgl_MT4_option.Checked = true; } else { tgl_MT4_option.Checked = false; } break; default: // 設定ファイル上の指示がおかしい場合 break; } } // EA毎のvol1応答の強制書き換え設定の取得 get_vol1_setting(); }
/// <summary> /// MT4の起動状況の再現をall_setting.txtを使って行います。 /// Windowsアップデートなどでサーバーがリブートした場合に /// MT4も停止するので、その状況からサービスを再開させる事が目的です。 /// </summary> public static void recover_MT4() { try { // 最終指示状況をDictionary型で取得します。 Dictionary <string, string> dict = File_CTRL.csv_reader("all_setting.txt"); foreach (var pair in dict) { //Console.WriteLine("Dic設定上の" + pair.Key + "は" + pair.Value); switch (pair.Value) { case "start": // MT4起動&自動売買開始 bool status = false; string program_path = pair.Key + @"\terminal.exe"; string error = ""; string option_param = "/portable /skipupdate"; // 起動指示前に起動しているかの確認 status = program_CTRL.SearchProgram(program_path, out error); if (!status) { // 起動動作を行います // program_CTRL.StartProgramはbool値返すのでfalseの時はログへ出力する if (MainForm.mt4_opt) { status = program_CTRL.StartProgram(program_path, option_param); } else { status = program_CTRL.StartProgram(program_path); } if (!status) { logger.Error(" 起動状態再現失敗 起動する事が出来ませんでした: パス:" + pair.Key + " 最終指示:" + pair.Value); } } else { logger.Error(" 起動状態再現 既に起動状態でした: パス:" + pair.Key + " 最終指示:" + pair.Value); } break; case "stop": // MT4停止&自動売買停止 break; case "reload": // MT4再起動 break; case "status": // STCログイン時のMT4起動状態応答用 break; case "outage": // 退会処理 break; case "mod_ea": // EAの設定変更 break; case "mod_brok": // ブローカーの設定変更 break; case "watch_s": // 起動状態の監視 break; case "watch_r": // 再起動状態の監視 break; case "force_stop": // 稼働検査でのタイムスタンプチェックで強制停止 break; default: // 指示ファイル上の指示がおかしい場合 logger.Error(" 起動状態再現失敗 全体最終指示ファイル上のパラメータエラー: パス:" + pair.Key + " 最終指示:" + pair.Value); break; } } } catch (System.Exception ex) { // ファイルを開くのに失敗したとき logger.Error(" 起動状態再現失敗: " + ex.Message); } }
/// <summary> /// 各MT4インストールフォルダで更新されているgfit.txtのタイムスタンプをチェックし /// MT4のダミーEAが動作しているか判定を行います。 /// MT4が稼働指示されている状態でタイムスタンプが更新されていない場合は /// MT4サーバーへ接続できていないと判断し強制終了を行います。 /// 将来的にはSTC_SVへ通知する機能を実装する構想です。 /// </summary> public static void connect_watch() { try { // MT4の監視機能ではありますが、ログ掃除もここに配置しておく File_CTRL.log_file_del(); string watch_log_file = @"\gfit.txt"; // 最終指示状況をDictionary型で取得します。 Dictionary <string, string> dict = File_CTRL.csv_reader("all_setting.txt"); foreach (var pair in dict) { //Console.WriteLine("Dic設定上の" + pair.Key + "は" + pair.Value); if (System.IO.Directory.Exists(System.IO.Path.GetDirectoryName(pair.Key + watch_log_file))) { switch (pair.Value) { case "start": // MT4起動&自動売買開始 // 更新日時を取得する DateTime dtUpdate = System.IO.File.GetLastWriteTime(pair.Key + watch_log_file); TimeSpan ts = DateTime.Now - dtUpdate; //DateTime の差が TimeSpan として返る Console.WriteLine("最終更新日時からの秒差: " + ts.TotalSeconds + "秒の差があります。"); // 現在日時と更新日時が一定時間乖離した場合は以降の処理を実装(取り敢えず10分=600秒ぐらいかな) if ((int)ts.TotalSeconds > 600) { // 通知後に該当のMT4を強制停止 Console.WriteLine("強制停止"); string err = ""; if (!program_CTRL.SearchProgram(pair.Key + @"\terminal.exe", out err)) // 否定IFに変更して下記をコメントアウト /*{ * program_CTRL.StopProgram(pair.Key + @"\terminal.exe"); * } * else*/ { logger.Error(" 接続監視失敗 停止対象のプログラムがOS上で見つかりませんでした パス:" + pair.Key + " 最終指示:" + pair.Value); } // 強制停止後、最終指示一覧に強制停止である事を上書き File_CTRL.last_order_rewrite(pair.Key, "force_stop"); // STCサーバーへ通知する機能の実装予定地 System.Console.WriteLine(pair.Key); //throw_force_stop_status(pair.Key); //停止だけだったので開始と共通化しましたのでこちらは使いません throw_notice(pair.Key, "OFF"); } break; case "stop": // MT4停止&自動売買停止 break; case "reload": // MT4再起動 break; case "status": // STCログイン時のMT4起動状態応答用 break; case "outage": // 退会処理 break; case "mod_ea": // EAの設定変更 break; case "mod_brok": // ブローカーの設定変更 break; case "watch_s": // 起動状態の監視 break; case "watch_r": // 再起動状態の監視 break; case "force_stop": // 稼働検査でのタイムスタンプチェックで強制停止 DateTime lastUpdate = System.IO.File.GetLastWriteTime(pair.Key + watch_log_file); TimeSpan timeSpan = DateTime.Now - lastUpdate; //DateTime の差が TimeSpan として返る Console.WriteLine("最終更新日時からの秒差: " + timeSpan.TotalSeconds + "秒の差があります。"); // 現在日時と更新日時が一定時間差以内になった場合は以降の処理を実装(取り敢えず30秒ぐらいかな) if ((int)timeSpan.TotalSeconds < 30) { // STCサーバーへの復帰の通知とall_setting.txtの最終指示更新 // 通知後に該当のMT4を強制停止 Console.WriteLine("復帰"); string err = ""; if (!program_CTRL.SearchProgram(pair.Key + @"\terminal.exe", out err)) { logger.Error(" 接続監視失敗 復帰確認対象のプログラムがOS上で見つかりませんでした パス:" + pair.Key + " 最終指示:" + pair.Value); } // 復帰確認後後、最終指示一覧に起動中である事を上書き File_CTRL.last_order_rewrite(pair.Key, "start"); // STCサーバーへ通知する機能の実装予定地 System.Console.WriteLine(pair.Key); throw_notice(pair.Key, "ON"); } break; default: // 指示ファイル上の指示がおかしい場合 logger.Error(" 接続監視失敗 最終指示ファイル上のパラメータエラー: パス:" + pair.Key + " 最終指示:" + pair.Value); break; } } else { // 指定されたファイルが見つからない場合 logger.Error(" 接続監視失敗 最終指示ファイル上の指定フォルダのgfit.txtが見つかりません: パス:" + pair.Key + " 最終指示:" + pair.Value); } } } catch (System.Exception ex) { // ファイルを開くのに失敗したとき logger.Error(" 接続監視失敗失敗: " + ex.Message); } }
/// <summary> /// MT4が起動しているか確認して応答を行います。 /// MT4が起動状態であればEA_StatusにONを設定し、起動していなければOFFを設定します。 /// </summary> /// <param name="read_req">request.jsonの1レコード</param> /// <param name="status">状態取得でエラーが発生していなければtrue、発生した場合はFalse</param> /// <param name="error">確認時のエラー情報</param> /// <returns></returns> private static dynamic get_status(dynamic read_req, out bool status, out string error) { // パラメータチェック結果判定 if (read_req.Check_Status == "NG") { error = "事前チェックエラー"; status = false; return(read_req); } status = program_watch(read_req, out error); if (status) { // mod_eaが存在し更新されたか判定 if (file_updated_check(read_req)) { // MT4起動中のステータス設定 read_req.EA_Status = "ON"; } else { // MT4起動中のステータス設定 read_req.EA_Status = "mod_ea_fail"; } Dictionary <string, string> dict = File_CTRL.csv_reader("all_setting.txt"); string file_path = File_CTRL.get_folder_path(read_req); Console.WriteLine("リクエスト上のファイルパスは" + file_path); foreach (var pair in dict) { Console.WriteLine("Dic設定上の" + pair.Key + "は" + pair.Value); if (pair.Key == file_path) { if (pair.Value == "force_stop") { read_req.EA_Status = "OFF"; } break; } } // MT4は起動しているが通信が切断している場合の判断を追加 } else { // outageの場合の処理追加 // 起動プログラムのパス //string folder_path = @"C:\Users\GFIT\" + read_req.Stc_ID + @"\" + read_req.MT4_Server + @"\" + read_req.MT4_ID + @"\" + read_req.Ccy + @"\" + read_req.Time_Period + @"\" + read_req.EA_Name; string folder_path = File_CTRL.get_folder_path(read_req); string file_path = folder_path + @"\terminal.exe"; string outage_file_path = folder_path + @"\@terminal.exe"; // プログラムの存在判断 if (File.Exists(file_path)) { // MT4停止のステータス設定 read_req.EA_Status = "OFF"; } else if (File.Exists(outage_file_path)) { // MT4停止のステータス設定 期限切れ read_req.EA_Status = "outage"; } else { // MT4停止のステータス設定 存在していないのでUNKNOWN read_req.EA_Status = "UNKNOWN"; } } error = ""; status = true; return(read_req); }