Forex MQLで行こう(旧株価チャートサイン)

FXで有名なMT4でMQLプログラムを勉強していきます。

MQL

決算だけするEA

ポジション取るときは自分の判断で、でも、決済は
自動でやりたい。

【MAで決算を判断】
・パラメーター
  prmMaF:短期線の周期
  prmMaS:中期線の周期
  prmMaL:長期線の周期
  maMode:種類
        0:単純移動平均
        1:指数移動平均
        2:平滑移動平均
        3:線形加重移動平均
  maCase:決算方法
        0:無効
        1:1本前の終値が短期線とクロス
        2:短期線と中期線のクロス
        3:1本前の終値が長期線とクロス

【MACDで決算を判断】
・パラメーター
  prmMacdF:短い線の周期
  prmMacdS:長い線の周期
  prmMacdI:シグナル周期
  macdCase:決算方法
        0:無効
        1:MACD線とシグナル線のクロス
        2:MACD線と0ライン線のクロス

【RSIで決算を判断】
・パラメーター
  prmRsiM:RSI50を基準にプラマイする値
  risCase:決算方法
        0:無効
        1:有効
  *prmRsiMが15であった場合、ロングポジションをRSI65で決算する


ダウンロード ClosePosi.ex4

ストキャスティクス(stochastics) クロスで音を鳴らすEA

【サイン】
%Kが%Dを上抜いた地点が買いサイン
%Kが%Dを下抜いた地点が売りサイン

【計算方法】
%K =(当日終値-N本の最安値)/(N本の最高値-N本の最安値)*100
%D =A/B*100
A=(当日終値-N本の最安値)のH本、B=(N本の最高値-N本の最安値)のH本合計

【使う関数】
double iStochastic(string symbol, int timeframe, int %Kperiod, int %Dperiod,
int slowing, int method, int price_field, int mode, int shift)

【関数に渡す値】
1)ペア:実行するウィンドウで表示しているペア(symbol 0)
2)時間足:実行するウィンドウで表示している時間足(timeframe 0)
3)%Kラインの期間(%Kperiod 5)
4)%Dラインの期間(%Dperiod 3)
5)スロー値(slowing 3)
6)MAの方式(method MODE_SMA)
7)安値/高値で判断(price_field 0 )
8)メインか、シグナルか(mode MODE_MAIN)
9)前の足が確定した時点で判断(shift 1)

main = iStochastic(NULL, 0, 5, 3, 3, MODE_SMA, 0, MODE_MAIN, 1);
sig = iStochastic(NULL, 0, 5, 3, 3, MODE_SMA, 0, MODE_SIGNAL, 1);

mainとsignalのクロスで音が鳴るようにした。
ダウンロード stochas1.ex4


ただし、20以下か、80以下かを見ているので、ただのクロスではない。


それより、バックテストが全然出来ない。
HistoryCenterでダウンロードしてテストしてもデーターが無いって出てくるし、
見てみると2012年の途中から、今年の5月までのデータがない。
なんで歯抜けになるの?
何回ダウンロードしても埋まらない。 

腹が立つんですが。

MACD (Moving Average Convergence Divergence) クロスで音を鳴らすEA

オシレーター系指標で、移動平均の乖離を見やすくしたやつってことですかね。

MACDの計算式は割愛。

【使う関数】
double iMACD(string symbol, int timeframe, int fast_ema_period,
   int slow_ema_period, int signal_period, int applied_price, int mode, int shift)


【関数に渡す値】
1)ペア:実行するウィンドウで表示しているペア(symbol 0)
2)時間足:実行するウィンドウで表示している時間足(timeframe 0)
3)周期1:12(fast_ema_period 12)
4)周期2:26(slow_ema_period 26)
5)シグナル:9(signal_period 9)
6)終値で判断する(applied_price PRICE_CLOSE)
7)モード:基本線か、シグナルか(mode MODE_MAIN/MODE_SIGNAL)
7)前の足が確定した時点で判断(shift 1)

以下の3つの条件でそれぞれアラートが鳴るようにしてみた。
ダウンロード macd1.ex4

パラメータの説明(Expert Propertiesで設定してください)
prmMacdF:短い周期の値(デフォルト12)
prmMacdS:長い周期の値(デフォルト26)
prmMacdI:シグナルの周期(デフォルト9)
sigCase :シグナル判断方法
  0:シグナルとのクロス
  1:0以下でシグナル線を突き抜けたか、0以上でシグナル線を下抜けた
  2:MACD線が0ラインをクロスした時
eaOn =0:バックテストをする時は1

最近(今年)のデータに限ってはバックテストの結果がプラスになるようだ。
sigCaseを2にして、0以上の時Longポジション、0以下の時Shortポジション
と言う設定にすると結果がプラスに。
macd2_15op

prmMacdF=10,prmMacdS=39,prmMacI=9(Optimizationの結果から引用)
期間は2013/01/02から

2000年からテストをするとずーーーーーと右肩下がり。
おかしい。。。2013年からのテストではプラスと言う結果になっているのに。

RSI いろいろな判定でアラート

まず、売買サインの判定を増やしてみた。
・2本のRSIの乖離をみてアラート
・指定した基準でRSIがクロスしたらアラート

バックテストをするのに、クローズ(決済)方法を3種類指定出来るようにした。
・ある基準まで来たらクローズ
・N本過ぎたらクローズ
・利益、損切りの値を指定する

ダウンロード rsi2.ex4

パラメータの説明(Expert Propertiesで設定してください)
prmRsi:RSIの周期(デフォルト14)
prmRsi2:RSIの周期(デフォルト42)
prmHi :買われすぎを判断する値(デフォルト70)
prmLo :売られ過ぎを判断する値(デフォルト30)
sigCase:シグナル判断方法 
  0:prmHiを越したか、又は、prmLoより下げた
  1:prmHiを越した後、反転したか、又は、prmLoを下回り、反転した
  2:prmHiを越した後、prmHiより戻した、又はprmLoを下回った後、pmrLoから戻した
  3:2本のRSIの差をみてアラート
    prmRsiとprmRsi2で2本を指定、短期が上の時、prmHiで上の差、短期が下の時pmrLoで下の差を指定
  4:ある基準でRSIがクロス
    prmRsiとprmRsi2で2本を指定、prmHi以上か、prmLo以下かで判定する
sigClose
  0:ある基準まで来たらクローズ
  1:N本過ぎたらクローズ
  2:利益、損切りしてい
  
prmClose:クローズする時に使う値
  sigCloseが0:50を基準にそのプラマイする値
     例えば10だとすると、longを入れてRSIが40になったらクローズ
  sigCloseが1:クローズする時刻を指定する値
     例えば2だと、15分足でテストしている場合、30分後の足でクローズ
  sigCloseが2:動き幅を指定してクローズ
     例えば30にすると、3pips動いたらクローズ
     
eaOn :バックテストをするときには1を指定


かなりややこしい。
テスト方法もたくさんあって、全てを確認していない。

RSI (Relative Strength Index) 相対力指数を使った音が鳴るEA

売られすぎ、買われすぎを見る代表的テクニカル指標ですね。
数値は0〜100の間で表され、30以下は売られすぎ、70以上は
買われ過ぎと見るのが一般的。

RSI=n日の値上がり幅合計/(n日の値上がり幅合計 +n日の値下がり幅合計)*100

【使う関数】
double iRSI(string symbol, int timeframe, int period, int applied_price, int shift)
*MetaSysSeekerより

【関数に渡す値】
1)ペア:実行するウィンドウで表示しているペア(symbol 0)
2)時間足:実行するウィンドウで表示している時間足(timeframe 0)
3)周期:14(period 14)
6)終値で判断する(applied_price PRICE_CLOSE)
7)確定している前の足を使う(shift 1)

こうなる
iRSI(0, 0, 30, PRICE_CLOSE, 1)

条件を満たしたら音が鳴る(Alert)ようにしてみた。
ダウンロード rsi1.ex4

パラメータの説明(Expert Propertiesで設定してください)
prmRsi:RSIの周期(デフォルト14)
prmHi :買われすぎを判断する値(デフォルト70)
prmLo :売られ過ぎを判断する値(デフォルト30)
sigCase:判断方法 
  0:prmHiを越したか、又は、prmLoより下げた(下図 
  1:prmHiを越した後、反転したか、又は、prmLoを下回り、反転した(下図◆
  2:prmHiを越した後、prmHiより戻した、又はprmLoを下回った後、pmrLoから戻した(下図)
rsi


さて、バックテストで売買ロジックを組むのに決算規則をどうするか。。。

MA 移動平均 長期線を入れたサイン◆_擦鳴るEA

前回の売買条件に以下を追加
買いシグナル:短期線が中期線より上で、長期線を中期線が上抜けた
if(fastNow > slowNow && slowPre <= longPre && slowNow > longNow)

売りシグナル:短期線が中期線より下で、長期線を中期線が下抜けた
if(fastNow < slowNow && slowPre >= longPre && slowNow < longNow)

*変数の説明
fastNow:1つ前の短期線の値
slowNow:1つ前の中期線の値
slowPre:2つ前の中期線の値
longPre:1つ前の長期線の値
longNow:2つ前の長期線の値

ダウンロード ma21.ex4


前回のテストのOptimizationでパフォーマンスが良かった値をつかってバックテスト

■5分足
短期線10本/中期線40本/長期線75本/モード単純移動平均/Open prices/期間2013.01.02〜
損益    P/F  トレード数 最大Drowdown 勝率
2814.79   1.14   266   3357.28   36.09%

■15分足
短期線8本/中期線50本/長期線75本/モード単純移動平均/Open prices/期間2013.01.02〜
損益    P/F  トレード数 最大Drowdown 勝率
5035.88  1.49   81    3308.20   34.57%

■30分足
短期線10本/中期線25本/長期線75本/モード単純移動平均/Open prices/期間2013.01.02〜
損益    P/F  トレード数 最大Drowdown 勝率
5915.09  1.73   56     2924.65   42.86%

■1時間足
短期線14本/中期線30本/長期線75本/モード単純移動平均/Open prices/期間2013.01.02〜
損益    P/F  トレード数 最大Drowdown 勝率
6642.69  2.16   22     5579.40  68.18%
素晴らしい!1lotでトレードしていたら6万円のプラスと言う結果に。
でも最大損失も5万5千円なり。

■4時間足
短期線10本/中期線25本/長期線75本/モード単純移動平均/Open prices/期間2013.01.02〜
損益    P/F  トレード数 最大Drowdown 勝率
3692.92  3.09   6     2800.09  50.0%

■日足
2000年からのテストをしたら、最初の3回のトレードでマイナスになり、終了。


次回は移動平均以外で新しい関数に挑戦です。

MA 移動平均 長期線を入れたサインで音が鳴るEA

移動平均の長期線も使ったプログラムを作ってみた。
ma2.ex4

パラメータの説明(Expert Propertiesで設定してください)
prmMaF:短期線の周期
prmMaS:中期線の周期
prmMaL:長期線の周期
eaOn :バックテスト時は1にする
mode :前回の移動平均の種類を指定するなら
0:単純移動平均(デフォルト)
1:指数移動平均
2:平滑移動平均
3:線形加重移動平均


移動平均の短期と中期のクロスでサインを判断するのは変わりませんが、
さらに条件として、長期線の上か下かで音がなります。

買いシグナル:長期線の上でゴールデンクロス
売りシグナル:長期線の下でデッドクロス
ですので、長期線より下で短期と中期のゴールデンクロスではサインとして
無視するので、音はなりません。

そして、プログラムではテスト用に決算方法を以下としてます。
買いポジション:中期線を短期線が下抜ける
売りポジション:中期線を短期線が上抜ける


Optimizationを使ったテスト結果
開始期間を1990年からにして、モデルはOpen Prices Only、長期線は75本固定。

日足での結果(収益の数字はUSD$です)
損益    Trade P/F  ExpectedPayOff DrawDown$ DrawDown%  設定
73921.32  84  2.14  880.02     12754.9  22.45%  prmMaF=10 prmMaS=35 prmMaL=75
72023.67  78  2.18  923.38     12885.87  24.92%  prmMaF=12 prmMaS=35 prmMaL=75
この2つがダントツでした。

4時間足での結果
損益    Trade P/F  ExpectedPayOff DrawDown$ DrawDown%  設定
37447.85  390 1.21   96.02     32184.02  42.40%  prmMaF=12 prmMaS=25 prmMaL=75
36929.02  581 1.16   63.56     38721.47  46.84%  prmMaF=14 prmMaS=20 prmMaL=75
35215.19  398 1.19   88.48     32285.94  43.60%  prmMaF=10 prmMaS=25 prmMaL=75
32094.14  518 1.15   61.96     39132.46  49.85%  prmMaF=10 prmMaS=20 prmMaL=75
31300.64  526 1.15   59.51     35405.69  48.16%  prmMaF=8 prmMaS=20 prmMaL=75

1時間足での結果
損益    Trade P/F  ExpectedPayOff DrawDown$ DrawDown%  設定
57354.99  926 1.25   61.94     18146.75  25.53%  prmMaF=12 prmMaS=35 prmMaL=75
48641.08  713 1.24   68.22     18803.90  55.41%  prmMaF=12 prmMaS=45 prmMaL=75
44046.06  1004 1.18   43.87    18031.33  27.22%  prmMaF=10 prmMaS=35 prmMaL=75
41791.76  875 1.18   47.76     18199.37  37.71%  prmMaF=14 prmMaS=35 prmMaL=75
37357.14  942 1.17   39.66     18047.19  41.42%  prmMaF=6 prmMaS=50 prmMaL=75

って、ここまでやって気がついたんだけど、この収益はスワップが入ってるのか!
ロングポジションが長ければその分プラスが増えるのか。

やり直し。。。
今年のみに絞ってテスト。
■5分足
損益    Trade P/F  ExpectedPayOff DrawDown$ DrawDown%  設定
668.80   10  2.21   66.88     572.57  5.49%   prmMaF=10 prmMaS=40 prmMaL=75
641.13   9  2.37   71.24     755.29  7.33%   prmMaF=14 prmMaS=30 prmMaL=75
523.65   8  2.03   65.46     776.83  7.43%   prmMaF=14 prmMaS=40 prmMaL=75
507.95   11  1.72   46.18     765.37  7.62%   prmMaF=12 prmMaS=30 prmMaL=75
484.40   10  2.00   48.44     667.86  6.53%   prmMaF=14 prmMaS=35 prmMaL=75

■15分足
損益    Trade P/F  ExpectedPayOff DrawDown$ DrawDown%  設定
7363.63   81  1.75   90.91    3431.69  19.88%   prmMaF=8 prmMaS=50 prmMaL=75
5608.27   53  1.68  105.82    2066.72  12.66%   prmMaF=14 prmMaS=55 prmMaL=75
5561.61   62  1.67   89.70    2539.91  18.09%   prmMaF=10 prmMaS=55 prmMaL=75
5243.93   89  1.52   58.92    3155.38  19.03%   prmMaF=10 prmMaS=35 prmMaL=75
5018.36   56  1.66   89.61    2395.74  14.53%   prmMaF=14 prmMaS=50 prmMaL=75
4825.77   60  1.64   80.43    2435.35  15.62%   prmMaF=12 prmMaS=45 prmMaL=75
4809.99   78  1.48   61.67    2962.76  18.56%   prmMaF=12 prmMaS=40 prmMaL=75

■30分足
損益    Trade P/F  ExpectedPayOff DrawDown$ DrawDown%  設定
226.53    1  0.00   226.53    258.07  2.49%   prmMaF=10 prmMaS=25 prmMaL=75
219.50    1  0.00   219.50    258.07  2.49%   prmMaF=8 prmMaS=20 prmMaL=75
127.70    3  1.95   42.57    585.43  5.57%   prmMaF=10 prmMaS=20 prmMaL=75
36.31    1  0.00   36.31    336.66  3.25%   prmMaF=14 prmMaS=25 prmMaL=75
36.31    1  0.00   36.31    336.66  3.25%   prmMaF=12 prmMaS=25 prmMaL=75
トレード回数が1回?話になりません。

■1時間足
■4時間足
  結果なし(なぜ?)

■1日足
損益    Trade P/F  ExpectedPayOff DrawDown$ DrawDown%  設定
3558.02   2  0.00  1779.01    3011.31  19.36%   prmMaF=2 prmMaS=30 prmMaL=75
1419.23   1  0.00  1419.23    3011.31  22.44%   prmMaF=4 prmMaS=50 prmMaL=75
以下同じ結果


どうもプラスにする事が出来るようだ。
次回はレインボークロス(短期が中期を上抜けた後、中期が長期を上抜け)について
考えてみようと思う。

あ、時間にゆとりがある人、テスト結果募集します。

MA 複数の種類の移動平均でテストしてみる

複数の種類の移動平均でテストしてみる

移動平均には単純移動平均、指数移動平均、平滑移動平均、線形加重移動平均がある。
先に作ったのは単純移動平均だが、その他の移動平均を指定出来るようにしてみた。
移動平均 ma11.ex4

modeの値を0から3の間で設定出来ます。(Expert Propertiesからパラメータの入力)
0:単純移動平均
1:指数移動平均
2:平滑移動平均
3:線形加重移動平均


Optimizationでのテスト結果(eaOnを1に設定するとテスト出来ます)
1時間足/EveryTickを指定
         損益    Trade P/F  ExpectedPayOff DrawDown$ DrawDown%
単純移動平均  :$248192.83 3872 1.26   64.10    74597.44  24.85%
指数移動平均  :$228324.23 2720 1.30   83.94    64648.05  22.87%
平滑移動平均  :$212624.56 4160 1.21   51.11    93289.18  31.61%
線形加重移動平均:$205945.48 1395 1.38   147.63    73872.74  25.51%

日足/EveryTickを指定
         損益    Trade P/F  ExpectedPayOff DrawDown$ DrawDown%
線形加重移動平均:$272532.23 488 1.70   558.47    35884.51  22.25%
指数移動平均  :$271487.44 319 1.95   851.06    57935.78  22.86%
平滑移動平均  :$249457.92 145 2.43   1720.40    47024.14  21.64%
単純移動平均  :$240454.37 481 1.62   499.91    54412.40  18.11%

本当にこんなに収益が出るんですかね。
相変わらず、バックテストが不安定だし、信用出来る数値とは言えないでしょう。
ヒストリーの取得とか、メモリとかちゃんと調べないと行けないかな。

MA 移動平均 ma1.ex4でのバックテスト結果

対象通貨:USD/JPY
期間:  1990-最近
使用通貨:USD

===1時間足でのテスト===
総純損益  102843.29
最大ドローダウン  52167.30
勝ちトレード数(率)  38.48%
1トレード当たりの最大利益18216.50
1トレード当たりの最大損失  -18582.85
ma1test1h

===日足でのテスト===
総純損益  51330.19
最大ドローダウン  55883.91
勝ちトレード数(率)  45.00%
1トレード当たりの最大利益  18215.08
1トレード当たりの最大損失  -18305.47
ma1test1d

1時間足と日足で収益が出ると言う結果が。


それより、このStrategy Testって、やる度に結果が違うのはなぜ?
また、他のパソコンでHistory Centerでダウンロードするんだけど、
最近2013年以降しかダウンロードできない。以前は出来た。


疑問ばかり。


そしてそして、嬉しいOptimazation機能。
値を変化させてパフォーマンスを見ることができます!

30分足では収益、プロフィットファクター共に短期線を12に、中期を60にすると
収益と、プロフィットファクターで一番いい結果が得られます。
総純損益  256098.46
最大ドローダウン  44249.61
勝ちトレード数(率)  32.6%
1トレード当たりの最大利益  39303.42
1トレード当たりの最大損失  -18608.30


30m足での結果:収益12,60
1H 足での結果:収益14,30/プロフィットファクター14,30
1D 足での結果:収益12,30/プロフィットファクター12,75

15分以下では結果が出ない。これも疑問。


今日はここまで。

MA 移動平均によるシグナル

移動平均線 Moving Average

有名過ぎて説明要らないですね。

買いシグナル:中期線を短期線を上抜る
売りシグナル:中期線を短期線が下抜ける

【使う関数】
double iMA(string symbol, int timeframe, int period, int ma_shift, int ma_method, int applied_price, int shift)
*MetaSysSeekerより

【関数に渡す値】
1)ペア:実行するウィンドウで表示しているペア(symbol 0)
2)時間足:実行するウィンドウで表示している時間足(timeframe 0)
3)周期:14(period 14)
4)転移:意味がわからないので0を指定(ma_shift 0)
5)単純移動平均を使う(ma_method MODE_SMA)
6)終値で判断する(applied_price PRICE_CLOSE)
7)前の足が確定した時点で判断(shift 1)
  0だと現在なのでまだ確定してない。

こうなる
iMA(0, 0, 14, 0, MODE_SMA, PRICE_CLOSE, 1)
25の周期は
iMA(0, 0, 25, 0, MODE_SMA, PRICE_CLOSE, 1)

クロスしたかどうかを判断するには、2つ前の移動平均と1つ前の
移動平均の値を取得して、2つ前と1つ前が逆転したらって判断します。


fastNow =iMA(0, 0, 14, 0, MODE_SMA, PRICE_CLOSE, 1)
slowNow =iMA(0, 0, 25, 0, MODE_SMA, PRICE_CLOSE, 1)
fastPre =iMA(0, 0, 14, 0, MODE_SMA, PRICE_CLOSE, 2)
slowPre =iMA(0, 0, 25, 0, MODE_SMA, PRICE_CLOSE, 2)

ゴールデンクロス
if( fastPre <= slowPre && fastNow > slowNow)
2つ前では短期線は下、1つ前では短期線が上に変化した。

デットクロス
if( fastPre >= slowPre && fastNow < slowNow)
2つ前では短期線は上、1つ前では下。


クロスで音がなる(Alert)ようにしてみた。
移動平均 ma1.ex4
デフォルトでは短期線14、中期線25としてありますが、「パラメータの入力」で変更可能です。

音が鳴ったら売買は自分で判断するって使い方もあるかな。

MQL メモ書き

■if(Volume[0]>1) return;
データはTickのタイミングで上がってくるようなので、最初の
タイミングのみを使いたい。
例えば、16時5分0秒過ぎて、最初のTickで、何かを判断
して、59秒までのデータは無視したい時など。

■extern int prmMaF =14;
定数でプログラムを作ってしまうと、変更してコンパイルが
必要になる。
テストするのに実行時に変更出来るようにするには、extern
で宣言してやる。

■作ったファイルがない!
Windows7って、勝手に保存場所を変えてた。UAC機能?
AppData/Local/VirtualStore
マイクロソフト迷惑です。

■意地汚いサイトばかり。
ネットでMT4自動売買とか、EA(Expert Advisor)で検索すると
ほとんどが「さくら」か宣伝広告ばかり。
ブログなんてみてみると、1ページの2/3は広告。
FX業者だったり、EA発売元だったり、私はこれで設けました
なんてね。
有料EAランキングなんて全く信用出来ない。どこも違うんだから。

MQLお勉強開始!

まず、MT4(Meta Trader 4)ですが、大変有名なフリーソフトで、高機能なチャートを表示
出来たり、このソフトに対応しているFX業者では売買もできます。

そして、MQLプログラムを作ることによって、MT4上にオリジナルインジケータを表示したり、
売買プログラムを実行できたりします。

株価チャートサインではエクセルを使ってVBA(びじゅあるべーっしっく)でしたが、
MQLはC言語に近い独自の言語なので、これから少しずつ勉強しながらプログラム
を作って行きたいとおもいます。

方向性としては、売買タイミング見つけるプログラムです。

【トレンド系】
市場の方向性を判断します。
・移動平均
・一目均衡表
  など

【オシレーター系】
振り子の原理で戻りを判断します。
・RSI
・ストキャスティクス
  など


ちなみに、株は塩漬け期間が長すぎて興味がなくなっちゃいました。。。
日経平均もやっと戻して来たので、資産は精算してFXへ移動です。

あ、あと、株価チャートサイン検索プログラム(エクセル)ですが、時間が
あったら、修正(データ取得先が変わったり、ゴミがあったり)して公開します。
カテゴリ別アーカイブ
記事検索
---ご紹介---

ソフト販売グレップス
パソコンレジソフトお試しDLあり
アンドロイドアプリ「消費税電卓」無料ダウンロード
明星塾 (白金台 英語個別指導)
個別指導でその生徒さんに合った指導を行っています
鈴木塾 (自由が丘 学習塾)
1クラス5人までの少人数制。納得するまで質問に答えます
旅館明治
山梨甲府湯村温泉 太宰治の宿
株式会社ベイ・アクティブ
横浜・上大岡の不動産屋
REPEAT
フィリピンでの結婚書類翻訳申請
Adsence
  • ライブドアブログ