2018年4月23日月曜日

EdelWeiss販売再開

かつて出品したEA EdelWeissについてご質問を頂きました。
OANDA TY3 5K、楽天、FXTFで動かしていますが、好調です。
ゴゴジャンを辞めてしまって少し恐縮なのですが、
早川社長から送別会で出品の許可を頂きましたので
販売再開にしてみようと思います!









2018年4月22日日曜日

【考察】週末クローズについて

週末クローズについて考えてみます。
最近多いのですが備忘録的なものです。

週末クローズで多いのは金曜日23時(MT4時間)にポジションをクローズし発注も制限するといった物です。
★一定の時間にポジションクローズし、発注を制限する。
時間は23時と書きましたが20時のものや21時22時などなど色々とあります。

ここで気になるのが20時にポジションクローズと発注制限を同時に仕掛けるものです。
発注制限をかけた後もしばらく持っているポジションはクローズしなくてもいいのではないでしょうか。
★一定の時間移行発注を制限し一定時間後にポジションを持っている時にはクローズする。(ex.金曜20時以降は新規発注をしない、23時にポジションを持っていたらクローズする。

もう一つ気になることがあります。
NYクローズ前にはレートの偏りはないでしょうか
ロングポジションとショートポジションの時間は同じでいいかどうかという事です。
過去データーを引き出してみます。


2005年~金曜日20時移行のデーターを分析してみました。
5分足です。青は終値から始値をひいた値の合計です。
オレンジは陽線÷すべての回数です。
金曜日に限定しない時は23時~極端なドル高の傾向があるのですが、
金曜日は違うようです。

青線で見ると20:45~21:45はドル高のようです。
オレンジで確認した場合20:55-21:25がドル高傾向
また23時前後にもピークがあります。

円高はピークが三つあります。
22:45 23:25 23:45です。


LONG
21:45新規発注制限開始
21:45以降利益が出ていればクローズ
23:10すべてのポジションをクローズ

SHORT
20:45新規発注制限開始
20:45以降利益が出ていればクローズ
23:45すべてのポジションクローズ

こんな感じがよさそうです









2018年4月20日金曜日

モンテカルロ EAとソースコード

取りあえずベースとなるモンテカルロのソースコードを作成してみました。
RSIでエントリーしていますが全くダメですねw

エントリーとそれにあったTPの大きさを見つけて下さい。
PRINTにカラムを表示していますので、みてください!


#property strict
input int Magic=11111;
input string Comments="MonteTACA-USDJPY-M1";
input double BaseLots=0.1;
input double TP=0.02;
int Monte[50],nMonte,d,i,Ticket;

double Vol;
string Sym=Symbol();

int OnInit()
{
for(i=0;i<3;i++){Monte[i]=i+1;}
nMonte=3;
Vol=BaseLots*4;
string Com="";
for(i=0;i<nMonte;i++){Com+=(string)i+" : "+(string)Monte[i]+" \n";}
Print (Com);
return(INIT_SUCCEEDED);}

void OnTick()
{
if(GetLastError()){Print(GetLastError());ExpertRemove();}
int NoP=Pos();
if(NoP && OrderSelect(Ticket,SELECT_BY_TICKET))
{
if(OrderType()==OP_BUY)
{
if(OrderOpenPrice()>Bid+TP)Lose();
if(OrderOpenPrice()<Bid-TP*2)Get();
}
if(OrderType()==OP_SELL)
{
if(OrderOpenPrice()<Ask-TP)Lose();
if(OrderOpenPrice()>Ask+TP*2)Get();
}
}



//++ Entry Logic ++
if(!NoP&&iRSI(Sym,PERIOD_CURRENT,20,PRICE_HIGH,0)<30

)
{
Ticket=OrderSend(Sym,OP_BUY,Vol,Ask,0,Bid-TP*2,Bid+TP*4,Comments,Magic);
Print("OpenLong: "+(string)Vol);
}
if(!NoP&&iRSI(Sym,PERIOD_CURRENT,20,PRICE_LOW,0)>70

    )
        {
        Ticket=OrderSend(Sym,OP_SELL,Vol,Bid,0,Ask+TP*2,Ask-TP*4,Comments,Magic);
Print("OpenShort: "+(string)Vol);
}
//+++++++++++++++++
}//OnTick()





//Get :Close Positin & Set Column
void Get()
{
if(OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),0))
{
if (nMonte<6)
{
for(i=0;i<nMonte;i++){Monte[i]=0;}
for(i=0;i<3;i++){Monte[i]=i+1;}
nMonte=3;
Vol=BaseLots*4;
}
else
{
for(i=0;i<nMonte-2;i++)
{Monte[i]=Monte[i+2];}
Monte[i-2]=0;
Monte[i-1]=0;
nMonte-=4;
Vol=BaseLots*(Monte[0]+Monte[nMonte-1]);
}
string Com="Get";
for(i=0;i<nMonte;i++){Com+=(string)i+" : "+(string)Monte[i]+" \n";}
Print (Com);
}
}
//Lose :Close Position & Set Column
void Lose()
{
if(OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),0))
{
Monte[nMonte]=(int)(OrderLots()/BaseLots);
Vol= (Monte[0]+Monte[nMonte])*BaseLots;
nMonte++;
string Com="Lose";
for(i=0;i<nMonte;i++){Com+=(string)i+" : "+(string)Monte[i]+" \n";}
Print (Com);
}
}

//Check Number of Position
int Pos()
{
int cnt = 0;
for(i=OrdersTotal()-1;i>=0;i--)
{
if(OrderSelect(i,SELECT_BY_POS)&&OrderMagicNumber()==Magic){cnt++;}
}
return(cnt);}

モンテカルロ法 考察 TACA的ベットコントロール

カジノのベットコントロールの戦略でモンテカルロ法があります。

3倍ベットのところでするのがスタンダードな方法です。

ルーレットインサイドのサイドにある1st12,2nd12,3rd12と
ボトムにある2to1三か所がよく使われます。

ちなみにインサイドの2点、4点ベットをすると2,5,8~の列が重なりやすくなりますので、2to1の真ん中はディーラーが一般的によく狙うところからずれて配置されています。2to1の場合両端がねらい目ですね。
すいている時で資金に余裕がある時はこれでも大丈夫です。出やすい黒を狙う戦略ですね。31,33はヨーロピアンスタイルではOrphelinsかその隣にあるので外しています。

さらにディーラー殺しの戦略がこちら!くわしく書くと大変な量になるので省略しますがディーラーが10回投げるとほぼ一回は0が出ます。0周りを攻めます。ディーラーと1v1の時はダメですよw1USD程度で賭けれるカジノで使える配置です。

さて話が大きくそれましたが、モンテカルロ法のやり方です。初めにカラムを三つイメージします。1,2,3 この両端を足した数をBETします。
初めは1+3で4 負けた時には先程のベット額4をカラムに足します。
カラムは1,2,3,4となっています。次にベットするのは1+4で5です。
勝った場合は両端から二個ずつカラムを削ります。1,2,3,4の左端から二個の1,2と右端から二個の3,4を削ります。カラムが無くなりましたこれで終了です。
カラムが0もしくは1になると終了です。
2回負けて1回勝った場合はこのようになります
1,2,3      BET 4(1+3) 負
1,2,3,4    BET 5(1+4) 負
1,2,3,4,5  BET 6(1+5) 勝
3 終了 9枚失い12枚勝ちました。平均ベットは5、合計3枚の利益です。

5枚ずつ三回かけた時は10枚失い10枚勝ち取り±0です。

つまりベットコントロール自体でもうけを増やすことが出来ます。
しかし欠点があります。マーチンゲールのような破綻的な上昇ではありませんが、
勝ち負けを繰り返すとベット数が増えてしまいます。

勝ち負けを繰り返すより連勝、連敗傾向がある方が効果的です。

これをFXに応用します。FXで固定三倍では面白くありません。
トレーリングストップの場合三倍固定ということが出来ません。
よくある手法では平均価格に合わせてベットをコントロールしますが、この場合ベットコントロール自体の意味合いが薄くなります。

そこで!少し考えてみました。
①トレーリングの特性
TP/SL3PIPS程度のEAは4PiPS程度のトレールが有効(経験則)
②マーチンゲールの特性
カラムベットの根幹は過去の負けの少し大きめのベットをする。

4Pipsのトレイルの場合(USDJPY 1LOT=100,000通貨ペア)
①0.1 lotエントリー4PIPs 400jpy lose
②0.11lotエントリー2PIPs 220jpy lose total -620jpy
③0.12lotエントリー6PIPs 720jpy win total +100jpy

6PIPs 負けて 6PIPs勝った場合 +100jpyとなります。

勝率33%です。

原点に戻ると勝率もリスクリワードも関係なく利益がすべてです。
TP/SLが固定出ない場合でもこれでベットコントロールができました。

手法
①初めに0.1LOTエントリーする。
②負けたら0.01LOT追加してエントリーをする。
③勝った時には初めから合計がトータルプラスになれば①に戻る。

次に買ったけれども負けが残っている場合を考えます。
①0.1 lotエントリー4PIPs 400jpy lose
②0.11lotエントリー2PIPs 220jpy lose total -620jpy
③0.12lotエントリー4PIPs 480jpy win total -140jpy
④0.13lotエントリー2PIPs 260jpy lose total -260jpy
⑤0.14lotエントリー2PIPs 280jpy win total    20jpy

使用ロットは0.6lot  8PIPs負けて6PIPs勝ちました。
-2Pips 負けているにも関わらず20jpyの利益です。

この手法が出来る証券会社はトレールを使用する為ストップレベルの無い証券会社
最小0.1lotからエントリーでき0.01lotステップでエントリーできる会社ですね。
OANDA TY3,PRO 楽天といったところでしょうか。

他もいいところがあったら教えて下さいね~











2018年4月19日木曜日

【初期処理】時間軸編

時間軸確認のコードです。
こちらもOnInit()内で済ませてしまいたいですね。
M1かどうか確認するにはPeriod()関数で確認するのですが、
M1は 1 もしくは列挙型の PERIOD_M1 のどちらでも大丈夫です。
1を使った方が速いので、OnTick()やOnTimer()内では列挙型PERIOD_M1を使わないようにしています。
OnInit()内ではわかりやすく列挙型PERIOD_M1を使用します。

if(Period()!=PERIOD_M1)
{
Comment("This period is M"+Period()+". Select M1.");
ExpertRemove();
return(INIT_FAILED);
}

#property strictうぃ宣言している時にはComment内のPeriod()の前に(string)を付け無いとコンパイル字に方が違うと警告が出てしまいます。


最近細かい処理をまとめていますが、
FX-ONでは特定の業者専用のEAの出品は禁止になりました。
何社か使えるようにする為にまとめています。

証券会社と共存しながら月利100%のEAを作ることは出来るでしょうか!



2018年4月17日火曜日

【初期処理】通貨ペアの選択 コード編

通貨ペアの選択の理想的なコードを考えてみました。
①OnInit()内で確認します。reuren()関数を使用する為int にしています。
②Symbols変数を宣言してStringToUpperで小文字を大文字に変換しています。
③変換したSymbols変数にUSDJPYが含まれているかどうかを確認します。
If文で頭文字6文字をチェックするコードが多くありますがたまに _USDJPY といった通貨ペアもありますのでStringFindで確認しています。
④コメントを表示してExpertRemove()でEAを強制終了します。
⑤念のためreturn(INIT_FAILED);をいれています。

ゴチャゴチャといろいろ確認していますが、OnInit()関数内はどれだけ重くなっても取引には関係が無いのでいいと考えます。
また、④でコメント表示しています。これをするとコメントがチャートに残ってしまうのでPrintするのも一手ですが、チャートに表示したほうが認識性が高いのでこちらにしています。


int OnInit()
{
string Symbols=Symbol();
if(StringToUpper(Symbols)&&StringFind(Symbols,"USDJPY")==-1)
{
Comment("Check Pair! Select USDJPY");
ExpertRemove();
return(INIT_FAILED);}
return(INIT_SUCCEEDED);
}

【初期処理】通貨ペアの選択について


初期処理・通貨ペアの固定について備忘記・メモ的な物をまとめてみます。
EAのソースコードを見ていると、通貨ペアの固定をしているの物が多くあります。
TACA的にはどこにどんなコードがいいのか考えてみました。

①場所( OnInit() or OnTick()  )どちらがいい?
EA起動する時にOnInit()処理をします。ここで通貨ペアの確認をしておけば、一回確認するだけで通貨ペアの確認ができます。OnTick()内に入れた場合ティックが動くたびに通貨ペアを確認する事になるので、速度的に不利になります。

気になるのは1点 途中で通貨ペアを変更した場合です。
そこで以下のソースで確認をします。

void OnInit(){Print("OnInit!");}
void OnTick(){} 

OnInit()処理をされるたびにOnInitとエキスパートに記録が残ります。
USDJPYのチャートでこのコードを動かした後にEURUSDに通貨ペアを変更します。

通貨ペアを変更した時にもう一度イニシャライズされてOnInit()が動作するようです。

という事はOnInit()の中に通貨ペアの確認コードを入れておけばいいようですね。



2018年4月16日月曜日

EAの限界数

さーて ゴゴジャン(fx-on)を退社し、香港、マカオ、ボラカイにマニラと遊び惚けてきました。
知る人ぞ知るゲンティンのワールドドリーム号の度でした。
普通のクルーズ船にはカジノのテーブルが10~20あるのですが、あの船にはゲンティンのカジノとシンガポールのリゾートワールドのカジノが入っておりテーブルだけで100以上 ギャンブルクルーズ船のようでした。

帰国後EAを何十個か作成したのですが、驚くべき事象が起こりました。

MT4がEAを認識しません。
新しく作ったEAがナビゲーターウィンドウにもバックテストの選択にも出てきません。

数が多すぎるのかな?と考えEAを少し削除したところナビゲーターに出てきました。
そう、MT4にはEAの数に限界があるのです。

きっと開発したロシア人の想定外の数を作成しているのでしょうw

最近開発しているので面白いのがMA3とMA5の関係性やMA10とMA11の関係性などです。
そういえばMA3とMA5は石原J先生に林君それはゲームだよ♪と言われたことがありましたね。

上手くいけば近日公開するかもしれません!