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の社名が変更されたようです。


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

本国名は金道集團 

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