2009/01/30

Mizutori_EAの説明(カスタムユーザー向け③)


先回な続きです。
【自作関数の書き方】
※自作関数が処理後に受け渡す形(今回はdouble)で宣言します。
※( )の前は、自作関数の名前、( )内部は、受け渡された物の形(今回は、int)とそれを格納する変数です。
※下記の場合、ポジション数をposに格納したlotSizeCalcという自作関数で,処理後に受け渡すものが、doubleの形であることを意味します。
◆ LOTサイズ計算 ◆
double lotSizeCalc(int pos)
{※ここから(※ここまで)がこの自作関数の範囲です。
int doru = 1;
double lotMM = 0;
int sizeND = 0;
double lotsize = MarketInfo(Symbol(),MODE_LOTSIZE);
【1ロットの単位(数量)をlotsizeに格納】
double maxlots = MarketInfo(Symbol(), MODE_MAXLOT);
【取引可能な最大Lot数をmaxlotsに格納】
double minlots = MarketInfo(Symbol(), MODE_MINLOT);
【取引可能な最少Lot数をminlotsに格納】
double accountFreeMargin = AccountFreeMargin();
【口座の余剰証拠金額をaccountFreeMarginに格納】
string Currency = AccountCurrency();
【口座預金の通貨名をCurrencyに格納】
if(Currency == "JPY") doru = 100;
【もし口座預金の通貨名が、JPYなら、doruに100を格納】
if(Currency =="USD") doru = 1;
【もし口座預金の通貨名が、USDなら、doruに1を格納】
※doruは、通貨ごとに違う単位を合わせるためのものです。
double lot =(accountFreeMargin*Leverage) / (doru*lotsize);
【(余剰証拠金×レバ)/(doru×ロットサイズ)をlotに格納】
if(minlots>=1){sizeND=0;}else{if(minlots>=0.1){sizeND=1;}else{if(minlots>=0.01){sizeND=2;}}}
【取引可能な最少Lot数により、小数点以下の適用範囲を決定する】
switch(pos)
【ナンピン回数により処理を分ける】
{
case 0: 【ナンピン回数0回の場合】
lotMM = NormalizeDouble(lot*Lotpos1,sizeND);
【ナンピン回数による倍率をlotに掛けて、最少Lot数単位で丸めた数値をlotMMに格納】
break;【switch処理を抜け出す】
case 1: 【ナンピン回数1回の場合】
lotMM = NormalizeDouble(lot*Lotpos2,sizeND);
【ナンピン回数による倍率をlotに掛けて、最少Lot数単位で丸めた数値をlotMMに格納】
break; 【switch処理を抜け出す】
case 2: 【ナンピン回数2回の場合】
lotMM = NormalizeDouble(lot*Lotpos3,sizeND);
【ナンピン回数による倍率をlotに掛けて、最少Lot数単位で丸めた数値をlotMMに格納】
break; 【switch処理を抜け出す】
case 3: 【ナンピン回数3回の場合】
lotMM = NormalizeDouble(lot*Lotpos4,sizeND);
【ナンピン回数による倍率をlotに掛けて、最少Lot数単位で丸めた数値をlotMMに格納】
break; 【switch処理を抜け出す】
case 4: 【ナンピン回数4回の場合】
lotMM = NormalizeDouble(lot*Lotpos5,sizeND);
【ナンピン回数による倍率をlotに掛けて、最少Lot数単位で丸めた数値をlotMMに格納】
break; 【switch処理を抜け出す】
default: 【ナンピン回数その他の場合】
lotMM = NormalizeDouble(lot*Lotpos6,sizeND);
【ナンピン回数による倍率をlotに掛けて、最少Lot数単位で丸めた数値をlotMMに格納】
break; 【switch処理を抜け出す】
}
if (lotMM < minlots) lotMM = minlots;
【求められた数値が最少Lot未満なら、lotMMに最小値を格納】
if (lotMM > maxlots) lotMM = maxlots;
【求められた数値が最大Lotを超えていたら、lotMMに最大値を格納】
if (lotMM > MaxLots) lotMM = MaxLots;
【求められた数値が設定した最大Lotを超えていたら、lotMMに設定した最大値を格納】
return (lotMM);
【求められた数値を、doubleの形で、この関数を呼び出したところに、返します。】
}※ここまで(lotSizeCalc自作関数の終わり)

◆時間軸によるMaのshiftの変更◆
int MaShift_Custom(int NowHour)
【MaShift_Customと名前の自作関数で、int型の数値を返します。】
{※ここから
int MaShift = 0;
if(NowHour>= EuTime_S && NowHour<= EuTime_E) MaShift = EuTime_MaShift ;
if(NowHour>= UsTime_S && NowHour<= UsTime_E) MaShift = UsTime_MaShift ;
if(AsTime_S <= AsTime_E) {
if(NowHour>= AsTime_S && NowHour<= AsTime_E) MaShift = AsTime_MaShift ;
} else {
if(NowHour>= AsTime_S || NowHour<= AsTime_E) MaShift = AsTime_MaShift ;
}
【1日を3つの範囲に分けてその範囲ごとの変数を設定するための仕様です。】
return(MaShift);
【求められた数値を、int型で、この関数を呼び出したところに、返します。】
}※ここまで
◆時間軸によるMaLimitのshiftの変更◆
※以前は、必要性がありましたが、今はほとんど使われていないものです。
※上記とほぼ同じことをしているので説明を省略します。
int MaLimtShift_Custom(int NowHour)
{
int MaLimtShift = 0;
if(NowHour>= EuTime_S && NowHour<= EuTime_E) MaLimtShift = EuTime_MaLimtShift;
if(NowHour>= UsTime_S && NowHour<= UsTime_E)MaLimtShift = UsTime_MaLimtShift;
if(AsTime_S <= AsTime_E) {
if(NowHour>= AsTime_S && NowHour<= AsTime_E)MaLimtShift = AsTime_MaLimtShift;
} else {
if(NowHour>= AsTime_S || NowHour<= AsTime_E)MaLimtShift = AsTime_MaLimtShift;
}
return(MaLimtShift);
}
◆時間軸による、Xoxの変更◆
※上記とほぼ同じため説明を省略します。
double Xox_Custom(int NowHour)
{※ここから
double Xox = 0;
if(NowHour>= EuTime_S && NowHour<= EuTime_E)Xox = EuTime_Xox;
if(NowHour>= UsTime_S && NowHour<= UsTime_E) Xox = UsTime_Xox;
if(AsTime_S <= AsTime_E) {
if(NowHour>= AsTime_S && NowHour<= AsTime_E) Xox = AsTime_Xox;
} else {
if(NowHour>= AsTime_S || NowHour<= AsTime_E) Xox = AsTime_Xox;
}
return(Xox);
}※ここまで

◆ マジックナンバーの作成◆
※本来、EAごと、通貨ペアごと、時間軸ごとに、マジックナンバーを変更しなければなりません。
しかし、忘れやすいので、通貨ごと、時間軸ごとで、マジックナンバーを自動的に変更するようにしてあります。
 ただし、別のEAと同時に使用する場合、邪魔になるかもしれません。(あくまでも、テスト用の参考ソースです。)
int MagicfromSymbol() {
【MagicfromSymbolという名前の自作関数で、int型の数値を返す】
int MagicNumber=0;
for (int i=0; i<5; i++) { 【5回繰り返します。】
MagicNumber=MagicNumber*3+StringGetChar(Symbol(),i);
【 MagicNumberを3倍し、通貨ペア名のi番目の文字コード番号を加えたものをMagicNumberに格納】
}
MagicNumber=MagicNumber*3+Period();
【MagicNumberを3倍し、時間軸を加えたものをMagicNumberに格納】
return(MagicNumber);
【求められた数値を、int型で、この関数を呼び出したところに、返す。】
}

◆TakeProfitの計算◆
double Take_Profit()
【Take_Profitという関数名で、double型の数値を返す。】
{※ここから
int StopLoss = MarketInfo(Symbol(),MODE_STOPLEVEL);
【注文時に決済注文を同時に発注する場合の最低利益をStopLossに格納】
int FreezLevel = MarketInfo(Symbol(),MODE_FREEZELEVEL);
【成り行き決済した場合の最低利益をFreezLevelに格納】
if(StopLoss>TakeProfit){TPf=StopLoss;}else{TPf=TakeProfit;}
【StopLossとTakeProfit(大域変数)を比べて、大きい方をTPfに格納】
if(FreezLevel>TPf)TPf=FreezLevel;
【FreezLevelがTPfより大きい場合、TPfにFreezLevelを格納】
return(TPf);
【求められた数値を、Double型で、この関数を呼び出したところに、返す。】
}※ここまで

次回に続く・・・・・・・・・

2009/01/28

Mizutori_EAの説明(カスタムユーザー向け②)


前回の続きです。
◆ 指標の計算◆
この部分で、すべての指標計算処理を行っています。
『iMA』とは、移動平均線の組込指標関数です。詳しい説明は、「Meta Editor」のヘルプで確認ください。
※詳細については、次の説明で行いたいと思います。
double Ma = iMA(NULL,0,MaPeriod,MaShift,MODE_SMA,PRICE_OPEN,0);
double MaSS = iMA(NULL,0,25,0,MODE_EMA,PRICE_OPEN,0);
double MaSM = iMA(NULL,0,50,0,MODE_EMA,PRICE_OPEN,0);
double MaMS = iMA(NULL,0,100,0,MODE_EMA,PRICE_OPEN,0);
double MaMM = iMA(NULL,0,200,0,MODE_EMA,PRICE_OPEN,0);
double MaLM = iMA(NULL,0,300,0,MODE_EMA,PRICE_OPEN,0);
double MaLL = iMA(NULL,0,400,0,MODE_EMA,PRICE_OPEN,0);
double Bands_Ma = iMA(NULL,0,10,0,MODE_SMA,PRICE_OPEN,0);
double Bands = Bands_Ma*(Percent/100);
double MaHi = Ma+Bands;
double MaLow = Ma-Bands;
double MaHi_Tr = Ma*(1+Percent_Tr/100);
double MaLow_Tr = Ma*(1-Percent_Tr/100);
double HiLimt = High[iHighest(NULL,0,MODE_CLOSE,LimtPeriod,0)];
double LowLimt = Low[iLowest(NULL,0,MODE_CLOSE,LimtPeriod,0)];
double RSI = iRSI(NULL,0,14,PRICE_CLOSE,0);
double stb = iMA(NULL,0,MaLimtPeriod,MaLimtShift,MODE_SMMA,PRICE_OPEN,0);
double st=(HiLimt-LowLimt)/(stb/100);
double Dv = iStdDev(NULL,PERIOD_H4,Dv_Period,0,MODE_EMA,PRICE_CLOSE,0);
double ATR = iATR(NULL,0,ATRPeriod,0);
◆シグナルの作成・注文及び決済◆
※注文を出す許可シグナルをFlag『旗』としています。
 つまり、買い注文を出す場合には、『Buy_Flag』を上げる(true)とします。
 許可シグナルを固定することにより、いくつもの条件を追加できるようにしています。
bool Buy_Flag = false;
【Buy_Flagを宣言し、下げる(false)を格納】
bool Sell_Flag = false;
【Sell_Flag を宣言し、下げる(false)を格納】
◆買いポジションの取得◆
//条件式記入---------------------------------------------------
if(
(!OderStop)
&&(pos1<Max_Position)
//&&(MaLimtHi>Ask)
//&&(MaLimtLow<Ask)
&&(st>=Xox)
&&(RSI<=RSILowLimt)
&&(MaLow>=Ask)
&&(ATR<=ATRLimt)
&&((Ask<=(LastPrice-(PipStep*Point)))||pos1==0)
)Buy_Flag = true;
【もし、上記の条件がすべて満たされるのであれば、「Buy_Flag」を上げる(true)】
//----------------------------------------------------------------------------+
if((!fbp)||(!Stop_DV && Dv>=Dv_Point))Buy_Flag = false;
【もし、条件が満たされるのであれば、「Buy_Flag」を下げる(false)】
//+トレンド発生時の停止 --------------------------------------+
if(
//(MaMG>MaLL)
(MaLL>MaLM)
&&(MaLM>MaMM)
&&(MaMM>MaMS)
&&(MaMS>MaSM)
&&(MaSM>MaSS)
)Buy_Flag = false;
【もし、条件が満たされるのであれば、「Buy_Flag」を下げる(false)】
//+新条件-----------------------------------------------------+
if(
(!OderStop)
&&(fbp)
&&(pos1<Max_Position)
&&(MaLL<MaLM)
&&(MaLM<MaMM)
&&(MaMM<MaMS)
&&(MaMS<MaSS)
&&(MaLow_Tr>=Ask)//今回変更
&&((Ask<=(LastPrice-(PipStep*Point)))||pos1==0)
)Buy_Flag = true;
【もし、条件が満たされるのであれば、「Buy_Flag」を上げる(true)】
※このように、最後に、『新条件を追加』することにより、上記の 『「Buy_Flag」を下げる(false)』の条件を無能力化できます。
//+-----------------------------------------------------------+
if(Buy_Flag == true){
【もし、「Buy_Flag」が上げられて(true)いたら、以下の処理を実施する】
ClosePositions(1,SIGNAL_CLOSESELL,Mc1Number);//買い注文と同時に売り注文の決済を行う場合
【ClosePositions自作関数で新規注文と逆のオーダーをすべて閉じる。】
※ちなみに、『ClosePositions(0,SIGNAL_CLOSESELL,Mc1Number);』とすると、逆のオーダーを1つだけ閉じます。
OrderPositions(SIGNAL_BUY,pos1,pos2,Mc1Number);
【OrderPositions自作関数で新規注文を出します。】
※ちなみに、OrderPositions(注文の種類,既存のBUY注文数,既存のSELL注文数,マジック);となっています。
Buy_Flag = false;
【Buy_Flag」を下げる(false)】※特に必要ありませんが、間違いを防止するために記載しています。
fbp=false;
return(0);
【終了:注文を出していますから、終了しています。】
}
【この{までが、「Buy_Flag」が上げられていたら・・・の範囲です】
◆売りポジションの取得◆
買いポジションと同じなので省略です。
//条件式記入---------------------------------------------------
if(
(!OderStop)
&&(pos2<Max_Position)
//&&(MaLimtLow<Bid)
//&&(MaLimtHi>Bid)
&&(st>=Xox)
&&(RSI>=RSIHiLimt)
&&(ATR<=ATRLimt)
&&(MaHi<=Bid)
&&((Bid>=(LastPrice+(PipStep*Point)))||pos2==0)
)Sell_Flag = true;
//-------------------------------------------------------------
if((!fsp)||(!Stop_DV && Dv>Dv_Point))Sell_Flag = false;
//+トレンド発生時の停止 --------------------------------------+
if(
//(MaMG<MaLL)
(MaLL<MaLM)
&&(MaLM<MaMM)
&&(MaMM<MaMS)
&&(MaMS<MaSM)
&&(MaSM<MaSS)
)Sell_Flag = false;
//+新条件-----------------------------------------------------+
if(
(!OderStop)
&&(fsp)//今回追加
&&(pos2<Max_Position)
&&(MaLL>MaLM)
&&(MaLM>MaMM)
&&(MaMM>MaMS)
&&(MaMS>MaSS)
&&(MaHi_Tr<=Bid)
&&((Bid>=(LastPrice+(PipStep*Point)))||pos2==0)
)Sell_Flag = true;
//+-----------------------------------------------------------+
if(Sell_Flag == true){
ClosePositions(1,SIGNAL_CLOSEBUY,Mc1Number);
OrderPositions(SIGNAL_SELL,pos1,pos2,Mc1Number);
Sell_Flag = false;
fsp=false;
return(0);
}
◆決 済◆
//+----------------------------------------------------------------------------------------+
//強制決済条件
※何らかの理由で、注文と同時にTakeProfit(利食い注文)が出来なかった場合、もしくは、利食い注文以下での決済が必要になった際の処理です。
※ただし、各業者が決めている【FreezLevel】以下での決済は行えません。
//買ポジ決済
double Current_Profit_Buy = Bid-LastPrice;
【現在の買いオーダー(BUY)の利食い値をCurrent_Profit_Buyに格納】
if((UseTakeProfit)&&(pos1>0)&&(TPf>TakeProfit*Point)&&(Current_Profit_Buy>(TakeProfit*Point)))ClosePositions(0,SIGNAL_CLOSEBUY,Mc1Number);
【現在の利食い値が、既定のTakeProfit以上なら決済処理を実行する。】※この場合は、1つの決済です。
//売ポジ決済
double Current_Profit_Sell = LastPrice-Ask;
【現在の売りオーダー(SELL)の利食い値をCurrent_Profit_Sellに格納】
if((UseTakeProfit)&&(pos2>0)&&(TPf>TakeProfit*Point)&&(Current_Profit_Sell>(TakeProfit*Point)))ClosePositions(0,SIGNAL_CLOSESELL,Mc1Number);
【現在の利食い値が、既定のTakeProfit以上なら決済処理を実行する。】※この場合は、1つの決済です。
//+----------------------------------------------------------------------------------------+
◆ナンピン回数による特別な決済条件◆
※ただし、ナンピン回数とは、同時ポジション数の最大値を意味します。
switch(NumPos)
【ナンピン回数別に処理を分ける】
{
case 0: 【ナンピン回数が0回の場合、(つまりポジションがない場合)】
break;【処理を脱出する】
case 1: 【ナンピン回数が1回の場合、】
break; 【処理を脱出する】
case 2: 【ナンピン回数が2回の場合、】
//if(pos1==1)ClosePositions(SIGNAL_CLOSEBUY,Mc1Number);
//if(pos2==1)ClosePositions(SIGNAL_CLOSESELL,Mc1Number);
break; 【処理を脱出する】
case 3: 【ナンピン回数が3回の場合、】
//if(pos1==1)ClosePositions(1,SIGNAL_CLOSEBUY,Mc1Number);
//if(pos2==1)ClosePositions(1,SIGNAL_CLOSESELL,Mc1Number);
break; 【処理を脱出する】
case 4: 【ナンピン回数が4回の場合、】
if((pos1==1))ClosePositions(1,SIGNAL_CLOSEBUY,Mc1Number);
if((pos2==1))ClosePositions(1,SIGNAL_CLOSESELL,Mc1Number);
【ポジション数が1になった場合、残りを強制決済する。】
※言い換えれば、ナンピン回数が4回あって3つのポジションが決済されれば、残りを強制決済することを意味します。
break; 【処理を脱出する】
default: 【ナンピン回数が5以上の場合、】
break; 【処理を脱出する】
}
◆指標による決済条件◆
【Buy(買い)注文の処理】
//条件式記入---------------------------------------------------
if(
(pos1>0)&&
(
(HiLimt-Bid<=Lt*Point)
||
//(ATR>ATRLimt)
//||
(MaHi<Bid)
||
(OderClose)
)
//-------------------------------------------------------------
){
ClosePositions(1,SIGNAL_CLOSEBUY,Mc1Number);
return(0);
}
【Sell(売り)注文の処理】
//条件式記入---------------------------------------------------
if(
(pos2>0)&&
(
(Ask-LowLimt<=Lt*Point)
||
//(ATR>ATRLimt)
//||
(MaLow>Ask)
||
(OderClose)
)
//-------------------------------------------------------------
){
ClosePositions(1,SIGNAL_CLOSESELL,Mc1Number);
return(0);
}
//+------------------------------------------------------------------+
return(0);
}
【ここでstart( )関数が終了します。】
※この後は、次回です。

2009/01/23

後出しじゃんけん。

時々有能であろうと思われる指標(インジケーター)に出会う。
しかし、検証してみると、後出ジャンケンをしていることが多い。
代表的なのに【ZigZag.mq4】がある。
この指標は、確定した物を見ると確実に高値と安値を導き出している。
なぜか? それは、高値および安値が更新されるたびに、更新していくから。
少なからず【MODE_CLOSE(終値)shift=0(現在のバー)】を用いた指標は、その傾向がある。
指標のさきっぽが、値が動くたびに動く現象
これは、EAにとって致命的な現象を引き起こすことがある。
その現象とは、バックテストとリアルトレードとの成績のズレを作りだすもの。
ほとんどが、利益を削減させる原因となる。
なぜ? 原因は、終値位置の違いがあるため。
現在のバーの終値は、リアルでは、終値が確定するまで現在の値を意味する。
バックテストの場合、最少の値が利用できるとしても、1分足の初値・高値・安値・終値の計4つ。
5分足で考えるなら、【5×4=20個】リアルの平均ティック数を50としても2/5のクオリティー、 まして、急激な変動があればティック数は、200を超える。その時1/10以下のクオリティーとなる。
バックテストは、オーダーを取らなかったのに、リアルトレードでは、オーダーを取得することも考えられる。 現在よりもちょっと先のデータを利用してテストしていると考えた方がいい。
 (後出しジャンケンが発生する) では、どうすればいいか? 確定した、最も新しい値(OPEN[0]現在の初値)を利用するのがいいだろう。 しかし、チャンスが低減する可能もある。

2009/01/22

繰り返し関数

MQL4の中には、2つの繰り返し関数が収録されています。
for( )と②while( )です。
まず、 ①for()関数の説明です。
よく、【for(i=0;i<=100;i++)】というコードを見ると思います。
これは、この後に続くコードをi=0からiが100以下の間繰り返すことを意味します。
※i++とは繰り返しが終わるごとにiに1を足していくことを意味します。
コードを書き換えるならば、『i=i+1』となります。
サンプル for(i=5;i>0;i--) { k=k+i } サンプルの答えは、『K=5+4+3+2+1=15』となります。
for()の( )の中身は、決まり事があります。
それは、(;;)セミコロンを2つ入れなければならないことです。
例) for(;;) { K=K+1 } と書くことができます。
しかし、このコードを使用すると、無限ループが起こります。
終了条件がないからです。
たとえば、  if(K==5)break; という文を追加します。
この分の意味は、kが5になったら繰り返すことをやめてくれというものです。
ちなみに、繰り返し関数の中によく使われるコードとして、以下の3種類があり、よく混乱しますので覚えていた方がいいものです。
break: (繰り返しなどから)脱出する。
continue;(繰り返しなどを) スキップする。
  return(); (自作関数などを)終了し( )内の数値を返す。
  (0)の場合は、そのまま終了という意味です。
例) for(i=0;i<=10;i++) { if(i==3)continue; K=K+i if(K==6)break;  }
答えは、K=0+1+2+スキップ+4+5+6+7+8+9+10=52になります。
※kが6になることがなかったために途中で脱出しませんでした。
(例題か?) これが、for()の繰り返し関数の基本です。
次に・・・・・・ ②while( )繰り返し関数です。
この繰り返し関数は、( )内に書かれた条件が真(true)の間繰り返しを実行するというものです。
例) int i=0; while(i<5) { k=k+i; i++; }
答えは、K=0+1+2+3+4=10です。
よくやってしまうのが、『i++;』を忘れてしまい無限ループになってしまう事と、while( )の( )内の条件がはじめから偽(false)になっていることで、処理されないことです。
※上記の条件で間違いがあっても、コンパイル時にエラーが出ません。
 そのため、無限ループに陥るか、処理しないコードになります。
後は、for()繰り返し関数と同じです。
では、なぜこの2つが収録されているのでしょうか?
※これは私の経験からこのように納得しています。 繰り返し関数の中に繰り返し関数を入れる場合、for()関数の中にfor()関数を入れても処理されません。
そのため、while()関数の中にfor()関数を入れるようなことを行うためにあるのだと理解しています。 (ごめんなさいこの内容には自信がありません) 今日は、ここまでです。

為替データがカオス時系列データである証明?

為替データがカオス時系列データだと思われる証明を少しだけ行いたいと思います。
まず、画像をご覧ください。











これは、USDJPY日足終値(2001.03.20~2009.01.20)のデータを加工したものです。
上は、横軸にN日縦軸にN日から14日過去の終値を記したグラフです。
下は、横軸にN日縦軸にN日から28日過去の終値を記したグラフです。












去年から今年に掛けて乱高下したデータもある一定の法則でまとまっていると思いませんか?
このグラフがカオスの定義のひとつだそうです。
3.何らかのポアンカレ写像により、テント写像が確認できる。】 に該当するそうです。
1.周期性を持たな】は、FXをやられている方なら身をもってご理解頂いてるはずです。
残りは【2.リアプノフ指数が0より大きい。】ですが、またの機会にしておきます。
(正直まだ理解できていなことが多々あるもので・・・・) 自由に動いていると思っていたデータが、ある法則に縛られて変動するデータであるとこがご理解いただけたでしょうか?

2009/01/20

Mizutori_EAの取扱い説明(ビギナー向け)

※このEAは、スキル向上のために作成したEAです。  もし、このEAが原因で、あなたに損害を与えたとしても、一切保証できません。 また、このEAは、作動を保証するものでもありません。

数多くの方々の協力を経て作り上げたEAです。ご協力頂いた方にお礼申し上げます。

特徴
・移動平均線からの乖離を売買ルールの起点とし、いくつかの指標で制限を加えながら安定的に成績を上げるように開発してきた逆張りスキャルピング系のEAです。
・売買注文と同時に、利食い値、ストップをオーダーしています。
・売買ルールの中にナンピン手法が含まれています。  
  ・常時売買を繰り返すEAではなく、ある一定の条件を満たさないと売買を行いません。
   (そのため1週間に一度も売買を行わない場合があります。)  

適用範囲
・通貨ペア   USDJPY(デフォルトの場合)
・時間軸
5M(5分足)(デフォルトの場合)
・口座通貨名
USD 若しくは、JPY ・会社名
全てに適応できるはず?【確認は取れていません】
※(ただし、デフォルトの設定は、【point】=0.01で設定されています。詳細はQ&Aで)       
マジックナンバー
このEAは、別のEAとの競合を防止するため、自動的にマジックナンバーを成形するプログラムが装備されています。

【プログラムの内容】
通貨ペア名の文字コードを利用して数字(USDJPYの場合は、30120)を成形し、それに時間軸(5分足なら5)を加え、さらに【MYMAGIC】の数値を取り入れたものがマジックナンバーとなります。   MYMAGIC=12345の場合 マジックナンバーは、【42470】となります。他のEAを使用されている方は、調整してください。

パラメーターの説明
#define MYMAGIC 12345 //ポジションの固有ID
マジックナンバーが競合する場合に調整します。
extern bool SignalAlert = true;
【true】の場合、取引ごとに、アラームを発生させます。
ただし、MT4での設定が必要です。
※利食い値に達した場合のCLOSEアラームは、発生しません。
extern bool SignalMail =false;
【true】の場合、取引ごとに、メールを送ります。
ただし、MT4でメール設定が必要になります。
※利食い値に達した場合のCLOSEメールは、配信されません。
//+-----------------------------------+
extern bool Lot_Management = true;//固定ロットの場合は,false
【true】の場合、ロットマネージメントを行います。
※ロットマネージメントとは、設定レバと余剰証拠金より自動的にロットサイズを調整するシステムです。
extern double Fixed_Lots = 0.0;//固定ロット数
【Lot_Management=false】の場合のロット数です。
extern double MaxLots = 10.0;
ロットマネージメントを使用して算出されたロット数の上限を指定しておくパラメーターです。
extern double Leverage = 1.0;
ロットマネージメントを使用する場合のレバを設定するパラメーターです。
extern double Slippage = 5.0;
注文を出す際のスリッページです。
//+-----------------------------------+
extern bool UseStopLoss = true;
【true】の場合、ストップロスを設定します。
extern int StopLoss = 100;
ストップロスの数値を設定します。
【100】とは、(point=0.01の場合)1.00を意味します。
100.00 USDJPYで注文を出した際のストップロス値は、101.00 USDJPYとなります。
 ※注意
最近、100.000と小数点以下が3桁の会社が出てきました。その場合は【1000】としてください。
extern bool UseTakeProfit = true;
【true】の場合、利食い値を設定します。
このEAでは、固定しておいてください。
extern double TakeProfit = 13.0;
利食い値の数値を設定します。
その他は、【StopLoss】を参照してください。
extern double PipStep = 18.0;
ナンピンを行う幅を数値で設定します。
その他は、【StopLoss】を参照してください。
extern int Max_Position = 5;//最大ポジション数
ナンピン回数の最大値を指定します。
extern int Order_Challenge = 10;//オーダーのアタック回数
何らかの原因で、オーダーが受け付けられなかった場合に、何回同じオーダーを繰り返し発信するかを指定します。
※オーダーが通らなかった場合、5秒間停止して、ループするようにしてあります。 //+-----------------------------------+
指標のパラメーター 後日、『Mizutori_EA(カスタムユーザー向け)マニュアル』にて説明
extern int MaPeriod = 10;
extern int AsTime_MaShift = 5;
extern int EuTime_MaShift = 5;
extern int UsTime_MaShift = 5;
extern double Limit_Percent = 0.3;
extern int Samples = 15;
extern int Break_Period = 10;
extern int MaLimtPeriod = 500;
extern int AsTime_MaLimtShift = 0;
extern int EuTime_MaLimtShift = 0;
extern int UsTime_MaLimtShift = 0;
extern int Lt = 2; extern int LimtPeriod = 80;
extern double AsTime_Xox = 0.7;
extern double EuTime_Xox = 0.7;
extern double UsTime_Xox = 0.7;
extern double RSIHiLimt = 70.0;
extern double RSILowLimt = 30.0;
extern bool Stop_DV =false;
extern double Dv_Point = 1.9;
extern int Dv_Period = 25;
extern bool Sort_Order = true;
//+---------------------------------------+
※時間変動設定のある指標のための時間設定です。デフォルト設定なら無力化されています。
extern int ServerTime_GMT = 0;//サーバーの時間
extern int AsTime_S = 20;//Asタイムの開始時間
extern int AsTime_E = 5;//Asタイムの終了時間
extern int EuTime_S = 6;
extern int EuTime_E = 11;
extern int UsTime_S = 12;
extern int UsTime_E = 19;
//+---------------------------------------+
週末制限用パラメーター
extern bool Weekend_Stop = true;//週末Stop用確認
【true】の場合、指定時間になると注文を出さなくなります。
extern bool Weekend_Close = true;//週末強制決済
【true】の場合、指定時間になるとポジションを強制決済します。
extern int Stop_Day_Of_Week = 5;//(0:日曜日 1:月曜日 2:火曜日 3:水曜日 4:木曜日 5:金曜日 6:土曜日)
注文を停止する曜日を指定します。
     ※注意、あくまでもサーバー時間です。
extern int Close_Day_Of_Week= 5;//(0:日曜日 1:月曜日 2:火曜日 3:水曜日 4:木曜日 5:金曜日 6:土曜日)
ポジションを決済する曜日を指定します。
     ※注意、あくまでもサーバー時間です。
extern int Stop_Hours = 13;
注文を停止する時間を指定します。
     ※注意、あくまでもサーバー時間です。
extern int Close_Hours = 20;
ポジションを決済する時間を指定します。
     ※注意、あくまでもサーバー時間です。
//+---------------------------------------+
一時的にEAを停止するパラメーター
extern bool Trade_Freeze = false;//時間による取引を凍結する場合はtrue
【true】の場合、指定時間内のオーダーを停止します。
     ※注意 日付してはしていませんので、設定して忘れていると、停止したままになります。
extern int Freeze_SH = 0;//凍結開始(時間)
オーダー停止の開始時間(時)
     ※注意、あくまでもサーバー時間です。
extern int Freeze_SM = 0;//凍結開始(分)
オーダー停止の開始時間(分)
     ※注意、あくまでもサーバー時間です。
extern int Freeze_EH = 0;//凍結終了(時間)
オーダー停止の終了時間(時)
     ※注意、あくまでもサーバー時間です。
extern int Freeze_EM = 0;//凍結終了(分)
オーダー停止の終了時間(分)
     ※注意、あくまでもサーバー時間です。 //+---------------------------------------+
ナンピン回数によるロット調整用のパラメーター このパラメーターを調整することにより、ロットに倍率を掛けることができます。
 extern double Lotpos1 = 1.0;
第1ポジション時のロット倍率
extern double Lotpos2 = 1.0;
第2ポジション時のロット倍率
extern double Lotpos3 = 1.0;
第3ポジション時のロット倍率
extern double Lotpos4 = 1.0;
第4ポジション時のロット倍率
extern double Lotpos5 = 1.0;
第5ポジション時のロット倍率
extern double Lotpos6 = 1.0;
その他(5以上)
//+---------------------------------------+

⑤エラー一覧
※EA作動時に「ターミナル」・「EXpert」・「メッセージ」に記載されるEAが発信するエラー報告です。 【We have no money. Free Margin =●●●】余剰証拠金不足です。
Close Positions Error OrderTicket =チケットナンバー】このチケットナンバーのオーダーを決済しようとしましたができませんでした。
※アラームによるエラーメッセージ
Error opening BUY order :GetLastError()】(GetLastError())の理由で買いポジションを取得できませんでした。
Error opening SELL order GetLastError()】(GetLastError())の理由で売りポジションを取得できませんでした。

⑥Q&A
Q)異なるバージョンのMizutoriを使用したいのですが、マジックは競合しますか?
A)競合します。EAをMetaEditorで開き【#define MYMAGIC 12345】を 【#define MYMAGIC 22345】に変更してください。

Q)Alpari UKで作動しません。
A)パラメーターの【StopLoss】・【TakeProfit】・【 PipStep】の数値を10倍してくださ。
※通貨ペアの値が小数点以下3桁になったため(他は、2桁)独自で対応してください。
Q)作動が確認されている業者は?
A)①ODL・FXDD・121証券・Alpari UK(上記対応後) Q)業者(サーバー)ごとに調整しなければならない時間設定は? A)週末STOPにかかわる事項だけです。(デフォルト状態の話です。)
Q)最低資金はいくら?
A)資金管理の内容が多かったので、一応参考までに掲示しておきます。
まずは、初期投資金額の設定方法です。
(最大オーダー数×必要証拠金/最少LOT)+(余剰証拠金(1と2の計算結果の大きい方)×KKD(勘と経験と度胸から求められる倍率 )
最低余剰証拠金1
(デフォルト時) (15×PipStep)+StopLoss=370(口座通貨名がJPYの場合、37,000JPY)
最低余剰証拠金2
バックテストでのMDDの結果 KKD:MDDは更新されるのが原則です。
KKD=2以上は必要です。
※計算を簡単にするために 口座通貨名JPY Lot=0.1
必要証拠金
10,000JPY/0.1Lot
最低余剰証拠金1を採用 KKD=2 と設定すると 最低初期投資金=(5×10,000)+(37,000×2)=124,000JPY となります。
次にその時のレバです。
(ここで注意が必要なことは、このEAで使われるレバは一般なレバとは分母が異なります。)
一般的なレバは、分母に有効証拠金が使われていますが、このEAでは余剰証拠金を使用していますので注意してください。
有効証拠金=124000
JPY Lot=0.1
必要証拠金 10,000JPY/0.1Lot とすると、
レバ=(Lot×100×100,000(取引数量))/(有効証拠金―(Lot数×必要証拠金))より
Lot=0.1(ファーストポジションの場合) (0.1×100×100,000)/(124,000-(1×10,000)=8.77
(このEAでいうレバです。)
これがlot=0.5(MAX)になると (0.5×100×100,000)/(124,000-32000※-(5×10,000))=119.05
※MAXLotに到達するまでに発生する見かけ損失分+Stoplossが発生するまでも損失分
第1ポジションの損失分 -100
第2ポジションの損失分 -82
第3ポジションの損失分 -64
第4ポジションの損失分 -46
第5ポジションの損失分 -28
合計            -320(-32,000JPY) となります。
初期投資金額の設定やレバの設定にお役立てください。
(あくまでも参考です。)

⑦まとめ
まだ、成長の巾があるEAだと思っています。EAの開発にご協力お願いします。
※誤字・誤り・更新内容がありましたら連絡をお願いします。

2009/01/19

カオスの呪縛!

為替のデータは、どんな特徴があるのか? まず、時間順で並んだ数値データ(時間の経過とともに観測されたデータ)のことを『時系列データ』と言います。
『時系列データ』の部類中で、天気・為替・株価などは、『カオス時系列データ』と位置付けられています。 なぜ? 学術的に言うと以下の事項を満たすとカオス性を持つと言えるようです。
1.周期性を持たない。
2.リアプノフ指数が0より大きい。
3.何らかのポアンカレ写像により、テント写像が確認できる。

ここでは、その検証は省略しますが、これらの事項を為替のデータなどは、満たしているそうです。 ※これは、私の解釈です。 『カオス時系列データ』とは、『過去(直近)のデータに影響を受け決定づけられたデータのこと』と考えています。
カオスとは? 混沌、無秩序を意味するカオスは、コンピュータの発達により「決定論的システムが作り出す予想不能のふるまい」、 即ち、ほんのわずかな初期条件の違いが予想もつかないほど大きく違った結果を生む現象、個々の現象は決定論的に予測できても、総体としては非連続でバラバラな挙動を示し予測不可能なこととしても認知されるようになった。
気象学者エドワード・ローレンツのローレンツアトラクタが有名。 この不規則で非常に複雑に見える現象が、簡単な方程式で書き表せることもある、とするのが「カオス理論」である(常にそうできる、とまでは主張しない)。
カオス理論は数学、物理学だけでなく、化学、医学などの生命科学、経済学や社会学など、全ての学問体系に影響を及ぼしている。(byウィキペディア 『カオス』より) カオスの特徴(byウィキペディア 『カオス理論』より) * 自己相似 * 単純な数式から、ランダムに見える複雑な振る舞いが発生する * 短期的(リアプノフ時間程度)には予測可能 * 初期値のごくわずかなずれが、将来の結果に甚大な差を生み出す(バタフライ効果) * 過去の観測データから将来の長期予測が困難となる これらを踏まえて、ここからが今回の内容になります。
【過去のデータから導いたEAは、カオスから逃れられない!】
例えば、MAがゴールデンクロスすれば、『買い!』デットクロスすれば『売り!』などというのは、過去のデータからの経験を利用したもので、『カオスの自己相似性』を利用したものにすぎません。
言い換えれば、ほとんどんのEAは、カオスの自己相似性を利用したもので、バタフライ効果が将来おとづれる(将来の結果に甚大な差を生み出す)要因を踏まえたものであると言えます。
ではどうすればいいのか? 『過去のデータに囚われないEAを作成すればいいのか?』 私は、そんな風には思いません。 前に投稿した『自動売買システムの種類』でも話したように、賞味期限があると理解し、絶えず対応していくことを忘れなければそれなりのEAが作成可能であると考えます。
また、『初期値のごくわずかなずれ』に対応できる最適化がおこなえれば、十分に有能なEAが作成可能であると考えます。 今、学者さんや専門家さんたちは、NN法(ニューラルネットワーク「通称:人工知能」)最近膀決定則などを用いて、短期的な予測を行おうとしています。また、いくつか実用されているものもあるでしょう。 ただ、『高度な技法を備えたEAだからと言って、有能なEAとは、限らない。』ということを覚えておいてください。

2009/01/18

自動売買EAの分類

特に、この内容には、私の思い込みが多く含まれています。 そのことを十分考慮に入れてご覧ください。 世の中には、いろいろなEAが存在しています。 それらのEAは、大きく分けると3種類に分類されると思っています。 ①過去のデーターのみを用いて作成されたEA  代表)NN系EAなど ②過去のデーターと確率的要因が含まれたEA  代表)①と③以外のEA ③確率的な要因のみで構成されたEA  代表)ナンピン系EA     例)一定量下がれば買い足していき、利益が出れば決済するなど、過去に囚われることなく売買していくEA では、その特徴は? 『利益/総資産』で見ていった場合 一般的に 【①>②>③】 になる。 『使用期限』私の考えでは、【ほとんどのEAには賞味期限が存在する】です。 【③>②>①】 になると考えます。 そのため(使用期限を延ばすため)、①では、ある期間ごとあるいは毎回、最適化をする必要があります。 上記内容を、まとめると、添付の表となります。 あなたが、目指すEAは、どのあたりのEAですか? 私が目指すEAは、②の①よりかな?

2009/01/17

ウサギとオオカミ?②

昨日の続きです。 昨日の条件を数式に当て嵌めてみると。 来年のウサギの個体数=今のウサギの個体数×(1.05-今のオオカミの個体数×0.001) 来年のオオカミの個体数=今のオオカミの個体数×((1-0.3)+今のウサギの個体数×0.002) 時間=n ウサギの個体数=U オオカミの個体数=O 全体の個体数=X とし、数式に変換すると・・・・・ U(n+1)=U(n)×(1.05―0.001×O(n)) O(n+1)=O(n)×(0.7+0.002×U(n)) X(n+1)=1.05×U(n)+0.7×O(n)+0.01×U(n)×O(n) となります。 つまり、この式が波の原因です。 また、前回のグラフは、初回の個体数がウサギ(200)オオカミ(50)の時のグラフです。 たとえば、オオカミが存在しない場合一番上のグラフになります。 この課題は、後ほど・・・・・ そして、『どうして波が発生するか?』という課題の結論は、 ウサギとオオカミが存在し、ウサギが増加したためにオオカミも増加する。しかし、オオカミが増加したためにウサギが減少していったため、その過程で個体数に波が発生したからだ。 相場に置き換えるなら、ウサギは?   オオカミは? 何なんでしょうか? 参考までに・・・・・・・

2009/01/16

ウサギとオオカミ?

捕食者と獲物の関係を元にどうして波が発生するか考えてみました。
ある条件を設定します。
(結構有名な話ですのでご存知の方も多いと思いますが・・・。) 
条件)
ウサギは、オオカミがいなければ、年間に5%個体数を増やす。
ウサギは、年間でオオカミの個体数の0.1%食べられる。
オオカミは、ウサギがいなければ、年間に0.3%減少する。
オオカミは、年間でウサギの個体数の0.2%個体数を増やす。
単純に考えて、個体数に波が発生することがわかりますよね!
グラフにしたのが右図です。
図の説明 縦軸が個体数を示し横軸が時間経過を示します。
緑線がウサギとオオカミの個体数の合計 青線が、ウサギの個体数 赤線が、オオカミの個体数 グラフからわかることは、 ①オオカミの個体数の増加のピークとウサギの増加のピークに時間的なズレがある。 ②全体数の増加のピークは、ウサギとオオカミの個体数の増加のピーク間にある。 まとめ もし、為替の値動き(波)が、個体数の合計と同じ現象で発生するのであれば、 ウサギの個体数をとらえられるEAが最も利益を生むEAになるに違いない。 ※などと考えながら、EAを作成しています。   そんな簡単なものではありませんが・・・・・・

Expert adviserの構成

Expert adviserの構成 大きく分けると本体とその他に分けられる。 本体 EA本体は、大域(グローバル)に関数の集合体を格納したもので、右記の図のような構成。 ※EA本体に必ず置かなければならないものとして、start()【メイン関数】があげられる。 その他 ライブラリーや組み込み関数、自作インジケーターなどがあげられる。 大域に設置されるコード 大域(グローバル)変数・配列・プロセッサー命令など基本条件や宣言・著作権の明記などである。 ※注意 ここで記載された内容は、プログラム全体に影響を与えるものとなる。 ※注意 大域で変数を宣言すると、EA開始時に初期化され、初期化指示を出さないと初期化されない。

2009/01/15

MetaEditorの記号の意味

※訂正2012/09/01
プログラムを作成していくと必ず、記号(//*"<+など)が出てきます。 まずその記号を確認しましょう。

【!】『感嘆符・イクスクラメーション
この記号の意味は、簡単に言ってしまえば否定(false)です。
例)if(!hoo)とはif(hoo==false)と同じ意味合いです。
ちなみに、if(hoo)とはif(hoo==true)と同じです。

【“】『引用符・ダブルクォーテーション
この符号で囲めば文字として認識されます。
例) Print("We have no money. Free Margin = ", AccountFreeMargin());
上記を表示させると We have no money. Free Margin = ●●●● となります。

【&】『アンパサンド
他の使い方もありますが、代表的なものに&&と2つ並べて条件式(if)の【かつ】
として使われます。
例)if(a&&b)C=1;※AかつBのときCに1を代入する。

【|】『縦線・パイプライン
2つ並べて条件式(if)の【もしくは】として使用されます。
例)if(a||B)C=1;※AもしくはBのときCに1を代入する。

【( )】『小括弧
計算式のまとめ(例)X=((A+B)*(C+D));)に使用されたり、関数の表記に使用されます。    A( ) とすると、「Aという関数」という意味合いになります。
例)int
start( )  ※スタート関数
doubule ABC(  )  ※自作ABC関数
if( ) ※if条件関数
for( ) ※繰り返し関数
関数については、後ほど・・・・・

【{・}】『中括弧
関数の適用範囲などをまとめる場合に使用します。
例)int start( ) { int Order = SIGNAL_NONE; ・・・・・・・・・・・・・・・・・・・・・・・・・・      }

【[・]】『大括弧
A[ ]という記載は、配列を意味します。    詳細は、後ほど・・・・・・・・・・・・・・・・

【*】『アスタリスク
計算式の×「かける」を意味します。

【+】『正符号・プラス

       計算式の+「たす」及び言葉を合わせる場合に使用します。
例)Tex = "Currency="+ase ; Comment(Tex);  
       表示させると      Currency= ●●●●      となります。

【―】『負符号・マイナス
計算式の-「引く」を意味します。

【. 】『コンマ』※ピリオド(訂正)
数字の小数点を意味します。
※「ピリオド」とよく間違えるので注意が必要です。

【, 】『ピリオド』※カンマ(コンマ)(訂正)
関数の( )内の区分などに使われます。
例)double MaHi = iMA(NULL,0,MaPeriod,MaShift,MODE_EMA,PRICE_OPEN,0);

【 / 】『斜線・スラッシュ
プログラム上で覚書を記入しておいたり、不必要なコードの無効化を行う際に、使用します。
例)//決済コード ※この場合は一行のみ無効化されます。
また/*~*/でブロックごと無効化することも可能です。

【 ; 】『セミコロン
一文の最後に記載します。(一文の終わりを宣言しています。)
注意:コロンと間違えたり、よく忘れるので注意が必要です。    

【<】『不等号・小なり

【>】『不等号・大なり
条件式および繰り返し関数などで使用します。
      例)A>B  ※AはBより大きい
      A>=B ※AはB以上
      A<B  ※AはB未満
A<=B ※AはB以下

【=】『等号・イコール
「A=B」は、AにBを代入という意味です。
「A==B」は、AとBは等しいという意味なので注意が必要!
「A!=B」は、AとBが等しくないという意味になります。

2009/01/14

ごあいさつ

MetaTraderに出会い自動売買に魅了された一人です。 EAのおもしろさを一緒に分かち合いたいと思い立ち上げました。 ※ここに記載された内容は、私の勝手な解釈にすぎません。  そのため、記載されている内容について、責任が負える文面は一切ありません。  また、この内容が元で不利益が発生しても負うことができませんのでご理解ください。 bighope