F# Monkey

about

F#でFXのトレード検証を手軽にできるシステムを作ってみる(その2)

adacolaさんに教えてもらったよ〜

Summary

前回の続き

アクティブパターンを使うとif/then/elseが綺麗になるよ、みたいな

code

module FX20170410 =

    /// とりあえず価格はこんな感じでつくってみる
    let highPrices = [99. .. -1. .. 92.]
    let lowPrices  = [97. .. -1. .. 90.]
    let dayprices  = List.map2 ( fun a b -> [a .. 0.001 .. b] ) lowPrices highPrices 

    /// entry ,tp, cl に対しての情報
    type Info = { Entry : float ; TakeProfit : float ; CutLoss : float }

    /// util function
    let pricePoint entryPrice prices =
        prices
        |> List.map ( List.tryFind ( fun n -> n = entryPrice) )
        |> List.tryFindIndex ( fun x -> Option.isSome x )

    let info : Info = { Entry = 99. ; TakeProfit = 95. ; CutLoss = 100. }

    /// entry ができるかどうか
    let entryPoint : option<int> = pricePoint info.Entry dayprices

    if      entryPoint.IsNone
    then    stdout.WriteLine "エントリーされませんでした"
    else
            /// entry したあとのリストをつくる
            let lst =   dayprices 
                        |> List.splitAt entryPoint.Value
                        |> snd

            /// tp or cl どちらかが掛かってるかを調べる
            let takeProfitPoint : option<int> = pricePoint info.TakeProfit lst
            let cutLossPoint    : option<int> = pricePoint info.CutLoss    lst

            let cutLoss () = 
                let loss   = System.Math.Abs( info.Entry - info.CutLoss )
                stdout.WriteLine( string loss   + " の損失を計上しました〜" )

            let takeProfit () =
                let profit = System.Math.Abs( info.TakeProfit - info.Entry )
                stdout.WriteLine( string profit + " の利益を計上しました〜" )

            match takeProfitPoint, cutLossPoint with
            | Some t , Some c when t > c -> cutLoss    ()
            | Some _ , _                 -> takeProfit ()
            | None   , Some _            -> cutLoss    ()
            | _ -> stdout.WriteLine "まだ確定されてません"

結果

4 の利益を計上しました〜

感想

ここをチェック〜

yukitosさん、bleisさん、adacolaさん。ありがとうございます!

gitter.im

Remove all ads