2020年4月28日火曜日

休日 変数w

休日をCVSから読み込んで、比較する仕様を考えていましたが
CVSファイルをどこどこに置いて~というのが結構めんどくさいので、
最初から変数に入れてみました。

今思えば配列Hday[年][月][日]にすればよかったような。。。


int Hday[343]= {20050101,20050102,20050103,20050110,20050211,20050320,20050321,20050429,20050503,20050504,20050505,20050718,20050919,20050923,20051010,20051103,20051123,20051223,20051231,20060101,20060102,20060103,20060109,20060211,20060321,20060429,20060503,20060504,20060505,20060717,20060918,20060923,20061009,20061103,20061123,20061223,20061231,20070101,20070102,20070103,20070108,20070211,20070212,20070321,20070429,20070430,20070503,20070504,20070505,20070716,20070917,20070923,20070924,20071008,20071103,20071123,20071223,20071224,20071231,20080101,20080102,20080103,20080114,20080211,20080320,20080429,20080503,20080504,20080505,20080506,20080721,20080915,20080923,20081013,20081103,20081123,20081124,20081223,20081231,20090101,20090102,20090103,20090112,20090211,20090320,20090429,20090503,20090504,20090505,20090506,20090720,20090921,20090922,20090923,20091012,20091103,20091123,20091223,20091231,20100101,20100102,20100103,20100111,20100211,20100321,20100322,20100429,20100503,20100504,20100505,20100719,20100920,20100923,20101011,20101103,20101123,20101223,20101231,20110101,20110102,20110103,20110110,20110211,20110321,20110429,20110503,20110504,20110505,20110718,20110919,20110923,20111010,20111103,20111123,20111223,20111231,20120101,20120102,20120103,20120109,20120211,20120320,20120429,20120430,20120503,20120504,20120505,20120716,20120917,20120922,20121008,20121103,20121123,20121223,20121224,20121231,20130101,20130102,20130103,20130114,20130211,20130320,20130429,20130503,20130504,20130505,20130506,20130715,20130916,20130923,20131014,20131103,20131104,20131123,20131223,20131231,20140101,20140102,20140103,20140113,20140211,20140321,20140429,20140503,20140504,20140505,20140506,20140721,20140915,20140923,20141013,20141103,20141123,20141124,20141223,20141231,20150101,20150102,20150103,20150112,20150211,20150321,20150429,20150503,20150504,20150505,20150506,20150720,20150921,20150922,20150923,20151012,20151103,20151123,20151223,20151231,20160101,20160102,20160103,20160111,20160211,20160320,20160321,20160429,20160503,20160504,20160505,20160718,20160811,20160919,20160922,20161010,20161103,20161123,20161223,20161231,20170101,20170102,20170103,20170109,20170211,20170320,20170429,20170503,20170504,20170505,20170717,20170811,20170918,20170923,20171009,20171103,20171123,20171223,20171231,20180101,20180102,20180103,20180108,20180211,20180212,20180321,20180429,20180430,20180503,20180504,20180505,20180716,20180811,20180917,20180923,20180924,20181008,20181103,20181123,20181223,20181224,20181231,20190101,20190102,20190103,20190114,20190211,20190321,20190429,20190430,20190501,20190502,20190503,20190504,20190505,20190506,20190715,20190811,20190812,20190916,20190923,20191014,20191022,20191103,20191104,20191123,20191231,20200101,20200102,20200103,20200113,20200211,20200223,20200224,20200320,20200429,20200503,20200504,20200505,20200506,20200723,20200724,20200810,20200921,20200922,20201103,20201123,20201231,20210101,20210102,20210103,20210111,20210211,20210223,20210320,20210429,20210503,20210504,20210505,20210719,20210811,20210920,20210923,20211011,20211103,20211123,20211231,};
void OnInit(void){for(int i=0; i<343; i++)Print(i," ",Hday[i]);}

休日カレンダーCSV 

ALEXAさんから休日CSVが便利とアイデアを頂きました。
確かに読み取って変数に入れて確認した方が早そうです.

作ってみました。
期間は2005-2021までです。
休日+銀行休みの日(1月1,2,3日 12月31日を入れてあります)

過去の休日はこちらから情報を頂きました。
http://koyomi.vis.ne.jp/sub/syukujitsu_table.htm

2020,2021は内閣府由来です。
https://www8.cao.go.jp/chosei/shukujitsu/gaiyou.html


①ご自由に使ってください。
②再配布、直接DLリンクは禁止です。必ずこのページを見てDLするようにしてください。
③販売EAに使い際には「Thank you TACA/AMSER Inc.」と入れてください。
また、その際は一言いただけると嬉しく思います。
④そして内容を保証するものではありませんので、自己責任でお願いします。
http://amser.co.jp/H_DAY.csv

間違いなどありましたらご連絡を頂けると助かりますm(__)m


PS
どうやら1955~の休日データがあるようです。
情報を頂きましたALEXAさん、弱気なトレーダーさんありがとうございます。


2020年4月27日月曜日

休日判定コード(備忘録)

久々に仲値EAを作ってみました。
ALEXAさんや青い豚さん aboyさんにいろいろと教えていただいて祝日を計算する関数を作りました。

参考にしたのは
「青い豚さんのブログ」
https://trv-and-mt4.blogspot.com/2019/12/mt4.html

銀行法
https://elaws.e-gov.go.jp/search/elawsSearch/elaws_search/lsg0500/detail?lawId=357CO0000000040&openerCode=1

内閣府hp
https://www8.cao.go.jp/chosei/shukujitsu/gaiyou.html

2020と2021はオリンピックで大きく変わるようですが、とりあえずベースができました。
国民の休日が日曜日の場合は翌日にする処理がいります。
国民の休日に挟まれた日も休日になります。(前回は2015年、次は2032年)



MqlDateTime A;
TimeCurrent(A);
bool Holiday()
   {
   if(A.mon==1&&A.day<=3)return true;//New Year
   if(8<=A.day_of_year&&A.day_of_year<=14&&A.day_of_week==MONDAY)return true;//Genpuku
   if(A.mon==2&&A.day==11)return true;//Foundation Day
   if(A.mon==2&&A.day==23)return true;//Emperor's Day
   if(A.mon==3&&A.day==20&&fmod(A.year,4)<=1)return true;//Vernal Equinox Day
   if(A.mon==3&&A.day==21)return true;//Vernal Equinox Day
   if(A.mon==4&&A.day==29)return true;//Showa
   if(A.mon==5&&3<=A.day&&A.day<=5)return true;//GW
   if(A.mon==7&&A.day_of_week==MONDAY&&15<=A.day&&A.day<=21)return true;//Love Sea
   if(A.mon==8&&A.day==11)return true;//Love Mountain
   if(A.mon==9&&A.day_of_week==MONDAY&&15<=A.day&&A.day<=21)return true;//Respect for the Oldish
   if(A.year>=2012&&A.mon==9&&A.day==22&&!fmod(A.year,4))return true;//Autumn equinox day
   if(A.mon==9&&A.day==23)return true;
   if(A.mon==10&&8<=A.day&&A.day<=14&&A.day_of_week==MONDAY)return true;//Sport day
   if(A.mon==11&&A.day==3)return true;//Taca's Wedding Anniversary
   if(A.mon==11&&A.day==23)return true;//Labor Thanksgiving Day
   if(A.mon==12&&A.day==31)return true;//End of Year
   return false;
   }

2020年4月24日金曜日

満月の日はチャートのピークになる? 満月EAソース付き

ひろぴーさんが満月の日に仮想通貨の価格が頂点になるとツイートしていました。
https://twitter.com/hiropi_fx/status/1253610559901057024

トレーディングビューって 月の満ち欠けまで表示できるようです。
やはりすごいの一言ですね
早速USDJPYで月を出してみました。
チャート上部黒丸●が満月 下の中抜き丸〇が新月です。


一致しているように見えます。
そんなことがあるのでしょうか?月は約30日周期です。
特定の日に例えば20日などにピークが来やすいのでしょうか
そこで、検証です。
調べてみると月の周期は29.530589日です。
月1回の取引です、長期の2005年からのデータで分析したいと思います。

満月の計算です。
2005年最初の満月は1月25日
MT4の時間datetimeは1970.1.1 00:00:00からの秒数です。
現在の秒TimeCurrent()から最初の満月の日を引きます。
これを86400でったあまりが1未満の日が29.53・・・周期の日になります。
(86400=24時間x60分x60秒)

新月エントリー満月クローズにしても成績が芳しくなかったので最適化します。
(ここで間違えていました💦じつは満月エントリー新月クローズを作っていました


閉じる日は2005.1.xにすれば月齢がてきとうにあいます。

int d;
input int day=1;
void OnTick()
{
   if(MathMod((TimeCurrent()-StringToTime("2005.1.25 00:00"))/86400,29.530589)<1
     )d=OrderSend(Symbol(),OP_BUY,0.1,Ask,0,0,0,NULL,1);
   if(MathMod((TimeCurrent()-StringToTime("2005.1."+day+"+ 00:00"))/86400,29.530589)<1)
      for(int i=OrdersTotal(); i>0;)
      {if(!OrderSelect(--i,0))continue;
      d=OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),0);
      }
}

画像

2005.1.29 月齢18が成績がいいようです。

友人曰く「リーマンの極端な下降シーン以外では使えそうです。」

確かにそうですね。


ここでソースを見返して重大なことに気が付きました。
満月エントリーロング、月齢18日(Day=29)クローズにしていました💦

そこで修正したのがこちら
int d;
input int day=1;
void OnTick()
{
   if(MathMod((TimeCurrent()-StringToTime("2005.1."+day+"+ 00:00"))/86400,29.530589)<1
     )d=OrderSend(Symbol(),OP_BUY,0.1,Ask,0,0,0,NULL,1);
   if(MathMod((TimeCurrent()-StringToTime("2005.1.25 00:00"))/86400,29.530589)<1)
      for(int i=OrdersTotal(); i>0;)
      {if(!OrderSelect(--i,0))continue;
      d=OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),0);
      }
}
一番いいのは月齢23日(Day=4)ロングエントリー 満月クローズです。



これはこれでいいですね


2020年4月21日火曜日

原油マイナス価格的中!!

今朝 原油価格がマイナスになりました。

ロシアが原油の減産に応じず、価格が暴落したため原油の買いだめが始まりました。
さらに、コロナで原油の消費量も減っている中先物5月のWTI原油の期限が迫ってきます。
原油を貯蔵することのできないファンドは慌ててたたき売りしたため、お金を払って引き取ってもらうマイナス価格が発生しました。
もちろん今日からは6月限の価格になりますので、+価格になる予定ですが、ロールオーバー次第では大変なことになるようです。
GMO DUKASは昨日から6月の価格だったので問題なしとの情報も入っています。

昨夜この現象を予測していたのですが、的中しました!!

なかなか嬉しいものです!




2020年4月9日木曜日

ドンチャンチャネル インジケーター ソースコード公開

ドンチャンチャネルのインジケータを作成しました。
実は、O社プレゼントのドンチャンを使用していたのですが、
セットしたままMT4を起動すると2-3分フリーズしていました。

おそらくチャートに表示されていない部分もすべて計算しているのでは、
そこで自作しました。High Low ドンチャンチャネルです。

ソースコードを貼り付けますので、ご自由に使用してください。
しばらくすると消すかもしれませんので、お早めに~


#property copyright "Copyright 2020/04/09,TACA/AMSER Inc."
#property link      "http://mt4kyoto.blogspot.jp/"
#property indicator_chart_window
#property indicator_buffers 2
#property indicator_color1 clrRed
#property indicator_color2 clrRed
#property indicator_width1 1
#property indicator_width2 1
#property indicator_type1 DRAW_LINE
#property indicator_type2 DRAW_LINE
extern int PERIOD=20;
double H[],L[];
string S=_Symbol;
int OnInit()
{
   SetIndexBuffer(0,H);
   SetIndexBuffer(1,L);
   return INIT_SUCCEEDED;
}
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])

{
   for(int i=rates_total-prev_calculated-1; i>=0; i--)
     {
      H[i]=High[iHighest(S,PERIOD_CURRENT,MODE_HIGH,PERIOD,i)];
      L[i]=Low[iLowest(S,PERIOD_CURRENT,MODE_LOW,PERIOD,i)];
     }
   return rates_total;
}

USDJPY 月別の値幅と最近の動き

コロナ、原油の影響で相場が大きく動いています。

小さな動きを前提に設計されたEAを大きく動く相場で使うと、
こんなことがおこります。
① TP、SL固定の場合 大きくとれるのに少しで利確してしまう。
② インジケーターのみで動かす場合 利確損切共に値幅が大きくなる。
最近急に成績が良くなっているEAはこれですね!
③ 損大利小のEA(こつこつどがん) SLにはまりやすく大負けする。
④ 複数ポジションEA(グリッド系) ポジションを持ちすぎてSO(破綻)しやすくなる。

毎日のH(高値)- L(安値) これはその日の値幅です。
これを月別に平均を出しました。



 2005年からの1日の値幅の平均は0.85円です

ただし最近はかなり小さめです。
2017:0.73
2018:0.50
2019:0.46

そして、先月2020年3月は何と2.06 !! 
これは2008.10(リーマン後)以来 歴代2位です。
歴史的瞬間ですね!

4月は00.77と戻ってきています


見やすいように年別に最大、平均、最小にまとめます。
そしてグラフ化するとこんな感じです。











2020年の値幅の最高値だけ吹き飛んでいます。
最小値はそう大きくないように見えます。


さて、今日時点ではどうでしょうか
気になるので日別で確認をしてみます。
縦 1~4(月) 横 01-31(日)

すこし細かくなりましたが月日別のH-L 値幅です。
黄色は1円、オレンジは2円、赤は3円を超えたところです。
相場が落ち着いてきたのが分かります。
※今日4/9は途中(まだ朝9時前)ですので、小さくなっています。

見やすいように日別にグラフ化しました



ほぼ、戻っているのが分かります。
EAを止めていた方も安心して使えるようになったのではないでしょうか!