/// <summary> /// jsonの共通チェック処理です /// </summary> /// <param name="dyn_check">チェック対象のjsonレコードです</param> /// <param name="dic">チェックに使用するディクショナリーです</param> /// <returns>エラーの場合は内容を応答します 正常の場合は""空文字で応答します</returns> protected override string Base_check(dynamic dyn_check, Dictionary <object, int> dic) { //エラー箇所特定用変数 string error_field; //ディクショナリーチェック if (dyn_check == null) { return(" ディクショナリーエラー: チェック用ディクショナリーが設定されていません プログラムの誤りです"); } //項目数一致チェック // 2016/06/23 かず様の拡張仕様発生の為、項目数についてはチェックを行わない様に修正 //if (!Json_Util.Field_Count_Check(dyn_check, dic)) //{ // return " 項目数チェックエラー: jsonとプログラム内の項目数が不一致です"; //} //存在チェック処理 if (!Json_Util.Presence_Check(dyn_check, dic, out error_field)) { return(" 項目存在チェックエラー:" + error_field); } //サイズチェック if (!Json_Util.Size_Check(dyn_check, dic, out error_field)) { return(" 項目文字数チェックエラー:" + error_field); } return(""); }
private static void throw_force_stop_status(string path_string) { try { // 取り敢えずここで強制停止時のJsonを生成してサーバーへ投げ込むまでの // 機能実装を行ってテストしみてる! // all_setting上のプログラムインストールパスを区切りで分割して配列に格納する string[] stArrayData = path_string.Split('\\'); // データを確認する /* * foreach (string stData in stArrayData) * { * System.Console.WriteLine(stData); * } * System.Console.WriteLine(stArrayData[1]); */ ArrayList OK_req_list = new ArrayList(); //定義変更時はRequest_machine_checkの項目も併せて修正しましょう! dynamic req_obj = new DynamicJson(); // ルートのコンテナ req_obj.Ope_Number = -1; req_obj.Stc_ID = stArrayData[3]; //req_obj.Request_Time = Json_Util.iso_8601_now(); req_obj.Machine_Name = MainForm.machine_name; req_obj.Response_Time = Json_Util.iso_8601_now(); req_obj.EA_ID = stArrayData[8]; req_obj.Broker_Name = stArrayData[4]; req_obj.MT4_Server = stArrayData[4]; req_obj.MT4_ID = stArrayData[5]; req_obj.Ccy = stArrayData[6]; req_obj.Time_Period = stArrayData[7]; req_obj.Ope_Code = "notice"; //req_obj.Vol_1shot = ""; //req_obj.A_Start = ""; req_obj.EA_Status = "OFF"; OK_req_list.Add(req_obj); dynamic out_put = Json_Util.reParse(OK_req_list); // 処理結果登録 http_Request_CTRL.http_post(out_put.ToString(), MainForm.ea_alert); //MainForm//private void rdo_stg_CheckedChanged } catch (System.Exception ex) { logger.Error(ex.Message); } }
private static dynamic Create_return_ope_tag(dynamic req_obj, dynamic read_req) { // 元のJsonのライブラリを改変してOpe_Tag用の1段階ネストを追加 // System.Console.WriteLine(Json_Util.get_Ope_Tag_Value(read_req, "header")); // System.Console.WriteLine(Json_Util.get_Ope_Tag_Value(read_req, "param")); req_obj.Ope_Tag = new { }; // Ope_Tagのオブジェクトの追加 req_obj.Ope_Tag.header = Json_Util.get_Ope_Tag_Value(read_req, "header"); req_obj.Ope_Tag.param = Json_Util.get_Ope_Tag_Value(read_req, "param"); return(req_obj); }
/// <summary> /// Ope_Tag用の追加タグを生成するための分岐を行います。 /// </summary> /// <param name="req_obj">応答用のjson</param> /// <param name="read_req">処理対象のjson</param> /// <returns></returns> private static dynamic Ope_Tag_Creator(dynamic req_obj, dynamic read_req) { dynamic return_json = null; if (Json_Util.get_Ope_Tag_Value(read_req, "header") == "") { return(null); } // ope_tagが存在している場合は生成して応答 return_json = Create_return_ope_tag(req_obj, read_req); return(return_json); }
public static Dictionary <string, string> ea_param_motion(string request_strings, out bool status, out string error) { dynamic json_obj = ""; status = false; error = ""; //送受信正常結果格納用パス string filePaht = System.IO.Directory.GetCurrentDirectory() + @"\rquest_log"; Json_EA_Param JRs = new Json_EA_Param(); json_obj = JRs.Json_accept(request_strings, out status, out error); if (status) { //正常時、証跡の受信内容をファイル出力 File_CTRL.Write_OK_Log(request_strings, filePaht + @"\Accept" + System.DateTime.Now.ToString("yyyy_MM_dd_HH_mm_ss") + @".txt"); } else { ///エラーログファイル出力 logger.Error(" ea_param.json 読み込みエラー: " + error + "\n\r" + request_strings); } // 応答用Dictionary var dict = new Dictionary <string, string>(); if (json_obj != null) { foreach (dynamic read_req in (object[])json_obj) { // EAのパラメータファイルをメモリに格納するか ファイルに出力する System.Console.WriteLine(Json_Util.get_Value(read_req, "name")); System.Console.WriteLine(Json_Util.get_Value(read_req, "type")); System.Console.WriteLine(Json_Util.get_Value(read_req, "desc")); System.Console.WriteLine(Json_Util.get_Value(read_req, "nonVolFlag")); System.Console.WriteLine(Json_Util.get_Value(read_req, "PARAM")); // Dictionaryに追加 dict.Add(Json_Util.get_Value(read_req, "name"), Json_Util.get_Value(read_req, "nonVolFlag")); } } return(dict); }
/// <summary> /// 特殊チェックの日時フォーマットを日時項目に対して行います /// </summary> /// <param name="dyn_check">チェック対象のjson</param> /// <param name="dic">チェック用ディクショナリー</param> /// <returns></returns> protected override string Special_check(dynamic dyn_check, Dictionary <object, int> dic) { //時刻形式チェック if (!Json_Util.Time_Format_Check(dyn_check.Join_Time)) { dyn_check.Check_Status = "NG"; return(" 日時フォーマットチェックエラー:Join_Time:" + dyn_check.Join_Time); } //時刻形式チェック if (!Json_Util.Time_Format_Check(dyn_check.Join_Time2)) { dyn_check.Check_Status = "NG"; return(" 日時フォーマットチェックエラー:Join_Time2:" + dyn_check.Join_Time2); } return(""); }
/// <summary> /// EA用のパラメータファイルを出力します。 /// STC_サーバーからOpe_Tagの内容をそのままファイル出力します。 /// </summary> /// <param name="read_req"></param> /// <param name="error"></param> /// <returns></returns> public static bool output_ea_param(dynamic read_req, out string error) { error = ""; try { // 更新or作成前にファイルのタイムスタンプを取得予定地 // mod_ea用のパラメータファイルを比較してチェック string folder_path = File_CTRL.get_folder_path(read_req) + @"\MQL4\Files"; // EAパラメータファイル出力先のパス string read_full_path = folder_path + @"\read_parameters.csv"; DateTime read_parameters = System.IO.File.GetLastWriteTime(read_full_path); // EAパラメータファイル出力先のMT4起動プログラムのパス string out_put_full_path = read_full_path; string param = ""; param += Json_Util.get_Ope_Tag_Value(read_req, "header"); param += "\r\n"; param += Json_Util.get_Ope_Tag_Value(read_req, "param"); File_CTRL.file_OverWrite(param, out_put_full_path, false); // 更新後、ファイルのタイムスタンプが更新されているかチェック予定地 DateTime after_read_parameters = System.IO.File.GetLastWriteTime(read_full_path); TimeSpan timeSpan = after_read_parameters - read_parameters; //DateTime の差が TimeSpan として返る // 更新されたか判定 if ((int)timeSpan.TotalSeconds > 0) { return(true); } return(false); } catch (System.Exception ex) { logger.Error(ex.Message); error = ex.Message; return(false); } }
/// <summary> /// 監視用タイマーのタイマーイベントです。 /// キューイングされているjsonから処理上に付加されたタグを除去してリクエスト時の状態に戻します。 /// その上でリクエストの受信時の動作を呼び出して、再実行します。 /// 戻りのPOSTリクエストをコメントにしてるのでasyncが警告となっています。 /// </summary> /// <param name="source"></param> /// <param name="e"></param> private async void OnTimerEvent(object source, ElapsedEventArgs e) { int get_cnt = Program.queue_list.Count; if (get_cnt > 0) { dynamic retry_obj = null; retry_obj = Json_Util.reParse(Program.queue_list); Program.queue_list.RemoveRange(0, get_cnt); foreach (dynamic retry in (object[])retry_obj) { bool status = false; string error = ""; // response登録先URL string post_url = "https://systrade-cloud.com/server/resultbox.php"; //キューに入っている内容をリクエスト時の状態に再整形 if (Json_Util.get_Value(retry, "Check_Status") != "") { retry.Delete("Check_Status"); } if (Json_Util.get_Value(retry, "EA_Status") != "") { retry.Delete("EA_Status"); } dynamic json_obj = Json_request_action.request_motion("[" + retry.ToString() + "]", out status, out error); if (status) { if (json_obj != null) { // 処理結果登録 await http_Request_CTRL.http_post(json_obj.ToString(), post_url); // debug用 //string file_path = "C:\\Users\\f464\\Desktop\\Response.json"; //File_CTRL.file_OverWrite(json_obj.ToString(), file_path); } } } } }
private static dynamic remove_inner_resopense(dynamic json_obj) { dynamic response_json = null; ArrayList OK_req_list = new ArrayList(); if (json_obj != null) { foreach (dynamic read_obj in (object[])json_obj) { string ope_conde = read_obj.Ope_Code; switch (ope_conde) { case "watch_s": if (read_obj.EA_Status == "ON") { read_obj.Ope_Code = "start"; OK_req_list.Add(read_obj); } break; case "watch_r": if (read_obj.EA_Status == "ON") { read_obj.Ope_Code = "reload"; OK_req_list.Add(read_obj); } break; default: OK_req_list.Add(read_obj); break; } } } if (OK_req_list.Count > 0) { response_json = Json_Util.reParse(OK_req_list); } return(response_json); }
/// <summary> /// requestのOpe_Codeによって処理の振り分けを行います。 /// </summary> /// <param name="request">rquest.jsonです</param> /// <param name="status">処理結果を応答します。</param> /// <param name="error">エラー内容を応答します。</param> /// <returns></returns> public static dynamic operation(dynamic request, out bool status, out string error) { string ope_code = ""; string req_errors = ""; status = false; string res_request = ""; foreach (dynamic read_req in (object[])request) { ope_code = Json_Util.get_Value(read_req, "Ope_Code"); Console.WriteLine("指示コード:" + ope_code); if (ope_code == "") { error = "パラメータエラー: ope_codeが存在していません。後続処理を中断します。"; status = false; return(null); } string req_error = ""; // 自分のマシン名と一致するか確認 if (Json_Util.get_Value(read_req, "Machine_Name") == MainForm.machine_name) { switch (ope_code) { case "start": // MT4起動&自動売買開始 start_mode(read_req, out status, out req_error, true); req_errors = req_errors + req_error; break; case "stop": // MT4停止&自動売買停止 stop_mode(read_req, out status, out req_error); req_errors = req_errors + req_error; break; case "reload": // MT4再起動 status = program_watch(read_req, out req_error); req_errors = req_errors + req_error; if (status) { // (OFF→ON→OFF)で浦島様の指定 // 停止処理 stop_mode(read_req, out status, out req_error); req_errors = req_errors + req_error; // 開始処理 start_mode(read_req, out status, out req_error, false); req_errors = req_errors + req_error; } else { // (ON→OFF→ON)で浦島様の指定 // 開始処理 start_mode(read_req, out status, out req_error, false); req_errors = req_errors + req_error; // 停止処理 stop_mode(read_req, out status, out req_error); req_errors = req_errors + req_error; } break; case "status": // STCログイン時のMT4起動状態応答用 get_status(read_req, out status, out req_error); req_errors = req_errors + req_error; break; case "outage": // 退会処理(未テストなのでKaz様と打ち合わせてテストしましょう) uninst_mode(read_req, out status, out req_error); req_errors = req_errors + req_error; break; case "mod_ea": // EAの設定変更 //Ope_tag部分の出力機能を追加する予定です! mod_ea_mode(read_req, out status, out req_error); req_errors = req_errors + req_error; break; case "mod_brok": // ブローカーの設定変更 break; case "watch_s": // 起動状態の監視 watch_mode(read_req, out status, out req_error); req_errors = req_errors + req_error; break; case "watch_r": // 再起動状態の監視 watch_mode(read_req, out status, out req_error); req_errors = req_errors + req_error; break; default: req_errors = req_errors + "パラメータエラー:" + ope_code; status = false; break; } // 対象の指示のみを再結合させます if (res_request != "") { res_request = res_request + ","; } res_request = res_request + read_req; } } dynamic dyn_obj; if (res_request != "") { dyn_obj = DynamicJson.Parse("[" + res_request + "]"); } else { dyn_obj = null; } error = req_errors; status = true; return(dyn_obj); }
/// <summary> /// 処理結果応答用のend_initをjsonとして生成します 生成時に必要項目を更新します /// </summary> /// <param name="read_json_obj">応答対象となる処理済みのjson(add_user.json)</param> /// <param name="status">全体処理結果をOUTします 全て正常の場合はtrue 1件でもエラーがある場合はfalse</param> /// <param name="error">1件でもエラーがある場合はエラー内容をOUTします</param> /// <returns>応答用のend_init形式のjson</returns> public static dynamic end_init(dynamic read_json_obj, out bool status, out string error) { try { ArrayList OK_user_list = new ArrayList(); foreach (dynamic read_user in (object[])read_json_obj) { //定義変更時はadd_user_checkの項目も併せて修正しましょう! dynamic user_obj = new DynamicJson(); // ルートのコンテナ user_obj.Stc_ID = Json_Util.get_Value(read_user, "Stc_ID"); user_obj.Stc_Pwd = Json_Util.get_Value(read_user, "Stc_Pwd"); user_obj.Mail_Address = Json_Util.get_Value(read_user, "Mail_Address"); user_obj.Join_Time = Json_Util.get_Value(read_user, "Join_Time"); user_obj.Join_Time2 = Json_Util.get_Value(read_user, "Join_Time2"); user_obj.Launch_Time = Json_Util.iso_8601_now(); //user_obj.Machine_Name = "Jupiter"; user_obj.Machine_Name = MainForm.machine_name; user_obj.Broker_Name = Json_Util.get_Value(read_user, "Broker_Name"); user_obj.MT4_Server = Json_Util.get_Value(read_user, "MT4_Server"); user_obj.MT4_ID = Json_Util.get_Value(read_user, "MT4_ID"); user_obj.MT4_Pwd = Json_Util.get_Value(read_user, "MT4_Pwd"); user_obj.EA_ID = Json_Util.get_Value(read_user, "EA_ID"); user_obj.EA_Name = Json_Util.get_Value(read_user, "EA_Name"); user_obj.Course = Json_Util.get_Value(read_user, "Course"); user_obj.Ccy = Json_Util.get_Value(read_user, "Ccy"); user_obj.Time_Period = Json_Util.get_Value(read_user, "Time_Period"); user_obj.Vol_1shot = Json_Util.get_Value(read_user, "Vol_1shot"); user_obj.A_Start = Json_Util.get_Value(read_user, "A_Start"); // A_Startが"A_Start"の場合はOn、offの場合はOFFで応答 if (Json_Util.get_Value(read_user, "A_Start") == "A_Start") { user_obj.EA_Status = "ON"; } else { user_obj.EA_Status = "OFF"; } user_obj.Init_Status = Json_Util.get_Value(read_user, "Check_Status"); // 4/26かずさんが追加していたので対応 user_obj.Stc_Name = Json_Util.get_Value(read_user, "Stc_Name"); // Ope_Tagでの追加タグ生成 dynamic req_obj_ope_tag = Ope_Tag_Creator(user_obj, read_user); if (req_obj_ope_tag != null) { user_obj = req_obj_ope_tag; } OK_user_list.Add(user_obj); } dynamic out_put = Json_Util.reParse(OK_user_list); status = true; error = "正常変換完了"; return(out_put); } catch (System.Exception ex) { status = true; error = ex.ToString(); logger.Error(ex.Message); return(null); } }
/// <summary> /// Ope_Tagと特殊チェックの日時フォーマットを日時項目に対して行います /// Ope_Codeが増えた場合は分岐を増やす修正を行って下さい。 /// 合せて分岐時に呼び出すファンクションを追加してください。 /// </summary> /// <param name="dyn_check">チェック対象のjson</param> /// <param name="dic">チェック用ディクショナリー</param> /// <returns></returns> protected override string Special_check(dynamic dyn_check, Dictionary <object, int> dic) { //Ope_Tagの種類チェック string ope_code = dyn_check.Ope_Code; dynamic dyn_check_ope_tag = null; string Json_Base_check_error = ""; switch (ope_code) { case "start": // start用OpeTag取得 dyn_check_ope_tag = Create_dictionary_start(); break; case "stop": dyn_check_ope_tag = Create_dictionary_stop(); break; case "reload": dyn_check_ope_tag = Create_dictionary_reload(); break; case "status": dyn_check_ope_tag = Create_dictionary_status(); break; case "outage": dyn_check_ope_tag = Create_dictionary_uninst(); break; case "mod_ea": dyn_check_ope_tag = Create_dictionary_mod_ea(); break; case "mod_brok": dyn_check_ope_tag = Create_dictionary_mod_brok(); break; case "watch_s": dyn_check_ope_tag = Create_dictionary_watch_s(); break; case "watch_r": dyn_check_ope_tag = Create_dictionary_watch_r(); break; default: dyn_check.Check_Status = "NG"; return(" Ope_Codeチェックエラー: " + ope_code + " はコード値としてプログラムに設定されていません"); } // Ope_Tagチェック 但しチェック用のディクショナリーがある場合のみ if (dyn_check_ope_tag != null) { Json_Base_check_error = Base_check(dyn_check.Ope_Tag, dyn_check_ope_tag); if (Json_Base_check_error != "") { dyn_check.Check_Status = "NG"; return(" Ope_Tagチェックエラー: " + Json_Base_check_error); } } //時刻形式チェック if (!Json_Util.Time_Format_Check(dyn_check.Request_Time)) { dyn_check.Check_Status = "NG"; return(" 日時フォーマットチェックエラー:Join_Time:" + dyn_check.Request_Time); } else { return(""); } }
/// <summary> /// json受信時のチェック処理用基本動作クラスです /// </summary> /// <param name="json_text">処理対象となるjsonのテキストを受け取ります</param> /// <param name="status">全体処理結果をOUTします 全て正常の場合はtrue 1件でもエラーがある場合はfalse</param> /// <param name="error">1件でもエラーがある場合はエラー内容をOUTします</param> /// <returns>statusがエラーでも正常処理できたレコードをjsonレコードとして応答します。</returns> public override dynamic Json_accept(string json_text, out bool status, out string error) { try { if (json_text == "ABORT") { status = true; error = "読込完了"; return(null); } dynamic dyn_obj = DynamicJson.Parse(json_text); //Console.WriteLine(user); if (dyn_obj == null) { status = true; error = "読込完了"; return(null); } // ステータスとエラーと正常読み込み対象の初期化 status = false; error = null; // 処理済みjson用リスト ArrayList dyn_obj_list = new ArrayList(); int dyn_count = 0; //json内のレコード数取得 // 受信対象のチェック用ディクショナリー生成 Dictionary <object, int> dic = Create_dictionary(); foreach (dynamic item in (object[])dyn_obj) { //Console.WriteLine(item); // 共通チェック処理 string Json_Base_check_error = Base_check(item, dic); if (Json_Base_check_error != "") { error = error + "\r\n処理レコード:" + dyn_count + ":" + Json_Base_check_error; item.Check_Status = "NG"; } else { // 特別チェック処理 string Json_Special_check_error = Special_check(item, dic); if (Json_Special_check_error != "") { error = error + "\r\n処理レコード:" + dyn_count + ":" + Json_Special_check_error; item.Check_Status = "NG"; } else { item.Check_Status = "OK"; } } // チェックのステータスを保持したリストを格納 dyn_obj_list.Add(item); dyn_count++; } //Console.WriteLine(user.ToString()); dynamic return_json = null; // 正常読み込み対象があるか判定 if (dyn_obj_list.Count > 0) { return_json = Json_Util.reParse(dyn_obj_list); } if (error == "" || error == null) { status = true; error = "読込完了"; } return(return_json); } catch (System.Exception ex) { logger.Error(ex.Message); status = false; error = ex.Message; return(null); } }
/// <summary> /// requestで受信した内容の処理結果を応答するためのjsonを生成します。 生成時に必要項目を更新します /// Ope_Tagが増えた場合はOpe_Tag_Creatorに分岐を追加して、専用のファンクションを追加してください。 /// </summary> /// <param name="read_json_obj"></param> /// <param name="status"></param> /// <param name="error"></param> /// <returns></returns> public static dynamic Response_machine(dynamic read_json_obj, out bool status, out string error) { try { ArrayList OK_req_list = new ArrayList(); foreach (dynamic read_req in (object[])read_json_obj) { //定義変更時はRequest_machine_checkの項目も併せて修正しましょう! dynamic req_obj = new DynamicJson(); // ルートのコンテナ req_obj.Ope_Number = Json_Util.get_Value(read_req, "Ope_Number"); req_obj.Stc_ID = Json_Util.get_Value(read_req, "Stc_ID"); req_obj.Request_Time = Json_Util.get_Value(read_req, "Request_Time"); req_obj.Machine_Name = MainForm.machine_name; req_obj.Response_Time = Json_Util.iso_8601_now(); req_obj.EA_ID = Json_Util.get_Value(read_req, "EA_ID"); req_obj.Broker_Name = Json_Util.get_Value(read_req, "Broker_Name"); req_obj.MT4_Server = Json_Util.get_Value(read_req, "MT4_Server"); req_obj.MT4_ID = Json_Util.get_Value(read_req, "MT4_ID"); req_obj.Ccy = Json_Util.get_Value(read_req, "Ccy"); req_obj.Time_Period = Json_Util.get_Value(read_req, "Time_Period"); //req_obj.EA_Status = Json_Util.get_Value(read_req, "EA_Status").ToUpper(); req_obj.Ope_Code = Json_Util.get_Value(read_req, "Ope_Code"); // Vol_1shotを強制的にゼロにするEAであるかを判定します if (vol1_force_zero(Json_Util.get_Value(read_req, "EA_Name"))) { req_obj.Vol_1shot = "0"; } else { req_obj.Vol_1shot = Json_Util.get_Value(read_req, "Vol_1shot"); } req_obj.A_Start = Json_Util.get_Value(read_req, "A_Start"); if (read_req.Check_Status == "NG") { req_obj.EA_Status = "UNKNOWN"; } else { req_obj.EA_Status = Json_Util.get_Value(read_req, "EA_Status").ToUpper(); } // Ope_Tagでの追加タグ生成 dynamic req_obj_ope_tag = Ope_Tag_Creator(req_obj, read_req); if (req_obj_ope_tag != null) { req_obj = req_obj_ope_tag; } OK_req_list.Add(req_obj); } dynamic out_put = Json_Util.reParse(OK_req_list); status = true; error = "正常変換完了"; return(out_put); } catch (System.Exception ex) { status = true; error = ex.ToString(); logger.Error(ex.Message); return(null); } }