//+------------------------------------------------------------------+
//| Donchian.mq4 |
//| Copyright (c) 2017, Ichizo FX |
//| http://fx.ichizo.biz |
//+------------------------------------------------------------------+
#property copyright "Copyright (c) 2017, Ichizo FX"
#property link "http://fx.ichizo.biz"
// マイライブラリー
//#include <MyLib.mqh>
// マジックナンバー
extern int Magic = 20170209;
// 外部パラメータ
extern double Lots = 0.01;
extern int Slippage = 3;
extern string Comments = "Perfect";
// エントリー関数
extern int MAPeriod10 = 10; // 10本移動平均
extern int MAPeriod20 = 20; // 20本移動平均
extern int MAPeriod100 = 100; // 100本移動平均
extern int MAPeriod200 = 200; // 200本移動平均
int Calculated_Slippage = 0;
int Ticket = 0;
int Adjust_Slippage = 0;
datetime Bar_Time = 0;
bool Closed = false;
datetime Close_Time = 0;
double pos = 0;
int Order_Type = 0;
int AdjustSlippage(string Currency, int Slippage_Pips)
{
int Symbol_Digits = MarketInfo(Currency, MODE_DIGITS);
if (Symbol_Digits == 2 | Symbol_Digits == 4)
{
Calculated_Slippage = Slippage_Pips;
}
else if (Symbol_Digits == 3 | Symbol_Digits == 5)
{
Calculated_Slippage = Slippage_Pips * 10;
}
return (Calculated_Slippage);
}
int init()
{
Adjust_Slippage = AdjustSlippage(Symbol(), Slippage);
return(0);
}
// スタート関数
int start()
{
if (Bars < MAPeriod200) {
return(0);
}
if (Bar_Time == Time[0]) {
return(0);
} else if (Bar_Time != Time[0]) {
Bar_Time = Time[0];
}
double MA10 = iMA(NULL,0,MAPeriod10,0,MODE_SMA,PRICE_CLOSE,0);
double MA20 = iMA(NULL,0,MAPeriod20,0,MODE_SMA,PRICE_CLOSE,0);
double MA100 = iMA(NULL,0,MAPeriod100,0,MODE_SMA,PRICE_CLOSE,0);
double MA200 = iMA(NULL,0,MAPeriod200,0,MODE_SMA,PRICE_CLOSE,0);
// ポジションを持っているかの判定
if (OrderSelect(Ticket, SELECT_BY_TICKET)) {
Close_Time = OrderCloseTime();
// 未決済の場合
if (Close_Time == 0) {
// オープンポジションの計算
pos = OrderOpenPrice();
Order_Type = OrderType();
}
}
// Perfectか
int perfectBuy = 0;
int perfectSell = 0;
// 買いのパーフェクト
if (MA10 > MA20 && MA20 > MA100 && MA100 > MA200) {
perfectBuy = 1;
}
// 売りのパーフェクト
if (MA10 < MA20 && MA20 < MA100 && MA100 < MA200) {
perfectSell = 1;
}
// ロングポジションのクローズ
if (Ticket > 0 && Order_Type == OP_BUY && perfectBuy == 0) {
Closed = OrderClose(Ticket, Lots, Bid, Adjust_Slippage, Magenta);
if (Closed == true) {
Ticket = 0;
}
// ショートポジションのクローズ
} else if (Ticket > 0 && Order_Type == OP_SELL && perfectSell == 0) {
Closed = OrderClose(Ticket, Lots, Ask, Adjust_Slippage, Aqua);
if (Closed == true) {
Ticket = 0;
}
}
// 買いシグナル
if(OrdersTotal() == 0 && perfectBuy == 1)
{
Ticket = OrderSend(Symbol(), OP_BUY, Lots, Ask, Adjust_Slippage, 0, 0, Comments, Magic, 0, Magenta);
}
// 売りシグナル
if(OrdersTotal() == 0 && perfectSell == 1)
{
Ticket = OrderSend(Symbol(), OP_SELL, Lots, Bid, Adjust_Slippage, 0, 0, Comments, Magic, 0, Aqua);
}
return(0);
}