オーケー馬 ソース公開1「Form1.cs」
競馬分析ソフト「オーケー馬」のプログラム・ソースを公開します。
5本程度のファイルになります。画面のコントロールのプロパティは後々、記載していきます。
とりあえず、1ページに1ファイルを記載予定です。
いずれ、解説なども記載します。
思い立ったが吉日なので、汚いソースですが、掲載します。
GitHubにもアップする予定です。
目的は、多くの人が競馬ソフトに触れる機会を作ることが、表向き。
個人としては、子供がこのソフトを使い、金に不自由をしない生活を送ること。
分析ソフトなので、このソフトで誰もが億万長者になれるわけではありません。
ですが、最初からソフトを作る労力は並大抵ではありません。
僕の場合は、紆余曲折あって、25年かかりました。
その集大成を公開します。
プログラムを見やすくするために、たまに、ソースを修正します。
noteには、編集されたときの通知機能がないので、有料化することで、お金を払ってくれた人に通知が行くようにします。
ですので、このページをお気に入りに登録しておけば、ソースが変更されても、閲覧は可能です。
画面のコードです。
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO;
namespace okbaCSapp
{
// okbaCS
public partial class Form1 : Form
{
targetRace targ;
const string chuoData = "UMA_CMPI.txt";
const string nankanData = "UMA_CMPI_nankan.txt";
string fileData = string.Empty;
string resultUmaban = string.Empty;
int resultRaceCnt = 0;
int resultHitCnt = 0;
long resultRetMny = 0;
int configTargetCnt = 10;
float configHitRatio = 0.2f;
float configReturnRatio = 1.2f;
enum tosusu : int
{
t8 = 255,
t9 = 511,
t10 = 1023,
t11 = 2047,
t12 = 4095,
t13 = 4095,
t14 = 4095,
t15 = 4095,
t16 = 4095,
t17 = 4095,
t18 = 4095,
}
//enum tosusu : int
//{
// t8 = 255,
// t9 = 511,
// t10 = 1023,
// t11 = 2047,
// t12 = 4095,
// t13 = 8191,
// t14 = 16383,
// t15 = 32767,
// t16 = 65535,
// t17 = 131071,
// t18 = 262143,
//}
string line;
string backkey;
string[] pat18;// = new string[262143];
string[] pat17 = new string[131071];
string[] pat16 = new string[65535];
string[] pat15 = new string[32767];
string[] pat14 = new string[16383];
string[] pat13 = new string[8191];
string[] pat12 = new string[4095];
string[] pat11 = new string[2047];
string[] pat10 = new string[1023];
string[] pat9 = new string[511];
string[] pat8 = new string[255];
string[] src;
string[] okba;
string[] harai;
/// <summary>
/// コンピ指数情報
/// </summary>
string[] tar;
Dictionary<string, string> ans8 = new Dictionary<string, string>();
Dictionary<string, string> ans9 = new Dictionary<string, string>();
Dictionary<string, string> ans10 = new Dictionary<string, string>();
Dictionary<string, string> ans12 = new Dictionary<string, string>();
Dictionary<string, string> ans14 = new Dictionary<string, string>();
Dictionary<string, string> ans16 = new Dictionary<string, string>();
Dictionary<string, string> ans18 = new Dictionary<string, string>();
bool isAdd; // insert or update
// enum(列挙型)の使い方総まとめ
// https://www.sejuku.net/blog/50547
enum indx : int
{
Year = 0,
Monthday,
jyocd,
Kaiji,
Nichiji,
RaceNum,
C01,
C02,
C03,
C04,
C05,
C06,
C07,
C08,
C09,
C10,
C11,
C12,
C13,
C14,
C15,
C16,
C17,
C18,
U01,
U02,
U03,
U04,
U05,
U06,
U07,
U08,
U09,
U10,
U11,
U12,
U13,
U14,
U15,
U16,
U17,
U18,
HF01,
HF02,
HF03,
HF04,
HF05,
UF01,
UF02,
UF03,
UF04,
UF05,
JyokenCD5,
TrackCD,
TorokuTosu,
}
public Form1()
{
InitializeComponent();
}
/// <summary>
/// パターンファイルのデータ数を取得
/// </summary>
/// <param name="pat"></param>
/// <returns></returns>
private long getPatArr()
{
switch (targ.tarTosu)
{
case 8:
return pat8.Length;
case 9:
return pat9.Length;
case 10:
return pat10.Length;
case 12:
return pat12.Length;
case 14:
return pat14.Length;
case 15:
return pat15.Length;
case 16:
return pat16.Length;
case 18:
return pat18.Length;
default:
return 0;
}
}
private long getPatArr(int tosu)
{
switch (tosu)
{
case 8:
return pat8.Length;
case 9:
return pat9.Length;
case 10:
return pat10.Length;
case 12:
return pat12.Length;
case 14:
return pat14.Length;
case 15:
return pat15.Length;
case 16:
return pat16.Length;
case 18:
return pat18.Length;
default:
return 0;
}
}
/// <summary>
/// カンマ区切りのコンピ指数情報を配列に変換
/// </summary>
/// <param name="index"></param>
/// <returns></returns>
private string[] pickPat(long index)
{
switch (targ.tarTosu)
{
case 8:
return pat8[index].Split(',');
case 9:
return pat9[index].Split(',');
case 10:
return pat10[index].Split(',');
case 12:
return pat12[index].Split(',');
case 14:
return pat14[index].Split(',');
case 15:
return pat15[index].Split(',');
case 16:
return pat16[index].Split(',');
case 18:
return pat18[index].Split(',');
}
return null;
}
/// <summary>
/// ABCを012に変換 'A'=65
/// </summary>
/// <param name="str"></param>
/// <returns></returns>
private string alphabet2Number(string str)
{
return ((int)char.Parse(str) - 65).ToString();
}
/// <summary>
/// UMA_CMPI.txtを読込み
/// </summary>
private void getSrcDataNew()
{
src = Utility.readFile(fileData);
}
private void getSrcData()
{
int cnt;
cnt = 0;
using (StreamReader sr = new StreamReader(fileData))
{
while ((line = sr.ReadLine()) != null)
{
cnt++;
}
}
Array.Resize(ref src, cnt);
cnt = 0;
using (StreamReader sr = new StreamReader(fileData))
{
while ((line = sr.ReadLine()) != null)
{
src[cnt] = line;
cnt++;
}
}
}
private void getTargetData()
{
int cnt;
cnt = 0;
using (StreamReader sr = new StreamReader("target.txt"))
{
while ((line = sr.ReadLine()) != null) cnt++;
}
Array.Resize(ref tar, cnt);
cnt = 0;
using (StreamReader sr = new StreamReader(ConstValue.fileTargetTxt))
{
while ((line = sr.ReadLine()) != null) tar[cnt++] = line;
}
}
/// <summary>
/// "target.txt"の行数を取得
/// </summary>
/// <returns></returns>
private int countLineFile()
{
int cnt = 0;
using (StreamReader sr = new StreamReader(Utility.PlusPath(ConstValue.fileTargetTxt)))
{
while ((line = sr.ReadLine()) != null) cnt++;
}
return cnt;
}
/// <summary>
/// "target.txt"をtarに出力
/// </summary>
private void getFileData()
{
int cnt = 0;
using (StreamReader sr = new StreamReader(Utility.PlusPath(ConstValue.fileTargetTxt)))
{
while ((line = sr.ReadLine()) != null) tar[cnt++] = line;
}
}
/// <summary>
/// "target.txt"をtarに出力 ※当日コンピ指数情報
/// </summary>
private void getTargetDataNew()
{
Array.Resize(ref tar, this.countLineFile());
this.getFileData();
}
/// <summary>
/// アルファベットを数値に変換 A->0, B->1
/// </summary>
/// <param name="line"></param>
/// <returns></returns>
private string convertAlphabet2NumberSeparateComma(string line)
{
StringBuilder wsb = new StringBuilder(string.Empty);
string[] wsp = line.Split(',');
for (int idx = 0; idx < (wsp.Length - 1); idx++)
{
wsb.Append(alphabet2Number(wsp[idx]));
wsb.Append(',');
}
wsb.Append(alphabet2Number(wsp[wsp.Length - 1]));
return wsb.ToString();
}
/// <summary>
/// パターンファイルを数値に変換 A,B,C -> 0,1,2
/// </summary>
/// <param name="filename"></param>
/// <returns></returns>
private string[] makePat(string filename)
{
string[] ans = new string[262143];
int cnt = 0;
using (StreamReader sr = new StreamReader(Utility.PlusPath(filename)))
{
while ((line = sr.ReadLine()) != null) ans[cnt++] = this.convertAlphabet2NumberSeparateComma(line);
}
Array.Resize(ref ans, cnt);
return ans;
}
// A:0, B:1, ....
// pat18をソースとして、他のパターンは、最大行数をリサイズする→だめ
/// <summary>
/// 出走頭数別のパターンデータを生成
/// </summary>
private void getPatDataNew()
{
pat18 = this.makePat("pat18.txt");
pat17 = this.makePat("pat17.txt");
pat16 = this.makePat("pat16.txt");
pat15 = this.makePat("pat15.txt");
pat14 = this.makePat("pat14.txt");
pat13 = this.makePat("pat13.txt");
pat12 = this.makePat("pat12.txt");
pat11 = this.makePat("pat11.txt");
pat10 = this.makePat("pat10.txt");
pat9 = this.makePat("pat9.txt");
pat8 = this.makePat("pat8.txt");
}
// A:0, B:1, ....
// pat18をソースとして、他のパターンは、最大行数をリサイズする→だめ
private void getPatData()
{
int cnt = 0;
StringBuilder wsb;
using (StreamReader sr = new StreamReader("pat18.txt"))
{
wsb = new StringBuilder("");
while ((line = sr.ReadLine()) != null)
{
string[] wsp = line.Split(',');
for (int idx = 0; idx < wsp.Length; idx++)
{
wsb.Append(alphabet2Number(wsp[idx]));
wsb.Append(',');
}
pat18[cnt++] = wsb.ToString();
wsb = new StringBuilder("");
}
}
Array.Resize(ref pat18, cnt);
cnt = 0;
using (StreamReader sr = new StreamReader("pat17.txt"))
{
wsb = new StringBuilder("");
while ((line = sr.ReadLine()) != null)
{
string[] wsp = line.Split(',');
for (int idx = 0; idx < wsp.Length; idx++)
{
wsb.Append(alphabet2Number(wsp[idx]));
wsb.Append(',');
}
pat17[cnt] = wsb.ToString();
wsb = new StringBuilder("");
cnt++;
}
}
Array.Resize(ref pat17, cnt);
cnt = 0;
using (StreamReader sr = new StreamReader("pat16.txt"))
{
wsb = new StringBuilder("");
while ((line = sr.ReadLine()) != null)
{
string[] wsp = line.Split(',');
for (int idx = 0; idx < wsp.Length; idx++)
{
wsb.Append(alphabet2Number(wsp[idx]));
wsb.Append(',');
}
pat16[cnt] = wsb.ToString();
wsb = new StringBuilder("");
cnt++;
}
}
Array.Resize(ref pat16, cnt);
cnt = 0;
using (StreamReader sr = new StreamReader("pat15.txt"))
{
wsb = new StringBuilder("");
while ((line = sr.ReadLine()) != null)
{
string[] wsp = line.Split(',');
for (int idx = 0; idx < wsp.Length; idx++)
{
wsb.Append(alphabet2Number(wsp[idx]));
wsb.Append(',');
}
pat15[cnt] = wsb.ToString();
wsb = new StringBuilder("");
cnt++;
}
}
Array.Resize(ref pat15, cnt);
cnt = 0;
using (StreamReader sr = new StreamReader("pat14.txt"))
{
wsb = new StringBuilder("");
while ((line = sr.ReadLine()) != null)
{
string[] wsp = line.Split(',');
for (int idx = 0; idx < wsp.Length; idx++)
{
wsb.Append(alphabet2Number(wsp[idx]));
wsb.Append(',');
}
pat14[cnt] = wsb.ToString();
wsb = new StringBuilder("");
cnt++;
}
}
Array.Resize(ref pat14, cnt);
cnt = 0;
using (StreamReader sr = new StreamReader("pat13.txt"))
{
wsb = new StringBuilder("");
while ((line = sr.ReadLine()) != null)
{
string[] wsp = line.Split(',');
for (int idx = 0; idx < wsp.Length; idx++)
{
wsb.Append(alphabet2Number(wsp[idx]));
wsb.Append(',');
}
pat13[cnt] = wsb.ToString();
wsb = new StringBuilder("");
cnt++;
}
}
Array.Resize(ref pat13, cnt);
cnt = 0;
using (StreamReader sr = new StreamReader("pat12.txt"))
{
wsb = new StringBuilder("");
while ((line = sr.ReadLine()) != null)
{
string[] wsp = line.Split(',');
for (int idx = 0; idx < wsp.Length; idx++)
{
wsb.Append(alphabet2Number(wsp[idx]));
wsb.Append(',');
}
pat12[cnt] = wsb.ToString();
wsb = new StringBuilder("");
cnt++;
}
}
Array.Resize(ref pat12, cnt);
cnt = 0;
using (StreamReader sr = new StreamReader("pat11.txt"))
{
wsb = new StringBuilder("");
while ((line = sr.ReadLine()) != null)
{
string[] wsp = line.Split(',');
for (int idx = 0; idx < wsp.Length; idx++)
{
wsb.Append(alphabet2Number(wsp[idx]));
wsb.Append(',');
}
pat11[cnt] = wsb.ToString();
wsb = new StringBuilder("");
cnt++;
}
}
Array.Resize(ref pat11, cnt);
cnt = 0;
using (StreamReader sr = new StreamReader("pat10.txt"))
{
wsb = new StringBuilder("");
while ((line = sr.ReadLine()) != null)
{
string[] wsp = line.Split(',');
for (int idx = 0; idx < wsp.Length; idx++)
{
wsb.Append(alphabet2Number(wsp[idx]));
wsb.Append(',');
}
pat10[cnt] = wsb.ToString();
wsb = new StringBuilder("");
cnt++;
}
}
Array.Resize(ref pat10, cnt);
cnt = 0;
using (StreamReader sr = new StreamReader("pat9.txt"))
{
wsb = new StringBuilder("");
while ((line = sr.ReadLine()) != null)
{
string[] wsp = line.Split(',');
for (int idx = 0; idx < wsp.Length; idx++)
{
wsb.Append(alphabet2Number(wsp[idx]));
wsb.Append(',');
}
pat9[cnt] = wsb.ToString();
wsb = new StringBuilder("");
cnt++;
}
}
Array.Resize(ref pat9, cnt);
cnt = 0;
using (StreamReader sr = new StreamReader("pat8.txt"))
{
wsb = new StringBuilder("");
while ((line = sr.ReadLine()) != null)
{
string[] wsp = line.Split(',');
for (int idx = 0; idx < wsp.Length; idx++)
{
wsb.Append(alphabet2Number(wsp[idx]));
wsb.Append(',');
}
pat8[cnt] = wsb.ToString();
wsb = new StringBuilder("");
cnt++;
}
}
Array.Resize(ref pat8, cnt);
}
private bool isAddMode(int pat, string key)
{
StringBuilder sb = new StringBuilder(key);
sb.Append("00"); // target"00"は必ず存在するため
string basekey = sb.ToString();
switch (pat)
{
case 8:
return ans8.ContainsKey(basekey) ? false : true;
case 9:
return ans9.ContainsKey(basekey) ? false : true;
case 10:
return ans10.ContainsKey(basekey) ? false : true;
case 12:
return ans12.ContainsKey(basekey) ? false : true;
case 14:
return ans14.ContainsKey(basekey) ? false : true;
case 16:
return ans16.ContainsKey(basekey) ? false : true;
case 18:
return ans18.ContainsKey(basekey) ? false : true;
}
return false;
}
private void updateData(int pat, string key, bool isAdd, string money)
{
//backkey = key;
////System.Diagnostics.Debug.WriteLine(key);
//StringBuilder sb = new StringBuilder("");
//string wkD;
////string hitCnt = "0";
////string raceCnt;
//long addHit = 0;
//long addRace = 1;
//if (money != "0")
//{
// addHit = 1;
//}
//if (isAdd)
//{
// sb.Append(addRace.ToString());
// sb.Append(",");
// sb.Append(addHit.ToString());
// sb.Append(",");
// sb.Append(money);
// wkD = sb.ToString();
// switch (pat)
// {
// case 8:
// if (ans8.ContainsKey(key))
// {
// key = key;
// }
// ans8.Add(key, wkD);
// break;
// case 9:
// if (ans9.ContainsKey(key))
// {
// key = key;
// }
// ans9.Add(key, wkD);
// break;
// case 10:
// if (ans10.ContainsKey(key))
// {
// key = key;
// }
// ans10.Add(key, wkD);
// break;
// case 12:
// if (ans12.ContainsKey(key))
// {
// key = key;
// }
// ans12.Add(key, wkD);
// break;
// case 14:
// if (ans14.ContainsKey(key))
// {
// key = key;
// }
// ans14.Add(key, wkD);
// break;
// case 16:
// if (ans16.ContainsKey(key))
// {
// key = key;
// }
// ans16.Add(key, wkD);
// break;
// case 18:
// if (ans18.ContainsKey(key))
// {
// key = key;
// }
// ans18.Add(key, wkD);
// break;
// }
//}
//else
//{
// switch (pat)
// {
// case 8:
// string[] dats8 = ans8[key].Split(',');
// dats8[0] = (long.Parse(dats8[0]) + 1).ToString(); // count
// dats8[1] = (long.Parse(dats8[1]) + addHit).ToString(); // hit
// dats8[2] = (long.Parse(dats8[2]) + long.Parse(money)).ToString(); // money
// sb.Append(dats8[0]);
// sb.Append(",");
// sb.Append(dats8[1]);
// sb.Append(",");
// sb.Append(dats8[2]);
// wkD = sb.ToString();
// ans8[key] = wkD;
// break;
// case 9:
// string[] dats9 = ans9[key].Split(',');
// dats9[0] = (long.Parse(dats9[0]) + 1).ToString(); // count
// dats9[1] = (long.Parse(dats9[1]) + addHit).ToString(); // hit
// dats9[2] = (long.Parse(dats9[2]) + long.Parse(money)).ToString(); // money
// sb.Append(dats9[0]);
// sb.Append(",");
// sb.Append(dats9[1]);
// sb.Append(",");
// sb.Append(dats9[2]);
// wkD = sb.ToString();
// ans9[key] = wkD;
// break;
// case 10:
// string[] dats10 = ans10[key].Split(',');
// dats10[0] = (long.Parse(dats10[0]) + 1).ToString(); // count
// dats10[1] = (long.Parse(dats10[1]) + addHit).ToString(); // hit
// dats10[2] = (long.Parse(dats10[2]) + long.Parse(money)).ToString(); // money
// sb.Append(dats10[0]);
// sb.Append(",");
// sb.Append(dats10[1]);
// sb.Append(",");
// sb.Append(dats10[2]);
// wkD = sb.ToString();
// ans10[key] = wkD;
// break;
// case 12:
// string[] dats12 = ans12[key].Split(',');
// dats12[0] = (long.Parse(dats12[0]) + 1).ToString(); // count
// dats12[1] = (long.Parse(dats12[1]) + addHit).ToString(); // hit
// dats12[2] = (long.Parse(dats12[2]) + long.Parse(money)).ToString(); // money
// sb.Append(dats12[0]);
// sb.Append(",");
// sb.Append(dats12[1]);
// sb.Append(",");
// sb.Append(dats12[2]);
// wkD = sb.ToString();
// ans12[key] = wkD;
// break;
// case 14:
// string[] dats14 = ans14[key].Split(',');
// dats14[0] = (long.Parse(dats14[0]) + 1).ToString(); // count
// dats14[1] = (long.Parse(dats14[1]) + addHit).ToString(); // hit
// dats14[2] = (long.Parse(dats14[2]) + long.Parse(money)).ToString(); // money
// sb.Append(dats14[0]);
// sb.Append(",");
// sb.Append(dats14[1]);
// sb.Append(",");
// sb.Append(dats14[2]);
// wkD = sb.ToString();
// ans14[key] = wkD;
// break;
// case 16:
// string[] dats16 = ans16[key].Split(',');
// dats16[0] = (long.Parse(dats16[0]) + 1).ToString(); // count
// dats16[1] = (long.Parse(dats16[1]) + addHit).ToString(); // hit
// dats16[2] = (long.Parse(dats16[2]) + long.Parse(money)).ToString(); // money
// sb.Append(dats16[0]);
// sb.Append(",");
// sb.Append(dats16[1]);
// sb.Append(",");
// sb.Append(dats16[2]);
// wkD = sb.ToString();
// ans16[key] = wkD;
// break;
// case 18:
// string[] dats18 = ans18[key].Split(',');
// dats18[0] = (long.Parse(dats18[0]) + 1).ToString(); // count
// dats18[1] = (long.Parse(dats18[1]) + addHit).ToString(); // hit
// dats18[2] = (long.Parse(dats18[2]) + long.Parse(money)).ToString(); // money
// sb.Append(dats18[0]);
// sb.Append(",");
// sb.Append(dats18[1]);
// sb.Append(",");
// sb.Append(dats18[2]);
// wkD = sb.ToString();
// ans18[key] = wkD;
// break;
// }
//}
}
private void button1_Click(object sender, EventArgs e)
{
System.Diagnostics.Debug.WriteLine(DateTime.Now.ToString());
button1.Enabled = false;
// DictionaryのKey、Valueの使い方
// https://www.sejuku.net/blog/41326
// char c = char.Parse(str);
// int aa=(int)c;
// pattern data load
getPatData();
// 初期化
// ファイルを開く
using (StreamReader sr = new StreamReader(fileData))
{
int tosu;
string[] vlue;
string[] umab;
string[] hara;
string[] umaw;
// src data loop
while ((line = sr.ReadLine()) != null)
{
StringBuilder sb = new StringBuilder("");
// カンマで分割
var values = line.Split(',');
if (values.Length != (int)(indx.TorokuTosu + 1))
{
throw new Exception("CSV format error");
}
try
{
if (values[(int)indx.HF01] == "")
{
continue;
//myDic[key]=value;
}
// 払い戻しデータが存在する->data make
// 頭数
tosu = int.Parse(values[(int)indx.TorokuTosu]);
if ((tosu != 16)) //if ((tosu < 8) || (tosu == 11) || (tosu == 13) || (tosu == 15) || (tosu == 17) || (tosu > 18))
{
continue;
}
// main base data
vlue = new string[tosu];
for (int ii = 0; ii < vlue.Length; ii++)
{
vlue[ii] = values[(int)indx.C01 + ii];
}
umab = new string[tosu];
for (int ii = 0; ii < umab.Length; ii++)
{
umab[ii] = values[(int)indx.U01 + ii];
}
int haraiCnt = 0;
for (int ii = (int)indx.HF01; ii < (int)indx.UF01; ii++)
{
if (values[ii] == "")
{
haraiCnt = ii - (int)indx.HF01;
break;
}
}
hara = new string[haraiCnt];
for (int ii = 0; ii < hara.Length; ii++)
{
hara[ii] = values[(int)indx.HF01 + ii];
}
umaw = new string[haraiCnt];
for (int ii = 0; ii < umaw.Length; ii++)
{
umaw[ii] = values[(int)indx.UF01 + ii];
}
// pattern loop
//for (long pp = 0; pp < getPatArr(tosu); pp++)
//{
// string[] pick = pickPat(tosu, pp); // A:0, B:1, ..., null
// Array.Resize(ref pick, pick.Length - 1);
// string[] pickVlue = new string[pick.Length];
// for (int ii = 0; ii < pickVlue.Length; ii++)
// {
// pickVlue[ii] = vlue[int.Parse(pick[ii])];
// }
// string[] pickUmab = new string[pickVlue.Length];
// for (int ii = 0; ii < pickVlue.Length; ii++)
// {
// pickUmab[ii] = umab[int.Parse(pick[ii])];
// }
// StringBuilder keyWk;
// keyWk = new StringBuilder("");
// for (int ii = 0; ii < 18; ii++)
// {
// if (ii < pick.Length)
// {
// keyWk.Append(String.Format("{0:00}", int.Parse(pick[ii])));
// }
// else
// {
// keyWk.Append("00");
// }
// }
// string rankStr = keyWk.ToString();
// //if (rankStr.Length != 36)
// //{
// // rankStr = rankStr;
// //}
// keyWk = new StringBuilder("");
// for (int ii = 0; ii < 18; ii++)
// {
// if (ii < pick.Length)
// {
// keyWk.Append(pickVlue[ii]);
// }
// else
// {
// keyWk.Append("00");
// }
// }
// string vlueStr = keyWk.ToString();
// keyWk = new StringBuilder("");
// keyWk.Append(rankStr);
// keyWk.Append(vlueStr);
// string key1 = keyWk.ToString();
// isAdd = isAddMode(tosu, key1);
// string getMny = "0";
// // target Loop
// for (int tarIdx = 00; tarIdx < pick.Length; tarIdx++)
// {
// keyWk = new StringBuilder("");
// keyWk.Append(key1);
// string tarStr = String.Format("{0:00}", tarIdx);
// keyWk.Append(tarStr);
// string key2 = keyWk.ToString();
// // Is win target horse?
// for (int winIdx = 00; winIdx < umaw.Length; winIdx++)
// {
// if (pickUmab[tarIdx] == umaw[winIdx])
// {
// getMny = hara[winIdx];
// break;
// }
// }
// updateData(tosu, key2, isAdd, getMny);
// }
//}
//// オブジェクト作成
//sb.Append(values[54]);
//sb.Append("01");
//sb.Append("010203040506070809101112131415161718");
//for (int ii = 6; ii <= 24; ii++)
//{
// sb.Append(values[ii]);
//}
//work = sb.ToString();
//if (!ans.ContainsKey(work))
//{
// ans.Add(work, "");
//}
//else
//{
// System.Diagnostics.Debug.WriteLine("exist!");
//}
}
catch (Exception ex)
{
System.Diagnostics.Debug.WriteLine(DateTime.Now.ToString());
System.Diagnostics.Debug.WriteLine(ex.Message);
}
}
}
// テキスト・ファイルの内容を簡単に書き込むには?
// https://atmarkit.itmedia.co.jp/fdotnet/dotnettips/680filewriteall/filewriteall.html
//Encoding sjisEnc = Encoding.GetEncoding("Shift_JIS");
//string[] manyLines = {"テスト", "書き込み", "改行"};
//File.WriteAllLines(@"C:\TestLines.txt", manyLines, sjisEnc);
button1.Enabled = true;
System.Diagnostics.Debug.WriteLine(DateTime.Now.ToString());
}
/// <summary>
///
/// </summary>
private void executeJobX()
{
this.dispLog(Utility.CombinStrings(new string[] { "start :", DateTime.Now.ToString() }));
this.setFileData(radioButton1.Checked);//chuo,nankan
this.setInitialExecuteJob();
this.executeJobNew();
this.dispLog(Utility.CombinStrings(new string[] { "end :", DateTime.Now.ToString() }));
}
private void dispLog(string log)
{
dgv.Rows.Add(log);
}
/// <summary>
/// 過去のコンピ指数、結果情報ファイル名を設定
/// </summary>
/// <param name="mode"></param>
private void setFileData(bool mode)
{
fileData = (mode) ? chuoData : nankanData;
}
private void waitOneMiliSec()
{
System.Threading.Thread.Sleep(1);
Application.DoEvents();
}
private void dispTextBox(string data)
{
this.textBox1.Text = data;
}
/// <summary>
/// コンピ指数ファイルから、コンピ指数、馬番を取得
/// </summary>
/// <param name="tarTosu"></param>
/// <param name="targets"></param>
/// <param name="topIdx"></param>
/// <returns></returns>
private string[] getTargetValue(int tarTosu, string[] targets, int topIdx)
{
string[] tarVlue = new string[tarTosu];
for (int ii = 0; ii < tarVlue.Length; ii++) tarVlue[ii] = targets[topIdx + ii];
return tarVlue;
}
private int getHaraiCount(string[] values)
{
int haraiCnt = 0;
for (int ii = (int)indx.HF01; ii < (int)indx.UF01; ii++)
{
if (values[ii] == string.Empty) return (ii - (int)indx.HF01);
}
return haraiCnt;//TODO:ありえない?
}
private string[] getHaraiArray(int haraiCnt, string[] values, int topIdx)
{
string[] hara = new string[haraiCnt];
for (int ii = 0; ii < hara.Length; ii++) hara[ii] = values[(int)indx.HF01 + ii];
return hara;
}
private void getPickValue(ref string[] ans, int tosu, string[] values, string[] pick, int topIdx)
{
string[] vlue = new string[tosu];
for (int ii = 0; ii < vlue.Length; ii++) vlue[ii] = values[topIdx + ii];
for (int ii = 0; ii < ans.Length; ii++) ans[ii] = vlue[int.Parse(pick[ii])];
}
private string[] getTargetPickValue(string[] pick, string[] tarVlue)
{
string[] ans = new string[pick.Length];
for (int ii = 0; ii < pick.Length; ii++) ans[ii] = tarVlue[int.Parse(pick[ii])];
return ans;
}
/// <summary>
/// 当日コンピのコンピ指数順位、値と過去データが一致するか判定
/// </summary>
/// <param name="tarPickVlue"></param>
/// <param name="pickVlue"></param>
/// <returns></returns>
private bool isSameValue(string[] tarPickVlue, string[] pickVlue)
{
for (int ii = 0; ii < tarPickVlue.Length; ii++) if (tarPickVlue[ii] != pickVlue[ii]) return false;
return true;
}
/// <summary>
///
/// </summary>
/// <param name="hara"></param>
/// <param name="umaw"></param>
/// <param name="pickUmab"></param>
private void calcResult(string[] hara, string[] umaw, string pickUmab)
{
resultRaceCnt++;
for (int ii = 0; ii < umaw.Length; ii++)// hit check
{
if (umaw[ii] == pickUmab)
{
resultHitCnt++;// 入賞していた
resultRetMny += long.Parse(hara[ii]);
break;
}
}
}
/// <summary>
/// yyyy,mmdd,jj,rr,umaban,pattern,selectRnk,resultRaceCnt,hit,resultMoney,hitRatio,retRatio
/// </summary>
/// <param name="pp"></param>
/// <param name="selectRnk"></param>
/// <returns></returns>
private string calcSumResult(long pp, int selectRnk)
{
string test = String.Empty;
float hitRatio = (float)resultHitCnt / (float)resultRaceCnt;
float retRatio = (float)resultRetMny / ((float)resultRaceCnt * 100);
// TODO:該当数(targetCnt)、的中率、回収率は、パラメータにすること
bool isBet = this.isBetCondition(new int[] { configTargetCnt, resultRaceCnt }, new float[] { configHitRatio, hitRatio }, new float[] { configHitRatio, retRatio });
//if (hitRatio >= 1) System.Diagnostics.Debug.WriteLine(Utility.CombinStrings(new string[] { "pat:", pp.ToString(), ", rnk:", selectRnk.ToString(), ", cnt:", resultRaceCnt.ToString(), ", hit:", hitRatio.ToString(), ", ret:", retRatio.ToString() }));
//System.Diagnostics.Debug.WriteLine(Utility.CombinStrings(new string[] { "pat:", pp.ToString(), ", rnk:", selectRnk.ToString(), ", cnt:", resultRaceCnt.ToString(), ", hit:", hitRatio.ToString(), ", ret:", retRatio.ToString() }));
//System.Diagnostics.Debug.WriteLine(Utility.CombinStrings(new string[] { "cnt:", resultRaceCnt.ToString(), ", hit:", hitRatio.ToString(), ", ret:", retRatio.ToString() }));
//if (isBet) test = Utility.CombinStrings(new string[] { "umaban:", resultUmaban, ", pattern:", pp.ToString(), ", select:", selectRnk.ToString(), ", count:", resultRaceCnt.ToString(), ", hit:", resultHitCnt.ToString(), ", money:", resultRetMny.ToString(), ", hitRatio:", hitRatio.ToString(), ", retRatio:", retRatio.ToString() });
test = Utility.CombinStrings(new string[] { targ.targets[(int)ConstValue.indx.Year], ",", targ.targets[(int)ConstValue.indx.Monthday], ",", targ.targets[(int)ConstValue.indx.jyocd], ",", targ.targets[(int)ConstValue.indx.RaceNum], ",", resultUmaban, ",", pp.ToString(), ",", selectRnk.ToString(), ",", resultRaceCnt.ToString(), ",", resultHitCnt.ToString(), ",", resultRetMny.ToString(), ",", hitRatio.ToString(), ",", retRatio.ToString() });
return test;
}
private bool isBetCondition(int[] raceCount,float[] hitRatio, float[] returnRatio)
{
if (raceCount[0] <= raceCount[1]) return false;
if (hitRatio[0] < hitRatio[1]) return false;
if (returnRatio[0] < returnRatio[1]) return false;
return true;
}
/// <summary>
/// 当日コンピ指数、パターンファイル、UMA_CMPI.txtを読込み
/// </summary>
/// <param name="mode"></param>
private void setInitialExecuteJob()
{
this.getTargetDataNew();
this.getPatDataNew();
this.getSrcDataNew();
}
/// <summary>
///
/// </summary>
private void executeJobNew()
{
//long lp1cur = 0;
//long lp1max = tar.Length;
string[] ans = new string[360000];
int cnt = 0;
foreach (string targetData in tar)
{
// 指定頭数以外はスキップ(とりあえず、元データを抽出することで対応)
// 以下が、1レース分なので、スレッド化する(とりあえず、レース数、EXEを起動して対応)
//System.Diagnostics.Debug.WriteLine("targetData");
System.Diagnostics.Debug.WriteLine(DateTime.Now.ToString() + " / " + targetData);
this.targ = new targetRace(targetData);// this.dispTextBox(tarIdx.ToString()); this.waitOneMiliSec();
int beforePickArrCnt = 0; // 1頭パターンと2頭パターンの境界を検出するため
bool isExistSameCompi = false; // Lengthが1のもので、該当がなければ、レース自体が対象外とする
//long lp2cur = 0;
//long lp2max = this.getPatArr();
for (long pp = 0; pp < this.getPatArr(); pp++) //②パターン数分 コンピ指数1位~n位の全抽出パターン
{
//System.Diagnostics.Debug.WriteLine("pp"); System.Diagnostics.Debug.WriteLine(pp.ToString());
string[] pick = this.pickPat(pp); // pickupするランク A:0, B:1, ..., null
//long lp3cur = 0;
//long lp3max = pick.Length;
// TODO:pick.Lengthが1のもので、該当がなければ、レース自体が対象外とする
if (beforePickArrCnt == 1 && pick.Length == 2 && !isExistSameCompi) break;
beforePickArrCnt = pick.Length;
bool isSame = false;
for (int selectRnk = 0; selectRnk < pick.Length; selectRnk++)// ③pickがABCならA、B、Cを順番に評価
{
//System.Diagnostics.Debug.WriteLine("selectRnk");System.Diagnostics.Debug.WriteLine(selectRnk.ToString());
// ④過去のコンピ指数情報、結果
initialResult();
//long lp4cur = 0;
//long lp4max = src.Length;
for (int srcIdx = 0; srcIdx < src.Length; srcIdx++)
{
//if (srcIdx == 577) System.Diagnostics.Debug.WriteLine("debug"); // debug
if (this.isSameValue(pick, src[srcIdx], selectRnk)) isSame = true;
//lp4cur++;
//string aaa = lp1cur + " / " + lp1max + " - " + lp2cur + " / " + lp2max + " - " + lp3cur + " / " + lp3max + " - " + lp4cur + " / " + lp4max;
//this.Text = aaa;
//this.Refresh();
}
//lp3cur++;
//string aaa = lp1cur + " / " + lp1max + " - " + lp2cur + " / " + lp2max + " - " + lp3cur + " / " + lp3max;
//this.Text = aaa;
//this.Refresh();
if (!isSame) break; // ひとつも該当しなかった
isExistSameCompi = true;
if (resultRaceCnt > 0)
{
//this.dispLog(this.calcSumResult(pp, selectRnk));
ans[cnt] = this.calcSumResult(pp, selectRnk);
cnt++;
}
this.waitOneMiliSec();
}
//lp2cur++;
}
//lp1cur++;
}
Array.Resize(ref ans, cnt);
File.WriteAllLines(@"c:\work\okba.txt", ans);
}
/// <summary>
///
/// </summary>
/// <param name="targetData">1レース分のコンピ指数</param>
private void analOneRace(string targetData)
{
string[] ans = new string[360000];
int cnt = 0;
// TODO:this.targは、ローカル変数にする?
this.targ = new targetRace(targetData);// this.dispTextBox(tarIdx.ToString()); this.waitOneMiliSec();
int beforePickArrCnt = 0; // 1頭パターンと2頭パターンの境界を検出するため
bool isExistSameCompi = false; // Lengthが1のもので、該当がなければ、レース自体が対象外とする
for (long pp = 0; pp < this.getPatArr(this.targ.tarTosu); pp++) //②パターン数分 コンピ指数1位~n位の全抽出パターン
{
string[] pick = this.pickPat(pp); // pickupするランク A:0, B:1, ..., null
if (beforePickArrCnt == 1 && pick.Length == 2 && !isExistSameCompi) break;
beforePickArrCnt = pick.Length;
for (int selectRnk = 0; selectRnk < pick.Length; selectRnk++)// ③pickがABCならA、B、Cを順番に評価
{
// ④過去のコンピ指数情報、結果
initialResult();
if (!isExistCompiPattern(pick, selectRnk)) break;
isExistSameCompi = true;
if (resultRaceCnt > 0)
{
ans[cnt] = this.calcSumResult(pp, selectRnk);
cnt++;
}
this.waitOneMiliSec();
}
}
}
private bool isExistCompiPattern(string[] pick, int selectRnk)
{
for (int srcIdx = 0; srcIdx < src.Length; srcIdx++)
{
if (this.isSameValue(pick, src[srcIdx], selectRnk)) return true;
}
return false;
}
private void initialResult()
{
resultUmaban = string.Empty;
resultRaceCnt = 0;
resultHitCnt = 0;
resultRetMny = 0;
}
private bool isSameValue(string[] pick, string src, int selectRnk)
{
PastData past = new PastData(pick, src, this.targ.tarTosu);
if (!past.isMatch) return false;
resultUmaban = past.PickUmab[selectRnk];
this.targ.GetTargetPickValue(pick);
bool sameFlg = this.isSameValue(this.targ.tarPickVlue, past.PickVlue);// targetと同じコンピ値?
if (!sameFlg) return false;
this.calcResult(past.Hara, past.Umaw, past.PickUmab[selectRnk]);
return true;
}
private bool isSameValue(string[] pick, string src, int selectRnk, targetRace targ)
{
PastData past = new PastData(pick, src, targ.tarTosu);
if (!past.isMatch) return false;
resultUmaban = past.PickUmab[selectRnk];
targ.GetTargetPickValue(pick);
bool sameFlg = this.isSameValue(targ.tarPickVlue, past.PickVlue);// targetと同じコンピ値?
if (!sameFlg) return false;
this.calcResult(past.Hara, past.Umaw, past.PickUmab[selectRnk]);
return true;
}
/// <summary>
/// 過去情報のデータ数が異常、払い戻し情報がない、頭数が異なる、のいずれかが該当すれば、評価対象としない
/// </summary>
/// <param name="srcValue"></param>
/// <param name="tosu"></param>
/// <param name="tarTosu"></param>
/// <returns></returns>
private bool judgeUnMatchAnal(string[] srcValue, int tosu, int tarTosu)
{
if (srcValue.Length != (int)(indx.TorokuTosu + 1)) return false;// data数check
if (srcValue[(int)indx.HF01] == "") return false;// 払い戻しデータ存在check
if ((tosu != tarTosu)) return false;// 頭数チェック
return true;
}
private void executeJob()
{
if (radioButton1.Checked)
{
fileData = chuoData;
}
else
{
fileData = nankanData;
}
string log = Utility.CombinStrings(new string[] { "start :", DateTime.Now.ToString() });
dgv.Rows.Add(log);
//dgv.Refresh();
System.Threading.Thread.Sleep(1);
Application.DoEvents();
// pattern data load
getTargetData(); // target.txt
getPatData(); // patXX.txt
getSrcData(); // UMA_CMPI.txt
for (int tartar = 0; tartar < tar.Length; tartar++)
{
this.textBox1.Text = tartar.ToString();
System.Threading.Thread.Sleep(1);
Application.DoEvents();
// target ファイル読み込みに変更予定
string target;// = textBox1.Text;// "2022,0213,05,,,01,71,70,69,65,57,54,53,52,49,48,47,46,43,42,41,40,,,10,04,11,15,16,12,14,02,08,05,03,13,06,07,01,09,,,,,,,,,,,,,,,16"; // 対象レースのデータ
target = tar[tartar];
string[] targets = target.Split(',');
int tarTosu = int.Parse(targets[(int)indx.TorokuTosu]);
log = Utility.CombinStrings(new string[] { "Year:", targets[(int)indx.Year], ", Monthday:", targets[(int)indx.Monthday], ", jyocd:", targets[(int)indx.jyocd], ", RaceNum:", targets[(int)indx.RaceNum] });
this.dispLog(log);
System.Threading.Thread.Sleep(1);
Application.DoEvents();
string[] tarVlue;
string[] tarUmab;
tarVlue = new string[tarTosu];
for (int ii = 0; ii < tarVlue.Length; ii++)
{
tarVlue[ii] = targets[(int)indx.C01 + ii];
}
tarUmab = new string[tarTosu];
for (int ii = 0; ii < tarUmab.Length; ii++)
{
tarUmab[ii] = targets[(int)indx.U01 + ii];
}
// pat18から今回の頭数用パターンデータを生成する
// ①pattern loop
//for (long pp = 0; pp < getPatArr(tarTosu); pp++)
//{
// string[] pick = pickPat(tarTosu, pp); // pickupするランク A:0, B:1, ..., null
// Array.Resize(ref pick, pick.Length - 1);
// string[] pickVlue = new string[pick.Length];
// string[] pickUmab = new string[pickVlue.Length];
// int tosu;
// string[] vlue;
// string[] umab;
// string[] hara;
// string[] umaw;
// int raceCnt = 0;
// int hitCnt = 0;
// long retMny = 0;
// // ②pickupしたランクから、ひとつのランクを選択 loop
// for (int selectRnk = 0; selectRnk < pick.Length; selectRnk++)
// {
// // ③src data loop
// for (int srcIdx = 00; srcIdx < src.Length; srcIdx++)
// {
// StringBuilder sb = new StringBuilder("");
// // カンマで分割
// var values = src[srcIdx].Split(',');
// // data数check
// if (values.Length != (int)(indx.TorokuTosu + 1))
// {
// continue; // throw new Exception("CSV format error");
// }
// // 払い戻しデータ存在check
// if (values[(int)indx.HF01] == "")
// {
// continue; //myDic[key]=value;
// }
// // 頭数
// tosu = int.Parse(values[(int)indx.TorokuTosu]);
// if ((tosu != tarTosu))
// {
// continue;
// }
// // main base data
// vlue = new string[tosu];
// for (int ii = 0; ii < vlue.Length; ii++)
// {
// vlue[ii] = values[(int)indx.C01 + ii];
// }
// umab = new string[tosu];
// for (int ii = 0; ii < umab.Length; ii++)
// {
// umab[ii] = values[(int)indx.U01 + ii];
// }
// int haraiCnt = 0;
// for (int ii = (int)indx.HF01; ii < (int)indx.UF01; ii++)
// {
// if (values[ii] == "")
// {
// haraiCnt = ii - (int)indx.HF01;
// break;
// }
// }
// hara = new string[haraiCnt];
// for (int ii = 0; ii < hara.Length; ii++)
// {
// hara[ii] = values[(int)indx.HF01 + ii];
// }
// umaw = new string[haraiCnt];
// for (int ii = 0; ii < umaw.Length; ii++)
// {
// umaw[ii] = values[(int)indx.UF01 + ii];
// }
// for (int ii = 0; ii < pickVlue.Length; ii++)
// {
// pickVlue[ii] = vlue[int.Parse(pick[ii])];
// }
// for (int ii = 0; ii < pickVlue.Length; ii++)
// {
// pickUmab[ii] = umab[int.Parse(pick[ii])];
// }
// // target pick
// string[] tarPickVlue = new string[pick.Length];
// for (int ii = 0; ii < tarPickVlue.Length; ii++)
// {
// tarPickVlue[ii] = tarVlue[int.Parse(pick[ii])];
// }
// // targetと同じコンピ値?
// bool sameFlg = true;
// for (int ii = 0; ii < tarPickVlue.Length; ii++)
// {
// if (tarPickVlue[ii] != pickVlue[ii])
// {
// // ひとつでも異なれば対象外データ
// sameFlg = false;
// break;
// }
// }
// if (sameFlg)
// {
// // count, hitCount, money
// raceCnt++;
// // hit check
// for (int ii = 0; ii < umaw.Length; ii++)
// {
// if (umaw[ii] == pickUmab[selectRnk])
// {
// // 入賞していた
// hitCnt++;
// retMny = retMny + long.Parse(hara[ii]);
// break;
// }
// }
// }
// //// output result
// //StringBuilder res = new StringBuilder("");
// //res.Append("pattern:");
// //res.Append(pp.ToString());
// //res.Append(", select:");
// //res.Append(selectRnk.ToString());
// //res.Append(", src:");
// //res.Append(srcIdx.ToString());
// //res.Append(", count:");
// //res.Append(raceCnt.ToString());
// //res.Append(", hit:");
// //res.Append(hitCnt.ToString());
// //res.Append(", money:");
// //res.Append(retMny.ToString());
// //string test = res.ToString();
// //System.Diagnostics.Debug.WriteLine(test);
// }
// if (raceCnt > 0)
// {
// float hitRatio = (float)hitCnt / (float)raceCnt;
// float retRatio = (float)retMny / ((float)raceCnt * 100);
// if ((raceCnt > 10) && (hitRatio >= 0.2) && (retRatio >= 1.2))
// {
// // pattern result
// StringBuilder res = new StringBuilder("");
// res.Append("umaban:");
// res.Append(pickUmab[selectRnk].ToString());
// res.Append(" ,pattern:");
// res.Append(pp.ToString());
// res.Append(", select:");
// res.Append(selectRnk.ToString());
// res.Append(", count:");
// res.Append(raceCnt.ToString());
// res.Append(", hit:");
// res.Append(hitCnt.ToString());
// res.Append(", money:");
// res.Append(retMny.ToString());
// res.Append(", hitRatio:");
// res.Append(hitRatio.ToString());
// res.Append(", retRatio:");
// res.Append(retRatio.ToString());
// string test = res.ToString();
// //System.Diagnostics.Debug.WriteLine(test);
// dgv.Rows.Add(test);
// System.Threading.Thread.Sleep(1);
// Application.DoEvents();
// //dgv.Refresh();
// //this.Refresh();
// }
// }
// }
//}
log = Utility.CombinStrings(new string[] { "end :", DateTime.Now.ToString() });
this.dispLog(log);
}
}
/// <summary>
/// Let's analボタン押下
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void button2_Click(object sender, EventArgs e)
{
System.Diagnostics.Debug.WriteLine(DateTime.Now.ToString());
button2.Enabled = false;
this.executeJobX();
System.Diagnostics.Debug.WriteLine(DateTime.Now.ToString());
Utility.mailSend("end", "okba");
button2.Enabled = true;
}
private void Form1_Load(object sender, EventArgs e)
{
dgv.ColumnCount = 1;
dgv.Columns[0].Width = 1000;
}
private void button3_Click(object sender, EventArgs e)
{
button3.Enabled = false;
this.setFileData(radioButton1.Checked);
this.getSrcDataNew();
long racecount = 0;
long harai = 0;
long kati = 0;
int torokusu = 12;
int rank = int.Parse(textBox2.Text);
int umabanOffset = (int)indx.U01 - 1;
int conpiOffset = (int)indx.C01 - 1;
int umabanIndex = umabanOffset + rank;
int conpiIndex = conpiOffset + rank;
long haraiOne;
string raceOne;
int debugCnt;
double[] px = new double[src.Length];
double[] py = new double[src.Length];
for (int srcIdx = 0; srcIdx < src.Length; srcIdx++)
{
string[] arr = src[srcIdx].Split(',');
if ((int.Parse(arr[(int)indx.TorokuTosu]) >= torokusu) && (arr[(int)indx.HF01] != "") && (arr[umabanIndex] != ""))
{
racecount++;
px[racecount] = (double)racecount;
raceOne = arr[(int)indx.Year] + "," + arr[(int)indx.Monthday] + "," + arr[(int)indx.jyocd] + "," + arr[(int)indx.RaceNum] + ",";
haraiOne = 0;
debugCnt = 0;
for (int lp = 0; lp < 5; lp++)
{
if (arr[umabanIndex] == arr[(int)indx.UF01 + lp])
{
debugCnt++;
if (debugCnt > 1)
{
this.dispLog("xxx," + raceOne);
}
kati++;
haraiOne = int.Parse(arr[(int)indx.HF01 + lp]);
harai += haraiOne;
}
}
py[racecount] = ((double)harai / (double)racecount);
//this.dispLog(px[racecount].ToString() + " , " + py[racecount].ToString());
this.dispLog(raceOne + haraiOne.ToString());
}
}
float hit = (((float)kati / (float)racecount) * 100);
float ret = (((float)harai / ((float)racecount * 100)) * 100);
this.dispLog("条件:出走頭数" + torokusu.ToString() + "以上、コンピ指数" + rank.ToString() + "位");
this.dispLog("race:" + racecount.ToString());
this.dispLog("win :" + kati.ToString());
this.dispLog("ret :" + harai.ToString());
this.dispLog("的中率:" + hit.ToString());
this.dispLog("回収率:" + ret.ToString());
// グラフにタイトルを付けます
formsPlot1.plt.Title("こんぴ君");
// X軸, Y軸に名前を付けます
// fontNameでフォントを指定することができます。
formsPlot1.plt.XLabel("時間", fontName: "MS ゴシック");
formsPlot1.plt.YLabel("値");
Array.Resize(ref px, (int)racecount);
Array.Resize(ref py, (int)racecount);
// 散布図としてデータをセットします。凡例もあわせて設定します。
formsPlot1.plt.PlotScatter(px, py, label: "コンピ回収率");
// Legend(凡例)の表示を指定します(指定しないと表示されません)
formsPlot1.plt.Legend();
// ScottPlotのコントロールに描画(表示)します。
formsPlot1.Render();
button3.Enabled = true;
}
private void button4_Click(object sender, EventArgs e)
{
dgv.Rows.Clear();
// グラフデータにあわせて描画内容を調整します(最初に戻す)
// 引数でX軸・Y軸の余白(マージン)を調整することもできます。
formsPlot1.plt.AxisAuto();
// ScottPlotのコントロールに再描画します。
formsPlot1.Render();
}
private void tabPage1_Click(object sender, EventArgs e)
{
}
private void button5_Click(object sender, EventArgs e)
{
Utility.mailSend("test", "tensai");
}
/// <summary>
/// マルチスレッド対応
/// </summary>
private void executeJobMulti()
{
string[] ans = new string[360000];
int cnt = 0;
foreach (string targetData in tar)
{
System.Diagnostics.Debug.WriteLine(DateTime.Now.ToString() + " / " + targetData);
this.targ = new targetRace(targetData);// this.dispTextBox(tarIdx.ToString()); this.waitOneMiliSec();
int beforePickArrCnt = 0; // 1頭パターンと2頭パターンの境界を検出するため
bool isExistSameCompi = false; // Lengthが1のもので、該当がなければ、レース自体が対象外とする
for (long pp = 0; pp < this.getPatArr(); pp++) //②パターン数分 コンピ指数1位~n位の全抽出パターン
{
string[] pick = this.pickPat(pp); // pickupするランク A:0, B:1, ..., null
if (beforePickArrCnt == 1 && pick.Length == 2 && !isExistSameCompi) break;
beforePickArrCnt = pick.Length;
bool isSame = false;
for (int selectRnk = 0; selectRnk < pick.Length; selectRnk++)// ③pickがABCならA、B、Cを順番に評価
{
// ④過去のコンピ指数情報、結果
initialResult();
for (int srcIdx = 0; srcIdx < src.Length; srcIdx++)
{
if (this.isSameValue(pick, src[srcIdx], selectRnk)) isSame = true;
}
if (!isSame) break; // ひとつも該当しなかった
isExistSameCompi = true;
if (resultRaceCnt > 0)
{
ans[cnt] = this.calcSumResult(pp, selectRnk);
cnt++;
}
this.waitOneMiliSec();
}
}
}
Array.Resize(ref ans, cnt);
File.WriteAllLines(@"c:\work\okba.txt", ans);
}
private void button6_Click(object sender, EventArgs e)
{
button6.Enabled = false;
addFuku();
button6.Enabled = true;
}
/// <summary>
/// 払い戻しのデータを結合して分析を容易にする
/// yyyy,mmdd,jj,rr,umabanをキーにして、コンピ指数データ、払い戻しのデータを結合
/// オーケー馬のデータ:okba.txt
/// 2023,0611,05,06,18,0,0,215,37,4510,0.172093,0.2097674
/// 0 1 2 3 4
/// yyyy,mmdd,jj,rr,umaban
/// 払い戻しのデータ:harai.txt
/// 2023,0611,05,,06,17,2,18,,,110,170,140,,,1305,3,4,2-17-18,,,,,1100,,,,,17-2-18,,,,,3770,,,,,,2023,0611,05,3,4,06,86,66,65,58,57,54,52,50,49,48,47,46,45,44,43,42,41,40,17,04,03,02,18,16,08,13,11,09,10,01,12,14,15,06,05,07,,,,,,,,,,,,,18
/// 0 1 2 3 4 5 6 7 89 0 1 2
/// yyyy,mmdd,jj,,rr,1 ,2,3 複勝 time k,n,sanrenpuku harai sanrentan harai compi umaban
/// 着順馬番
/// add data:複勝の払い戻し(外れはゼロ)・・・実際の回収率、的中率を算出する
/// 着順馬番から検索をして、ヒットしてたら、払い戻しを取得
/// </summary>
private void addFuku()
{
// ファイル読み込み
// オーケー馬のデータ:okba.txt
okba = Utility.readFile("okba.txt");
// 払い戻しのデータ:harai.txt
harai = Utility.readFile("harai.txt");
string[] res = new string[okba.Length];
int cnt = 0;
// キー:オーケー馬のyyyy,mmdd,jj,rr:払い戻しをなめる
for(int ii = 0; ii < okba.Length; ii++)
{
int idx = hitHarai(okba[ii], harai);
if (idx != -1)
{
// TODO
// ヒットしたら、umabanが着順馬番に存在するか判定
// あれば、着順に応じた複勝払い戻しを取得。なければ、ゼロ
string ans = getFukuHarai(okba[ii], harai[idx]);
res[cnt] = ans;
cnt++;
}
}
Array.Resize(ref res, cnt);
string filePath = "analy.txt";
System.Text.Encoding enc = System.Text.Encoding.GetEncoding("shift_jis");
System.IO.File.WriteAllLines(filePath, res, enc);
}
/// <summary>
/// オーケー馬のデータ:okba.txt
/// 2023,0611,05,06,18,0,0,215,37,4510,0.172093,0.2097674
/// 0 1 2 3 4
/// yyyy,mmdd,jj,rr,umaban
/// 払い戻しのデータ:harai.txt
/// 2023,0611,05,,06,17,2,18,,,110,170,140,,,1305,3,4,2-17-18,,,,,1100,,,,,17-2-18,,,,,3770,,,,,,2023,0611,05,3,4,06,86,66,65,58,57,54,52,50,49,48,47,46,45,44,43,42,41,40,17,04,03,02,18,16,08,13,11,09,10,01,12,14,15,06,05,07,,,,,,,,,,,,,18
/// 0 1 2 3 4 5 6 7 89 0 1 2
/// yyyy,mmdd,jj,,rr,1 ,2,3 複勝 time k,n,sanrenpuku harai sanrentan harai compi umaban
/// 着順馬番
/// </summary>
/// <param name="okba"></param>
/// <param name="harai"></param>
/// <returns></returns>
private string getFukuHarai(string okba,string harai)
{
string[] arrOkba = okba.Split(',');
string[] arrHarai = harai.Split(',');
int umaban = int.Parse(arrOkba[4]);
string ans = "0";
for(int ii = 5; ii <= 9;ii++)
{
if (arrHarai[ii] == string.Empty) break;
if (umaban == int.Parse(arrHarai[ii]))
{
ans = arrHarai[ii + 5];
break;
}
}
return okba + "," + ans;
}
private int hitHarai(string oneOkba, string[] arrHarai)
{
for(int ii = 0; ii < arrHarai.Length; ii++)
{
string str = arrHarai[ii];
if (hitHarai(oneOkba, str)) return ii;
}
return -1;
}
/// <summary>
/// オーケー馬のデータ:okba.txt
/// 2023,0611,05,06,18,0,0,215,37,4510,0.172093,0.2097674
/// yyyy,mmdd,jj,rr,umaban
/// 0 1 2 3 4
/// 払い戻しのデータ:harai.txt
/// 2023,0611,05,,06,17,2,18,,,110,170,140,,,1305,3,4,2-17-18,,,,,1100,,,,,17-2-18,,,,,3770,,,,,,2023,0611,05,3,4,06,86,66,65,58,57,54,52,50,49,48,47,46,45,44,43,42,41,40,17,04,03,02,18,16,08,13,11,09,10,01,12,14,15,06,05,07,,,,,,,,,,,,,18
/// yyyy,mmdd,jj,,rr,1 ,2,3 複勝 time k,n,sanrenpuku harai sanrentan harai compi umaban
/// 0 1 2 3 4 5 6 7 89 0 1 2
/// hit check:yyyy,mmdd,jj,rr
/// </summary>
/// <param name="oneOkba"></param>
/// <param name="oneHarai"></param>
/// <returns></returns>
private bool hitHarai(string oneOkba, string oneHarai)
{
string[] arrOkba = oneOkba.Split(',');
string[] arrHarai = oneHarai.Split(',');
if (arrOkba[0] == arrHarai[0])
{
if(arrOkba[1] == arrHarai[1])
{
if (arrOkba[2] == arrHarai[2])
{
if (arrOkba[3] == arrHarai[4])
{
return true;
}
}
}
}
return false;
}
}
class Human
{
public string Name { get; set; }
public string Age { get; set; }
}
}
以下は特に記事はありません。
お金を払ってもらえると、僕が少しハッピーになります。
あと、ソースを修正したときに通知が行くはずです。
ここから先は
20字
¥ 100
この記事が気に入ったらサポートをしてみませんか?