2016年5月31日火曜日

【EAを作ろう】第十一回 シャンデリア・トレーリングを作ろう!

第十回のソースコードの最後の一行が抜けていました。
M氏よりご指摘いただきました。ごめんなさいmm そして、ありがとうございます^^

第十回ではエントリーまで作りました。
今回はシャンデリア・トレーリングです。
実はシャンデリア・トレーリングは死語です。死語というのも死語のような気がしますが・・・
トレーリング・ストップの事なのですがシャンデリア・トレーリングのほうがゴージャスな雰囲気
まさに将来大金持ちになる皆様にふさわしいと思いこちらを愛用しています。

オーダーエントリー時に設定したストップロス、テイクプロフィットに届くのを待つのではなく、
積極的に相場に合わせてストップロスを変更します。
価格が利益獲得方向に進んでいくのに合わせストップロスをスライドさせます。
価格が反転した時にSLに引っかかり終了となります。

バリエーションも多く価格が一定まで上昇した時に発動するタイプ
一定幅でSL幅が変更されるタイプ、時間で幅が狭くなるタイプ
エントリーより長い脚の平均乖離に合わせてSL幅を変更するタイプ

また、リアルタイムでSLを動かすもの、足変更時に動かすもの、価格幅を設定して動かすものなどあります。

extern int UpperLine=70,LowerLine=30,RSIPeriod=20,CTProfit=30,Magic=747;
extern ENUM_APPLIED_PRICE AppliedPrice=0;
extern ENUM_TIMEFRAMES ShortTimeFrames=1;
extern ENUM_TIMEFRAMES LongTimeFrames=5;
double SL,TSL,OTSL;
int d;

void OnTick(){
TS();      
  if(OrdersTotal()==0)  {
    if(RSI(ShortTimeFrames)>UpperLine&&RSI(LongTimeFrames)>UpperLine){EntryShort();}
    if(RSI(ShortTimeFrames)<LowerLine&&RSI(LongTimeFrames)>UpperLine){EntryLong();}
  }
}

double RSI(int Periods){return(iRSI(Symbol(),Periods,RSIPeriod,AppliedPrice,1));}
void EntryLong(){d=OrderSend(Symbol(),OP_BUY,0.1,Ask,0,Ask-CTProfit,0,"Long",Magic,0,clrNONE);}
void EntryShort(){d=OrderSend(Symbol(),OP_SELL,0.1,Bid,0,Bid+CTProfit,0,"Short",Magic,0,clrNONE);}

void TS(){
d=OrderSelect(0,SELECT_BY_POS);
if(OrderType()==0)
 {if(TSL<Close[0]){TSL=Close[0];SL=TSL-CTProfit*Point;}}
else
 {if(TSL>Close[0]){TSL=Close[0];SL=TSL+CTProfit*Point;}}
if(TSL!=OTSL){OTSL=TSL;
d=OrderSelect(0,SELECT_BY_POS);
d=OrderModify(OrderTicket(),OrderOpenPrice(),SL,0,0,clrNONE);}}

今回の変更点は一回ずつ宣言していたdを先頭に
StopLoss,TakeProfitの設定をなくし
OnInitもまるごと削りました。
CTProfitがシャンデリアトレーリングの幅です50以下がよいでしょう。
OnTick()直後にTS();関数を呼び出しています。

OrderSelectで注文を選択します。一本しか発注しない場合でも選択する必要があります。
SELECT_BY_POSはモードです。このモードの場合直前の0は直近にオーダーしたオーダー、1その次は2と順々に増えていきます。オーダーするたびにずれていきます。
SELECT_BY_TICKETにした時はチケット番号で選択できます。

OrderType()はOrderSelect()で選んだポジションのタイプです。0はBUY 1はSELLです。

次の行はTSL定数と現在の価格を比較し利益側に動いたときはTSL、SLを更新しています。
TSLは最新の現在価格、SLはストップロス価格です。
OTSLは一つ前のTSL価格です。TSLが変更された=利益側に価格が動いたかを見ています。

そして再びオーダーを選択し
OrderModifyで価格を変更しています。
OrderTicket()はOrdeSelect()で選んだオーダーのチケット番号
OrderOpenPrice()はOrderSelect()で選んだオーダーのエントリ価格です。
OrderModify(チケット番号、エントリー価格、ストップロス、テイクプロフィット、発注期限、矢印)です。

関数紹介になってきましたねw














2016年5月28日土曜日

サーバー対決 最終報告 お名前.comUS(OnTimer) vs お名前.com東京 vs 三条 vs FX-On(フロント) vs 全ティック vs コントロールP vs 初値

AMSER好調!三か月の実現損益が二位になりました。稼働一ケ月ですので三分の一の期間で二位です。三倍速です!赤いEAです!ムフフw
少し環境の変化があります。
環境の変化と言っても引越しに伴うブログ終了ではありません
①自宅のXPのグラフィックボードのリニアファンがずれてノイズを出しています
一年ほど前からなのですが、そろそろ限界です。PC廃棄を決めました><;10年間ありがとう SSDのみケースに入れてノートにつなげます。
②自宅サーバーもやめてしまえば部屋と机が広くなります。
マンション光なので遅延、不動など不安定な事も要因の一つです。時代はVPSですね。
③お名前.COMよりメールが来ました。
「お試しのUSサーバの二週間が過ぎました。データは消しました。あしからず」的なメールです。
「お試し期間残り何日です。契約しませんか?」とメールが来れば契約するつもりだったのですが・・・御縁がなかったのでしょう お世話様ですw

そこで最終サーバー比較の最終報告です。
US(お名前.COM US OANDA) OnTimer
東京(お名前.COM 日本 OANDA)
三条(自宅 OANDA WIN7 ロースペック)
FX-ON(OANDA 詳細不明)
そしてバックテスト三兄弟です。

前回はUSが最速、続いて三条、東京でした。FX-ONは今回が初めてです。


今回はUSにOnTimerを使用しています。
ワンティック稼ごう計画ですw

結果ですがUSが最低でした。ほとんど1秒遅れています。早くなったのは0です。
OnTimerだめですね。
一番欠けが少なかったのは三条。FX-ONとUSの欠けが同じです。
FX-ONはお名前.COMのUSサーバーを使用している可能性が高いですねw

バックテストはXPパソコンでとったのですがAoE専用でMT4をあまり使ってなかったのでオレンジの部分の欠落がありました><;
始値はクローズがすべて遅れています。理屈で考えるとそりゃそうです。
全ティックとコントロールポイントは全く同じでした。
全ティックは三条に近いデーターでしたのでこのEAに関しては信頼性は高いですね。

USを考えていたのですが上記の悲しいストーリーからBEEKSにチャレンジしてみようと思います。

今回は自宅>東京>FX-ON>US(OnTimer)です。
OnTimerを使わなければUS>自宅(不安定要因あり)>>東京でしょうね。





2016年5月27日金曜日

【告知】FX-ONに記事を掲載!

先日少し書きましたが、FX-ONの作成管理会社から記事の執筆の依頼が来ました。

祝 ということでEAのコメントにいれて大騒ぎしたのですが、

書き始めてみると自分の文才の無さに辟易してしまいました。


学生の頃に麻雀放浪記を読みました。

夜11時くらいから少しだけ読むつもりだったのですが、

面白さのあまり朝まで読み続けてしまいました。

私の麻雀やカジノ、FXの考え方の基礎を築いた本です。

もう一度読み直して今度は執筆の基礎を学ぶ必要があるのかもしれません。

さて、稼げるEAの見分け方全10回(予定)です。

アフィリエート誘導記事や根拠のない話が多いシストレの世界に

TACA的理論を注入してやります。

シストレの話題で直木賞は受賞できるのでしょうか!!

応援よろしくお願いします!






【EAを作ろう】第十回 RSI判定を1分と5分の二重判定に

作成しているEAはチャートの時間のRSIでエントリーを決めていましたが、
複数時間のRSIで判定します。
関数を活用したい為のすこし強引な展開ですw

extern int UpperLine=70,LowerLine=30,RSIPeriod=20,StopLoss=10,TakeProfit=90,Magic=747;
extern ENUM_APPLIED_PRICE AppliedPrice=0;
extern ENUM_TIMEFRAMES ShortTimeFrames=1;
extern ENUM_TIMEFRAMES LongTimeFrames=5;
double SL,TP;
int OnInit(){
if (Digits == 2|| Digits == 4)
{
SL=StopLoss  * Point * 0.1;
TP=TakeProfit* Point * 0.1;
}
else
{
SL=StopLoss*Point;
TP=TakeProfit*Point;
}
return(INIT_SUCCEEDED);}

void OnTick(){        
  if(OrdersTotal()==0)  {
    if(RSI(ShortTimeFrames)>UpperLine&&RSI(LongTimeFrames)>UpperLine){EntryShort();}
    if(RSI(ShortTimeFrames)<LowerLine&&RSI(LongTimeFrames)>UpperLine){EntryLong();}
    Comment(TP,SL);
  }
}

double RSI(int Periods){return(iRSI(Symbol(),Periods,RSIPeriod,AppliedPrice,1));}
void EntryLong(){int d=OrderSend(Symbol(),OP_BUY,0.1,Ask,0,Ask-SL,Ask+TP,"Long",Magic,0,clrNONE);}
void EntryShort(){int d=OrderSend(Symbol(),OP_SELL,0.1,Bid,0,Bid+SL,Bid-TP,"Short",Magic,0,clrNONE);}

利益が出ないと面白くないのでTakeProfitを90にしました♪

(最適値募集中ですよ!)

いままではRSI()でしたがRSI(ShortTimeFrames)もしくはLong~となっています。
初期設定ではShort~は1 Long~は5ですので
RSI(1) と RSI(5) という意味合いになります。

オレンジ色の&&はAND 両方の条件が真の時という意味です。

水色は受け取り用にint Periodsを宣言 iRSIの期間をPeriodsにしています。



RSI(ShortTimeFrames)を追っかけてみましょう

RSI(ShortTimeFrames)はTimeFramesはデフォルトで1ですのでRSI(1)と言う意味になります。

この1は水色のところでPeriodsに格納されます。Periodsは1です。

iRSIの期間のところもPeriodsになっています。iRSIの期間1の値がRSI(ShortTimeFrames)に入ります。

同様にRSI(LongTimeFrames)はiRSIの期間5の値が入ります。

RSI(ShortTimeFrames)とRSI(LongTimeFrames)の両方がUpperLineより大きい時にEntryShort()を呼び出します。

※RSIを二重にすることで精度が上がりますが取引回数は下がります。

損益は一回取引の平均利益 x 取引回数ですので、平均と取引回数をうまくコントロールしないと利益はでません

そしてこの設定の場合 勝率10%ちょいですが利益が出ますw





【EAを作ろう】第九回 他通貨設定を楽にしよう2 二桁四桁対応

前回は通貨ペアごとの桁数の違いを整えました。
こんどはブローカーによって2桁4桁 3桁5桁と別れているところを修正します。
2桁4桁のブローカーと契約が無いので、テストできてませんが完璧なはずw



extern int UpperLine=70,LowerLine=30,RSIPeriod=20,StopLoss=10,TakeProfit=10,Magic=747;
extern ENUM_APPLIED_PRICE AppliedPrice=0;
double SL,TP;
int OnInit(){
if (Digits == 2|| Digits == 4)
{
SL=StopLoss  * Point * 0.1;
TP=TakeProfit* Point * 0.1;
}
else
{
SL=StopLoss*Point;
TP=TakeProfit*Point;
}
return(INIT_SUCCEEDED);}

void OnTick(){        
  if(OrdersTotal()==0)  {
    if(RSI()>UpperLine){EntryShort();}
    if(RSI()<LowerLine){EntryLong();}
    Comment(TP,SL);
  }
}

double RSI(){return(iRSI(Symbol(),PERIOD_CURRENT,RSIPeriod,AppliedPrice,1));}
void EntryLong(){int d=OrderSend(Symbol(),OP_BUY,0.1,Ask,0,Ask-SL,Ask+TP,"Long",Magic,0,clrNONE);}
void EntryShort(){int d=OrderSend(Symbol(),OP_SELL,0.1,Bid,0,Bid+SL,Bid-TP,"Short",Magic,0,clrNONE);}



Digits は 桁数が格納されています。
|| は or 

桁数が2桁 もしくは 桁数が4桁の時は
(一桁足りないので) *0.1しています。

else以降は条件が合わなかった時の命令です。
桁数が2桁 もしくは 桁数が4桁でない時は
以前と同じようにPointをかけています。

使えるブローカーをできるだけ増やしたいときはこんな処理もできますよ程度です@@;


【EAを作ろう】第八回 他通貨設定を楽にしよう

作成しているRSIプログラムですが、
StopLoss、TakeProfit共に 0.01にしています。
USDJPYやEURJPYでは1Pipsです。
ところがEURUSDでは100Pipsになってしまいます。
桁数が異なるからです。

通貨ペアが異なれば設定値は変わりますが、同じような桁で考えたいと思うのは人の常

そこでPointを使います。
Pointは少数3ケタの通貨ペアでは0.001
5桁の通貨ペアでは0.00001になります。

extern int UpperLine=70,LowerLine=30,RSIPeriod=20,StopLoss=10,TakeProfit=10,Magic=747;
extern ENUM_APPLIED_PRICE AppliedPrice=0;
double SL,TP;
int OnInit(){
SL=StopLoss*Point;
TP=TakeProfit*Point;
return(INIT_SUCCEEDED);}

void OnTick(){        
  if(OrdersTotal()==0)  {
    if(RSI()>UpperLine){EntryShort();}
    if(RSI()<LowerLine){EntryLong();}
  }
}

double RSI(){return(iRSI(Symbol(),PERIOD_CURRENT,RSIPeriod,AppliedPrice,1));}
void EntryLong(){int d=OrderSend(Symbol(),OP_BUY,0.1,Ask,0,Ask-SL,Ask+TP,"Long",Magic,0,clrNONE);}
void EntryShort(){int d=OrderSend(Symbol(),OP_SELL,0.1,Bid,0,Bid+SL,Bid-TP,"Short",Magic,0,clrNONE);}



行数が長いと見にくいので短くしました。
extern intを、カンマで並列記述
double RSI()は理解のためにrに一度入れていましたが直接return()へ記述
void Entry~の改行を減らしました。

こうやって自分勝手な見にくいソースができていくのですが、ブログでは短いほうがいいと思いますのでご理解ください。

少数3ケタ、5ケタのブローカ向けです。(2桁4桁のブローカーまだあるのかな?)
水色のStopLoss,TakeProfitはdoubleで0.01としていましたがint で10にしました。
黄色の戦闘でSL,TPをdoubleで宣言
OnInitで前処理として SLはStopLoss 掛ける Point、TPはTakeProfit 掛ける Pointとしています。
USDJPYの場合 StopLossは10 Pointは0.001 ですのでSLは0.01      1Pips
EURUSDの場合 StopLossは10 Pointは0.00001 ですのでSLは0.0001  1Pips
と両方1Pipsになりました。


だれか、どの通貨ペアで、どの設定が最適か教えて下さいw








【EAを作ろう】第七回 設定編

前回RSIのシンプルなEAを作成しましたが設定がありません。

よくあるニーズとしてはRSIの期間、終値以外を使いたい、30,70のラインを変更したい。
MAGICナンバーを変えたい。ストップロス、テイクプロフィットを動かしたいというところでしょう。

定数を宣言に int や double を使っていましたがその前に extern もしくは input を付けると設定画面で設定できるようになります。

inputで設定した値はプログラムの中で変更することはできません。
externで設定したものはプログラム中の変更ができます。

前回のEAを変更します。変更点は下線のところです。

extern int UpperLine=70;
extern int LowerLine=30;
extern int RSIPeriod=20;
extern double StopLoss=0.01;
extern double TakeProfit=0.01;
extern ENUM_APPLIED_PRICE AppliedPrice=0;
extern int Magic=747;

void OnTick(){           //ティック関数
  if(OrdersTotal()==0)  {//ポジションが0の時で
    if(RSI()>UpperLine){EntryShort();}//RSIが70を超えていると買われすぎと判断しで売り建てをする。
    if(RSI()<LowerLine){EntryLong();}//RSIが30を下回っていると売られすぎと判断しで買い建てをする。
  }
}

double RSI(){//RSI関数作成
  double r=iRSI(Symbol(),PERIOD_CURRENT,RSIPeriod,AppliedPrice,1);//rにRSIを入れる
  return(r);}//rを戻り値に返す。 

void EntryLong(){//買い建て関数
  int d=OrderSend(Symbol(),OP_BUY,0.1,Ask,0,Ask-StopLoss,Ask+TakeProfit,"Long",Magic,0,clrNONE);
}

void EntryShort(){//売り建て関数
  int d=OrderSend(Symbol(),OP_SELL,0.1,Bid,0,Bid+StopLoss,Bid-TakeProfit,"Short",Magic,0,clrNONE);
}

先日コメント欄で話していた小技を一つ
extern ENUM_APPLIED_PRICE ~ あまり見慣れない記述かと思います。

設定で終値は0 始値は1・・・ という数字で設定する方法もありますが、
ENUM_APPLIED_PRICEと入力すると設定画面が文字表示されわかりやすくなります。


mql4には初めからClosePriceは0 OpenPriceは1・・・と定義されているのです。



メタエディターでENUMと入力するといろいろ候補が出てきますのでチャレンジしてみてください。
ENUM~で定義された定数はint形式になります。



MAGICについて
いろいろソースをみるとMAGICナンバーの宣言は三種類ほど見られます。
#define Magic 4649
int Magic = 4645;
extern int Magic =4646;

上の二つは競合してもユーザ側で選べません。そもそもex4だけだと番号もわかりません><;
extern もしくはinputで選択できるようにしましょう。

 

2016年5月26日木曜日

【EAを作ろう】第六回 RSIのEA作成

RSIをEAを作ります。
ポジションを持たず、RSIが70を超えたら売り30を下回ったら買い建てです。


void OnTick(){            //ティック関数
  if(OrdersTotal()==0)  {     //ポジションが0の時で
    if(RSI()>70){EntryShort();} //RSIが70を超えていると買われすぎと判断しで売り建てをする。
    if(RSI()<30){EntryLong();} //RSIが30を下回っていると売られすぎと判断しで買い建てをする。
  }
}

double RSI(){                                                        //RSI関数作成
  double r=iRSI(Symbol(),PERIOD_CURRENT,20,PRICE_CLOSE,1); //rにRSIを入れる
  return(r);}                          //rを戻り値に返す。 

void EntryLong(){      //買い建て関数
  int d=OrderSend(Symbol(),OP_BUY,0.1,Ask,0,Ask-0.01,Ask+0.01,"Long",747,0,clrNONE);
}

void EntryShort(){   //売り建て関数
  int d=OrderSend(Symbol(),OP_SELL,0.1,Bid,0,Bid+0.010,Bid-0.01,"Short",747,0,clrNONE);
}

OrdersTotal()は現在のポジション数が取得できます。sをよく忘れます。

条件分岐はifは if (条件) {実行} となります。
ややこしいのは左右が同じであればという時は==となります。
違う時は!=です。 >小なり,>=以下,<大なり,<=以上などよく使います。

if(OrdersTotal()==0){ は もしポジションを持っていない時は・・・という事です。

続いて
if(RSI()>70){EntryShort();} もしRSI()が70より多きい時はEntryShort()を実行します。
その下は30未満の時にはEntryLong()を実行です。

RSI()関数はiRSI関数でRSIの値を取り出しています。
iRSI(通貨ペア、足、期間、使用する価格データ、バーの位置)

Symbol()は今回のチャートの通貨ペアを表し、PEROD_CURRENTはチャートの時間軸です。
期間は20、終値の一本前となります。

最後は
int d=OrderSend(Symbol(),OP_BUY,0.1,Ask,0,Ask-0.01,Ask+0.01,"Long",747,0,clrNONE);

OrderSendは発注する関数なのですが戻り値がありますので、
int d=とつけています。コンパイル時の注意を避けるためでdの中身は使いません。

OrderSend(通貨ペア、コマンド、ロット、注文価格、スリッページ、ストップロス、テイクプロフィット、コメント、マジックナンバー、有効期限、矢印の色)

コマンドはOP_BUY、OP_SELLが成り行き買い、売りです。
注文価格は成り行きの時は買いAsk,売りBidです。
スリッページは0
ストップロス、テイクプロフィットは0.01円です。
コメントはLong Shortを入れマジックナンバーは747にしています。
有効期限は0 なしです。





【EAを作ろう】第五回 定義済み変数

MQL4の中には定義済みの変数があります。
非常に便利です。

Bid            現在の売値
Ask           現在の買値 バックテストでは開始時のスプレッドにBidを足したものになります。
Close[1]   終値 
High[1]       最高値
Low[1]      最低値
Open[1]     始値

[]内の数字の本数前の値になります。 一分足では[2]は二分前のバーの終値、一時間足で[2]は二時間前のバーの終値です。
直近の確定値はClose[1]になりますので使用頻度は一番高くなります。

Point    最小桁の1が入ります。
例えばUSDJPYが少数三桁表示105.023の場合Pointは0.001
二桁表示105.02の場合Pointは0.01となります。
通貨によって桁数が変わりますので桁をそろえるのに便利です。
しかしブローカーによって桁が変わる点は困りどころです。






【EAを作ろう】第四回 流れをつかもう

EAの流れを見てみましょう
MetaEditorで新規作成したものからページの都合上注釈を消しています。
そしてTACA的説明を書き込みました。



#property copyright "TACA 2016/05/26 Kyoto" //コピーライト EAを選ぶときに見づらくなります。
#property link      "http://mt4kyoto.blogspot.jp/"//バージョン情報のコピーライトをクリックするとこのサイトに飛びます。
#property version   "1.00"              //バージョンあまり管理していません
//#property strict strictモード いつも消します。  

//このへんに定数の宣言int~ double~が並びます。

int OnInit()                      //EA起動時に一回動作します。
  {
   EventSetTimer(60);                 //OnTimerの間隔です。一秒単位です。今回は60秒
   return(INIT_SUCCEEDED);
  }

void OnDeinit(const int reason)         //EA終了時に一回動作します。
  {
   EventKillTimer();                 //終了時にOnTimerを止めます。なにも殺さなくても・・・
  }

void OnTick()                    //ティックに変動があるたびに動きます。
  {
  }

void OnTimer()                   //EventSetTimerでセットした秒ごとに動作
  {
  }


はじめは#propatyです。iconなんかも設定できるのですが、最初の頃は面倒なので無しでいいかと思います。
strictモードは説明は長くなるので省きますがこいつも必要ありません。

今回は書いていませんが、このあとに定数の宣言を行います。

int OnInitは 前処理です。OnTimerを使う時はここでTimerの感覚をEventSetTimerで宣言します。昔はint Initでした。

void OnDeinitは終了処理です。今回ではOnTimerの設定をEventKillTimerで消しています。
こちらも古いソースコードではint deinitです。

void OnTickはティックが変動するたびに動作します。
この中にエントリーやモディファイ、クローズ処理を書きます。
昔はint startでした。

void OnTimerは設定秒ごとに動きます。ティックは数秒動かないことがありますが、
OnTimerは時間ごとに確実に動きます。OnTimerはバックテストでは無視されます。
ある程度OnTickで作成しバックテストしてからのOnTimerに変更、追加するのが良いと思います。

OnTickとOnTimerの両方に同じ処理を記述することで、1ティック早く動く可能性があります。

ごちゃごちゃと書きましたが前半の関数の宣言とOnTickだけである程度は作れます。
流れだけおぼえて下さい。











【EAを作ろう】第三回 関数編

今回は関数編です。

整数、少数、定数、変数、関数と頭の痛い単語が並んでいます。
しかし最大の難関は関数です。私も初めは全く理解できませんでした。
ここを10回読んでみて下さいw

定数は数値や文字を格納するところ。
関数は処理を格納するところです。

同じ処理を何回も実行する時には関数を作ると便利です。

例)
int a=1,b=2;          //aは1、bは2で整数です。
void OnTick(){        //ティックが動くと動作する関数
Comment( S() );     //Commentの中で関数S()を呼び出し 
}              //OnTick()関数はここまで!

int S(){          //関数S()は整数です。
return(a+b);       //戻り値はa+bです。
}              //S()関数はここまで


今までの整数、少数、文字列を入れていた定数はアルファベットでしたが、
関数はアルファベットに()が付きます。
returnの()の中が戻り値です。CommentのなかのS()に入ります。
Commentの中のS()はreturnの中のa+bという事になります。

つぎはSの()についてです。

例)
void OnTick(){     //ティックが動くと動作する関数
Comment(S(5));   //S()関数に5を渡す
}            //OnTick()関数はここまで!

int S(int d){          //dは整数です。dには上で渡された5が入ります。
int c=d*d;     //cも整数です。cはd掛けるdです。 
return(c);}     //戻り値はcです。


CommentのなかのS(5)はS()関数に5を渡しています。
int S(int d){   ここで5を受け取りdは5だと決めています。
サブルーチンS()の中でint dすなわちdは整数だと宣言しています。
S(){   }の外でdを使うことはできません。
int c=d*d;も同様に S(){     }の外でcを使うことはできません。

例)
void OnTick(){   //ティックが動くと動作する関数
S(1);         //S()関数に1を渡す。
}           //OnTick()関数はここまで!
void S(int d){    //S()関数はvoid(戻り値無し)です。1はdに入れます。
Comment(d);   //dをCommentします。
}           //S()関数はここまで戻り値は無いのでreturnは不要です。

こんどはOnTickの中にCommentはありません。
ただS()関数に1を渡しています。
S()関数は受け取った1をCommentしています。
voidは戻り値がない関数です。関数の中身を実行するだけです。
戻り値が無いのでreturnはいりません。










 

【EAを作ろう】第二回 定数2

第二回です。

整数と少数の説明をしましたが続いてboolです。
boolは白黒はっきりしたがるやつです。
この宣言をすると1か0のどちらかになります。

例)
bool a=1;
bool b=true;
bool c=TRUE;
bool d=True;
void OnTick(){
Comment(a,b,c,d);
}


結果は1111と表示されます。
a,b,c,dすべて1という事です。
0,false,False,FALSEの時は0が格納されます。
※大文字小文字の区別がなさそうですがTrUeとした場合エラーが出てコンパイルできませんw

続いて文字列です。

例)
string a="TACA";
string b="さま素敵";
void OnTick(){
Comment(a+b);
}



左上の表示はどうなったでしょうか?10回大きな声で読んでみてください!

そんなに素敵と言われると照れてしまいます♪

定数にはcolor色定数や日時定数等ありますが、
そちらはまたの機会に紹介します。

intは整数
doubleは少数
stringは文字
void OnTick()はティック変動時に動作する関数
Commentはチャート左上に文字を出します。(バックテストではビジュアルモードにしてください)




【EAを作ろう】第一回 定数

いつもコメントや応援ありがとうございます。
非常に励みになります!

MT4を使う人には三種類のタイプがあります。

  • EAの作成に興味がなくひたすらEAを探すタイプ。
  • 興味があるが、敷居が高いもしくはうまく作れない。
  • ガツガツEAを作成するタイプ。
このブログを読まれている方は真ん中のタイプが多数派です。
そこで、TACA的MQL4解説をしてみたいと思います。



今日は定数です。変数と言いたいところですが原文がconstantなので定数とします。

定数とは数字や文字を入れておく物です。
大文字、小文字も区別します。AAとAaは別として扱われます。

例)
int a;  // aを整数として使うことを宣言
a = 1;   // aを1にします。

//は注釈です。//から行の終わりは落書きゾーンとなります。
複数行にまたがるときや、行の一部分だけの時は/*   */と記載します。

例)
int a;// ここはメモ
a = /* ココもメモ*/ 1;

オレンジ色の部分はプログラムには無視されます。
そしてコマンドの最後には必ず;セミコロンを付けましょう。

intは整数ですが、少数を使いたいときはdoubleを使いましょう

例)
double b=0.5;      //bを0.5にします。
void OnTick(){      //ティックが動くたびに動作する
Comment(b);            //bをチャートの左上に表示
}             //OnTick終了
      

先程までは aの使用を宣言して、次の行でaは1と入れていますが、一緒にすることも可能です。
void OnTick()は関数です。そのあとの { から } までをティックが動くたびに実行します。
Commentは ( )の中をチャートの左上に表示ます。テスター(バックテストの画面)のビジュアルモードにしてチャートの左上を見て下さい。
0.5と表示されます。

※double b=0.5;をint b=0.5;にしてみてください。コンパイルすると整数に少数が入っていると注意がでますがex4は作成できます。結果は0と表示されます。intにすると少数以下は切り捨てられます。

例)
int a=1.1,b=10;     //int a=1.1; int b=10;を,カンマで一つにすることができます。
void OnTick(){
Comment(a * b);   //*は掛け算です
}


この場合どうなるでしょうか? intで整数と宣言していますのでa = 1,b = 10と記憶されます。
Commentの中でa * b (aとbを掛け算しています) 1 * 10 で10と表示されます。

double a=1.1,b=10;とした場合は11となります。












2016年5月25日水曜日

EA HappySet 祝 ブログ10,000アクセス突破! 祝 AMSER 実現損益NO1! 祝 FX-ON連載決定!

このブログはMT4と京都のブログです!
京都と言えばナルド(マクドナルド)です。西日本で最初にナルドができたのは京都なんです!
もう一つ京都は学生の街という顔もあります。バンドが盛んなのはそのせいでしょうか!

さて今朝ブログを見て驚きました!!
アクセス件数が10,000を突破していました!!
皆さま本当にありがとうございます!!

そしてFX-ONの実現損益をみてみるとAMSERが期間一か月で今朝も一位でした!
出品して一か月弱のEAが期間三カ月でみても二位!!!
野望に向かってまっしぐらです!!

さらにFX-ONに記事の連載が決まりました!!
二、三日中には一話掲載されるようです!!

そこで今日はEA HappySet!!
前述のように京都といえばナルドとバンド!
このEAはMACDとBandsを使いコツコツと稼いでくれるやつです!!
(強引な振りでしょうか!!)
このチャートみるとSLなしのナンピン系と思われる方もいると思いますが!
完全SL付きの1本エントリー物です!

バックテストはビジュアルモードでもやってみてください!
コメントを入れました!!

#property copyright "Copyright 2016/5/25,TACA"
#property link      "http://mt4kyoto.blogspot.jp/"
datetime TO;int d,i;double TSL,SL,OTSL;
extern int MAGIC=10000;//ブログ10,000アクセス記念
extern double Lots=0.2;
extern int MaxSpread=5;//Spread上限
double R(int TimeFrame){return(iRSI(NULL,TimeFrame,14,0,1));}//RSI TimeFrameは期間
double B(int Mode){return(iBands(NULL,1,20,2,0,0,Mode,1));}//Bands Modeは1上2下のライン
string ModeText[3]={"祝 ブログ10,000アクセス突破!!","祝 AMSER FX-ON実現収益No1!!","祝 FX-ON連載開始!!"};
void OnTick()
{
MathSrand(GetTickCount());
CS();Comment(ModeText[(MathRand()%3)]);
if(Time[0]!=TO){TO=Time[0];
if(MarketInfo(Symbol(),MODE_SPREAD)<=MaxSpread){
if(OrdersTotal()==0){
if(R(5)<30){if(R(1)<30){if(B(2)>Close[1]){E(0);}}}//&&を使用するよりこの形のほうが高速
if(R(5)>70){if(R(1)>70){if(B(1)<Close[1]){E(1);}}}
}}}}

void E(int BoS){
if(BoS==0){TSL=Ask;SL=TSL-30*Point;}else{TSL=Bid;SL=TSL+30*Point;}
d = OrderSend(Symbol(),BoS,Lots,TSL,0,SL,0,NULL,MAGIC,0,clrNONE);}

void CS(){
d=OrderSelect(0,SELECT_BY_POS);
if(OrderType()==0)
 {if(TSL<Close[0]){TSL=Close[0];SL=TSL-30*Point;}}
else
 {if(TSL>Close[0]){TSL=Close[0];SL=TSL+30*Point;}}
if(TSL!=OTSL){OTSL=TSL;
d=OrderSelect(0,SELECT_BY_POS);
d=OrderModify(OrderTicket(),OrderOpenPrice(),SL,0,0,clrNONE);}}


//さて今日のブログにいくつ!が入っているでしょうか?

2016年5月23日月曜日

祝 AMSER FX-ON実現収益 一か月 NO.1

EAで一番大事なことはいくら稼いでくれるかという事です!
いくら収益率が高くても、PFが高くてもDDが少なくてもやはり最後は実現損益です。

以前ご紹介いたしましたAMSER ですが、もうすぐ出品から一か月になります。
そして4/26~5/20までの計測でなんと全EA中 NO1です!!

特徴を見ていきます
他のEAは一ケ月のデーターですが、AMSERはまだ一か月経っていません。
一か月たつと更に差が開くことが予想されます。

一か月の取引回数ですが 他のEAは2桁 19~89回ですがAMSERは275回です。
取引回数が多いという事は、より安定している証ではないでしょうか。
ブローカーにはらう手数料も多いので、貢献していることにもなりますね。

FX-ONのフロントテストは1,000,000円スタートです。
複利系のEAは元金が多いほど実現損益は大きくなります。
つまり昔から稼ぎ続けてるEAほど一か月前の元金は大きく実現損益は大きくなります。
AMSERは100万円⇒226,941円の利益です。

以前野望を書いています。実現損益ベスト5を私のEAで埋め尽くすというものですが、
一歩近づいた気がします。





2016年5月20日金曜日

EA 往復ビンタ CS

往復ビンタ君 というEAがあります。
前足が上昇した時は下降にベットするEAなのですが、過去データーから見ると4時間足以上で有意差があるという結果がでました。

しかしクローズをシャンデリアストップにすると1分足でも稼げるようになりました。
複利なしで10万 ⇒五か月⇒ 100万
うーん我ながらすごいw


しかし最近エントリーE()とTS()の関数ばかり使っている気がします・・・


#property copyright "Copyright 2016/5/20,TACA"
#property link      "http://mt4kyoto.blogspot.jp/"
extern int TSProfit=20;
extern int MAGIC=12;
extern int Spread=4;
extern double Lots=0.2;
datetime TimeOld;
int d,i;
double TSL,OTSL,SL;

void OnTick()
{
TS();
if(OrdersTotal()==0){
if(MarketInfo(Symbol(),MODE_SPREAD)<=Spread){
if(Time[0]!=TimeOld){TimeOld=Time[0];
if(Close[2]>Close[1]){E(0);}
if(Close[2]<Close[1]){E(1);}
}}}}

void E(int BoS){
if(BoS==0){TSL=Ask;SL=TSL-TSProfit*Point;}
else{TSL=Bid;SL=TSL+TSProfit*Point;}
d=OrderSend(Symbol(),BoS,Lots,TSL,2,SL,0,NULL,MAGIC,0,0);}

void TS()
{d=OrderSelect(0,SELECT_BY_POS);if(OrderType()==0)
{if(TSL<Close[0]){TSL=Close[0];SL=TSL-TSProfit*Point;}}
  else
{if(TSL>Close[0]){TSL=Close[0];SL=TSL+TSProfit*Point;}}
if(TSL!=OTSL)
{OTSL=TSL;for(i=OrdersTotal()-1;i>=0;i--)
{d=OrderSelect(i,SELECT_BY_POS);
 d=OrderModify(OrderTicket(),OrderOpenPrice(),SL,0,0,0);}}}

VPS サーバーの設定 軽量化!

先日K氏と話していた時にVPSのMT4 軽量化について考えてみました。
わたくしのやっていることをまとめてみます。

ニュースの削除
「ツール(T)」 ⇒ 「オプション(O)」 ⇒ 「サーバー」タブ ⇒ 「ニュースを有効にする(N)」のチェックを外す。

音の削除
オプション画面より「音声設定」 ⇒ 「有効にする」のチェックを外す。

不要なバーを減らす
「チャート」タブ ⇒ 「ヒストリー内の最大バー数」 と 「チャートの最大バー数」の数字を減らす。
※プルダウンになっていますが直接数字を入力できます。
動かすEAの仕組みがわかっている時はインディケーターの使う本数+数本で大丈夫です。
ex.平均期間20なら30本程度
よくわからない時でも1,000本もあればまず問題ないと思います。
デフォルトから1,000本に変更すると40MB程度メモリーが軽減できます。

①②③が終われば「OK」を押して確定してください。

不要なウィンドウ等の削除
a.不要なチャートの削除
b.不要なインディケーターの削除
c.「気配値表示」 CTLR+M 削除
d.「データーウィンドウ」CTRL+D 削除
e.「ナビゲーター」CTRL+N 削除
f.「テスター」CTRL+R 削除

不要なファイルの削除
「ファイル(F)」 ⇒ 「データーフォルダを開く」
MT4を落とす。
「history」フォルダー ⇒ 「ブローカーの名前」のhstファイルをすべて削除
「history」フォルダー ⇒ 「mailbox]フォルダー ⇒ すべて削除
「MQL4]フォルダー ⇒ 「Logs」 と 「Libraries」  と」「Scripts」の中をすべて削除
「MQL4]フォルダー ⇒ 「Experts」と「indicators」の不要なものをすべて削除
※使うEAとインディケーターは残しておいてください。


これで200MB程度あったメモリーが50MB以下になります。
③と⑤は劇的に減りますがよくわからない時は
③は1,000
⑤は上二つにしておきましょう

自己責任でお願いします!






 










2016年5月19日木曜日

EA EADoChin 窓珍

昨日は御霊祭という事で昼間っから姉小路のBEER&ソーセージの店で飲みすぎてグダングダンでした。姉小路と御霊祭は全く関係ないのですが♪
窓がらみのEAを作成したのですが、今朝読み返してみるとグダングダンでした。


そこで修正点をリビルトいたしました。
一万円三年で525円、スプレッド正常化を待ってからのスタートですのでさらに収益は見込めません。
シャンデリア・トレーリングよりも窓の大きさでTPを分けたほうがよさそうです。
窓埋め後の反転もあるそうなのですが・・・・



#property copyright "Copyright 2016/5/19,TACA"
#property  version  "1.1"
extern int MAGIC=4;
extern double Lots=0.01;
datetime TimeOld;
int d,i;
double TSL,OTSL,SL,TP;

void OnTick()
{
TS();
if(OrdersTotal()==0){
int hh=Hour(),mm=Minute(),dw=DayOfWeek();
if(Time[0]!=TimeOld){TimeOld=Time[0];
if(hh==0&&mm==0&&dw==5){
if(Open[0]>Close[1]){E(1);}else{E(0);}
}}}}

void E(int BoS){

if(BoS==0){TSL=Ask;SL=TSL-20*Point;TP=TSL+200*Point;}
else{TSL=Bid;SL=TSL+20*Point;TP=TSL-200*Point;}
if(MarketInfo("USDJPY-a01",MODE_SPREAD)<=4)
{d=OrderSend("USDJPY-a01",BoS,Lots,TSL,0,SL,TP,NULL,MAGIC,0,clrNONE);}
else
{E(BoS);}
}

void TS()
{d=OrderSelect(0,SELECT_BY_POS);if(OrderType()==0)
{if(TSL<Close[0]){TSL=Close[0];SL=TSL-20*Point;}}
  else
{if(TSL>Close[0]){TSL=Close[0];SL=TSL+20*Point;}}
if(TSL!=OTSL)
{OTSL=TSL;for(i=OrdersTotal()-1;i>=0;i--)
{d=OrderSelect(i,SELECT_BY_POS);
 d=OrderModify(OrderTicket(),OrderOpenPrice(),SL,TP,0,clrNONE);}}}

2016年5月18日水曜日

EA MADo 窓

今見直してみると金曜日を指定するのを忘れていました。
スプレッドが上がる時間ですので、リアル稼働にはスプレッドが下がるまで発注を繰り返すもしくは待つルーチンがいりますね
しかしスプレッドはバックテストでは変動しないので、うーん
没かな...

FXの世界には窓という単語があるようです。
金曜日クローズから月曜日オープンまでの差を窓というのですが、
月曜日のオセアニアスタート時には窓の反対に動くといわえる窓梅埋めという現象が起こるようです。

ほんとかなぁ~と疑惑の目で検証してみました。

EA MadoChin

今回は10,000円スタートですw


サーバー時間の0時に前足を確認して、トレーリングします。
前足が上がっていればSHORT
下がっていればLONGです。
シャンデリアトレーリングを付けています。
固く年利9% 銀行の金利0.01%900倍ですw

#property copyright "Copyright 2016/5/18,TACA"
#property  version  "1.1"
extern int MAGIC=4;
extern double Lots=0.01;
datetime TimeOld;
int d,i;
double TSL,OTSL,SL,TP;
double Bull(){return(iBullsPower("USDJPY-a01",5,13,0,1));}
double Bear(){return(iBearsPower("USDJPY-a01",5,13,0,1));}

void OnTick()
{
TS();
if(OrdersTotal()==0){
int hh=Hour(),mm=Minute();
if(MarketInfo("USDJPY-a01",MODE_SPREAD)<=4){
if(Time[0]!=TimeOld){TimeOld=Time[0];
if(hh==0&&mm==0){
if(Open[0]>Close[1]){E(1);}else{E(0);}
}}}}}

void E(int BoS){
if(MarketInfo("USDJPY-a01",MODE_SPREAD)<=4){
if(BoS==0){TSL=Ask;SL=TSL-20*Point;TP=TSL+200*Point;}
else{TSL=Bid;SL=TSL+20*Point;TP=TSL-200*Point;}
if(OrderSend("USDJPY-a01",BoS,Lots,TSL,0,SL,TP,NULL,MAGIC,0,clrNONE)==-1){E(BoS);}}}

void TS()
{d=OrderSelect(0,SELECT_BY_POS);if(OrderType()==0)
{if(TSL<Close[0]){TSL=Close[0];SL=TSL-20*Point;}}
  else
{if(TSL>Close[0]){TSL=Close[0];SL=TSL+20*Point;}}
if(TSL!=OTSL)
{OTSL=TSL;for(i=OrdersTotal()-1;i>=0;i--)
{d=OrderSelect(i,SELECT_BY_POS);
 d=OrderModify(OrderTicket(),OrderOpenPrice(),SL,TP,0,clrNONE);}}}









2016年5月17日火曜日

サーバー比較 お名前.COM US vs 日本 vs 自宅 vs バックテスト(3種類)

宿題にしていましたサーバーの比較をしました。
首題の6パターンの比較になります。
FX-ONは一日単位でしか出ませんので今回はパスです。

またしても細かい表ですが作成に苦労したのでお許しください。
この日の取引は六回でした。

上からお名前.COM 日本、お名前.COM US、自宅PC、バックテスト全ティック、コントロールポイント、始値です。
 



最下段バックテストの始値ですが、5回目の取引をしていません。
CLOSEの時間ずれが3/5回 価格はトータル7ポイントのずれが出ています。
やはり始値はダメですね。

全ティックとコントロールは1ポイントのずれ。時間は同じです。
なかなか優秀です。

リアルテスト同士の比較ですが、3比較ですので多数決方式を取ります。
日本は2ポイント 一回、USは4ポイント 一回のずれです。
エントリー時間はすべて秒単位まで同じです。
多数決で一番多数派は自宅PCです。

リアルテストと全ティックとの比較です。
リアルテストはエントリー時間が数秒遅れていますが、リアル同士が同じです。
遅延ではなく、ティックが止まっていたという事でしょう。

価格のずれは全ティックと比べて 
お名前.COM 日本 -19ポイント
お名前.COM US -16ポイント
自宅PC        -17ポイント 
ずべて損するずれのほうが得するずれより回数、金額ともに多い結果でした。

結論ですが、データーが少ないので確証とまでは言えませんが、
OANDAで取引するならお名前.COMのUSサーバーが良いようです。
OANDAではBeeks FXが早いと謳っていますのでその選択もいいかもしれませんね。

結果はリアルテストとバックテスト始値が一番近いことが多々ありましたので、少し期待していたのですが、論外でした。
コントロールポイントが意外とよかったので条件設定はコントロールポイント、最後の確認は全ティックでよさそうです。







2016年5月16日月曜日

EA TACA Bands

さて、TACA Bandsに挑戦する時が来ました。

じつは、ボリンジャーバンドの平均から偏差をとることには前々から大きな不信感がありました。
そこで終値から偏差をとるTACABandsです。



EURUSDの5Mです。期間は2015年一年間

スプレッドを1下げるとかなり改善しますのでみんなのFXやFXTFあたりでUSDJPY 0.3Pipsなんかも面白そうです。

#property copyright "Copyright 2016/5/16,TACA"
#property link      "http://mt4kyoto.blogspot.jp/"
extern int TSProfit=20;
extern int MAGIC=9;
extern int Spread=5;
extern double Lots=0.1;
datetime TimeOld;
int d,i;
double TSL,OTSL,SL;
double TACABands(int Mode)
{return(iBands(Symbol(),0,20,2,0,0,Mode,2)-iBands(Symbol(),0,20,2,0,0,0,2)+Close[2]);}
void OnTick()
{
TS();
if(OrdersTotal()==0){
if(MarketInfo(Symbol(),MODE_SPREAD)<=Spread){
if(Time[0]!=TimeOld){TimeOld=Time[0];
if(TACABands(2)>Close[1]){E(0);}
if(TACABands(1)<Close[1]){E(1);}
}}}}

void E(int BoS){
if(BoS==0){TSL=Ask;SL=TSL-TSProfit*Point;}
else{TSL=Bid;SL=TSL+TSProfit*Point;}
d=OrderSend(Symbol(),BoS,Lots,TSL,2,SL,0,NULL,MAGIC,0,0);}

void TS()
{d=OrderSelect(0,SELECT_BY_POS);if(OrderType()==0)
{if(TSL<Close[0]){TSL=Close[0];SL=TSL-TSProfit*Point;}}
  else
{if(TSL>Close[0]){TSL=Close[0];SL=TSL+TSProfit*Point;}}
if(TSL!=OTSL)
{OTSL=TSL;for(i=OrdersTotal()-1;i>=0;i--)
{d=OrderSelect(i,SELECT_BY_POS);
 d=OrderModify(OrderTicket(),OrderOpenPrice(),SL,0,0,0);}}}

ボリンジャーバンドの謎 インディケーター TACA Bands

ボリンジャーバンドはメジャーなインディケーターのひとつです。
過去の平均と偏差を求め平均から±σに収まらない確率は68.3%
二倍の±2σは95.4%、さらに三倍の±3σは99.7%となっています。
もともとはトレンド系としてバンドウォークの予想に使われましたが、オシレーターとしてもよく使われます。バンドが収縮した後にバンドを突き抜けバンドウォークするか反転するかの目安です。
明日はあれ時々曇り所により大雨の可能性があるというのと同じですね。

オシレーターとしてはよく使われるのは14の2σ、20の2σかと思います。
一分足に置きなおしてみると60分の間に収まらないのは理論上2.76本です。
それでは見てみましょう 赤がボリンジャー上下と平均 青が終値です。


幅をちょうど一時間にしてみましたが4本はみ出ています。
このままスライドさせて過去10時間ほどを検証したところ、
平均は四本弱。二本になったのは一回だけです。

まえから少し多い気がしていたのですが、やはり多いですね。

まあ、10時間ではエビデンスとしては弱いと思うのでEXCELでUSDJPY5分足 過去10年を分析してみました。(1分足は多すぎてEXCELに収まらないので5分足でのチャレンジです。)

結果上に突き抜ける確率5.4% 下に突き抜ける確率5.4% 83万本の足を使用していますので、誤差はほぼないと考えられます。

理論上4.6%が事実は10.8% いったいどうゆう事でしょうか。
念のためEURJPYで確認したところ5.3%と5.4%ほぼ同じ結果です。

元来の疑問がありました。期間20の偏差を使うのはわかりますが、なぜ期間20の平均線から偏差をとるのでしょうか、終値から偏差を取らないと激しく価格が変動した時にはσラインを超え続けることになります。

そこでひさびさにインディケーターを作成
TACA Bandsたかバンドです。



ボリンジャーバンドは期間20の平均から上下に期間20の偏差を取っています。
たかバンドは終値から上下に期間20の偏差を取り足一本分右にずらしています。

右にずらすのは一本前のバンド幅を超えないという考えからです。
少し見たところバンドウォークは少なく、線を超えた時は反転が多くなった気がします。

#property copyright "Copyright 2016/5/16,TACA"
#property link      "http://mt4kyoto.blogspot.jp/"
#property indicator_chart_window
#property indicator_buffers 2
#property indicator_color1 Red
#property indicator_color2 Red
#property indicator_width1 1
#property indicator_width2 1
#property indicator_type1 DRAW_LINE
#property indicator_type2 DRAW_LINE
double UPLINE[];
double BelowLINE[];
int OnInit()
{
SetIndexBuffer(0,UPLINE);
SetIndexBuffer(1,BelowLINE);
return(0);}
int start()
{
int limit=Bars-IndicatorCounted();
for(int i=limit-1;i>=0;i--)
  {
  UPLINE[i]    = iBands(Symbol(),0,20,2,0,0,1,i+1) - iBands(Symbol(),0,20,2,0,0,0,i+1) + Close[i+1];
  BelowLINE[i] = iBands(Symbol(),0,20,2,0,0,2,i+1) - iBands(Symbol(),0,20,2,0,0,0,i+1) + Close[i+1];
  }
return(0);}






2016年5月15日日曜日

OnTick() と OnTimer()

昨日は三条地ビール祭り。
本日は葵祭の賀茂祭りです。
御所から行列が出るのですが、なぜか御所にカウンタックが集合していたようです。
そして、三条に戻ると檀王法林寺で沖縄フェスティバル
18日は御霊祭、21日は五月満月祭り
う~ん しあわせ♪
そして神様にお願いするのは一つ 今日もよいEAができますようにw

さて、今日はリアルテストをバックテストに近づける為の考察です。
EAのソースコードの中のメイン部分は
void OnTick(){・・・・}
の中にあります。
ティックが動くたびに動作します。
つまり一秒間に何回も動いたり何秒間も動かなかったりします。

まだ、試験中ですがお名前.COM VPS米国設置(NYではなかったようです)と日本設置に差がない結論に落ち着きそうです。
片道100ms(0.1秒)程度の遅れはさほど差がないということかもしれません。

では、なぜエントリーが十秒もおくれるのか?
もしかしたらティックが動かないから待っているのかもしれません。

そこで、OnTimerを考えてみました。
OnTimerは設定した時間ごとに動きます。
TakeProfitやStopLossの可変はOntick() で実行し、エントリーはOnTimer設定一秒にすれば、価格の変更はティックが動くたびに変更、エントリーは一秒ごとに実行ということになります。
エントリーをOnTick()からOnTimerにすることで、時間のずれはともかく1ティック分エントリーが早くなるのはメリットです。

しかしOnTimerはバックテストでは一切動きません(汗)
バックテスト完了まではOnTick()でリアルテスト前にはOnTimer()にするとよさそうですね。

VPS米国 vs VPS日本 vs 家のPC vs FX-ONの結果が出ましたら挑戦してみたいと思います。





EA MAD(MA-TS) VS MADMACD

以前ブルベアとMA-TSの比較をしました。
ブルベアもノリ?が良かったのですがMAはさらに良い成績が出ました。

単純に平均ではなく平均の乖離率をオシレーター使用していますので名前をMADにしました。
少し期間をかえてのバックテストですが、安定していい数字が出ています。
しかし!!!!

勝率が気に入りません。
純益 = (勝率 x 平均価値トレード + 負率 x 平均敗トレード) x 総取引数
ですので一概に勝率だけではないのですが、上げたいのは人の心です。


そこでコンビ―ネーションにします。
RSIの二階建てやMACD+RSIなどよくやる手法なので一通り試すことにします。




完敗です。利益が上がるものはできませんでした。
しかし、気になるものが一点だけ
MAD&MACDです。

勝率は43.16%から46.84%に大幅アップ
平均勝トレードは241から254へ微増
平均敗トレードは-144から―150へ微減

素晴らしい限りですがトレード数が約28,000から2,487へ大幅ダウン

複利システムの場合勝率が非常に重要なポイントになりますが、これではどうでしょうか・・・





#property copyright "Copyright 2016/5/9,TACA"
#property link      "http://mt4kyoto.blogspot.jp/"
extern int TSProfit=20;
extern int MAPeriod=5;
extern double MADevision=0.0003;
extern int MAGIC=9;
extern int Spread=4;
extern double Lots=0.1;
datetime TimeOld;
int d,i;
double TSL,OTSL,SL;
double MAD(){return((iMA("",0,MAPeriod,0,0,0,1)-Close[0])/Close[0]);}
double RSI(){return(iRSI("",0,14,0,1));}
double Bands(int Mode){return(iBands("",0,20,2,0,0,Mode,1));}
double MACD(int Mode,int Shift){return(iMACD("",0,12,26,9,0,Mode,Shift));}
void OnTick()
{
TS();
if(OrdersTotal()==0){
if(MarketInfo(Symbol(),MODE_SPREAD)<=Spread){
if(Time[0]!=TimeOld){TimeOld=Time[0];
if(MAD()>MADevision    && MACD(0,1)>MACD(1,1)&&MACD(0,1)<0){E(0);}
if(MAD()<-1*MADevision && MACD(0,1)<MACD(1,1)&&MACD(0,1)>0){E(1);}
}}}}

void E(int BoS){
if(BoS==0){TSL=Ask;SL=TSL-TSProfit*Point;}
else{TSL=Bid;SL=TSL+TSProfit*Point;}
d=OrderSend(Symbol(),BoS,Lots,TSL,2,SL,0,NULL,MAGIC,0,0);}

void TS()
{d=OrderSelect(0,SELECT_BY_POS);if(OrderType()==0)
{if(TSL<Close[0]){TSL=Close[0];SL=TSL-TSProfit*Point;}}
  else
{if(TSL>Close[0]){TSL=Close[0];SL=TSL+TSProfit*Point;}}
if(TSL!=OTSL)
{OTSL=TSL;for(i=OrdersTotal()-1;i>=0;i--)
{d=OrderSelect(i,SELECT_BY_POS);
 d=OrderModify(OrderTicket(),OrderOpenPrice(),SL,0,0,0);}}}





2016年5月13日金曜日

VPS借りてみました!!

無料のお試しでVPSを借りました。

借りたのはOANDAから二カ月無料の「お名前.COM」国内
そして「お名前.COM」NewYork サーバー 15日無料

比較するのは、FX-ONのフロントテスト(OANDA社)
自宅のEPSONのNP-30S(ウルトラロースペックPC)
そしてバックテストです。
結果は後日ですがAMSERで比較します。

FX-ONのフロントテストはOANDA社という以外詳細不明です。
お名前.COM 国内はMT4  一枚
お名前.COM NYはMT4  三枚
自宅PC   MT4    八枚
バックテストは全ティックを予定していますが始値も興味があります。

まずは導入前のイメージ(先入観?)ですが
操作感は        国内>NY 近いから当たり前ですね。
エントリーのスピードは NY>国内 OANDAのサーバーはNYにあるからこれも当然ですね。ちなみに国内からOANDAサーバーまで約140msかかるようです。
往復で280ms。NYからは約40ms 往復で80msということは0.2秒ほど早くなる予定です。
また、めたぶろ先生によると お名前.COMのアメリカサーバーは重いとの事でした・・・

そして導入(インストール)
Windows2012R2と2008を選べます。注意書きには2012R2を推奨と書いていますが、あちこちのサイトでは2008が軽くてよいと書いていました。
国内サーバーにアクセスすると始めから2008になっていますw
そしてMT4インストール済み これは便利と思いきや旧バージョン760?がインストールされておりアップデートできません。ログインすらできませんでした。
再度新しいMT4をインストールして午前終了 意外と苦労しました
初めてのVPSの感想は結構操作が重いの一言です。

続いてNYサーバーさらに操作が重いことを覚悟しつつやってみました。
こちらは2012R2が入っていたので2008をクリーンインストール
ワンクリックですできるのは素晴らしいですね。
そしてMT4を三つインストールしたのですが国内より圧倒的に軽い操作感ですね。
これは期待できそうです。

比較結果は来週報告します!!









【検証】リアルテスト と バックテストの違い その2

前回はリアルテストバックテストの差の検証をしました。
原因の一つはスリッページを2にしていることが怪しいと考えました。
スリッページを2にしていると損する側に2ずれることが多かったのです。

おなじEAでスリッページを0にしてレアルテストとバックテストの比較です。

前回も一日、今回も一日なのですが今回は取引量が4倍になっています。
日によってこんなに違うものなのですね。

スリッページ0での予測されるメリットはエントリー時のずれが減るという事です。
デメリットは取引回数が減る懸念です。

今回も小さくビジーな表で申し訳ありません。
もともと0秒で発注するEAなのですが0秒でないところを赤くしました。

前回はすべてで42秒のずれエントリー数は14回でしたので3秒/回でした。
今回はトータル71秒のずれ、エントリー回数は61回 1.2秒/回です。

エントリーの価格差は
前回は31Points 14回  2.2Points/回
今回は106Point  61回 1.7Points/回

データーが少ないので確定的ではありませんが大きく改善していますね。

そして取引回数ですが、バックテストより多くなっています。
バックテストでクローズできなかったところがリアルでは出来ているようです。
リアルのほうがバックテストよりティックの動きが激しいのでしょうか・・・

少し改善しましたがやはりサーバーを借りようかと思います。


2016年5月10日火曜日

【検証】リアルテスト と バックテストの違い

バックテストとリアルテストの違いについて悩んでいます。

まず単語から・・・
バックテスト ⇒ MT4のストラテジーテスターでの検証

リアルテスト ⇒ 現金を運用しながら本番でテスト

フロントテスト ⇒ デモ口座でのテスト 英語表記では多くみられる。
            辞書的には前面、前側 BACKの対義語
フォワードテスト⇒フロントテストと同意 日本語表記ではこちらが主流
            辞書的には将来、未来的意味合いがある。対義語はBACKWARD

フォワードテストやフロントテストにリアルテストの意味合いを含んでいる時もありますので複雑なのですが・・・ 悩ましい限りです。

TACA的には上の表記にします。
フロントvsフォワードはフロントにします。
(入力タイプ数は両者7文字ですが指の移動が少ないのでw)

バックテストとフロントテストの結果に差が出るのは有名な話ですが、フロントテストとリアルテストにも差が出るという話があります。(未検証)

バックテストは数分から多くても数日で終わりますがフロントテスト、リアルテストは数日では終わりません。
数か月かけてフロントテストを実施してその結果がリアルテストと異なる可能性があるのであれば、フロントテストはする意味がありません。Time is Money!!です。

現在10数個のEAをリアルテストにかけています。
すべてのEAが同時刻のバックテストでは利益を出しているのに、リアルテストは損益が少ないもしくはマイナスになっています。

そこで検証です。




左がリアルテストOANDA社、右がバックテストOANDA社のデーター
このEAは一分足で足が変わるタイミングで発注
シャンデリア・トレーリングでストップロスを動かしていきます。

まず0時、1時の発注が消えています!!
PCの遅延もしくは、10年前の旧式ルーターが遅いか、マンション光の遅延でしょうか。
解せません。 ⇒ PCとルーターの買い替えもしくはVPS導入がいいかもしれません。

また、バックテストの段がずれているところはリアルでは二つに分けられています。
決済はストップロス、サーバー側での計算になりますのでネットの遅延は考えられません。
同じOANDA社のリアルデーターに差があるのでしょうか??
これがフロントテストとリアルテストの差になるのかもしれませんね。

リアルテストは秒単位まで表示されますが、バックテストは分単位です。
足が変わるタイミングで発注しますので0秒に発注されるはずです。
バックテストは0秒発注で計算されていますが 赤字のところをご覧ください。
リアルは遅延が出ています 最大13秒も・・・

次は緑の文字を見て下さい。ここがバックテストとの差異です。
発注時のプライスが2ズレるところが多くあります。
ソースを見ると発注時のスリッページを2にしています。
スリッページを0にすると解決するのでしょうか?もしくは発注されなくなるのでしょうか?
発注は成り行きにしていますが、指値にしたほうがいいかもしれません。
サーバーでは成り行きが指値より優先されますので、検証が必要ですね。

クローズの時間はずれが見当たりません。
バックテストは秒が表示されないので何とも言えないところですが・・・

発注に比べて価格もずれが少ない様に見えます。
サーバー側での処理だからでしょうか。

結論
①VPSの導入
 自宅PCの限界(EPSON NP-30NでMT4 十数個稼働)
 マンションタイプのネット たまに遅延がある。
②エントリー時に指値発注、スリッページ0を検討
 サーバー側での処理のほうがバックテストに近い

安定環境と発注決済はサーバー(ブローカー)に任せることですね。







 




2016年5月9日月曜日

EA MA-TS   平均MA VS BULL,BEAR

平均からある乖離すると反転するというイメージでBULL,BEARのEAの作成を思いつきました。
泥酔状態での作成でしたが思ったより安定かつ結果がよく、大きな反響をいただきました。

BULL'S POWERは過去13回の最高値EMAと直近の終値との差Bear'S POWERは最低値EMAとの差です。

下の図は緑が終値
赤が最高値EMA(13) 青は最低値EMA(13) そして黄色は終値SMA(13)です。
SMA:単純平均 EMA:指数平均


印象は赤と青が平行しているのが驚きでした!
黄色をEMAにすると赤と青の間を走るのであえてSMAにしてみたのですが、黄色のほうがなだらかですね。
BULL,BEARにしなくても平均でいいかもと思ってきました。
ブルベアのメリットはブルベアのEAがあまりないので希少性、話題性はありそうです。
平均のメリットはブルとベアに分けないですむことと設定が簡単なことです。



ブルベアの時は期間を標準の13以外は試さなかったのですが、MAは期間も調整しました。
SMAの期間5 シャンデリア・トレーリングを付けました。
ブルベアはM5でしたがこちらはM1です。
取引数がブルベア 2,271 ⇒ MA 21,229へ増加 足が違うので当たり前かもしれません足の増加は5倍に対し9倍は驚くべきことです!
利益は ブルベア113,170 ⇒ MA468,220大幅増加です。

#property copyright "Copyright 2016/5/9,TACA"
#property link      "http://mt4kyoto.blogspot.jp/"
extern int TSProfit=20;
extern int MAPeriod=5;
extern double MADevision=0.0003;
extern int MAGIC=9;
extern int Spread=4;
extern double Lots=0.1;
datetime TimeOld;
int d,i;
double TSL,OTSL,SL;
double MA(){return(iMA(Symbol(),0,MAPeriod,0,0,0,1));}
double MAD(){return((MA()-Close[0])/Close[0]);}
void OnTick()
{
TS();
if(OrdersTotal()==0){
if(MarketInfo(Symbol(),MODE_SPREAD)<=Spread){
if(Time[0]!=TimeOld){TimeOld=Time[0];
if(MAD()>MADevision){E(0);}
if(MAD()<-1*MADevision){E(1);}
}}}}

void E(int BoS){
if(BoS==0){TSL=Ask;SL=TSL-TSProfit*Point;}
else{TSL=Bid;SL=TSL+TSProfit*Point;}
d=OrderSend(Symbol(),BoS,Lots,TSL,2,SL,0,NULL,MAGIC,0,0);}

void TS()
{d=OrderSelect(0,SELECT_BY_POS);if(OrderType()==0)
{if(TSL<Close[0]){TSL=Close[0];SL=TSL-TSProfit*Point;}}
  else
{if(TSL>Close[0]){TSL=Close[0];SL=TSL+TSProfit*Point;}}
if(TSL!=OTSL)
{OTSL=TSL;for(i=OrdersTotal()-1;i>=0;i--)
{d=OrderSelect(i,SELECT_BY_POS);
 d=OrderModify(OrderTicket(),OrderOpenPrice(),SL,0,0,0);}}}












EA失業君 ファンダメンタルズ 日本完全失業率 その3

その3です。

いよいよファンダメンタル型EAの発表です。

目標は放置で毎回自動発注のEAでしたが、私の勉強不足から作成が困難です。

しかし!!!

これだけ時間をかけて調べたのにEAを作らないのはもったいないですね。

そして最近ブログのペースが落ちているので応援をたくさんいただいているところです!


作成したのは次回2016/5/31の完全失業率一回ぽっきり稼働のEAです!

今回はUSD高の予測の元作成しました。

ローカールタイム(パソコンの時間)で5月31日8時29分50秒以降のティック変動時に買い建てエントリーします。
前回の分析の結果を踏まえて利益確定は10Pips、損切は20Pipsにしています。
ローカルタイムを使用しますのでパソコンの時間は正確に合わせておいてください。
USDJPY M1での動作をお願いします。
余剰証拠金すべてエントリーします!
10万円で2,000円程度の予想利益です。



ファンダメンタルEAはこちら

ファンダメンタルズ 日本完全失業率 その2

前回に続き 雇用人員判断D.I.と日本失業率の相関性を見ていきます。

日本・完全失業率と雇用人員判断DIとの比較です。
1四半期の意味合いがわからないので少しづれているかもしれません

失業率の発表後のUSDJPYの変動がマイナスからプラスに変わったのは2015年の10月です。
ところが雇用人員判断DIはマイナスのままです。
詳しく見てみると2013年の9月にマイナスに転じています。
しかし、2013年の影響が2015年になって現れるとは考えずらいところですね。


参照日本銀行「全国企業短期経済観測調査」

これで本当に相関性があるのでしょうか・・・
もう一度発見した厚労省のペーパーを読み直してみます。
四ページをみると相関を示すチャートが載っています。

雇用人員判断と失業率の時系列上の動きのチャートをよくよくみると
日銀短観と失業率の比較と凡例がなっています。
そして短観が毎月になっていますが調査・発表は年四回ではないでしょうか???

参照日本銀行「全国企業短期経済観測調査」

日銀短観(大企業製造業)と並べてみました。
先程注目した失業率プラマイ逆転が10月、日銀短観は10月から対前四半期が減じています。

短観の対前四半期が上昇すると円高ドル安、下降すると円安ドル高という事のようです。

日銀短観の数字を自動で拾うことが私の技術ではできませんので、ファンダメンタルEA化は諦めます。

しかし、この分析が正しければ
次回5月30日8:30は7~15Pipsの円高が予想されます。












ファンダメンタルズ 日本完全失業率

株はファンダメンタル、FXはテクニカルと言われることもありファンダメンタル基準のEAは見たことがありません。
厳密にいえば雇用統計除外などはファンダメンタルになるのかもしれませんが・・・

以前、ファンダメンタルに挑戦したことがあるのですがこれがなかなか難しい。
米国雇用統計の二日前にADP雇用統計が発表されます。

民間企業ADP社の雇用統計は公務員の雇用数が入っていない等条件が違うのですが、
同じ米国の雇用統計、相関性はあると考えました。

そして、ADPの雇用統計でUSDが上がれば二日後の雇用統計でUSDを買い建てというロジックで作成したのですが結果はコテンパンでした・・・
いろいろ角度から相関性を検討したのですが、ADP雇用統計と本番の雇用統計は相関性は見つかりませんでした。


そんなある日、厚労省のHPからこのような文章を発見しました。
職業安定局雇用政策課発行文章で担当者名と直通の電話番号まで書いてあります。
厚労省のホームページ【外部リンク】

要約すると日本の失業率と決定係数(一定区間においては相関係数の二乗)が高いのは
1四半期前の「雇用人員判断DI」               R²=0.87
三か月前の「有効求人倍率(季節調整値)」R²=0.75

ではここの上下を参考にエントリーすればファンダメンタルEAができるのではないでしょうか!!

雇用人員判断【外部リンク】
有効求人倍率【外部リンク】


それでは検証してみましょう

1四半期前・・・聞きなれない単語です。まぁ四月の1四半期前は12月でしょう
雇用人員判断D.I.の12月は -12 日銀短観に含まれていますので発表時の影響はこれだけとは考えられないところです。

有効求人倍率           1.3 失業率と同時発表です。相関性があっても使えません。


壁にぶち当たったところで次回に続く~




2016年5月8日日曜日

AMSER 販売中!フロントテストあり!

FX-ON社からEAの出品の依頼がありました。

EAは稼ぐもので売るものでは無い。
MQL4の開発入門者の参考になるソースコードがあまり世の中にない。

とのことでブログでソースコードを公開しているのですが、
FX-ONでの販売しているEAを見ると野望が沸いてきました。

実現損益のベスト5を私のEAで埋め尽くしてやろうという野望です!!

現在の一位のEAは56万円/3か月、スタート金額はすべて100万円からです!!

** 今回はソースコード公開無しです **

ソースコード無料公開と言いながらごめんなさい

今回出品したのはAMSER オランダ語ウェールズ語で時間という意味です。

出品手数料は35%、広告代が10%、売買手数料10%で合計55%が手数料。

トレンドがある時間を調査し時間ごとの戦略を組み込んでいます。

時間は曜日、時間、分、秒単位です。

エントリー時にストップロス、利益確定を決めるもの、シャンデリアトレーリングで変動するもの、
時間でクローズするもの、そしてその組み合わせを時間ごとに採用しています。

エントリー時間は最大7回/日、通貨ペアはUSDJPY。
V系の複利システムを搭載しています。


それでは、過去一年のバックテストの結果です。


10万円が一年で94万増え合計104万円になっています。

月別にみると8月が単月マイナスになっています。
平均成長率は21% 月利21% ムフフです♪

そして、続いてはFX-ONのフロントテストと同条件の100万円スタートです。

平均成長率は20% ロット分割の過程で若干金額が変わってきます。
100万円の20%は20万円 三か月で60万円ちょい
8月末には実現損益 一位を奪取できるでしょう!

まだフロントテストを開始して稼働日10日しかもゴールデンウィーク真っ只中ですので、
時々見て応援していただけると幸いです!!

販売サイト↓詳細情報&フロントテスト結果あり
AMSER FX-ON 販売ページ




AMSER | fx-on.com

2016年5月1日日曜日

BULLsPower & BearsPower  

プサンでアップしたブル&ベアのブログを間違えて消してしまったようです。(;´д`)トホホ

プサンのカジノで半日ビールを飲みながら考えたのは、
①MACDやボリンジャーバンドなどメジャーなインディケーターは終値を見ているのに、最高値、最低値を含むろうそく足を見るのは迷いが生じる。
②平均からの現在の終値の差の成長で未来が予測できる。

そして、バカラと酒に酔いながらひらめいたのがBULLsPOWER BearsPOWERです。

過去13回の最高値の平均-現在の終値がBULLsPOWER
最低値の場合はBearsPOWER

①とは逆なのですが最高値、最低値の差をみるのはCOA的発想でありですね。
②は終値平均で考えていたのですが、二つの平均の差というのは面白そうです。

そういえば有名なEA WhiteBear なんてのもありますが、あれももしかするとBEARかもしれませんね。

そして朝二時酩酊状態で作りました。(今回のはその時の進化版です)
作成の流れは
①ブル、ベア共に正ならLONGエントリー、両方負の時はSHORT
いい結果はでません。
②すこし下駄をはかせます。ブル、ベアともに0.1以上の時はLONG、以下同じ・・・
真横に進むグラフ
③シャンデリア・トレーリングを装備
いい結果になりました。
④足を5分に変更
完成です。

1・5分足においてシャンデリア・トレーリングは幅30以下での数値が出るのが、いいインジケーターです。40以上ではブレが生じます。
ブレというのは月別に見た時にマイナス月が多くなることです。
今回のEAはマイナス月0です。優秀かつ安定型ですね。

時々迷走していますが・・・
プログラムを覚えるときに他人のソースコードを見ると勉強になります。
しかしなかなかいい教材が無いのも事実です。
そこで、公開しようと思ったのがこのブログです。
という事はわかりやすいソースコードを書かなければならないのですね。
はい、がんばります。

#property copyright "Copyright 2016/5/1,TACA"
#property link      "http://mt4kyoto.blogspot.jp/"
extern int TSProfit=20;
extern int MAGIC=7;
extern int Spread=4;
extern double Lots=0.1;
datetime TimeOld;
int d,i;
double TSL,OTSL,SL;
double Bull(){return(iBullsPower(Symbol(),0,13,0,1));}
double Bear(){return(iBearsPower(Symbol(),0,13,0,1));}
void OnTick()
{
TS();
if(OrdersTotal()==0){
if(MarketInfo(Symbol(),MODE_SPREAD)<=Spread){
if(Time[0]!=TimeOld){TimeOld=Time[0];
if(Bull()> 0.1&&Bear()> 0.1){E(0);}
if(Bull()<-0.1&&Bear()<-0.1){E(1);}
}}}}

void E(int BoS){
if(BoS==0){TSL=Ask;SL=TSL-TSProfit*Point;}
else{TSL=Bid;SL=TSL+TSProfit*Point;}
d=OrderSend(Symbol(),BoS,Lots,TSL,2,SL,0,NULL,MAGIC,0,0);}

void TS()
{d=OrderSelect(0,SELECT_BY_POS);if(OrderType()==0)
{if(TSL<Close[0]){TSL=Close[0];SL=TSL-TSProfit*Point;}}
  else
{if(TSL>Close[0]){TSL=Close[0];SL=TSL+TSProfit*Point;}}
if(TSL!=OTSL)
{OTSL=TSL;for(i=OrdersTotal()-1;i>=0;i--)
{d=OrderSelect(i,SELECT_BY_POS);
 d=OrderModify(OrderTicket(),OrderOpenPrice(),SL,0,0,0);}}}