/// <summary> /// 取引履歴をスプレッドシートへ送信する /// </summary> /// <param name="bhc">送信するメッセージコンテナ 1つ</param> public static String PostBoResult(BoHistroyContainer bhc) { string ret = string.Empty; try { // 送信待ちでないものは終了 そのまま返す if (bhc.State != HistoryState.hsWaitPost) { return(bhc.PostResultData); } SignalResult boResultSig = bhc.ResultSig; SignalOrder boEntrySig = bhc.Sig; // 送信用パラメータ文字列作成 string postResultParam = string.Empty; postResultParam += "result=" + boResultSig.R_Result; // 結果 postResultParam += "&pair=" + boResultSig.R_TradeBrand; // 通貨ペア postResultParam += "&rate=" + boResultSig.R_BidRate; // 入札レート postResultParam += "&bidTime=" + boResultSig.R_BidTime; // 入札時間 postResultParam += "&judgeTime=" + boResultSig.R_JudgeTime; // 判定時間 postResultParam += "&state=Done"; // + boResultSig.R_State; // ステータス Done固定 postResultParam += "&judgeRate=" + boResultSig.R_JudgeRate; // 判定レート postResultParam += "&bidPrice=" + boResultSig.R_BidPrice.Replace("¥", ""); // 入札金額 postResultParam += "&payout=" + boResultSig.R_PayOut.Replace("¥", ""); // ペイアウト postResultParam += "&signalName=" + bhc.Sig.signalRoomName; // シグナル名 postResultParam += "&environment=" + bhc.Sig.getEnviromentNames(); // 環境の送信 postResultParam += "&conditionPrice=" + boEntrySig.bidPrice; // エントリー時の判断した時のレート価格 // 部屋名のコンバート postResultParam += "&SignalName=DATA"; //送信用コマンドを保持 ret = bhc.PostURL_SpredSheet + postResultParam; Process cmd = new Process(); cmd.StartInfo.FileName = "PowerShell.exe"; cmd.StartInfo.WindowStyle = ProcessWindowStyle.Hidden; //PowerShellのWindowを立ち上げずに実行。 cmd.StartInfo.Arguments = @"curl '" + bhc.PostURL_SpredSheet + postResultParam + "'"; // 引数optionsをShellのコマンドとして渡す。 cmd.Start(); cmd.Close(); return(ret); } catch (Exception e) { DebugPrint(e, "postBoResult"); bhc.PostResultData = string.Empty; return(ret); } }
/// <summary> /// 入札結果を取得し、終了のものが有れば、 /// エントリーしたシグナル情報と照らし合わせて /// どのシグナルでエントリーしたものかをチェックして /// 格納する /// </summary> /// <returns></returns> public void getSignalResult(ref List <BoHistroyContainer> boHistroyContainers) { try { IsActivate(); // ハイロー画面へ // リストを取得 IReadOnlyCollection <IWebElement> resultList = this.chrome.FindElementsByXPath("//*[@id='tradeActionsTableBody']/tr"); for (int i = 0; i < resultList.Count(); i++) { // 取引終了の結果があった場合 if (resultList.ElementAt(i).Text.Contains("取引終了")) { // 比較先 型を取る SignalResult resSig = CommonControl.ConvBoResult(resultList.ElementAt(i).Text); // すべての履歴コンテナと比較 for (int n = 0; n < boHistroyContainers.Count; n++) { // 比較元 入力シグナルコンテナ BoHistroyContainer bhc = boHistroyContainers.ElementAt(n); if (bhc.State != HistoryState.hsWaitResult) { continue; // シグナル結果待ちのもののみ比較対象とする } // 入札銘柄と時間が同じなら そのシグナルで入札した結果とし、googleに送信する if (resSig.R_TradeBrand.Equals(bhc.Sig.tradeBrand) && DateTime.Parse(resSig.R_JudgeTime).Equals(DateTime.Parse(bhc.Sig.tradeTimeFrame))) { boHistroyContainers.ElementAt(n).ResultSig = resSig; boHistroyContainers.ElementAt(n).State = HistoryState.hsWaitPost; // → Google送信待ち break; } } } } } catch (Exception e) { CommonControl.DebugPrint(e); } }
/// <summary> /// 取引履歴をテキストにストックする /// </summary> /// <param name="bhc">記録するBOコンテナ</param> /// <returns> True 成功 / False 失敗 </returns> public static bool OutPutTextBoResult(BoHistroyContainer bhc) { try { // 送信済みのもののみ受け付け if (bhc.State != HistoryState.hsPostDataComplete) { return(false); } // 作成するテキストファイル 1日単位 の命名 string boFullFileName = Constants.PATH_BO_HISTORY_TEXT + @"\BO履歴_" + DateTime.Now.ToString("yyyyMMdd") + ".txt"; // 出力 URL付 System.IO.File.AppendAllText(boFullFileName, bhc.PostResultData + Environment.NewLine); return(true); } catch (Exception e) { DebugPrint(e, "OutPutTextBoResult"); return(false); } }
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("プログラムを終了しました"); } }