2019年4月24日水曜日

スワップ 11日の悲劇 バックテストに影響が・・・

GWの影響で、本日はSWAPが11日もらえる日です。
 明日の朝は早起きしていただこうかと思います^^

 さて、本日ひさびさに時間が空いたのでEAを開発しました。
まずは買い建てLONGから設計構築します。
 感がいいのか、今日は恐ろしく成績のいい物ばかりできます。

続いて売り建てSHORTを構築すると、あまりいいものができません。
色々やっても成績が出ないので、考えてみました。






原因がヒラメキマシタ。
今日はSWAP 11日の日です。
スワップの設定が11日分になっているため、
バックテストに大量のスワップが計上されていたようです。

LONGがよくって SHORTが悪い こうゆう事ですね




2019年4月11日木曜日

最適化で勝率を表示 無料ソース公開

古来より最適化に勝率を出す方法がいろいろと考えられてきました。
今回は OnTester() 関数を使用して、勝率を表示します。

double OnTester()
{
double cWin=0;
for(int i=0;i<OrdersHistoryTotal();i++)
{
if(!OrderSelect(i,SELECT_BY_POS,MODE_HISTORY))continue;
if(OrderProfit()>0)cWin++;
}
return cWin/OrdersHistoryTotal()*100;
}

このコードをmql4の最後に付けて最適化をします。

OnTester結果に勝率が出力されました。

【ソース解説】
勝率は 勝った回数(cWIN) ÷ 取引数です。
①勝った回数をいれる変数 cWIN を宣言します。
最後に勝率計算で小数が出ますので double にします。

②for ループで取引回数まわします。
 バックテストのOrdersHistoryTotal()はバックテストだけの取引数が入るので便利です

③オーダーを選択します。
 より厳格にするために失敗した時には敗けたと考えて計算します。
 その為にcontinue にしています。

④利益を確認して cWin を加算します。

⑤最後に returnで戻り値を返します。
 return に()カッコを付けない人はほとんどいませんが、カッコつけなくてもいいじゃん!

※ブログ頑張ってかきますね!

#property strict における 変数の初期化

前回のブログで 変数の初期化について少しふれました。

①Case 1
#property strict
void OnTick()
{
int a;
int b=a;
}

ここではstrict モードにして、関数内でローカル変数 a を宣言し中身を入れていません。
次に b=a で a を参照させコンパイルするとこんな警告が出ます。

possible use of uninitialized variable 'a' test.mq4 5 8

②Case2
#property strict
void OnTick()
{
int a=0;
int b=a;
}
a の宣言時に 0 を代入すると
警告は出ません。

③Case3
#property strict
void OnTick()
{
int a;
Comment(a);
}

こうした場合には警告は出ません。
0 と表示されます。
引数(ひきすう)として渡した場合は参照してもいいようです。
④Case4
#property strict
int a;
void OnTick()
{
int b=a;
}
グローバルエリアで a を宣言しました。
この場合も警告は出ません。

strict モード宣言時にローカル変数内で宣言した変数を初期化(なにかを代入)せずに参照すると警告が出ます。
警告が出ても、正常にコンパイルでき値も0として扱われます。

結論
変数は出来るだけグローバルエリアで宣言するましょう。




バックテスト 最適化用 敗け月 自動計算器

ぱんださん🐼よりOnTestrer()で、成績を出力すると便利と情報を教えていただきました。

イベント関数の動作と順番はこのような感じです。

int OnInit()
 イベント起動時に一度だけ動作
void OnTick()
 ティックの配信を受け取ると動作
double OnTester()
 テスト、最適化でOnDeinit()直前に動作
 戻り値はテストの時は操作履歴に表示
 最適化の時は最適化結果に表示

void OnDeinit(const int reason)
 終了時に一度動作

月単位で何カ月に1回マイナス月が出るかを出力してみます。
double Profit[2100][13];
double OnTester()
{
int StartYYY=2100,EndYYY=0;
for(int i=OrdersHistoryTotal()-1;i>=0;i--)
{
if(!OrderSelect(i,SELECT_BY_POS,MODE_HISTORY))continue;
int YYY=TimeYear(OrderOpenTime());
int MMM=TimeMonth(OrderOpenTime());
if(YYY<StartYYY)StartYYY=YYY;
if(YYY>EndYYY)EndYYY=YYY;
Profit[YYY][MMM]+=OrderProfit();
}
double cWIN=0,cLOSS=0;
for(int i=StartYYY;i<=EndYYY;i++)
{
for(int j=1;j<=12;j++)
{
if(Profit[i][j]>0)cWIN++;
if(Profit[i][j]<0)cLOSS++;
}
}
return ((cWIN+cLOSS)/cLOSS);
}

変数Profit[][]を宣言していますが、初期化が手間なのでグローバルに出しています。(裏技?です)

2019年4月6日土曜日

GW恐ろしい事があるようです。スワップ11日DAY! 無料ソース付き♪

YJ FX!さんはMT4が使える会社です。
正確には使える but 自動売買は出来ない を提供されています。

そんなYJさんのカレンダーを見ると
https://www.yjfx.jp/gaikaex/mark/swap/calendar.php

4月24日はスワップ11日DAY!!という恐ろしい日にちがありました。
マイナスのポジションを持っていたら悲劇ですね

USDJPYで70円/DAY の場合
70円 x 11日分 = 770円 7.7Pips!

凄いです。
スワップは会社やペアによって変わるので要注意です。

※実は私が発見したのではなく天下一品を愛する親友から教えてもらいました。

これを自動でするにはこんな感じかな
取引終了時間も会社によって異なるのでmmで設定してください。
55分までのところは54分にしたほうがいいかもしれません。
4月24日23時mm分にエントリーをします。
翌25日になってポジションに利益が出た時(±0も)は終了
スワップ分以上マイナスになったら終了
無いと思いますが、持ち越しても25~30日は上の条件で動きます。

一回使い切りEA 動作チェックはしていません(-_-;)
※ご使用は自己責任で!

input int mm=50;
input int Magic=20190424;
input double Lot=0.1;
MqlDateTime T;
int Ticket,d,i;
void OnTick()
{
TimeToStruct(TimeCurrent(),T);
int c=0;
for(i=OrdersTotal()-1;i>=0;i--)
{
if(!OrderSelect(i,0))continue;
if(OrderMagicNumber()!=Magic)continue;
c++;
if(OrderProfit()>0&&T.day>=25)d=OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),0);
if(OrderProfit()+OrderSwap()<=0&&T.day>=25)d=OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),0);
}
if(T.mon==4&&
T.day==24&&
T.hour==23&&
T.min==mm&&
!c)Ticket=OrderSend(Symbol(),OP_BUY,Lot,Ask,0,0,0,"11Days",Magic);
if(!c&&T.day>=25){Alert("Fine");ExpertRemove();}
}

2019年4月3日水曜日

令和記念! DUKAS MT4開始 FXTF社名変更 

4月3日に書くのは少し遅いかもしれませんが、年号が決まりました。
令和
なかなか、かわいい字面です。
令の字は屋根の下でお辞儀をしている形とのことですがこんなかんじでしょうか
/ \
Orz


そしていよいよ デュ―カスコピー社のMT4が使用できるようになりました。

MT4の次はMT5ではなくJFOREXかもしれないと思っていたのですが…


さらに FXTFの社名が変更されたようです。


新しい社名はゴールデンウェイ・ジャパン

本国名は金道集團 

わたし的には金道日本のほうがカッコよく感じます。







2019年3月28日木曜日

【脱線】TradingView 

最近はブログの更新がほとんどできていません。
ごめんなさい。
かなり開発案件を抱えていまして・・・・
と、忙しぶってみました^^

開発からの現実逃避でトレーディングビューをすこし

//@version=3
strategy("TACA_RSI",overlay=true)
RSI10=rsi(close,10)
if( RSI10<30  )
    strategy.entry("TACA RSI LONG" ,strategy.long )
if(RSI10>70 )
    strategy.entry("TACA RSI SHORT",strategy.short)
strategy.exit("Exit Long" ,"TACA RSI LONG" ,when = RSI10>70 )
strategy.exit("Exit Short","TACA RSI SHORT",when = RSI10<30)

一行目 バージョン 必ず必要です。

二行目 EA?ストラテジーの名前を宣言

三行目 RSI10に終値期間10のRSIの値を入れます。
※Symbol()やらPERIOD_CURRENT はいりません
トレードステーションに近い感じです

四行目 if は同じような感じです && は ANDです

五行目 OrderSend() ポジションに"TACA RSI LONG"と名前を付けて発注
※Magicナンバーの代わりにこの名前を使います。
細かい事は省略可能 
ifを使わずにwhen で条件を入れてしまう事も出来ます。exit参照

下から二行目 OrderClose()です。
なぜかクローズにも名前を付けてから、
OrderSelect()なしでダイレクトにポジション名"TACA RSI LONG"を指定します。
when = RSI10>70 これが面白いところです。
TPやSLのように 条件を入れることが出来ます。

やはりEASYLanguageっぽいですね









2019年3月24日日曜日

MT4 の 暗号化 CryptEncode(); 関数登場!

それはメタエディターで遊んでいた時です。
Crと押したところ候補文字にCryptEncode が出てきました。

仮想通貨のようなかっこいい名前の関数です。
いままで気が付かなかったので、最近のビルドで追加されたのかと思います。

使い方はキーと暗号化したいテキストをCryptEncodeで暗号化して
CryptDecode で復号化します。

データーの変換方法は以下の種類から選べます。


ENUM_CRYPT_METHOD
定数
説明
CRYPT_BASE64
BASE64
CRYPT_AES128
128ビット(16バイト)キーでの AES 暗号化。
CRYPT_AES256
256 ビット(32 バイト)キーでの AES 暗号化。
CRYPT_DES
56ビット(7バイト)キーでの DES 暗号化。
CRYPT_HASH_SHA1
SHA1 HASH の計算。
CRYPT_HASH_SHA256
SHA256 HASH の計算。
CRYPT_HASH_MD5
MD5 HASH の計算。
CRYPT_ARCH_ZIP
ZIP アーカイブ。

(参照MQL5)

用途不明ですが、まあ使ってみましょう。

void OnInit()
{
uchar data[],Txt[],Key[],Txt2[];
int res,res2;
StringToCharArray("abcdefg",Key);
StringToCharArray("TEXT-test",Txt);
Print("1 ",CharArrayToString(Txt));
res =CryptEncode(CRYPT_DES,Txt,Key,data);
Print("2: ",CharArrayToString(data));
     res2=CryptDecode(CRYPT_DES,data,Key,Txt2);
Print("3: ",CharArrayToString(Txt2));
}

キー"abcdefg" を 配列Keyにいれます。StringToCharArray("abcdefg",Key);

暗号化したい"TEXT-test"を配列Txtに格納します。StringToCharArray("TEXT-test",Txt);

DES暗号化をつかってTxtをKeyをつかって暗号化したものを配列dataにいれます。CryptEncode()

DES暗号化で暗号化したdata をKeyで復号化したものをTxt2にいれます。
CryptDecode()

さーて なんに使おうかな














2019年3月14日木曜日

ビルド1160問題 デモ口座全滅・・・

MT4のバージョン(BUILD)アップに伴い
①WINDOWSの古いバージョンではMT4が使えなくなる。
②古いMT4は使えなくなる

この二点がアナウンスされていました。
https://www.metatrader4.com/ja/releasenotes/491

② は各ブローカー BEEKS社より案内が来ていました。

アナウンスを全く無視して海外で遊び惚けてきました。

先程VPSを見ると・・・・・

膨大な額の含み損を抱えているMT4がいくつかあります (-_-;)

よくみると、すべてデモ口座です。実口座じゃなくてよかった♪

しかし、計測していたデーターがすべておかしくなってしまいました。

全然よくないじゃないか・・・・

すべて3月1日より動いていません。


皆様も、MT4しっかりと再起動しましょうね・・・

2019年2月14日木曜日

時間毎の相場の活性について


小さな疑問が出てきました。
レンジ相場、トレンド相場などという言葉をよく耳にします。
また、ロンドンとNYの重なる時間は活性が高いような話もよく聞きます。
時間によって価格の動きやすさは変わってくるのでしょうか?
また傾向はあるのでしょうか?
実は以前確認したことがあるのですが、今回は標準偏差をベースに見てみたいと思います。

USDJPY 5分足で確認します。
活性の力を評価する為に使うのは、
①高値ー安値の平均
②Volumeの平均
③標準偏差
です。

①価格がどれくらい動いたのかを確認します。
②MT4のVOLUMEはティックボリュームです。
ティックの動いた回数ですが、これも相場の活性が高い時にはよく動くとされています。
FXDDのデーターを使いますが、過去に比べて最近のほうがティックボリュームは大きくなっています。最近の傾向が重視されることになります。
③狭義(正確な意味あい)でのボラティリティとは標準偏差の事です。
またボリンジャーバンドは平均から上下に標準偏差分幅を取ったものです。


オレンジ:StDev(標準偏差)期間20
グレー:(高値ー安値)の平均
水色:TickVolume

頂点を見比べると グレーと水色は同じ位置です。
オレンジは遅れていますが期間20、すなわち過去20回を元に数字を計算しているのが原因です。

いろいろな計算式を使っても同じように出るものですね。

さて、1月末にGGJに出品したSPDがまだ計測開始になっていません。
まだかなぁ~













2019年2月7日木曜日

Where is The Love? (iはどこ?)

最近忙しくてブログが書けていません。
そして今日がもっとも忙しい感じです。
体調→悪い
トレステ→最高 (米株のWEBです) Y様F様T様元気かな?
NZDUSD→復活!
SYZYGY→いい感じ
EZ O様→多謝

さて、この多忙な中にどうしても訴えたいことが!
知人と話していた時の事です。
おかしなエラーが出ました。
原因を探すとこんな感じのソースでエラーが出ることが判明しました。

#property strict
void OnInit()
{
for(int i=0;i<=10;i++){}
for(    i=0;i<=10;i++){}
}

メタエディター様は 2回目のforループのiを宣言していないよね(-。-)y-゜゜゜
とコンパイル拒否をします。

最初のforで宣言したiはどこにいったのでしょう?

どうやら、現在の仕様では#property strict を使った場合
for ループ内のi 宣言は毎回しないといけないようです。

いままで作ったEAはすべて手直しをしないといけません。
う~ん