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( )関数が終了します。】
※この後は、次回です。

3 件のコメント :

GKMA さんのコメント...

Bighopeさん!
非常~~~~~~~~~に参考になります。
某掲示板にも書きましたが、
x68kのCライクなBasic
を若干かじったりしていましたので
とっつきやすいですね。ベーシックぽくて。
MQL特有の使い方や技を覚えてしまえば
なんとなく作れると思います。
Bighopeさんの記事を参考にして
スキルアップしたいと思います!

polarB さんのコメント...

参考にさせて頂いてます。読めば読むほどMizutoriの安定性に納得がいきます。

1つ気づいたのですが強制決済条件の(TPf>TakeProfit*Point)は(TPf>TakeProfit)でよいかと思います。ちなみにこの条件をはずして、例えば指値TP18・強制決済TP12とするとうまい具合に平均利益が上がってくれました。ブローカーの約定力に左右されますが・・・

bighope さんのコメント...

気がつきませんでした。
申し訳ありません。
次回の投稿時に修正しておきます。
いつもありがとうございます。