// マイライブラリー
#include <MyLib.mqh>
// マジックナンバー
#define MAGIC 20094060
#define COMMENT "平均足"
// 外部パラメータ
extern double Lots=0.1;
extern int Slippage=3;
extern int SLpips= 0; // 損切り値幅(pips)
extern int TPpips= 0; // 利食い値幅(pips)
extern int BandsPeriod=21;
extern int BandsDeviation=2;
extern int SignalContinuousBars=7;
extern int IsUseExit=true;
datetime LatestTime;
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
int EntrySignal(int magic)
{
// オープンポジションの計算
double pos=MyCurrentOrders(MY_OPENPOS,magic);
double heikinAshiOpen_1 = iCustom(NULL, NULL, "HeikinAshi", 0, 0);
double heikinAshiClose_1 = iCustom(NULL, NULL, "HeikinAshi", 1, 0);
double isContinuousPositiveBars =CountPositiveBars(2)>SignalContinuousBars;
double isContinuousNegativeBars =CountNegativeBars(2)>SignalContinuousBars;
bool isPositiveBars=heikinAshiClose_1> heikinAshiOpen_1;
bool isNegativeBars=heikinAshiClose_1< heikinAshiOpen_1;
bool buySignal=isContinuousNegativeBars && isPositiveBars;
bool sellSignal=isContinuousPositiveBars && isNegativeBars;
int ret=0;
// 買いシグナル
if(pos<=0 && buySignal)
ret=1;
// 売りシグナル
if(pos>=0 && sellSignal)
ret=-1;
return(ret);
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
void ExitPosition(int magic)
{
// オープンポジションの計算
double pos=MyCurrentOrders(MY_OPENPOS,magic);
double heikinAshiOpen_1 = iCustom(NULL, NULL, "HeikinAshi", 0, 0);
double heikinAshiClose_1 = iCustom(NULL, NULL, "HeikinAshi", 1, 0);
bool isPositiveBars=heikinAshiClose_1> heikinAshiOpen_1;
bool isNegativeBars=heikinAshiClose_1< heikinAshiOpen_1;
bool buyExitSignal=isNegativeBars;
bool sellExitSignal=isPositiveBars;
int ret=0;
//if(pos < 0 && 売りポジションの決済シグナル) ret = 1;
if(pos<0 && sellExitSignal)
ret=1;
//if(pos > 0 && 買いポジションの決済シグナル) ret = -1;
if(pos>0 && buyExitSignal)
ret=-1;
// オープンポジションの決済
if(ret!=0)
MyOrderClose(Slippage,magic);
}
// スタート関数
int start()
{
if(Time[0] != LatestTime)
{
LatestTime = Time[0];
}
else
{
return(0);
}
if(IsUseExit)
{
ExitPosition(MAGIC);
}
// エントリーシグナル
int sig_entry=EntrySignal(MAGIC);
// 買い注文
if(sig_entry>0)
{
MyOrderClose(Slippage,MAGIC);
MyOrderSendSL(OP_BUY,Lots,Ask,Slippage,SLpips,TPpips,COMMENT,MAGIC);
}
// 売り注文
if(sig_entry<0)
{
MyOrderClose(Slippage,MAGIC);
MyOrderSendSL(OP_SELL,Lots,Bid,Slippage,SLpips,TPpips,COMMENT,MAGIC);
}
return(0);
}
//+------------------------------------------------------------------+
bool MyOrderSendSL(int type,double lots,double price,int slippage,int slpips,int tppips,string comment,int magic)
{
int mult=1;
if(Digits == 3 || Digits == 5)
mult=10;
slippage *= mult;
if(type==OP_SELL || type==OP_SELLLIMIT || type==OP_SELLSTOP)
mult*=-1;
double sl=0,tp=0;
if(slpips > 0)
sl = price-slpips*Point*mult;
if(tppips > 0)
tp = price+tppips*Point*mult;
return(MyOrderSend(type, lots, price, slippage, sl, tp, comment, magic));
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
int CountPositiveBars(int timeshift)
{
int countPositiveBarsSum=0;
for(int i=0; i<Bars; i++)
{
double heikinAshiOpen_i = iCustom(NULL, NULL, "HeikinAshi", 0, i+timeshift);
double heikinAshiClose_i = iCustom(NULL, NULL, "HeikinAshi", 1, i+timeshift);
if(heikinAshiClose_i<heikinAshiOpen_i)
{
break;
}
countPositiveBarsSum++;
}
return countPositiveBarsSum;
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
int CountNegativeBars(int timeshift)
{
int countNegativeBarsSum=0;
for(int i=0; i<Bars; i++)
{
double heikinAshiOpen_i = iCustom(NULL, NULL, "HeikinAshi", 0, i+timeshift);
double heikinAshiClose_i = iCustom(NULL, NULL, "HeikinAshi", 1, i+timeshift);
if(heikinAshiClose_i>heikinAshiOpen_i)
{
break;
}
countNegativeBarsSum++;
}
return countNegativeBarsSum;
}
//+------------------------------------------------------------------+
コメント