全自動売買戦略:移動平均クロス戦略版を応用して、1か月3万円スイング投資法を実装してみた。


【40代50代】初心者でも稼げる!月3万円の利益!スイングトレード最強テクニックを公開
という、YouTubeを見た。
内容要約


VBAでの実装
1. 楽天証券のスーパースクリーナーで時価総額、5000億以上をスクリーニング
CSVで掃き出し、Excelに貼り付け
2. 中期線(25MA)に対して、陰線で割って、翌日、陽線で返している。
Ø 過去30日分の「高値・安値・終値」株価データ取得
こちらはすでにATR戦略で取得しているのでこのデータをそのまま使用。
① 前日、25MAを陰線下抜けている銘柄を探す。
当日、前日、前々日の25MAを計算する。
前日の終値 < 前日25MA かつ 前日終値 - 前日始値 < 0
② 前々日の終値が25MAの上にいること
前々日の終値 > 25MA
3. 前日の陰線の終値に対して、陽線の始値が上にある(25MAの上にある必要はない)
前日の終値 > 当日の始値
4. かつ、陽線で終了(15:00の時点で判断) ➡ エントリ条件達成
当日の終値 - 当日の始値 > 0
上記条件が成立したらエントリ条件達成
5. エントリ条件達成日、15:00 – 15:30 に、成買いの注文を入れておく
15時以降に当日が陽線に成ったらエントリ
この記事が参考になった!と思ったら、下のバナーをクリックして応援お願いします😊
VBAでコード化
Sub エントリ判定()
Dim lastRow As Long, i As Long
Dim currentPrice As Double, lowPrice As Double, trailLine As Double
Dim thisWs As Worksheet
Dim ws14 As Worksheet
Set thisWs = ThisWorkbook.Sheets("メイン")
Set ws14 = ThisWorkbook.Sheets("14日間データ")
lastRow = thisWs.Cells(Rows.Count, "A").End(xlUp).Row
elapsedTime = 0
For i = 3 To lastRow
thisWs.Range("H" & i).Value = 0
thisWs.Range("I" & i).Value = 0
thisWs.Range("J" & i).Value = 0
thisWs.Range("p" & i).Value = 0
If Int(thisWs.Range("Q" & i).Value) = Int(Now()) Then
GoTo Continue
End If
ws14.Range("B2").Value = thisWs.Range("A" & i).Value
ImportCSVToCurrentSheet
Get25MA
thisWs.Range("H" & i).Value = ws14.Range("B7").Value
thisWs.Range("I" & i).Value = ws14.Range("B8").Value
thisWs.Range("J" & i).Value = ws14.Range("H9").Value
thisWs.Range("K" & i).Value = ws14.Range("I9").Value
thisWs.Range("L" & i).Value = ws14.Range("J9").Value
thisWs.Range("M" & i).Value = "=IF(P" & i & "<G" & i & ",1,0)"
thisWs.Range("N" & i).Value = "=IF(D" & i & "-G" & i & ">0,1,0)" ' 当日陽線
thisWs.Range("P" & i).Value = ws14.Range("D3").Value ' 前日終値
' If ws14.Range("G9").Value = 5 Then
' thisWs.Range("O" & i).Value = "OK"
' Else
' thisWs.Range("O" & i).Value = "NG"
' End If
thisWs.Range("O" & i).Value = "=IF(SUM(J" & i & ":L" & i & ")=3,""リーチ"",IF(SUM(J" & i & ":N" & i & ")=5,""OK"",""""))"
thisWs.Range("Q" & i).Value = Now()
Continue:
Next i
MsgBox "月3万円スイング終わりです。"
End Sub
'************************************************************************************************************
' Get25MA : 前日、前々日の25MAを計算
'************************************************************************************************************
Sub Get25MA()
Dim thisWs As Worksheet
Dim ws14 As Worksheet
Set thisWs = ThisWorkbook.Sheets("メイン")
Set ws14 = ThisWorkbook.Sheets("14日間データ")
ws14.Range("B7").Value = 0
ws14.Range("B8").Value = 0
' 当日の値が返ってきた場合は、その前の行を前日値とする。
If CDate(ws14.Range("A43").Value) < Date Then
' Culiculate Yesterday's 25MA
Set priceRange = ws14.Range("B19:B43")
ws14.Range("B7").Value = Application.WorksheetFunction.Average(priceRange) ' 25MA(前日)
Set priceRange = ws14.Range("B18:B42")
ws14.Range("B8").Value = Application.WorksheetFunction.Average(priceRange) ' 25MA(前々日)
前日終値 = ws14.Range("B42").Value
前日始値 = ws14.Range("E42").Value
前前日終値 = ws14.Range("B41").Value
前前日始値 = ws14.Range("E41").Value
Else ' 今日のデータが43行目
' Caliculate Yesterday's 25MA
Set priceRange = ws14.Range("B18:B42")
ws14.Range("B7").Value = Application.WorksheetFunction.Average(priceRange) ' 25MA(前日)
Set priceRange = ws14.Range("B17:B41")
ws14.Range("B8").Value = Application.WorksheetFunction.Average(priceRange) ' 25MA(前々日)
前日終値 = ws14.Range("B43").Value
前日始値 = ws14.Range("E43").Value
前前日終値 = ws14.Range("B42").Value
前前日始値 = ws14.Range("E42").Value
End If
前日25MA = ws14.Range("B7").Value
前前日25MA = ws14.Range("B8").Value
' ws14.Range("B9").Value = 0
'O 前日、25MAを陰線下抜けている銘柄を探す。
'
' 当日、前日、前々日の25MAを計算する。
' 前日の終値 < 前日25MA かつ 前日終値 - 前日始値 < 0
If 前日終値 < 前日25MA And (前日終値 - 前日始値) < 0 Then
'
' O 前々日の終値が25MAの上にいること
' 前々日の終値 > 前々日の25MA
If 前前日終値 > 前前日25MA Then
'
'3. 前日の終値に対して、当日の始値が上にある(25MAの上にある必要はない)
' 前日の終値 < 当日の始値 かつ 当日の終値 - 当日の始値 > 0
If 前日終値 < ws14.Range("B6").Value And (ws14.Range("B3").Value - ws14.Range("B6").Value) > 0 Then
'
'4. かつ、陽線で終了(15:00の時点で判断) ? エントリ条件達成
' 上記条件が成立したらエントリ条件達成
ws14.Range("C9").Value = Now
'
'5. エントリ条件達成日、15:00 ? 15:30 に、成買いの注文を入れておく
'15 時以降に当日が陽線に成ったらエントリ
Else
ws14.Range("C9").Value = Now
End If
Else
ws14.Range("C9").Value = Now
End If
Else
ws14.Range("C9").Value = Now
End If
End Sub
ソースを読んでみると、ちょっと譜に落ちない部分が出てきた。
prevClose = Sheet1.Cells(i + 1, 4).Value
prevClose ? 前日の終値? なんで次の行を見ているのだろう?
ChatGPTに聞いてみる。
なるほど。間違いというか、このサンプルソースは、14日データを取得後、日にち逆順に並び変えてからの処理のようだ。
ソースに疑問点があったら、聞いた方がよい。
古い情報で作っていて、動かない場合とかも結構ある。
この記事が参考になった!と思ったら、下のバナーをクリックして応援お願いします😊
落とし穴あり
検証をしていると、期待通りの場合とそうでない場合がある。
見直してみると、30日分のデータ取得で、当日分を含む場合と含まない場合があることが分かった。
場が始まる前は当然、当日分は取得されない。しかし、当日分を含むタイミングがわからない。
場が始まって値が付いた時かと思いきや、そうでもない。
ので、最後の行に、当日分のデータがあるかないかを判定して処理を分けるようにした。


最後に
昨日、検証してみた結果、対象銘柄は、316銘柄 、そのうち15時時点でリーチがかかったのは、6銘柄、エントリ条件が揃ったのが2銘柄。
面白かったのが、決算の結果が悪く暴落した銘柄がヒットした。
底を確認する手段になるかもしれない。
とりあえず、買ってみた。
いつも通り、2%下に損切値を設定し、アルゴで高値から2%下がったら利確。
さてどうなることやら。


この記事が参考になった!と思ったら、下のバナーをクリックして応援お願いします😊
🎯仕事に疲れたときは
私はこれです。仕事終わりや、チョっとつかれたときに、ミックスナッツとウイスキーまたは赤ワイン。
コード譜書くのって結構つかれるのです。
トリフ塩があれば最高です。軽く燻製してもグッド