//+------------------------------------------------------------------+ //| expert start function | //+------------------------------------------------------------------+ int start() { //変数の宣言 int cnt, CurrentPosition; int Ticket; // オーダーチェック(ポジションなどのデータ) CurrentPosition=-1; for(cnt=0;cnt < OrdersTotal();cnt++){ OrderSelect(cnt,SELECT_BY_POS); if(OrderSymbol() == Symbol()) CurrentPosition=cnt; } // ポジションチェック ポジション無し if(CurrentPosition == -1) { //もしメインがシグナルを下から上にクロスしたら if( CrossMACD(12,26,9) == 1 ) { //買いポジションを取る Ticket = OrderSend(Symbol(), OP_BUY, 1, Ask, 3, Ask-(200*Point), Ask+(200*Point), "Buy", 0, 0, Red); } //もしメインがシグナルを上から下にクロスしたら if( CrossMACD(12,26,9) == 2) { //売りポジションを取る Ticket = OrderSend(Symbol(), OP_SELL, 1, Bid, 3, Bid+(200*Point), Bid-(200*Point), "Sell", 0, 0, Blue); } } // ポジション有り else { //ポジションの選択 OrderSelect(CurrentPosition,SELECT_BY_POS); //通貨ペアの確認 if(Symbol() == OrderSymbol()) { //もし買いポジションだったら if(OrderType()==OP_BUY) { //もしメインがシグナルを上から下にクロスしたら if( CrossMACD(12,26,9) == 2) { //手仕舞い OrderClose(OrderTicket(),OrderLots(),Bid,3,Green); //ドテンで売りポジションを取る Ticket = OrderSend(Symbol(), OP_SELL, 1, Bid, 3, Bid+(200*Point), Bid-(200*Point), "Sell", 0, 0, Blue); } } //もし売りポジションだったら else if(OrderType()==OP_SELL) { //もしメインがシグナルを下から上にクロスしたら if( CrossMACD(12,26,9) == 1) { //手仕舞い OrderClose(OrderTicket(),OrderLots(),Ask,3,Green); //ドテンで買いポジションを取る Ticket = OrderSend(Symbol(), OP_BUY, 1, Ask, 3, Ask-(200*Point), Ask+(200*Point), "Buy", 0, 0, Red); } } } } return(0); } /*------------------------------------------------------ 関数名 CrossMACD 内容 MACDのゴールデンクロスとデッドクロスを判断する関数 引数 int fast 短期EMA int slow 長期EMA int signal シグナル 戻り値 0:何も出来ていない 1:ゴールデンクロス 2:デッドクロス -------------------------------------------------------*/ int CrossMACD(int fast,int slow,int signal) { double kakoa,gennzaia; double kakob,gennzaib; //一つ前のMACDのメイン kakoa = iMACD(NULL,0,fast,slow,signal,PRICE_CLOSE,MODE_MAIN,1); //一つ前のMACDのシグナル kakob = iMACD(NULL,0,fast,slow,signal,PRICE_CLOSE,MODE_SIGNAL,1); //現在のMACDのメイン gennzaia = iMACD(NULL,0,fast,slow,signal,PRICE_CLOSE,MODE_MAIN,0); //現在のMACDのシグナル gennzaib = iMACD(NULL,0,fast,slow,signal,PRICE_CLOSE,MODE_SIGNAL,0); //もしメインがシグナルを下から上にクロスしたら if( kakoa < kakob && gennzaia >= gennzaib) { return(1); } //もしメインがシグナルを上から下にクロスしたら if( kakoa > kakob && gennzaia <= gennzaib) { return(2); } return(0); } // the end. //+------------------------------------------------------------------+