![見出し画像](https://assets.st-note.com/production/uploads/images/64005722/rectangle_large_type_2_66a1962dccc97667d88a372d1188282e.png?width=1200)
FX自動売買EA mt4ソースコードあり:MACDとのシグナル線クロスで順張り買いエントリー
プログラムの機能概要
EAupdate-00007
MACDとシグナル線(MACDの指数平滑移動平均線)のゴールデンクロス時に買い注文を行うプログラムです。(順張りです。)
ほか、指定のpips値での損切、利確を行います。
ロジック詳細
MACDは「MACD=短期EMA-長期EMA」で計算されます。
このMACDとシグナル線(MACDの指数平滑移動平均線)がクロスした場合に買いオーダー(順張り)を行います。
ほか、固定pipsでの利確・損切(ポジション解消・決済処理)のオーダーを行います。
★以下の設定は簡単に変更できるようパラメータ化してあります★
・短期EMA 指数平滑移動平均線(1~100)
・長期EMA 指数平滑移動平均線(1~100)
・シグナル線(MACDのEMA)(1~100)
短期、長期、シグナル線はいずれも違う期間指定が必要です。(同じ値NG)
・利益注文時のpips(1~100)最小単位は1です。(少数点以下の設定不可)
・損切注文時のpips(1~100)最小単位は1です。(少数点以下の設定不可)
・ロット数:0.01~1.00の間で指定ください。0.01刻みです(小数点以下2桁まで指定)。
・許容スリッページ:3~10pipsの間で指定下さい。1刻みです。(整数で指定)
【ロジックご参考】
・対象通貨ペア、時間足はEAが設定されたチャートに依存します。(
・価格は終値で判定します
・決められた条件に達した際に1度だけ注文を出します。
・最大ポジション数は「1」固定です。
・「プログラム動作」に記載以外の動作は含まれておりません。証拠金・取引可能時間の確認やスプレッドの考慮、注文取消し、不成立時再注文、他は行っておりません。
【ご注意いただきたい事】
・作成したEAについて利益を保証するものではありません。
・FXの主要通貨ペアを想定しています。それ以外のCFDや先物、指数やコモディティの稼働は考慮しておりません。
ソースコード
mt4向けmqlでの作成ソースコードです。
//+---------------------------------------------------------------------+
//
//MACDとのシグナル線クロスで順張り買いエントリー
//
// code by KOUSHIROU
// https://note.com/mt4_coder
//+------------------------------------------------------------------+
//+---------------------------------------------------------------------+
// パラメーター設定 ★の部分は自由にパラメータ変更可能です。
//+---------------------------------------------------------------------+
input int MAGIC = 20120414;
input int Slippage=3;//★許容スリッページ
input int MaxSpread=10;//★スプレッド最大値(スプレッドが開きすぎるときはオーダーしない)
//取引ロット関連
input int MaxPosition=1;
input double BaseLots=0.01;//★ロット数
input int takeprofit=100;//★利確pips
input int stoploss=100;//★損切pips
//その他項目
double Lots;
input string C1="MACDクロス";
int TimeScale1 = 0;
int Entry1 = 1;//1_直近確定の足、2_二本前、3_三本前
input int MACD1_fast = 2; //★短期EMA 指数平滑移動平均線
input int MACD1_slow = 3; //★長期EMA 指数平滑移動平均線
input int MACD1_sig = 1; //★シグナル
//インジケーター矢印の幅
input int AllowNarrow=10;
//+---------------------------------------------------------------------+
// 一般関数
//+---------------------------------------------------------------------+
double AdjustPoint(string Currency)//ポイント調整
{
int Symbol_Digits=(int)MarketInfo(Currency,MODE_DIGITS);
double Calculated_Point=0;
if (Symbol_Digits==2 || Symbol_Digits==3)
{
Calculated_Point=0.01;
}
else if (Symbol_Digits==4 || Symbol_Digits==5)
{
Calculated_Point=0.0001;
}
else if (Symbol_Digits==1)
{
Calculated_Point=0.1;
}
else if (Symbol_Digits==0)
{
Calculated_Point=1;
}
return(Calculated_Point);
}
int AdjustSlippage(string Currency,int Slippage_pips )//スリッページ調整
{
int Calculated_Slippage=0;
int Symbol_Digits=(int)MarketInfo(Currency,MODE_DIGITS);
if (Symbol_Digits==2 || Symbol_Digits==3)
{
Calculated_Slippage=Slippage_pips;
}
else if (Symbol_Digits==4 || Symbol_Digits==5)
{
Calculated_Slippage=Slippage_pips*10;
}
return(Calculated_Slippage);
}
int LongPosition()//ロングポジション数を取得
{
int buys=0;
for(int i=0;i<OrdersTotal();i++)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true && OrderSymbol()==Symbol() && OrderMagicNumber()==MAGIC)
{
if(OrderType()==OP_BUY) buys++;
}
}
return(buys);
}
int ShortPosition()//ショートポジション数を取得
{
int sells=0;
for(int i=0;i<OrdersTotal();i++)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true && OrderSymbol()==Symbol() && OrderMagicNumber()==MAGIC)
{
if(OrderType()==OP_SELL) sells++;
}
}
return(sells);
}
//+---------------------------------------------------------------------+
// エントリ関連関数
//+---------------------------------------------------------------------+
//ポジションエントリ関数
void OpenOrder(int EntryPosition)
{
int res;
bool Modified;
double SL;
double TP;
int SLP=AdjustSlippage(Symbol(),Slippage );
//ロットサイズ調整
Lots=BaseLots;//固定ロット
if( EntryPosition == 1 ) //買いの場合のエントリ条件
{
res=OrderSend(Symbol(),OP_BUY,Lots ,Ask,SLP,0,0,"EAupdate",MAGIC,0,Red);
if (OrderSelect(res,SELECT_BY_TICKET)==true)
{
if (stoploss!=0) SL=OrderOpenPrice()-stoploss*AdjustPoint(Symbol());
if (takeprofit!=0) TP=OrderOpenPrice()+takeprofit*AdjustPoint(Symbol());
}
if(SL!=0 || TP!=0) Modified=OrderModify(OrderTicket(),OrderOpenPrice(),SL,TP,0,Red);
}
else if(EntryPosition == -1 ) //---- 売りエントリ
{
res=OrderSend(Symbol(),OP_SELL,Lots,Bid,SLP,0,0,"EAupdate",MAGIC,0,White);
if(OrderSelect(res,SELECT_BY_TICKET)==true)
{
if(stoploss!=0) SL=OrderOpenPrice()+stoploss*AdjustPoint(Symbol());
if(takeprofit!=0) TP=OrderOpenPrice()-takeprofit*AdjustPoint(Symbol());
}
if(SL!=0 || TP!=0) Modified=OrderModify(OrderTicket(),OrderOpenPrice(),SL,TP,0,White);
}
return;
}
//+---------------------------------------------------------------------+
// エグジット関連関数
//+---------------------------------------------------------------------+
//ポジションクローズ関数
void CloseOrder(int ClosePosition)
{
for(int i=OrdersTotal()-1;i>=0;i--)
{
int res;
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true)
{
if(OrderMagicNumber()==MAGIC && OrderSymbol()==Symbol())
{
if(OrderType()==OP_SELL && (ClosePosition==-1 || ClosePosition==0 )) //売りポジションのクローズ
{
res=OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),10,Silver);
}
else if(OrderType()==OP_BUY && (ClosePosition==1 || ClosePosition==0 ) ) //買いポジションのクローズ
{
res=OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),10,Silver);
}
}
}
}
}
//+---------------------------------------------------------------------+
// インジケーター
//+---------------------------------------------------------------------+
//2-1 シグナル|MACDとSignal線のクロス(順張り)
int Indicator2_1(int i,int TimeScale,int MACDfast,int MACDslow,int MACDsig)
{
double Main=iMACD(NULL,TimeScale,MACDfast,MACDslow,MACDsig,0,0,i);
double Sig= iMACD(NULL,TimeScale,MACDfast,MACDslow,MACDsig,0,1,i);
double Main_1=iMACD(NULL,TimeScale,MACDfast,MACDslow,MACDsig,0,0,i+1);
double Sig_1= iMACD(NULL,TimeScale,MACDfast,MACDslow,MACDsig,0,1,i+1);
int ret=0;
if (Main>Sig && Main_1<Sig_1)
{
ret=1;
}
else if(Main<Sig && Main_1>Sig_1)
{
ret=-1;
}
return(ret);
}
//+---------------------------------------------------------------------+
// ティック毎の処理
//+---------------------------------------------------------------------+
void start()
{
// ニューバーの発生直後以外は取引しない
static datetime bartime=Time[0];
if (Time[0]==bartime) return;
bartime=Time[0];
//各種パラメーター取得
int EntryBuy=0;
int EntrySell=0;
int ExitBuy=0;
int ExitSell=0;
int LongNum=LongPosition();
int ShortNum=ShortPosition();
//クローズ判定
//買いのクローズロジックなし、固定PIPSのみ
//売りのクローズロジックなし、固定PIPSのみ
//エントリ基準取得
int Strtagy1=Indicator2_1(Entry1,TimeScale1,MACD1_fast,MACD1_slow,MACD1_sig);
int TotalNum=ShortNum+LongNum;
//エントリ判定
if((TotalNum<MaxPosition ) && (Strtagy1==1 ))
{
EntryBuy=1;
}
//売りエントリのロジックは選択されていません
//オープン処理
if( ((Ask-Bid)/AdjustPoint(Symbol())) < MaxSpread )
{
if(EntryBuy!=0)
{
OpenOrder(1);
}
if(EntrySell!=0)
{
OpenOrder(-1);
}
}
}
以上、どうぞよろしくお願いいたします。