2009/02/04

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


表示にバグがありましたので修正しました。
Mizutori_EAの内部で何を行っているか、順に説明していきます。
本職の方が見たら、ホントでそれでいいのか?と問いかけたくなるところがあると思います。気になりましたコメントください。)
では、初期化関数から見ていきます。
この初期化関数『init()』は、EAを作動した時に1度だけ作動する場所です。
 一度だけ処理すれば、解決する内容を記載します。
int init()
{①
マジックナンバーの取得
Mc1Number = MYMAGIC + MagicfromSymbol();
【MagicfromSymbol()関数で処理した数値にMYMAGICを加えMc1Number(大域変数)に格納する。】
Profitの確認
TPf = Take_Profit();
【Take_Profit()関数で処理した数値をTPf(大域変数)に格納する。】
return(0);
}①
後処理関数です。(省略可能)
int deinit()
{
return(0);
}

ティックが更新するたびにスタート関数『start()』が呼び出されます。
expert start function
int start() {
int Order = SIGNAL_NONE;
int pos1=0,pos2=0;
bool OderStop = false;
bool OderClose = false;
bool fbp = false;
bool fsp = false;
//double Profit =0;
int Now_Time = TimeCurrent();
【現在のサーバータイムをNow_Timeに格納】
//int NowDay = TimeDay(Now_Time);
int NowHour = TimeHour(Now_Time);
【現在のサーバータイムを時間軸(時)に変更し、NowHourに格納】
int NowMin = TimeMinute(Now_Time);
【現在のサーバータイムを時間軸(分)に変更して、NowMinに格納】
if(!IsTradeAllowed())return(0);
【もし取引が可能でなければ、start()関数終了】
オーダーの凍結
int NT,FrT,ExT;
if(Trade_Freeze)【もしTrade_Freezeが真(true)なら{から}までを実行する。】
{①
NT = (60*NowHour)+NowMin;
【(60*NowHour)+NowMin『現在のサーバータイム』をNTに格納】
 ※●分を×分に変換しています。
FrT = (60*Freeze_SH)+Freeze_SM;
【設定したオーダー凍結開始時間を分に変換してFrTに格納】
ExT = (60*Freeze_EH)+Freeze_EM;
【設定したオーダー凍結終了時間を分に変換してExTに格納】
if((FrT<ExT)&&(FrT<NT)&&(NT<ExT))OderStop = true;
【もし( )内の条件が真(true)ならOderStop に真を格納】
if((FrT>ExT)&&((FrT<NT)||(NT<ExT)))OderStop = true;
もし( )内の条件が真(true)ならOderStop に真を格納】
}①

週末制限 および制限
if(Weekend_Stop==true && DayOfWeek()== Stop_Day_Of_Week && NowHour>=Stop_Hours)OderStop = true;//週末のオーダーストップ
 【もし( )内の条件が真(true)ならOderStop に真を格納】DayOfWeek()は、現在のサーバータイムの曜日(日~土)を0から6の数値で表す関数です。
if(Weekend_Stop==true && DayOfWeek()>Stop_Day_Of_Week)OderStop = true;
 【もし( )内の条件が真(true)ならOderStop に真を格納】
if(Weekend_Close==true && DayOfWeek()==Close_Day_Of_Week && NowHour>=Close_Hours)OderClose = true;//週末のオーダー強制決済
 【もし( )内の条件が真(true)ならOderClose に真を格納】
if(Weekend_Close==true && DayOfWeek()>Close_Day_Of_Week)OderStop = true;
 【もし( )内の条件が真(true)ならOderStop に真を格納】

最後に決済したオーダーの抽出
1時間の間最後に決済されてから金額よりも悪い条件で取引することを防止するための仕様です。
 int ht = OrdersHistoryTotal( )-1;
 【過去のオーダー数 -1をhtに格納】
int ODT = 0;
for(int Z = ht ; Z>=0 ;Z--)
 【過去のオーダー数回{~}内を繰り返す。Zは、過去のオーダー数からの引き算】
 過去のオーダーは、古いものから新しいもの(最後に決済したもの)の順に並んでいます。一番古いもの・・・・・・・・・・一番新しいもの
{
if(OrderSelect(Z, SELECT_BY_POS, MODE_HISTORY) == true)//口座履歴の選択
  【もし過去のデータファイルからデータを抜き出せたら{~}内を処理する。】
{
if(OrderMagicNumber() != Mc1Number) continue;//マジックナンバー
【もしマジックナンバーが異なっていたらこの処理をスキップする。】
datetime HistoryLastTime = OrderCloseTime( ) ;//決済した時間
【決済した時間をHistoryLastTimeに格納する。】
double HistoryLastPrice = OrderOpenPrice( ) ;
 【注文した時の価格をHistoryLastPriceに格納】
ODT = ODT+1;
 【ODTに1を加える】
}
if(HistoryLastPrice>0)break;
 【HistoryLastPriceが0以上ならループから脱出する。】
 }
 //ポジション取得の許可
int now =TimeHour(Now_Time-HistoryLastTime) ;
 【現在の時間から最後に決済された時間を引いてnowに時間単位(時)で格納】
if((now>=1)||(ODT==0)||(Ask<=(HistoryLastPrice-(PipStep*Point))))fbp = true;
 【もし(最後に決済されてから1時間以上経過した)または(過去のオーダーがない)または(最後に決済した価格よりもASKが下回ったら)fbpに真を格納する。】
if((now>=1)||(ODT==0)||(Bid>=(HistoryLastPrice+(PipStep*Point))))fsp = true;//
 【もし(最後に決済されてから1時間以上経過した)または(過去のオーダーがない)または(最後に決済した価格よりもBidが上回ったら)fbpに真を格納する。】
if(!Sort_Order){fbp = true;fsp = true;}
 【もしSort_Orderが真でなければ{ }を処理】
オープンポジションの抽出
//ポジション数の確認およびラストオーダーの金額の抽出
ポジションは、古いオーダー・・・・新しいオーダーの順で格納されています。
double LastPrice = 0;
for(int i=0;i<OrdersTotal();i++)【注文分繰り返す】
{①
if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES) == true){② //注文ポジションの選択
【もしデータファイルからデータを抜き出せたら{~}内を処理する。】
if(OrderMagicNumber() != Mc1Number) continue;//マジックナンバー
【マジックナンバーが異なればスキップ】
if(OrderType()==OP_BUY)pos1++;
 【BUY注文があればpos1に1を追加する】
if(OrderType()==OP_SELL)pos2++;
 【SELL注文があればpos2に1を追加する】
LastPrice=OrderOpenPrice();
【約定金額をLastPriceに格納】
}②
}①
int posX = pos1+pos2;
if((posX==0)||(posX > NumPos))
【もし( )内の条件のどちらかが真から{①}内を繰り返す。】
{①
NumPos=posX;
if(NumPos>1 && UseStopLoss )Changes_Stoploss(Mc1Number,NumPos);
【もしナンピン回数(オーダー数の合計)が更新されたら、Changes_Stoploss()関数にMc1Number,NumPosの条件を与えて処理させる。】
}①
時間軸による変更(サーバータイム[GTM+0]
int NH = NowHour+ServerTime_GMT;
MaShift = MaShift_Custom(NH);
【MaShift_Custom( )にNHを与えて、その結果をMaShiftに格納】
Xox = Xox_Custom(NH);
【Xox_Custom( )にNHを与えて、その結果をXoxに格納】

今回はここまでにしておきます。