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型で、この関数を呼び出したところに、返す。】
}※ここまで

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