Multi_Lot_Scalperの解読1
今回は、Multi Lot ScalperというEAのコードを見ていきましょうか。
ダウンロード元はこちら↓
http://codebase.mql4.com/en/619
まずは、どんなパラメータがあるかサラッと見ましょう!
extern double TakeProfit = 40;
extern double Lots = 0.1;
extern double InitialStop = 0;
extern double TrailingStop = 20;
extern int MaxTrades = 10;
extern int Pips = 15;
extern int SecureProfit = 10;
extern int AccountProtection = 1;
extern int OrderstoProtect = 3;
extern int ReverseCondition = 0;
extern double EURUSDPipValue = 10;
extern double GBPUSDPipValue = 10;
extern double USDCHFPipValue = 10;
extern double USDJPYPipValue = 9.715;
extern int StartYear = 2005;
extern int StartMonth = 1;
extern int EndYear = 2006;
extern int EndMonth = 12;
extern int EndHour = 22;
extern int EndMinute = 30;
extern int mm = 0;
extern int risk = 12;
extern int AccountisNormal = 0;
変数名で役割がなんとなく分かるものとそうでないものがありますが、
先に進めば役割が分かってきますので、サラッとみます^^;
記憶用の変数もサラッ!と見ましょう。
//----
int OpenOrders = 0, cnt = 0;
int slippage = 5;
double sl = 0, tp = 0;
double BuyPrice = 0, SellPrice = 0;
double lotsi = 0, mylotsi = 0;
int mode = 0, myOrderType = 0;
bool ContinueOpening = True;
double LastPrice = 0;
int PreviousOpenOrders = 0;
double Profit = 0;
int LastTicket = 0, LastType = 0;
double LastClosePrice = 0, LastLots = 0;
double Pivot = 0;
double PipValue = 0;
string text = "", text2 = "";
今のところは、「こんな変数をここで宣言しているんだな~」程度で
良いかと思います。
でわ早速 int start() の中身を見ていきましょう!
if(AccountisNormal == 1)
if(mm != 0)
lotsi = MathCeil(AccountBalance()*risk/10000);
else
lotsi=Lots;
else
// then is mini
if(mm != 0)
lotsi = MathCeil(AccountBalance()*risk / 10000) / 10;
else
lotsi = Lots;
//----
if(lotsi > 100)
lotsi = 100;
個人的にはif文が重なるときは{}があったほうが見やすいのですが^^;
内容は
もし AccountisNormal が1の時で
mm が0ではない場合
lotsi に口座残高* risk /10000 の小数点以下切り上げを代入。
その他(mm が0)の場合
lotsiにLotsを代入。
//ミニの場合
その他の( AccountisNormal が1ではない)時で
mm が0ではない場合
lotsi に口座残高* risk /10000/10 の小数点以下切り上げを代入。
その他(mm が0)の場合
lotsiにLotsを代入。
もしlotsi が100より大きい時
lotsiに100を代入。
という感じです。
ここで MathCeil() はカッコ内の数値を小数点以下繰り上げといった感じです。
繰り上げなので、数値がマイナスの時、たとえば-2.999の時は-2に繰り上がります。
あと、変数 mm はマネーマネジメントのイニシャルという感じですね。
mmをオン(0以外)にした場合、lotsi をロット数にするには大きい感じがしますね。
でわ、次を見てみましょう。
OpenOrders = 0;
//----
for(cnt = 0; cnt < OrdersTotal(); cnt++)
{
OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
//----
if(OrderSymbol() == Symbol())
OpenOrders++;
}
です。内容は
念のため OpenOrders を0にしておいて、
cnt が0から オーダー(この場合は所持ポジション)の総数より小さい内は
{}内を行い cnt に1を足すということを繰り返します。
{
インデックス cnt のポジションを選択し
もしその通貨ペアが現在のチャートの通貨ペアと同じ場合
OpenOrders に1を足す。
}
といった感じです。
所持ポジションのうち現在のチャートの通貨ペアの数を OpenOrders で表す感じですね。
続いて
//----
if(OpenOrders < 1)
{
if(TimeYear(CurTime()) < StartYear)
return(0);
//----
if(TimeMonth(CurTime()) < StartMonth)
return(0);
//----
if(TimeYear(CurTime()) > EndYear)
return(0);
//----
if(TimeMonth(CurTime()) > EndMonth )
return(0);
}
ですが、内容は
もし OpenOrders が1より小さい(0の)場合で、
もし、現在の年が StartYear より小さい時、終了。
もし、現在の月が StartMonth より小さい時、終了。
もし、現在の年が EndYear より大きい時、終了。
もし、現在の月が EndMonth より大きい時、終了。
といった感じです。
これは、ちょっと気になりますね・・・。
このままだと、たとえば
StartYear = 2005
StartMonth = 10
EndYear = 2007
EndMonth = 8
とした場合、現在の月が10月より小さい場合は、終了。
現在の月が8月より大きい場合は、終了。
ということは、いつでもここで終了ということになってしまいます。
何年何月~何年何月までというような条件を作る時は
if(TimeYear(CurTime()) < StartYear)
return(0);
//----
if(TimeMonth(CurTime()) < StartMonth && TimeYear(CurTime()) == StartYear)
return(0);
//----
if(TimeYear(CurTime()) > EndYear)
return(0);
//----
if(TimeMonth(CurTime()) > EndMonth && TimeYear(CurTime()) == EndYear)
return(0);
とするとできますね。
今回の条件はまた別の意味があるかもしれませんので
先に進みましょうか^^;
続いては、
//----
if(Symbol() == "EURUSD")
PipValue = EURUSDPipValue;
//----
if(Symbol() == "GBPUSD")
PipValue = GBPUSDPipValue;
//----
if(Symbol() == "USDJPY")
PipValue = USDJPYPipValue;
//----
if(Symbol() == "USDCHF")
PipValue = USDCHFPipValue;
//----
if(PipValue == 0)
{
PipValue = 5;
}
です。
内容は、
もし現在のチャートの通貨ペアがEURUSDの時、PipValue に EURUSDPipValue を代入。
(後の3つも同じ感じ)
もし PipValue が0の時、PipValue に5を代入。
といった感じです。
PipValue が0の時というのは、PipValue に何も代入されていなくて
初期値のままか、0が代入された時というわけですね。
もし PipValue が正の数じゃないとマズい時はif(PipValue <= 0) とした方がいいかもですね。
それにしても、PipValue は何に使うんでしょうね。ワクワクしますね!
このワクワクは、次回まで持ち越しましょうか。
でわ、今回はこの辺で。
応援ありがとうございます!
→FXシステムトレード派
→rank応援クリック
→人気ブログランキング
ps
メルマガ登録ありがとうございます。
まだ、第1号を発行してないのですが、登録数にビックリしています^^;
第1号は来週あたりを予定しております。お楽しみに!
タグ
コメント (2)
StartYear、EndMonthとかはEA有料化するため、期限を設定する用ですね。
Bogie-ATC2007-1もそういう風に期限付きのバージョンを売ってますね。
投稿者:為替龍 |2008年1月13日 02:14
ですよね!
ありがとうございます。
投稿者:慶次 |2008年1月13日 06:19


