//+------------------------------------------------------------------+
//| candle_sign.mq5 |
//| 2022/00/00 RELEASE |
//| by Cross Retailing Co, LTD. |
//+------------------------------------------------------------------+
#property copyright "Copyright (c) , Cross Retailing Co, LTD."
#property version "1.00"
#property strict
#property indicator_chart_window
#property indicator_buffers 2
#property indicator_plots 2
#property indicator_color1 clrHotPink
#property indicator_color2 clrCornflowerBlue
//#property indicator_style1 STYLE_SOLID
//#property indicator_style2 STYLE_SOLID
#property indicator_width1 3
#property indicator_width2 3
#property indicator_type1 DRAW_ARROW
#property indicator_type2 DRAW_ARROW
input bool Alert_ON=true;
input bool Mail_ON=true;
input bool USDJPY_Alert=false;
input bool EURJPY_Alert=false;
input bool GBPJPY_Alert=false;
input bool AUDJPY_Alert=false;
input bool CADJPY_Alert=false;
input bool EURUSD_Alert=false;
input bool GBPUSD_Alert=false;
input bool AUDUSD_Alert=false;
input bool USDCAD_Alert=false;
input bool EURGBP_Alert=false;
input bool EURAUD_Alert=false;
input bool EURCAD_Alert=false;
input bool GBPAUD_Alert=false;
input bool GBPCAD_Alert=false;
input bool AUDCAD_Alert=false;
/*extern int MAMetod=0;
extern int MAPeriod=5;
extern int MAMetod2=1;
extern int MAPeriod2=10;*/
double up[],dn[];
int other[15][5];
int Buyflg = 0;
int Sellflg = 0;
double Pips,Tick_Value;
static double ArrowPos=20.0;
static double adjustment=1.0;
string plusSymbol;
double OpenPrice[],ClosePrice[],High_LowPrice[],High_LowPrice2[];
int AveCandle_Handle;
datetime timeflg;
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
PipsAdjust();
SetIndexBuffer(0,up);
SetIndexBuffer(1,dn);
PlotIndexSetString(0,PLOT_LABEL,NULL);
PlotIndexSetString(1,PLOT_LABEL,NULL);
PlotIndexSetInteger(0,PLOT_ARROW,233);
PlotIndexSetInteger(1,PLOT_ARROW,234);
ArraySetAsSeries(up,true);
ArraySetAsSeries(dn,true);
ArraySetAsSeries(OpenPrice,true);
ArraySetAsSeries(ClosePrice,true);
ArraySetAsSeries(High_LowPrice,true);
ArraySetAsSeries(High_LowPrice2,true);
AveCandle_Handle = iCustom(Symbol(),PERIOD_CURRENT,"MAX_Average_Candle");
//testAveCandle_Handle = iCustom(Symbol(),PERIOD_CURRENT,"heiken_ashi");
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Custom indicator iteration function |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
const int prev_calculated,
const datetime &time[],
const double &open[],
const double &high[],
const double &low[],
const double &close[],
const long &tick_volume[],
const long &volume[],
const int &spread[])
{
//int counted_bars=IndicatorCounted();
if(prev_calculated<0)return(-1);
int i;
if(CopyBuffer(AveCandle_Handle,0,0,Bars(_Symbol,PERIOD_CURRENT),High_LowPrice) == -1)return(0);
if(CopyBuffer(AveCandle_Handle,1,0,Bars(_Symbol,PERIOD_CURRENT),High_LowPrice2) == -1)return(0);
if(CopyBuffer(AveCandle_Handle,3,0,Bars(_Symbol,PERIOD_CURRENT),OpenPrice) == -1)return(0);
if(CopyBuffer(AveCandle_Handle,4,0,Bars(_Symbol,PERIOD_CURRENT),ClosePrice) == -1)return(0);
if(0==prev_calculated){
ArrayInitialize(up,EMPTY_VALUE);
ArrayInitialize(dn,EMPTY_VALUE);
//ArrayInitialize(OpenPrice,EMPTY_VALUE);
//ArrayInitialize(ClosePrice,EMPTY_VALUE);
//ArrayInitialize(High_LowPrice,EMPTY_VALUE);
//ArrayInitialize(High_LowPrice2,EMPTY_VALUE);
for(i=iBars(_Symbol,PERIOD_CURRENT)-10;i>=0;i--){
check(i,false);
}
}else{
check(0,true);
}
return(rates_total);
}
//+------------------------------------------------------------------+
void check(int i,bool message)
{
if(i < 100){
Print(iTime(_Symbol,PERIOD_CURRENT,i)," High_LowPrice[i] ",High_LowPrice[i]," High_LowPrice2[i] ",High_LowPrice2[i]," OpenPrice[i] ",OpenPrice[i]," ClosePrice[i] ",ClosePrice[i]);
timeflg = iTime(_Symbol,PERIOD_CURRENT,i);
}
//適用していない15通貨の判定
if(Alert_ON || Mail_ON){
GetSmoothedPrice(i,USDJPY_Alert,message,"USDJPY"+plusSymbol,0);
GetSmoothedPrice(i,EURJPY_Alert,message,"EURJPY"+plusSymbol,1);
GetSmoothedPrice(i,GBPJPY_Alert,message,"GBPJPY"+plusSymbol,2);
GetSmoothedPrice(i,AUDJPY_Alert,message,"AUDJPY"+plusSymbol,3);
GetSmoothedPrice(i,CADJPY_Alert,message,"CADJPY"+plusSymbol,4);
GetSmoothedPrice(i,EURUSD_Alert,message,"EURUSD"+plusSymbol,5);
GetSmoothedPrice(i,GBPUSD_Alert,message,"GBPUSD"+plusSymbol,6);
GetSmoothedPrice(i,AUDUSD_Alert,message,"AUDUSD"+plusSymbol,7);
GetSmoothedPrice(i,USDCAD_Alert,message,"USDCAD"+plusSymbol,8);
GetSmoothedPrice(i,EURGBP_Alert,message,"EURGBP"+plusSymbol,9);
GetSmoothedPrice(i,EURAUD_Alert,message,"EURAUD"+plusSymbol,10);
GetSmoothedPrice(i,EURCAD_Alert,message,"EURCAD"+plusSymbol,11);
GetSmoothedPrice(i,GBPAUD_Alert,message,"GBPAUD"+plusSymbol,12);
GetSmoothedPrice(i,GBPCAD_Alert,message,"GBPCAD"+plusSymbol,13);
GetSmoothedPrice(i,AUDCAD_Alert,message,"AUDCAD"+plusSymbol,14);
}
//平均足スムーズドの価格確認
double SortPrice[4];
SortPrice[0] = High_LowPrice[i];
SortPrice[1] = High_LowPrice2[i];
SortPrice[2] = OpenPrice[i];
SortPrice[3] = ClosePrice[i];
//ArraySort(SortPrice,4,0,MODE_DESCEND);
ArraySetAsSeries(SortPrice,false);
//同じ方向のサインを出さない処理
if(OpenPrice[i+1] < ClosePrice[i+1] && up[i+1] != EMPTY_VALUE){
Buyflg = 1;
Sellflg = 0;
}else if(OpenPrice[i+1] > ClosePrice[i+1] && dn[i+1] != EMPTY_VALUE){
Buyflg = 0;
Sellflg = 1;
}
//サイン判定
if(OpenPrice[i] < ClosePrice[i] && Buyflg == 0){
if(up[i] == EMPTY_VALUE){
up[i]=SortPrice[3]-SignPosition();
if(message){
AlertMail("Buy chance!",Symbol());
}
//Print("up ",iTime(_Symbol,PERIOD_CURRENT,i)," ",up[i]);
}
}else if(OpenPrice[i] > ClosePrice[i]
&& Sellflg == 0){
if(dn[i] == EMPTY_VALUE){
dn[i]=SortPrice[0]+SignPosition();
if(message){
AlertMail("Sell chance!",Symbol());
}
}
}
//条件が崩れていたらサインを消す
if(OpenPrice[i+1] > ClosePrice[i+1] && up[i+1] != EMPTY_VALUE){
up[i+1] = EMPTY_VALUE;
}
if(OpenPrice[i+1] < ClosePrice[i+1] && dn[i+1] != EMPTY_VALUE){
dn[i+1] = EMPTY_VALUE;
}
}
//他の15通貨の条件判定
void GetSmoothedPrice(int i,bool message, bool message2,string symbol,int index)
{
if(message){
//OpenPrice = iCustom(symbol,0,"MAX_Average_Candle",2,i);
//ClosePrice = iCustom(symbol,0,"MAX_Average_Candle",3,i);
//OpenPrice2 = iCustom(symbol,0,"MAX_Average_Candle",2,i+1);
//ClosePrice2 = iCustom(symbol,0,"MAX_Average_Candle",3,i+1);
if(OpenPrice[i+1] < ClosePrice[i+1] && other[index][0] != EMPTY_VALUE){
other[index][2] = 1;
other[index][3] = 0;
}else if(OpenPrice[i+1] > ClosePrice[i+1] && other[index][1] != EMPTY_VALUE){
other[index][2] = 0;
other[index][3] = 1;
}
if(OpenPrice[i] < ClosePrice[i] && other[index][2] == 0){
if(other[index][0] == EMPTY_VALUE){
other[index][0]=1;
other[index][1]=EMPTY_VALUE;
other[index][4] = i;
if(message2 && symbol != Symbol()){
AlertMail("Buy chance!",symbol);
}
}
}else if(OpenPrice[i] > ClosePrice[i] && other[index][3] == 0){
if(other[index][1] == EMPTY_VALUE){
other[index][1]=1;
other[index][0]=EMPTY_VALUE;
other[index][4] = i;
if(message2 && symbol != Symbol()){
AlertMail("Sell chance!",symbol);
}
}
}
if(OpenPrice[i+1] > ClosePrice[i+1] && other[index][0] != EMPTY_VALUE && other[index][4] < i ){
other[index][0] = EMPTY_VALUE;
}
if(OpenPrice[i+1] < ClosePrice[i+1] && other[index][1] != EMPTY_VALUE && other[index][4] < i){
other[index][1] = EMPTY_VALUE;
}
}
}
void AlertMail(string AlertMassage,string symbol)
{
string strText,strPeriod,strSymbol;
int nPeriod=Period();
switch(nPeriod){
case PERIOD_H1:strPeriod="] [H1] ";break;
case PERIOD_H4:strPeriod="] [H4] ";break;
case PERIOD_D1:strPeriod="] [D1] ";break;
case PERIOD_W1:strPeriod="] [W1] ";break;
case PERIOD_MN1:strPeriod="] [MN] ";break;
default:strPeriod="] [M"+DoubleToString(nPeriod,0)+"] ";
}
strSymbol=symbol;
strText="[MAXONE] ["+StringSubstr(strSymbol,0,3)+"/"+StringSubstr(strSymbol,3,3)+strPeriod+AlertMassage;
if(Alert_ON)Alert(strText);
if(Mail_ON)SendMail(strText,strText);
}
void PipsAdjust()
{
double dig1,dig2;
string s=Symbol();
if(6<StringLen(s))s=StringSubstr(s,6);else s="";
dig1=SymbolInfoInteger("USDJPY"+s,SYMBOL_DIGITS);
dig2=SymbolInfoInteger("EURUSD"+s,SYMBOL_DIGITS);
Tick_Value=SymbolInfoDouble(_Symbol,SYMBOL_TRADE_TICK_VALUE);
if(2==dig1||4==dig2){
Pips = _Point;
}else if(3==dig1||5==dig2){
Pips = _Point*10;
Tick_Value = Tick_Value*10;
}else if(4==dig1||6==dig2){
Pips = _Point*100;
Tick_Value = Tick_Value*100;
}else if(0==dig1&&0==dig2){
if(3==_Digits||5==_Digits){
Pips = _Point*10;
Tick_Value = Tick_Value*10;
}else{
Pips = _Point;
}
}else{
Pips = _Point*10;
Tick_Value = Tick_Value*10;
}
}
//サインの表示位置
double SignPosition()
{
return(ArrowPos*adjustment*Point());
}