/// <summary> /// エントリーする時間が高い重要度の時間帯でないかどうかチェックする /// 重要度前後30分以内であればスルーする /// </summary> /// <returns>True 高い重要度 / False それ以外の重要度または重要でない</returns> public bool JudgeEnvironmentSignalZone(ref SignalOrder sig, ref LINEControl cLine) { bool ret = false; //// 指定時間帯の時トレードを通す //DateTime dudgeTime = sig.tradeEntryTime.AddMinutes(5); //// 指定の時間帯であれば取引を行う //if ( DateTime.Parse("11:00") <= dudgeTime && dudgeTime < DateTime.Parse("12:00") ) //{ // ret = false; //} else //{ // ret = true; //} // TODO:今は無条件でテスト sig.Environment = EnvState.esTest; return(ret); //TODO:必要になったらコメントを外す // IsCheckImportanceTimeZone //try //{ // foreach (invCalender inv in EconomicList) // { // DateTime sTime = inv.evTime.AddMinutes(-30); // DateTime eTime = inv.evTime.AddMinutes(30); // // 間に入っているか? // if (sTime <= sig.tradeEntryTime && sig.tradeEntryTime <= eTime) // { // ret = true; // // 回避になった場合メッセージを送る // cLine.putSignalMsgToRoom(Constants.ROOM_NAME_CmdLine // , sig.signalRoomName // , "次の経済指標に引っかかった為エントリーしませんでした。" // + "経済指標 【 "+ inv.evTime.ToString("HH:mm:ss") + " " + inv.detail + " 】 " // + "シグナル【" + sig.rawOriginalMessage + "】" ); // break; // 一つでも見つかったら終了 // } // } //} //catch (Exception e) //{ // CommonControl.DebugPrint(e, "経済指標 時間比較失敗"); //} //return ret; }
/// <summary> /// ラインの部屋で /// シグナルを受け取る部屋に新着があるか、 /// 又はコマンド部屋での新しい入力を受け付けるまで待つ /// </summary> /// <param name="Line">ラインオブジェクト</param> /// <returns></returns> private static string WaitLineGroupsNewArraival(LINEControl Line) { // ラインに切り替える Line.IsActivate(); // 子機かどうか? if (Constants.LINE_RECEIVER_SIDE) { return(WaitLineGroupsByReciever(Line)); } else { // 親機の時 return(WaitLineGroupsByParent(Line)); } }
/// <summary> /// 子機用ライングループ 待機処理 /// </summary> /// <param name="Line"></param> /// <returns></returns> private static string WaitLineGroupsByReciever(LINEControl Line) { Line.IsActivate(); Line.ChatRoomListScrollTop(); //var tasks = new List<Task>(); string ret = string.Empty; string[] roomNames; roomNames = new string[] { Constants.ROOM_NAME_BoSignal }; var task1 = Task.Run(() => Line.WaitRoomNewArrivals(roomNames[0])); // 着信が来るまでまつ int taskNum = Task.WaitAny(task1); // 対象のシグナル、又は入力された部屋 return(roomNames[taskNum]); }
/// <summary> /// 親機用ライングループ 待機処理 /// </summary> /// <param name="Line">ラインオブジェクト</param> /// <returns></returns> private static string WaitLineGroupsByParent(LINEControl Line) { // ライン部屋 Line.IsActivate(); // TODO:待機用の部屋をアクティブにして待つ(LINE新着の数字を取得するため) // 今は仮でデバッグ部屋にする Line.RoomAvtive(Constants.ROOM_NAME_DebugRoomName); Line.ChatRoomListScrollTop(); //var tasks = new List<Task>(); string ret = string.Empty; string[] roomNames; //roomNames = new string[] { // Constants.ROOM_NAME_RISE, // Constants.ROOM_NAME_AUXESIS, // Constants.ROOM_NAME_CmdLine, // Constants.ROOM_NAME_MIYU }; roomNames = new string[] { "", Constants.ROOM_NAME_AUXESIS, Constants.ROOM_NAME_CmdLine, Constants.ROOM_NAME_SignalMeijin }; var task1 = Task.Run(() => Line.WaitRoomNewArrivals(roomNames[0])); var task2 = Task.Run(() => Line.WaitRoomNewArrivals(roomNames[1])); var task3 = Task.Run(() => Line.WaitRoomNewArrivals(roomNames[2])); var task4 = Task.Run(() => Line.WaitRoomNewArrivals(roomNames[3])); // 何れかに着信が来るまでまつ int taskNum = Task.WaitAny(task1, task2, task3, task4); // 帰ってきた値の部屋が本当に新着があるか確認する if (Line.ConfirmIsRoomsNewArrivals(roomNames[taskNum])) { ret = roomNames[taskNum]; } else { ret = string.Empty; // 来ていない、又は来ていたが無しと判断されたとき(TODO:原因不明 要調査) for (int i = 0; i < roomNames.Length; i++) { // 1つずつ見て本当になかったか確認する if (Line.ConfirmIsRoomsNewArrivals(roomNames[i])) { // debug CommonControl.DebugPrint("WaitLineGroupsByParent", "自身で見に行って発見した", roomNames[i]); // 実は見つかった時 ret = roomNames[i]; break; } } } // 対象のシグナル1の着信 return(ret); }
static void Main(string[] args) { //ForDebugOnly(); // デバッグ用関数 //return; try { // ===== ===== ===== ===== ===== ===== ===== ===== ===== ===== ===== ===== ===== ===== ===== ===== // 起動準備 & 引数用意 // ===== ===== ===== ===== ===== ===== ===== ===== ===== ===== ===== ===== ===== ===== ===== ===== // パラメータ設定の初期化(取得) Constants.Initialize(); // ブラウザ立ち上げ ChromeDriverEx chrome = CreateNewChromeDriver(); // 経済指標を取得 //InvestingCalender InvC = new InvestingCalender(ref chrome); //InvC.GetInvestingCalender(); //// LINE用 LINEControl cLINE = new LINEControl(ref chrome); // ログイン ライン cLINE.LoginLINE(); //// 初回ログイン時はログイン情報だけを記憶させて終了 //if (Constants.Login_Line_First) return; //// highlow 本トレ HighLowControl cHighLow_Real = new HighLowControl(ref chrome); cHighLow_Real.Open(false); // 本番OPEN cHighLow_Real.Login(); // 本トレログイン ///// highlowデモ HighLowControl cHighLow_Demo = new HighLowControl(ref chrome); cHighLow_Demo.Open(true); // デモOPEN cHighLow_Demo.demoLogin(); // デモログイン CommonControl.SleepWait(500); // ユーザーによるコマンド受付 情報保持用 string userCommandStatus = string.Empty; //ハイロー入札履歴 List <BoHistroyContainer> HL_History = new List <BoHistroyContainer>(); #if DEBUG //ForDebugOnly(chrome); //return; #endif // シグナルが来るまで待つか、[コマンド]終了を受け付けたら終了 while (true) { //CommonControl.DebugPrint("待機開始・・・"); // メッセージを待つ string signalRoomName = WaitLineGroupsNewArraival(cLINE); // なければ、終了定期処理へ if (string.IsNullOrEmpty(signalRoomName)) { CommonControl.DebugPrint("この時間来ませんでした" + DateTime.Now); goto finallyProcess; // 終了まで飛ばす } // 以下、シグナル受信していたら // メッセージが来た時 // 新着対象の部屋のメッセージ群を取得する ArrayList newMsgList = cLINE.getNewMsgText(signalRoomName); // メッセージがあるか?(通知に気づいたときには古いメッセージしかなくて新着メッセージないときは抜ける) if (newMsgList.Count == 0) { // 新着に気づいたが、メッセージが古い時間のものしか無かった時 CommonControl.DebugPrint("気づくのが遅かった・・・部屋名:" + signalRoomName); goto finallyProcess; // 終了まで飛ばす } string newMsg = ""; if (!userCommandStatus.Equals("stop")) { // エントリーの情報1つのみに絞り込むか又は命令メッセージ(最初に見つかったエントリー メッセージを取得) newMsg = HighLowControl.SelectSignalMsg(signalRoomName, newMsgList); } else { newMsg = (string)newMsgList[newMsgList.Count - 1]; } if (Constants.LINE_RECEIVER_SIDE) { // 子機の場合は冒頭についているどの部屋から来たか情報を取り出し // メッセージの冒頭の親からのヘッダパラメータをカットしてシグナル文のみにする signalRoomName = HighLowControl.AnalysisReceiverSide(ref newMsg); } // ※Stop時以外 // 命令かバイナリー配信かを判断する if (IsSignalMsg(signalRoomName, newMsg)) { // バイナリー配信の時 // 親機の時のみ if (Constants.LINE_RECEIVER_SIDE == false) { // 対象の部屋(グループ)へメッセージをコピー cLINE.putSignalMsgToRoom(Constants.ROOM_NAME_BoSignal, signalRoomName, newMsg); } // シグナル解析 SignalOrder sig = HighLowControl.AnalysisWord(signalRoomName, newMsg); // 指標の高い重要度の時間帯でないか\ // 又は、指定した時間帯 //if (!InvC.JudgeEnvironmentSignalZone(ref sig, ref cLINE)) //sig.Environment = EnvState.esTest; // 無条件デモ HighLowControl.JudgeRealDemo(ref sig); // エントリー結果 bool entryResult = false; if (sig.Environment.Equals(EnvState.esReal)) { // リアルトレード entryResult = cHighLow_Real.EntryHighLow(ref sig); } else { // デモトレード entryResult = cHighLow_Demo.EntryHighLow(ref sig); } // 結果をラインに表示 if (entryResult) { //成功時 cLINE.putSignalMsgToRoom(Constants.ROOM_NAME_CmdLine, signalRoomName, "エントリーに成功。" + Constants.LINE_CRLF + sig.getEntryNoticeMsg()); // シグナル履歴にストック BoHistroyContainer boc = new BoHistroyContainer(HistoryState.hsWaitResult, sig); HL_History.Add(boc); } else { CommonControl.DebugPrint("エントリーに失敗。" + sig.rawOriginalMessage); // デバッグ用 //cLINE.putSignalMsgToRoom(Constants.ROOM_NAME_CmdLine, signalRoomName, "エントリーに失敗。" + sig.rawOriginalMessage); } // 待機に戻る } else { // バイナリー配信ではなくて、命令の時 ステータスにセット if (signalRoomName.Equals(Constants.ROOM_NAME_CmdLine)) // 命令は指定のルームからのメッセージのみ受け取る { // 命令の抽出 string comResult = CommandProc(newMsg, userCommandStatus, out userCommandStatus); // エラーがあった場合 if (comResult.Length != 0) { cLINE.putSignalMsgToRoom(Constants.ROOM_NAME_CmdLine, "", comResult); } // 命令実行 TODO:今は仮 if (userCommandStatus.IndexOf("end") >= 0) // 終了時 { cLINE.putSignalMsgToRoom(Constants.ROOM_NAME_CmdLine, signalRoomName, "プログラムを終了します。" + newMsg); break; } } } // 1通り終了時 定期的に行う処理 finallyProcess: // ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- // 溜まったタスクを消化 // ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- System.Windows.Forms.Application.DoEvents(); ClickActionTrigger += 1; // ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- // 結果を見に行き、新着があればそれを部屋に出力 // ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- cHighLow_Real.getSignalResult(ref HL_History); // 本トレ cHighLow_Demo.getSignalResult(ref HL_History); // デモ それぞれに見に行く for (int i = 0; i < HL_History.Count; i++) { if (HL_History[i].State == HistoryState.hsDone) { continue; // 全て完了済みのものは飛ばす } bool ret = false; HL_History[i].PostResultData = CommonControl.PostBoResult(HL_History[i]); // Google送信 // postデータが作られていたら成功 HL_History[i].State = string.IsNullOrEmpty(HL_History[i].PostResultData) ? HL_History[i].State : HistoryState.hsPostDataComplete; // 成功したかどうか ret = CommonControl.OutPutTextBoResult(HL_History[i]); // テキスト吐き出し // テキスト掃き出しできたらすべて完了 HL_History[i].State = ret ? HistoryState.hsDone : HL_History[i].State; } // TODO: コンプリートしたBOコンテナ要素はここで削除しても良いかも // ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- // 2minに一回何らかのアクションを起こしてメッセージの受信頻度を上げる // スリープ(LINE受信しなくなる)対策 // ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- if (ClickActionTrigger % 2 == 0) { CommonControl.ClickAction(); ClickActionTrigger = 0; // 受信が行われるようにActiveWindowsの切り替えを行う //TODO:実験成功? 画面のライトがONOFFしなくても受信できるかチェックする SendKeys.SendWait("%{TAB}"); CommonControl.SleepWait(500); SendKeys.SendWait("%{TAB}"); // ネットワークが切れていれば 再ログイン 効果未確認 cHighLow_Real.RetryLogin(); } // debug用 //break; } // main end // ハイローログアウト //cHighLow_Demo.Logout(); //cHighLow_Real.Logout(); chrome.Quit(); } catch (Exception e) { // 想定外エラー発生時 // 原因調査用 CommonControl.DebugPrint(e, "Main Exception"); } finally { CommonControl.DebugPrint("プログラムを終了しました"); } }