プログラミングのすすめ 第十二歩 Windows PowerShell FX損益総計グラフ ブラッシュ・アップ

プログラミング

今までプログラミングのすすめ 第六歩第七歩第十歩 で取り上げてきました FX損益総計グラフですが、今回はこのプログラムをブラッシュ・アップして、もう少し使い易いものにして行こうと思います。

【paters】

グラフ表示期間を指定出来るようにする

先ずは、グラフを表示する期間を指定できるようにします。そのためには、CSVファイルの各行の日付を判定して指定された期間のデータを抽出する必要があります。

CSVファイルの内容は以下のようになっています。プロパティ H10 の日付で期間を判定します。

PS C:\sumbyday\aug> Import-Csv KessaiFinal.csv -Header H1,H2,H3,H4,H5,H6,H7,H8,H9,H10

H1  : AUD/JPY
H2  : 売
H3  : 決済
H4  : 1
H5  : 93.873
H6  : 80
H7  : 0
H8  : 80
H9  : 2022/08/08 14:35:06
H10 : 2022/08/08 14:35:06

H1  : AUD/JPY
H2  : 売
H3  : 決済
H4  : 1
H5  : 93.835
H6  : 80
H7  : 0
H8  : 80
H9  : 2022/08/08 15:05:11
H10 : 2022/08/08 15:05:11

次の様なスクリプトを書きました。

この例では、Import-Csv で 項目10番目までを読み込んで、Where-Object でH10の値が “2022/08/12″ より大きく、”2022/08/15!” より小さい行を抽出しています。項目10番目は ”2022/08/15 10:42:57″ のように日付の後はスペース” ” ですので”!”を付け加えたた値と比較すると小さくなります。

# Select date

$StartDay = "2022/08/12"

$EndDay = "2022/08/19"

Import-Csv KessaiFinal.csv -Header H1,H2,H3,H4,H5,H6,H7,H8,H9,H10 | 
Where-Object { $_.H10 -gt $StartDay -and $_.H10 -lt $EndDay + "!" } | 
ConvertTo-Csv

実行結果

PS C:\sumbyday\aug> ./SelectDate.PS1
#TYPE System.Management.Automation.PSCustomObject
"H1","H2","H3","H4","H5","H6","H7","H8","H9","H10"
"CAD/JPY","売","決済","1","104.061","-5,780","0","-5,780","2022/08/12 01:21:10","2022/08/12 01:21:10"
"CAD/JPY","買","決済","1","104.276","-2,250","-146","-2,396","2022/08/15 10:42:57","2022/08/15 10:42:57"

スクリプトに日付を引数で渡し判定する。

会員数は国内最大級の180万人を突破!【paters】

次は、スクリプトに期間の日付を引数で渡す方法です。

PowerShell のスクリプトに引数を渡すと $Args[] という変数に入ります。

渡す引数は、次のような形での日付で期間を表すものです。

  1. “08/09-08/20”
  2. “8/9-8/20”
  3. “8/3-26”
  4. “2022/12/1-1/10”
  5. “12/1-1/10”
  6. “12/1-2023/1/10”
  7. “2022/10/1-2023/11/30”

これらの表記をすべて正しく処理するために、次のようなスクリプトを書きました。

$Start_YYYYMMDD,$End_YYYYMMDD = $Args[0].Split("-")
$Start_Year = ""
$End_Year = "" 
$End_Day = ""
if ( (($Start_YYYYMMDD.Split("/")).Count -1) -LT 2  ) {

    $Start_Mon,$Start_Day = $Start_YYYYMMDD.Split("/") }

 else {

    $Start_Year,$Start_Mon,$Start_Day = $Start_YYYYMMDD.Split("/") }

 if ( (($End_YYYYMMDD.Split("/")).Count -1) -LT 2 ) { {

    $End_Mon,$End_Day = $End_YYYYMMDD.Split("/");  }

 else {
 
   $End_Year,$End_Mon,$End_Day = $End_YYYYMMDD.Split("/") }
 
if ( $End_Day.length -eq 0 ) {
 
  $End_Day = $End_Mon ; $End_Mon = $Start_Mon } 

 if ( $Start_Mon.length -lt 2 ) { 

   $Start_Mon = "0" + $Start_Mon }

 if ( $Start_Day.length -lt 2 ) { 

   $Start_Day = "0" + $Start_Day }

 if ( $End_Mon.length -lt 2 ) { 

   $End_Mon = "0" + $End_Mon }

 if ( $End_Day.length -lt 2 ) { 

   $End_Day = "0" + $End_Day }


if ($End_Year -eq "" ) {                                                 # 終了年 未指定
    if ($Start_Year -ne "" ) {                                           # 開始年は指定されている
         if ($End_Mon -LT $Start_Mon) {                                  # 終了月 < 開始月 年を跨ぐ
              $End_Year = [Int]$Start_Year + 1                            # 終了年を開始年 + 1 に
         }                                                              
         else { $End_Year = $Start_Year                                   # 年を跨がない 終了年 = 開始年
         }                                
    } 
    else {  $End_Year = Get-Date -Format "yyyy"                            # 開始年も終了年も指定なし 終了年を現在の年に
         if ($End_Mon -LT $Start_Mon) { $Start_Year = [Int]$End_Year - 1   # 年を跨いでいる 開始年 = 終了年 - 1
          }  
         else  { $Start_Year = $End_Year                                   # 年を跨がない 開始年 = 終了年
          }                                  
    }    
}
else   {                                                                   # 終了年 指定
    if ($Start_Year.length -eq 0 ) {                                       # 開始年 未指定
       if ($End_Mon -LT $Start_Mon) {  $Start_Year = [Int]$End_Year - 1   # 年を跨いでいる 開始年 = 終了年 - 1
       }
       else { $Start_Year = $End_Year                                   # 年を跨がない 開始年 = 終了年
       }
    }
}
If ($Start_Year.Length -LT 3 ) { $Start_Year = "20" + $Start_Year }
If ($End_Year.Length -LT 3 ) { $End_Year = "20" + $End_Year  }
Write-Output $("開始日 " + $Start_Year + "/" + $Start_Mon + "/" + $Start_day)
Write-Output $("終了日 " + $End_Year + "/" + $End_Mon + "/" + $End_Day)

$Start_YYYYMMDD,$End_YYYYMMDD = $Args[0].Split(“-“)

引数を”-” で区切って、開始月日と終了月日に分けます。

if ( (($Start_YYYYMMDD.Split(“/”)).Count -1) -LT 2 ) {
$Start_Mon,$Start_Day = $Start_YYYYMMDD.Split(“/”)
}
else {
$Start_Year,$Start_Mon,$Start_Day = $Start_YYYYMMDD.Split(“/”)
}

開始月日の中に ”/” が2個未満なら 年は指定されてないと判断して開始月日を”/”で区切って開始月と日に分けます。年が指定されていると判断した場合は、年、月、日 に分けます。終了月日も同じように処理します。

if ( $End_Day.length -eq 0 ) {
$End_Day = $End_Mon ; $End_Mon = $Start_Mon
}

終了月日の日にちの長さが0の場合、渡された引数が “8/3-26” のように終了月日の月の値が指定されていないので、文字列に “/”が一つしかなく、$End_Day には何も代入されません。その場合、$End_Mon に入っている ”26” の値が終了月日の日にちの値なので $End_Mon を $End_Day に代入し、終了月日の月は、開始月日の月と同じなので、$Start_Mon を $End_Mon に代入します。

if ( $Start_Mon.length -lt 2 ) {
$Start_Mon = “0” + $Start_Mon
}

値が一桁の場合は、頭に”0″を付けます。

if ($Start_Year -eq “” ) { $Start_Year = Get-Date -Format “yyyy” }

開始年が指定されていない場合は、現在の年を取得して代入します。

if ($End_Year -eq “” ) {
if ($Start_Mon -GT $End_Mon) { $End_Year = [Int]$Start_Year + 1 }
else
{ $End_Year = $Start_Year }
}

終了年が指定されていないときは、開始月>終了月の場合は年を跨ぐと判断し、開始年+1して終了年に代入します。そうでない場合は、終了年=開始年 とします。

if ($Start_Year.length -eq 0 ) {                                       # 開始年 未指定
   if ($End_Mon -LT $Start_Mon) {  $Start_Year = [Int]$End_Year - 1   # 年を跨いでいる 開始年 = 終了年 - 1
   }
   else { $Start_Year = $End_Year                                   # 年を跨がない 開始年 = 終了年
   }
}

終了年が指定されていて、開始年が指定されていない場合です。年を跨いでいる場合は、開始年を終了年-1 にします。年を跨がない場合は、開始年 = 終了年 とします。

実行結果です。

PS C:\sumbyday\aug> ./testday.PS1 08/09-08/20
開始日 2022/08/09
終了日 2022/08/20
PS C:\sumbyday\aug> ./testday.PS1 8/9-8/20
開始日 2022/08/09
終了日 2022/08/20
PS C:\sumbyday\aug> ./testday.PS1 8/3-26
開始日 2022/08/03
終了日 2022/08/26
PS C:\sumbyday\aug> ./testday.PS1 2022/10/1-2023/11/30
開始日 2022/10/01
終了日 2023/11/30
PS C:\sumbyday\aug> ./testday.PS1 12/1-2023/1/10
開始日 2022/12/01
終了日 2023/01/10
PS C:\sumbyday\aug> ./testday.PS1 2022/12/1-1/10
開始日 2022/12/01
終了日 2023/01/10

これらをこちらで作成した FX_Trade_Chart.PS1 に組み込みます。

# Make Bar Chart Data

cat TradeRecordList*.csv | sls "決済" | sls JPY | Out-File OnlyKessai.csv
Import-Csv OnlyKessai.csv -Header H1,H2,H3,H4,H5,H6,H7,H8,H9,H10 | Sort-Object H10 | Export-Csv OnlyKessaiS.csv -Encoding UTF8

# ------ Prep $StartDay / $EndDay --------------------------------------------------------------------------------------------

$Start_YYYYMMDD,$End_YYYYMMDD = $Args[0].Split("-")
$Start_Year = ""
$End_Year = "" 
$End_Day = ""
if ( (($Start_YYYYMMDD.Split("/")).Count -1) -LT 2  ) {

    $Start_Mon,$Start_Day = $Start_YYYYMMDD.Split("/") }

 else {

    $Start_Year,$Start_Mon,$Start_Day = $Start_YYYYMMDD.Split("/") }

if ( (($End_YYYYMMDD.Split("/")).Count -1) -LT 2 ) { {

    $End_Mon,$End_Day = $End_YYYYMMDD.Split("/");  }

 else {
 
   $End_Year,$End_Mon,$End_Day = $End_YYYYMMDD.Split("/") }
 
if ( $End_Day.length -eq 0 ) {
 
  $End_Day = $End_Mon ; $End_Mon = $Start_Mon } 

 if ( $Start_Mon.length -lt 2 ) { 

   $Start_Mon = "0" + $Start_Mon }

 if ( $Start_Day.length -lt 2 ) { 

   $Start_Day = "0" + $Start_Day }

 if ( $End_Mon.length -lt 2 ) { 

   $End_Mon = "0" + $End_Mon }

 if ( $End_Day.length -lt 2 ) { 

   $End_Day = "0" + $End_Day }


if ($End_Year -eq "" ) {                                                 # 終了年 未指定
    if ($Start_Year -ne "" ) {                                           # 開始年は指定されている
         if ($End_Mon -LT $Start_Mon) {                                  # 終了月 < 開始月 年を跨ぐ
              $End_Year = [Int]$Start_Year + 1                            # 終了年を開始年 + 1 に
         }                                                              
         else { $End_Year = $Start_Year                                   # 年を跨がない 終了年 = 開始年
         }                                
    } 
    else {  $End_Year = Get-Date -Format "yyyy"                            # 開始年も終了年も指定なし 終了年を現在の年に
         if ($End_Mon -LT $Start_Mon) { $Start_Year = [Int]$End_Year - 1   # 年を跨いでいる 開始年 = 終了年 - 1
          }  
         else  { $Start_Year = $End_Year                                   # 年を跨がない 開始年 = 終了年
          }                                  
    }    
}
else   {                                                                   # 終了年 指定
    if ($Start_Year.length -eq 0 ) {                                       # 開始年 未指定
       if ($End_Mon -LT $Start_Mon) {  $Start_Year = [Int]$End_Year - 1   # 年を跨いでいる 開始年 = 終了年 - 1
       }
       else { $Start_Year = $End_Year                                   # 年を跨がない 開始年 = 終了年
       }
    }
}
If ($Start_Year.Length -LT 3 ) { $Start_Year = "20" + $Start_Year }
If ($End_Year.Length -LT 3 ) { $End_Year = "20" + $End_Year  }
Write-Output $("開始日 " + $Start_Year + "/" + $Start_Mon + "/" + $Start_day)
Write-Output $("終了日 " + $End_Year + "/" + $End_Mon + "/" + $End_Day)

$StartDay = $Start_Year + "/" + $Start_Mon + "/" + $Start_day
$EndDay = $End_Year + "/" + $End_Mon + "/" + $End_Day

# -------------------------------------------------------------------------------------------------------------------------------
Import-Csv OnlyKessaiS.csv -Header H1,H2,H3,H4,H5,H6,H7,H8,H9,H10 | Where-Object { $_.H10 -gt $StartDay -and $_.H10 -lt $EndDay + "!" } | Export-Csv OnlyKessaiSS.csv -Encoding UTF8
cat OnlyKessaiSS.csv | gu | oss | sls JPY | out-file KessaiFinal.csv
Import-Csv KessaiFinal.csv -Header H1,H2,H3,H4,H5,H6 | Select-Object H6 | oss | sls "H6","--" -NotMatch | out-file SonEki.txt
$BarData = ""
cat SonEki.txt | % { $_.Replace(",","")}  | ? { $_ -Match "[0-9]{2}" -Or $_ -Match "0" } | % { $BarData = $BarData + $_ + "," }
$BarData | Out-File BarChartData.txt

# Make Line Chart Data

function sumline {
Begin {
               $LCD = 0
            }
            Process  { % { $LCD = $LCD + [INT]$_  } {  Write-OutPut $LCD
                      }
            }
 }
Cat SonEki.txt | ? { $_ -Match "[0-9]{2}" -Or $_ -Match "0" } | Sumline | Out-file KasanGaku.txt
$LineChartD = ""
Cat KasanGaku.txt | % { $LineChartD = $LineChartD + $_ + "," }
$lineChartD | Out-File LineChartData.txt

# Make Label Data 

Import-Csv KessaiFinal.csv -header h1,h2,h3,h4,h5,h6,h7,h8,h9,h10 | Select-Object h10 | oss | ? {$_ -Match "[0-9]{4}"} | Out-File YakuteiDate.txt
cat YakuteiDate.txt | % { $_.Substring(5,5) } | % { $Label = $Label + "'" + $_ + "'" + "," }
$Label | Out-File LabelData.txt

# Make Mixed Chart HTML

$FileName = ".\MixedChartOfTrade.HTML"
if (Test-Path $FileName ) {
  Remove-Item $FileName
}
Write-OutPut '<!doctype html>'                                                                         | Add-Content $FileName
Write-OutPut '<html>'                                                                                  | Add-Content $FileName
Write-OutPut '    <head>'                                                                              | Add-Content $FileName
Write-OutPut '        <title>Chart Sample</title>'                                                     | Add-Content $FileName
Write-OutPut '        <link rel="stylesheet" href="Chart.css">'                                        | Add-Content $FileName
Write-OutPut '        <script src="\Windows\System32\node_modules\chart.js\dist\Chart.js"></script>'   | Add-Content $FileName
Write-OutPut '    </head>'                                                                             | Add-Content $FileName
Write-OutPut '    <body> '                                                                             | Add-Content $FileName
Write-OutPut '    <div id="wrapper">'                                                                  | Add-Content $FileName
Write-OutPut '    <canvas id="myChart" width="" height=""></canvas>'                                   | Add-Content $FileName
Write-OutPut '    </div>'                                                                              | Add-Content $FileName
Write-OutPut '<script>'                                                                                | Add-Content $FileName
Write-OutPut 'var canvas = document.getElementById(''myChart'');'                                      | Add-Content $FileName
Write-OutPut '   canvas.width =  wrapper.offsetWidth;'                                                 | Add-Content $FileName
Write-OutPut '   canvas.height = wrapper.offsetHeight;'                                                | Add-Content $FileName
Write-OutPut 'const ctx = document.getElementById(''myChart'').getContext(''2d'');'                    | Add-Content $FileName
Write-OutPut 'const myChart = new Chart(ctx, {'                                                        | Add-Content $FileName
Write-OutPut '    data: {'                                                                             | Add-Content $FileName
Write-OutPut '        //xxxLABEL '                                                                     | Add-Content $FileName
Write-OutPut '        labels: [ '                                                                      | Add-Content $FileName
cat LabelData.txt                                                                                      | Add-Content $FileName  
Write-OutPut '],'                                                                                      | Add-Content $FileName 
Write-OutPut '        datasets: [{'                                                                    | Add-Content $FileName
Write-OutPut '                  type: ''line'','                                                       | Add-Content $FileName
Write-OutPut '            label: ''損益合計'','                                                        | Add-Content $FileName
Write-OutPut '            //xxxLine Data       '                                                       | Add-Content $FileName
Write-OutPut '            data: [              '                                                       | Add-Content $FileName
cat LineChartData.txt                                                                                  | Add-Content $FileName
Write-OutPut '], '                                                                                     | Add-Content $FileName
Write-OutPut '           borderColor: [         '                                                      | Add-Content $FileName
Write-OutPut '                ''rgba(255, 206, 86, 1)'']'                                              | Add-Content $FileName
Write-OutPut '        },{ '                                                                            | Add-Content $FileName
Write-OutPut '             type: ''bar'','                                                             | Add-Content $FileName
Write-OutPut '            label: ''損益/日'','                                                         | Add-Content $FileName
Write-OutPut '            //xxxBar Data'                                                               | Add-Content $FileName
Write-OutPut '            data: [ '                                                                    | Add-Content $FileName
cat BarChartData.txt                                                                                   | Add-Content $FileName 
Write-OutPut '],'                                                                                      | Add-Content $FileName
Write-OutPut '            backgroundColor: ['                                                          | Add-Content $FileName
Write-OutPut '                ''rgba(200, 99, 132, 1)'']        }]'                                    | Add-Content $FileName
Write-OutPut '    }, '                                                                                 | Add-Content $FileName
Write-OutPut '    options: {'                                                                          | Add-Content $FileName
Write-OutPut '        scales: {'                                                                       | Add-Content $FileName
Write-OutPut '            y: {   '                                                                     | Add-Content $FileName
Write-OutPut '                beginAtZero: true'                                                       | Add-Content $FileName
Write-OutPut '            }'                                                                           | Add-Content $FileName
Write-OutPut '        }'                                                                               | Add-Content $FileName
Write-OutPut '    }'                                                                                   | Add-Content $FileName
Write-OutPut '});'                                                                                     | Add-Content $FileName
Write-OutPut '</script>'                                                                               | Add-Content $FileName
Write-OutPut '</body>'                                                                                 | Add-Content $FileName
Write-OutPut '</html>'                                                                                 | Add-Content $FileName

# Write Out Chart.css 

if (Test-Path '.\Chart.css' ) {
  Remove-Item '.\Chart.css'
}

Write-OutPut '#canvas{'                     | Add-Content .\Chart.css
Write-OutPut '	display: block;'            | Add-Content .\Chart.css
Write-OutPut '}'                            | Add-Content .\Chart.css
Write-OutPut 'html, body, #wrapper{'        | Add-Content .\Chart.css
Write-OutPut '	width: 95%;'                | Add-Content .\Chart.css
Write-OutPut '	height: 95%;'               | Add-Content .\Chart.css
Write-OutPut '}'                            | Add-Content .\Chart.css

# Display HTML file

$FileName | Out-File .\DispChart.ps1
.\DispChart.ps1 

# Clean-Up Files

if (Test-Path '.\BarChartData.txt' ) {
  Remove-Item '.\BarChartData.txt'
}
if (Test-Path '.\DispChart.ps1' ) {
  Remove-Item '.\DispChart.ps1'
}
if (Test-Path '.\KasanGaku.txt' ) {
  Remove-Item '.\KasanGaku.txt'
}
if (Test-Path '.\KessaiFinal.csv' ) {
 # Remove-Item '.\KessaiFinal.csv'
}
if (Test-Path '.\LabelData.txt' ) {
  Remove-Item '.\LabelData.txt'
}
if (Test-Path '.\LineChartData.txt' ) {
  Remove-Item '.\LineChartData.txt'
}
if (Test-Path '.\OnlyKessai.csv' ) {
  Remove-Item '.\OnlyKessai.csv'
}
if (Test-Path '.\OnlyKessaiS.csv' ) {
  Remove-Item '.\OnlyKessaiS.csv'
}
if (Test-Path '.\SonEki.txt' ) {
  Remove-Item '.\SonEki.txt'
}
if (Test-Path '.\YakuteiDate.txt' ) {
  Remove-Item '.\YakuteiDate.txt'
}

期間指定で実行してみます。

PS C:\sumbyday\All_Data> ./FX_Trade_Chart.ps1 11/01-11/24
開始日 2022/11/01
終了日 2022/11/24

PS C:\sumbyday\All_Data> ./FX_Trade_Chart.ps1 09/15-10/15
開始日 2022/09/15
終了日 2022/10/15

すべてのデータを一か所に重複も気にせずにダウンロードして、期間指定でグラフを表示出来るようになりました。

期間指定が引数で指定されないケースを考慮

引数が渡されなかったケースも考慮しないといけません。

日付け判定のルーティンを If文で囲み、$Args[0] の長さが5桁以下の場合は、 $StartDay は、Null に $EndDay は、”All Period” にします。

# ------ Prepair $StartDay / $EndDay --------------------------------------------------------------------------------------------
If ($Args[0].length -gt 5) { 
   $Start_YYYYMMDD,$End_YYYYMMDD = $Args[0].Split("-")
   $Start_Year = ""
:
:
:
   $StartDay = $Start_Year + "/" + $Start_Mon + "/" + $Start_day
   $EndDay = $End_Year + "/" + $End_Mon + "/" + $End_Day
}
else {
   $StartDay = ""
   $EndDay ="50"
}

HTMLをWebページ等からリンクして実行できるようにCDNのChart.jsを参照するように変更する。

老舗サイトのラブサーチ[18歳以上]

今まで Chart.js は PCにパッケージをダウンロードして参照していましたが、WebページでHTMLを表示出来るように CDN の Chart.jsを参照するように変更します。

  <script src="\Windows\System32\node_modules\chart.js\dist\Chart.js"></script>
                      |
                                        V
  <script src="https://cdn.jsdelivr.net/npm/chart.js@4.0.1/dist/chart.umd.min.js"></script>

最新の CDN Chart.js の リンクはこちらにあります。

同じく、CSSを外部ファイルでリンクしていましたが、HTMLの <Head> の下に記述してリンクは外します。

# Write-OutPut '        <link rel="stylesheet" href="Chart.css">'                                        | Add-Content $FileName

Write-OutPut '          <meta http-equiv="Content-Style-Type" content="text/css"> '                     | Add-Content $FileName
Write-OutPut '          <style type="text/css"> '                                                       | Add-Content $FileName
Write-OutPut '          #canvas{ '                                                                      | Add-Content $FileName                 
Write-OutPut '          display: block;   '                                                             | Add-Content $FileName      
Write-OutPut '          }                 '                                                             | Add-Content $FileName        
Write-OutPut '          html, body, #wrapper{     '                                                     | Add-Content $FileName
Write-OutPut '	                     width: 95%;            '                                           | Add-Content $FileName 
Write-OutPut '	                     height: 95%;           '                                           | Add-Content $FileName 
Write-OutPut '                      }                      '                                            | Add-Content $FileName   
Write-OutPut '          </style>'                                                                       | Add-Content $FileName

変更後に実行しサーバーにアップした グラフ 11/01-26 です。

他のFX会社の約定履歴でも使えるように変更する

運用実績20年以上の信頼!安心のポイントサイト《ワラウ》

今までDMM.FX の約定履歴で作ってきました。他のFX会社の約定履歴でも使えるように変更します。

外為どっとコム バーチャルFX の約定履歴がありましたので、先ずはこちらで使えるように変更を加えて行きます。

外為どっとコムの約定履歴 CSV出力データ

分かり易いように先頭の数行をスペースを入れて編集しています。Hx は追記しています。決済約定日時は、H1です。 損益金額はH20です。

期間,from,to,通貨ペア,約定区分,売買区分,
期間指定,22/11/01 00:00:00,22/11/26 23:59:59,全通貨,新規・決済,全売買,
決済約定日時,注文番号,ポジション番号,通貨ペア,両建区分,注文方式,約定区分,執行条件,指定レート,売買,Lot数,新規約定日時,新規約定値,決済約定値,pip損益,円換算レート,スポット損益,手数料,スワップ損益,取引損益,チャネル,
      H1                H2              H3             H4    H5   H6   H7  H8      H9      H10 H11       H12             H13       H14        H15      H16          H17         H18    H19          H20       H21
                                                            両建 注文 約定 執行            売 Lot
   決済約定日時  ,    注文番号    ,  ポジション番号,  ペア ,区分,方式,区分,条件,指定レート,買,数  ,   新規約定日時  , 新規約定値,決済約定値,pip損益,円換算レート,スポット損益,手数料,スワップ損益,取引損益,チャネル,  
                 ,2211472400032623,2211479300003903,AUD/JPY,なし,通常,新規,成行,          ,売,1000,22/11/25 22:19:22,   93.823  ,          ,       ,            ,            ,   0  ,            ,        ,GFX(iPhone),
22/11/25 22:19:05,2211472400032622,2211479300003892,AUD/JPY,なし,通常,決済,成行,          ,買,10  ,22/11/25 22:18:52,   93.833  ,  93.845  ,-12.000, 1.0000     ,  -120      ,   0  ,    0       ,   -120 ,GFX(iPhone),
                 ,2211472400032621,2211479300003892,AUD/JPY,なし,通常,新規,成行,          ,売,10  ,22/11/25 22:18:52,   93.833  ,          ,       ,            ,            ,   0  ,            ,        ,GFX(iPhone),
22/11/25 22:18:35,2211472400032620,2211477700003730,AUD/JPY,なし,通常,決済,成行,          ,売,1000,22/11/24 19:27:36,   93.170  ,  93.835  ,665.000, 1.0000     ,  665000    ,   0  ,   6400     ,  671400,GFX(iPhone),
                  2211462600036261,2211477700003730,AUD/JPY,なし,通常,新規,指値,  93.170  ,買,1000,22/11/24 19:27:36,   93.170  ,          ,       ,            ,            ,   0  ,            ,        ,GFX(iPhone),
22/11/17 22:01:20,2211462600035580,2211458700007258,AUD/JPY,なし,通常,決済,成行,,売,1000,22/11/10 23:51:03,93.129,93.277,148.000,1.0000,148000,0,46600,194600,GFX(iPhone),
,2211453300024928,2211458700007258,AUD/JPY,なし,通常,新規,成行,,買,1000,22/11/10 23:51:03,93.129,,,,,0,,,GFX(iPhone),

外為どっとコムの約定履歴データは、 GaitameTradex.csv で保管することとします。

決済履歴だけを抜き出す作業は、CSV ファイルのファイル名が GaitameTrade* に変わるだけです。

損益金額は、H20なので Import-Csvでは H20まで読み込むように変更し、H1 の約定日時で ソートします。

cat GaitameTrade*.csv | sls "決済" | sls JPY | Out-File OnlyKessai.csv
Import-Csv OnlyKessai.csv -Header H1,H2,H3,H4,H5,H6,H7,H8,H9,H10,H11,H12,H13,H14,H15,H16,H17,H18,H19,H20 | Sort-Object H1 | Export-Csv OnlyKessaiS.csv -Encoding UTF8

期間の抽出で問題が、外為ドットコムの決済約定日時の表記が下記のように 22/11/08 と 20 が省略されています。

"22/11/08 22:34:32","2211453300008461","2211455400000016","AUD/JPY","なし","通常","決済","指値","94.729","買","1000","22/11/08 07:55:38","94.929","94.729","200.000","1.0000","200000","0","0","200000"
"22/11/09 00:11:11","2211453500011159","2211455400002969","AUD/JPY","なし","通常","決済","指値","94.800","売","1000","22/11/08 22:37:35","94.756","94.800","44.000","1.0000","44000","0","0","44000"
"22/11/09 00:11:11","2211453500011166","2211455400002967","AUD/JPY","なし","通常","決済","指値","94.800","売","10","22/11/08 22:35:36","94.729","94.800","71.000","1.0000","710","0","0","710"

決済約定日時で抽出する前に、開始月日、終了月日を次のように頭の20を取り除きます。

$StartDay = $StartDay.Substring(2)
$EndDay = $EndDay.Substring(2)

期間の抽出は、決済約定日時がなので、H1を参照するように変更します。

Import-Csv OnlyKessaiS.csv -Header H1,H2,H3,H4,H5,H6,H7,H8,H9,H10,H11,H12,H13,H14,H15,H16,H17,H18,H19,H20 | Where-Object { $_.H1 -gt $StartDay -and $_.H1 -lt $EndDay + "!" } | Export-Csv OnlyKessaiSS.csv -Encoding UTF8

H20の損益金額だけを書き出します。

Import-Csv KessaiFinal.csv -Header H1,H2,H3,H4,H5,H6,H7,H8,H9,H10,H11,H12,H13,H14,H15,H16,H17,H18,H19,H20 | Select-Object H20 | oss | sls "H20","--" -NotMatch | out-file SonEki.txt

グラフのラベルは、H1の約定日時を抜き出します。4桁以上の数字の連続を日付と判断していたのを2桁以上に変更しました。

2022/11/01 だったので $_.Substring(5,5) を 22/11/01 になったので $_.Substring(3,5) に変更しています。

Import-Csv KessaiFinal.csv -header h1,h2,h3,h4,h5,h6,h7,h8,h9,h10 | Select-Object h1 | oss | ? {$_ -Match "[0-9]{2}"} | Out-File YakuteiDate.txt
cat YakuteiDate.txt | % { $_.Substring(3,5) } | % { $Label = $Label + "'" + $_ + "'" + "," }

以上の変更で、外為どっとコムの約定履歴からグラフが作成可能となりました。

PS >./FX_Trade_Chart_For_Gaitame.ps1 11/01-26
開始日 2022/11/01
終了日 2022/11/26
PS >

外為どっとコム(バーチャル) 11月 のグラフ

スイッチを設定

DMM.FX と 外為どっとコム の約定履歴を取り扱えるように 引数で スイッチを渡すようにします。 引数で -G を渡すと 外為どっとコム 引数なしは、ディフォルトで DMM.FX とします。

引数 “-G” があるとないとで CSV ファイルの名前、決済約定日時のヘッダー値、損益金額のヘッダー値、決済約定日時の中の月の始まり桁を、それぞれ変数に設定します。

# Parameter "-G" means Gaitame Dot Com otherwise DMM.FX
 
if ($Args[0] -eq "-G" -OR $Args[1] -eq "-G" ) {
    $CSVFiles = "GaitameTrade*.csv"
    $KessaiDate = "H1"
    $SonEkiGaku = "H20"                                                                    #                     0123....
    $MonSta = 3                                         # Start of Month data in KessaiDate of GaitameDotCom    "22/01/01"
    }
else {
    $CSVFiles = "TradeRecordList*.csv"
    $KessaiDate = "H10"
    $SonEkiGaku = "H8"                                                                     #           012345....
    $MonSta = 5                                         #Start of Month data in KessaiDate of DMM.FX  "2022/01/01"                                      
    }     

Get-Content で取得するファイル名を変数 $CSVFiles で与えます。

決済約定日時でソートする際のヘッダー値を変数 $KessaiDate で与えます。

cat $CSVFiles | sls "決済" | sls JPY | Out-File OnlyKessai.csv -width 250
Import-Csv OnlyKessai.csv -Header H1,H2,H3,H4,H5,H6,H7,H8,H9,H10,H11,H12,H13,H14,H15,H16,H17,H18,H19,H20 | Sort-Object $KessaiDate | Export-Csv OnlyKessaiS.csv -Encoding UTF8

期間で抽出する際の開始月日と終了月日との比較対象のヘッダー値を 変数 $KessaiDate で与えます。

Import-Csv OnlyKessaiS.csv -Header H1,H2,H3,H4,H5,H6,H7,H8,H9,H10,H11,H12,H13,H14,H15,H16,H17,H18,H19,H20 | Where-Object { $_.$KessaiDate -gt $StartDay -and $_.$KessaiDate -lt $EndDay + "!" } | Export-Csv OnlyKessaiSS.csv -Encoding UTF8

損益金額を書き出す際の対象ヘッダーを 変数 $SonEkiGaku で与えます。

Import-Csv KessaiFinal.csv -Header H1,H2,H3,H4,H5,H6,H7,H8,H9,H10,H11,H12,H13,H14,H15,H16,H17,H18,H19,H20 | Select-Object $SonEkiGaku | oss | sls "$($SonEkiGaku)","--" -NotMatch | out-file SonEki.txt -width 250

グラフのラベルを書き出す際の対象ヘッダーを 変数 $KessaiDate で与えます。DMM.FX の約定日時は 2022/xx/xx と 2022 で始まっていたので 対象の行かどうかを ? {$_ -Match “[0-9]{4}”} と数字の連続が4桁以上かどうかを見ていましたが、 ? {$_ -Match “[0-9]{2}”} 2桁以上かどうかで判断するように変更しています。

決済約定月日の中から月日を書き出す際、何桁目から書き出すかを 変数 $MonSta で与えています。 

Import-Csv KessaiFinal.csv -header h1,h2,h3,h4,h5,h6,h7,h8,h9,h10 | Select-Object $KessaiDate | oss | ? {$_ -Match "[0-9]{2}"} | Out-File YakuteiDate.txt -width 250
cat YakuteiDate.txt | % { $_.Substring($MonSta,5) } | % { $Label = $Label + "'" + $_ + "'" + "," }

今後の予定 Bar Chart のカラー変更

コメント

タイトルとURLをコピーしました