TF-altProjekte/Experts/130/signaltradeexp.mqh

816 lines
23 KiB
MQL5
Raw Permalink Normal View History

2025-05-30 16:31:33 +02:00
//+------------------------------------------------------------------+
//| SignalTrade.mqh |
//| Sergey Greecie |
//| sergey1294@list.ru |
//+------------------------------------------------------------------+
#property copyright "Sergey Greecie"
#property link "sergey1294@list.ru"
//+------------------------------------------------------------------+
//| Declare variables for storing the settings of indicators |
//+------------------------------------------------------------------+
//--- input parameters Moving Average
int periodma1=8;
int periodma2=16;
ENUM_MA_METHOD MAmethod=MODE_SMA;
ENUM_APPLIED_PRICE MAprice=PRICE_CLOSE;
//--- input parameters MACD
int FastMACD=12;
int SlowMACD=26;
int MACDSMA=9;
ENUM_APPLIED_PRICE MACDprice=PRICE_CLOSE;
//--- input parameters Price Channel
int PCPeriod=22;
//--- input parameters Adaptive Channel ADX
int ADXPeriod=14;
//--- input parameters Stochastic Oscillator
int SOPeriodK=5;
int SOPeriodD=3;
int SOslowing=3;
ENUM_MA_METHOD SOmethod=MODE_SMA;
ENUM_STO_PRICE SOpricefield=STO_LOWHIGH;
//--- input parameters RSI
int RSIPeriod=14;
ENUM_APPLIED_PRICE RSIprice=PRICE_CLOSE;
//--- input parameters CCI
int CCIPeriod=14;
ENUM_APPLIED_PRICE CCIprice=PRICE_TYPICAL;
//--- input parameters WPR
int WPRPeriod=14;
//--- input parameters Bollinger Bands
int BBPeriod=20;
double BBdeviation=2.0;
ENUM_APPLIED_PRICE BBprice=PRICE_CLOSE;
//--- input parameters Standard Deviation Channel
int SDCPeriod=14;
double SDCdeviation=2.0;
ENUM_APPLIED_PRICE SDCprice=PRICE_CLOSE;
ENUM_MA_METHOD SDCmethod=MODE_SMA;
//--- input parameters Price Channel 2
int PC2Period=22;
//--- input parameters Envelopes
int ENVPeriod=14;
double ENVdeviation=0.1;
ENUM_APPLIED_PRICE ENVprice=PRICE_CLOSE;
ENUM_MA_METHOD ENVmethod=MODE_SMA;
//--- input parameters Donchian Channels
int DCPeriod=24;
int DCExtremes=3;
int DCMargins=-2;
//--- input parameters Silver-channels
int SCPeriod=26;
double SCSilvCh=38.2;
double SCSkyCh=23.6;
double SCFutCh=61.8;
//--- input parameters NRTR
int NRTRPeriod = 40;
double NRTRK = 2.0;
//--- input parameters Alligator
int ALjawperiod=13;
int ALteethperiod=8;
int ALlipsperiod=5;
ENUM_MA_METHOD ALmethod=MODE_SMMA;
ENUM_APPLIED_PRICE ALprice=PRICE_MEDIAN;
//--- input parameters AMA
int AMAperiod=9;
int AMAfastperiod=2;
int AMAslowperiod=30;
ENUM_APPLIED_PRICE AMAprice=PRICE_CLOSE;
//--- input parameters Ichimoku Kinko Hyo
int IKHtenkansen=9;
int IKHkijunsen=26;
int IKHsenkouspanb=52;
//+------------------------------------------------------------------+
//| Declare variables for storing the handles of indicators |
//+------------------------------------------------------------------+
int h_ma1 = INVALID_HANDLE;
int h_ma2 = INVALID_HANDLE;
int h_macd = INVALID_HANDLE;
int h_pc = INVALID_HANDLE;
int h_pc2 = INVALID_HANDLE;
int h_acadx = INVALID_HANDLE;
int h_stoh = INVALID_HANDLE;
int h_rsi = INVALID_HANDLE;
int h_cci = INVALID_HANDLE;
int h_wpr = INVALID_HANDLE;
int h_bb = INVALID_HANDLE;
int h_sdc = INVALID_HANDLE;
int h_env = INVALID_HANDLE;
int h_dc = INVALID_HANDLE;
int h_sc = INVALID_HANDLE;
int h_gc = INVALID_HANDLE;
int h_nrtr = INVALID_HANDLE;
int h_al = INVALID_HANDLE;
int h_ama = INVALID_HANDLE;
int h_ao = INVALID_HANDLE;
int h_ich = INVALID_HANDLE;
//+------------------------------------------------------------------+
//| Declare necessary arrays for storing data of indicators |
//+------------------------------------------------------------------+
double ma1_buffer[];
double ma2_buffer[];
double macd1_buffer[];
double macd2_buffer[];
double pc1_buffer[];
double pc2_buffer[];
double pc1_buffer2[];
double pc2_buffer2[];
double acadx1_buffer[];
double acadx2_buffer[];
double stoh_buffer[];
double rsi_buffer[];
double cci_buffer[];
double wpr_buffer[];
double bb1_buffer[];
double bb2_buffer[];
double sdc1_buffer[];
double sdc2_buffer[];
double env1_buffer[];
double env2_buffer[];
double dc1_buffer[];
double dc2_buffer[];
double sc1_buffer[];
double sc2_buffer[];
double gc1_buffer[];
double gc2_buffer[];
double nrtr1_buffer[];
double nrtr2_buffer[];
double al1_buffer[];
double al2_buffer[];
double al3_buffer[];
double ama_buffer[];
double ao_buffer[];
double ich1_buffer[];
double ich2_buffer[];
double Close[];
//+------------------------------------------------------------------+
//| functions for forming signals |
//| 0 - no signal |
//| 1 - signal to buy |
//| -1 - signal to sell |
//+------------------------------------------------------------------+
int TradeSignal_01()
{
//--- zero means absence of a signal
int sig=0;
//--- check handles of indicators
if(h_ma1==INVALID_HANDLE)//--- if the handle is invalid
{
//--- create it again
h_ma1=iMA(Symbol(),Period(),periodma1,0,MAmethod,MAprice);
//--- exit from the function
return(0);
}
else //--- if the handle is valid
{
//--- copy the values of indicator to the array
if(CopyBuffer(h_ma1,0,0,3,ma1_buffer)<3) //--- and if the data is less than necessary
//--- exit from the function
return(0);
//--- set indexing in the array as in a timeseries
if(!ArraySetAsSeries(ma1_buffer,true))
//--- in case of an indexation error exit from the function
return(0);
}
if(h_ma2==INVALID_HANDLE)//--- if the handle is invalid
{
//--- create it again
h_ma2=iMA(Symbol(),Period(),periodma2,0,MAmethod,MAprice);
//--- exit from the function
return(0);
}
else //--- if the handle is valid
{
//--- copy the values of indicator to the array
if(CopyBuffer(h_ma2,0,0,2,ma2_buffer)<2) //--- and if the data is less than necessary
//--- exit from the function
return(0);
//--- set indexing in the array as in a timeseries
if(!ArraySetAsSeries(ma1_buffer,true))
//--- in case of an indexation error exit from the function
return(0);
}
//--- perform checking of the condition and set the value for sig
if(ma1_buffer[2]<ma2_buffer[1] && ma1_buffer[1]>ma2_buffer[1])
sig=1;
else if(ma1_buffer[2]>ma2_buffer[1] && ma1_buffer[1]<ma2_buffer[1])
sig=-1;
else sig=0;
//--- return the trade signal
return(sig);
}
//+------------------------------------------------------------------+
int TradeSignal_02()
{
int sig=0;
if(h_macd==INVALID_HANDLE)
{
h_macd=iMACD(Symbol(),Period(),FastMACD,SlowMACD,MACDSMA,MACDprice);
return(0);
}
else
{
if(CopyBuffer(h_macd,0,0,2,macd1_buffer)<2)
return(0);
if(CopyBuffer(h_macd,1,0,3,macd2_buffer)<3)
return(0);
if(!ArraySetAsSeries(macd1_buffer,true))
return(0);
if(!ArraySetAsSeries(macd2_buffer,true))
return(0);
}
//--- perform checking of the condition and set the value for sig
if(macd2_buffer[2]>macd1_buffer[1] && macd2_buffer[1]<macd1_buffer[1])
sig=1;
else if(macd2_buffer[2]<macd1_buffer[1] && macd2_buffer[1]>macd1_buffer[1])
sig=-1;
else sig=0;
//--- return the trade signal
return(sig);
}
//+------------------------------------------------------------------+
int TradeSignal_03()
{
int sig=0;
if(h_pc==INVALID_HANDLE)
{
h_pc=iCustom(Symbol(),Period(),"Price Channel",PCPeriod);
return(0);
}
else
{
if(CopyBuffer(h_pc,0,0,3,pc1_buffer)<3)
return(0);
if(CopyBuffer(h_pc,1,0,3,pc2_buffer)<3)
return(0);
if(CopyClose(Symbol(),Period(),0,2,Close)<2)
return(0);
if(!ArraySetAsSeries(pc1_buffer,true))
return(0);
if(!ArraySetAsSeries(pc2_buffer,true))
return(0);
if(!ArraySetAsSeries(Close,true))
return(0);
}
//--- perform checking of the condition and set the value for sig
if(Close[1]>pc1_buffer[2])
sig=1;
else if(Close[1]<pc2_buffer[2])
sig=-1;
else sig=0;
//--- return the trade signal
return(sig);
}
//+------------------------------------------------------------------+
int TradeSignal_04()
{
int sig=0;
if(h_acadx==INVALID_HANDLE)
{
h_acadx=iCustom(Symbol(),Period(),"AdaptiveChannelADX",ADXPeriod);
return(0);
}
else
{
if(CopyBuffer(h_acadx,0,0,2,acadx1_buffer)<2)
return(0);
if(CopyBuffer(h_acadx,1,0,2,acadx2_buffer)<2)
return(0);
if(CopyClose(Symbol(),Period(),0,2,Close)<2)
return(0);
if(!ArraySetAsSeries(acadx1_buffer,true))
return(0);
if(!ArraySetAsSeries(acadx2_buffer,true))
return(0);
if(!ArraySetAsSeries(Close,true))
return(0);
}
//--- perform checking of the condition and set the value for sig
if(Close[1]>acadx1_buffer[1])
sig=1;
else if(Close[1]<acadx2_buffer[1])
sig=-1;
else sig=0;
//--- return the trade signal
return(sig);
}
//+------------------------------------------------------------------+
int TradeSignal_05()
{
int sig=0;
if(h_stoh==INVALID_HANDLE)
{
h_stoh=iStochastic(Symbol(),Period(),SOPeriodK,SOPeriodD,SOslowing,SOmethod,SOpricefield);
return(0);
}
else
{
if(CopyBuffer(h_stoh,0,0,3,stoh_buffer)<3)
return(0);
if(!ArraySetAsSeries(stoh_buffer,true))
return(0);
}
//--- perform checking of the condition and set the value for sig
if(stoh_buffer[2]<20 && stoh_buffer[1]>20)
sig=1;
else if(stoh_buffer[2]>80 && stoh_buffer[1]<80)
sig=-1;
else sig=0;
//--- return the trade signal
return(sig);
}
//+------------------------------------------------------------------+
int TradeSignal_06()
{
int sig=0;
if(h_rsi==INVALID_HANDLE)
{
h_rsi=iRSI(Symbol(),Period(),RSIPeriod,RSIprice);
return(0);
}
else
{
if(CopyBuffer(h_rsi,0,0,3,rsi_buffer)<3)
return(0);
if(!ArraySetAsSeries(rsi_buffer,true))
return(0);
}
//--- perform checking of the condition and set the value for sig
if(rsi_buffer[2]<30 && rsi_buffer[1]>30)
sig=1;
else if(rsi_buffer[2]>70 && rsi_buffer[1]<70)
sig=-1;
else sig=0;
//--- return the trade signal
return(sig);
}
//+------------------------------------------------------------------+
int TradeSignal_07()
{
int sig=0;
if(h_cci==INVALID_HANDLE)
{
h_cci=iCCI(Symbol(),Period(),CCIPeriod,CCIprice);
return(0);
}
else
{
if(CopyBuffer(h_cci,0,0,3,cci_buffer)<3)
return(0);
if(!ArraySetAsSeries(cci_buffer,true))
return(0);
}
//--- perform checking of the condition and set the value for sig
if(cci_buffer[2]<-100 && cci_buffer[1]>-100)
sig=1;
else if(cci_buffer[2]>100 && cci_buffer[1]<100)
sig=-1;
else sig=0;
//--- return the trade signal
return(sig);
}
//+------------------------------------------------------------------+
int TradeSignal_08()
{
int sig=0;
if(h_wpr==INVALID_HANDLE)
{
h_wpr=iWPR(Symbol(),Period(),WPRPeriod);
return(0);
}
else
{
if(CopyBuffer(h_wpr,0,0,3,wpr_buffer)<3)
return(0);
if(!ArraySetAsSeries(wpr_buffer,true))
return(0);
}
//--- perform checking of the condition and set the value for sig
if(wpr_buffer[2]<-80 && wpr_buffer[1]>-80)
sig=1;
else if(wpr_buffer[2]>-20 && wpr_buffer[1]<-20)
sig=-1;
else sig=0;
//--- return the trade signal
return(sig);
}
//+------------------------------------------------------------------+
int TradeSignal_09()
{
int sig=0;
if(h_bb==INVALID_HANDLE)
{
h_bb=iBands(Symbol(),Period(),BBPeriod,0,BBdeviation,BBprice);
return(0);
}
else
{
if(CopyBuffer(h_bb,1,0,2,bb1_buffer)<2)
return(0);
if(CopyBuffer(h_bb,2,0,2,bb2_buffer)<2)
return(0);
if(CopyClose(Symbol(),Period(),0,3,Close)<3)
return(0);
if(!ArraySetAsSeries(bb1_buffer,true))
return(0);
if(!ArraySetAsSeries(bb2_buffer,true))
return(0);
if(!ArraySetAsSeries(Close,true))
return(0);
}
//--- perform checking of the condition and set the value for sig
if(Close[2]<=bb2_buffer[1] && Close[1]>bb2_buffer[1])
sig=1;
else if(Close[2]>=bb1_buffer[1] && Close[1]<bb1_buffer[1])
sig=-1;
else sig=0;
//--- return the trade signal
return(sig);
}
//+------------------------------------------------------------------+
int TradeSignal_10()
{
int sig=0;
if(h_sdc==INVALID_HANDLE)
{
h_sdc=iCustom(Symbol(),Period(),"StandardDeviationChannel",SDCPeriod,SDCmethod,SDCprice,SDCdeviation);
return(0);
}
else
{
if(CopyBuffer(h_sdc,0,0,2,sdc1_buffer)<2)
return(0);
if(CopyBuffer(h_sdc,1,0,2,sdc2_buffer)<2)
return(0);
if(CopyClose(Symbol(),Period(),0,3,Close)<3)
return(0);
if(!ArraySetAsSeries(sdc1_buffer,true))
return(0);
if(!ArraySetAsSeries(sdc2_buffer,true))
return(0);
if(!ArraySetAsSeries(Close,true))
return(0);
}
//--- perform checking of the condition and set the value for sig
if(Close[2]<=sdc2_buffer[1] && Close[1]>sdc2_buffer[1])
sig=1;
else if(Close[2]>=sdc1_buffer[1] && Close[1]<sdc1_buffer[1])
sig=-1;
else sig=0;
//--- return the trade signal
return(sig);
}
//+------------------------------------------------------------------+
int TradeSignal_11()
{
int sig=0;
if(h_pc2==INVALID_HANDLE)
{
h_pc2=iCustom(Symbol(),Period(),"Price Channel",PC2Period);
return(0);
}
else
{
if(CopyBuffer(h_pc2,0,0,4,pc1_buffer2)<4)
return(0);
if(CopyBuffer(h_pc2,1,0,4,pc2_buffer2)<4)
return(0);
if(CopyClose(Symbol(),Period(),0,3,Close)<3)
return(0);
if(!ArraySetAsSeries(pc1_buffer2,true))
return(0);
if(!ArraySetAsSeries(pc2_buffer2,true))
return(0);
if(!ArraySetAsSeries(Close,true))
return(0);
}
//--- perform checking of the condition and set the value for sig
if(Close[1]>pc2_buffer2[2] && Close[2]<=pc2_buffer2[3])
sig=1;
else if(Close[1]<pc1_buffer2[2] && Close[2]>=pc1_buffer2[3])
sig=-1;
else sig=0;
//--- return the trade signal
return(sig);
}
//+------------------------------------------------------------------+
int TradeSignal_12()
{
int sig=0;
if(h_env==INVALID_HANDLE)
{
h_env=iEnvelopes(Symbol(),Period(),ENVPeriod,0,ENVmethod,ENVprice,ENVdeviation);
return(0);
}
else
{
if(CopyBuffer(h_env,0,0,2,env1_buffer)<2)
return(0);
if(CopyBuffer(h_env,1,0,2,env2_buffer)<2)
return(0);
if(CopyClose(Symbol(),Period(),0,3,Close)<3)
return(0);
if(!ArraySetAsSeries(env1_buffer,true))
return(0);
if(!ArraySetAsSeries(env2_buffer,true))
return(0);
if(!ArraySetAsSeries(Close,true))
return(0);
}
//--- perform checking of the condition and set the value for sig
if(Close[2]<=env2_buffer[1] && Close[1]>env2_buffer[1])
sig=1;
else if(Close[2]>=env1_buffer[1] && Close[1]<env1_buffer[1])
sig=-1;
else sig=0;
//--- return the trade signal
return(sig);
}
//+------------------------------------------------------------------+
int TradeSignal_13()
{
int sig=0;
if(h_dc==INVALID_HANDLE)
{
h_dc=iCustom(Symbol(),Period(),"Donchian Channels",DCPeriod,DCExtremes,DCMargins);
return(0);
}
else
{
if(CopyBuffer(h_dc,0,0,3,dc1_buffer)<3)
return(0);
if(CopyBuffer(h_dc,1,0,3,dc2_buffer)<3)
return(0);
if(CopyClose(Symbol(),Period(),0,2,Close)<2)
return(0);
if(!ArraySetAsSeries(dc1_buffer,true))
return(0);
if(!ArraySetAsSeries(dc2_buffer,true))
return(0);
if(!ArraySetAsSeries(Close,true))
return(0);
}
//--- perform checking of the condition and set the value for sig
if(Close[1]>dc1_buffer[2])
sig=1;
else if(Close[1]<dc2_buffer[2])
sig=-1;
else sig=0;
//--- return the trade signal
return(sig);
}
//+------------------------------------------------------------------+
int TradeSignal_14()
{
int sig=0;
if(h_sc==INVALID_HANDLE)
{
h_sc=iCustom(Symbol(),Period(),"Silver-channels",SCPeriod,SCSilvCh,SCSkyCh,SCFutCh);
return(0);
}
else
{
if(CopyBuffer(h_sc,0,0,2,sc1_buffer)<2)
return(0);
if(CopyBuffer(h_sc,1,0,2,sc2_buffer)<2)
return(0);
if(CopyClose(Symbol(),Period(),0,3,Close)<3)
return(0);
if(!ArraySetAsSeries(sc1_buffer,true))
return(0);
if(!ArraySetAsSeries(sc2_buffer,true))
return(0);
if(!ArraySetAsSeries(Close,true))
return(0);
}
//--- perform checking of the condition and set the value for sig
if(Close[2]<sc1_buffer[1] && Close[1]>sc1_buffer[1])
sig=1;
else if(Close[2]>sc2_buffer[1] && Close[1]<sc2_buffer[1])
sig=-1;
else sig=0;
//--- return the trade signal
return(sig);
}
//+------------------------------------------------------------------+
int TradeSignal_15()
{
int sig=0;
if(h_gc==INVALID_HANDLE)
{
h_gc=iCustom(Symbol(),Period(),"PriceChannelGalaher");
return(0);
}
else
{
if(CopyBuffer(h_gc,0,0,3,gc1_buffer)<3)
return(0);
if(CopyBuffer(h_gc,1,0,3,gc2_buffer)<3)
return(0);
if(CopyClose(Symbol(),Period(),0,2,Close)<2)
return(0);
if(!ArraySetAsSeries(gc1_buffer,true))
return(0);
if(!ArraySetAsSeries(gc2_buffer,true))
return(0);
if(!ArraySetAsSeries(Close,true))
return(0);
}
//--- perform checking of the condition and set the value for sig
if(Close[1]>gc1_buffer[2])
sig=1;
else if(Close[1]<gc2_buffer[2])
sig=-1;
else sig=0;
//--- return the trade signal
return(sig);
}
//+------------------------------------------------------------------+
int TradeSignal_16()
{
int sig=0;
if(h_nrtr==INVALID_HANDLE)
{
h_nrtr=iCustom(Symbol(),Period(),"NRTR",NRTRPeriod,NRTRK);
return(0);
}
else
{
if(CopyBuffer(h_nrtr,0,0,2,nrtr1_buffer)<2)
return(0);
if(CopyBuffer(h_nrtr,1,0,2,nrtr2_buffer)<2)
return(0);
if(!ArraySetAsSeries(nrtr1_buffer,true))
return(0);
if(!ArraySetAsSeries(nrtr2_buffer,true))
return(0);
}
//--- perform checking of the condition and set the value for sig
if(nrtr1_buffer[1]>0)
sig=1;
else if(nrtr2_buffer[1]>0)
sig=-1;
else sig=0;
//--- return the trade signal
return(sig);
}
//+------------------------------------------------------------------+
int TradeSignal_17()
{
int sig=0;
if(h_al==INVALID_HANDLE)
{
h_al=iAlligator(Symbol(),Period(),ALjawperiod,0,ALteethperiod,0,ALlipsperiod,0,ALmethod,ALprice);
return(0);
}
else
{
if(CopyBuffer(h_al,0,0,2,al1_buffer)<2)
return(0);
if(CopyBuffer(h_al,1,0,2,al2_buffer)<2)
return(0);
if(CopyBuffer(h_al,2,0,2,al3_buffer)<2)
return(0);
if(!ArraySetAsSeries(al1_buffer,true))
return(0);
if(!ArraySetAsSeries(al2_buffer,true))
return(0);
if(!ArraySetAsSeries(al3_buffer,true))
return(0);
}
//--- perform checking of the condition and set the value for sig
if(al3_buffer[1]>al2_buffer[1] && al2_buffer[1]>al1_buffer[1])
sig=1;
else if(al3_buffer[1]<al2_buffer[1] && al2_buffer[1]<al1_buffer[1])
sig=-1;
else sig=0;
//--- return the trade signal
return(sig);
}
//+------------------------------------------------------------------+
int TradeSignal_18()
{
int sig=0;
if(h_ama==INVALID_HANDLE)
{
h_ama=iAMA(Symbol(),Period(),AMAperiod,AMAfastperiod,AMAslowperiod,0,AMAprice);
return(0);
}
else
{
if(CopyBuffer(h_ama,0,0,3,ama_buffer)<3)
return(0);
if(!ArraySetAsSeries(ama_buffer,true))
return(0);
}
//--- perform checking of the condition and set the value for sig
if(ama_buffer[2]<ama_buffer[1])
sig=1;
else if(ama_buffer[2]>ama_buffer[1])
sig=-1;
else sig=0;
//--- return the trade signal
return(sig);
}
//+------------------------------------------------------------------+
int TradeSignal_19()
{
int sig=0;
if(h_ao==INVALID_HANDLE)
{
h_ao=iAO(Symbol(),Period());
return(0);
}
else
{
if(CopyBuffer(h_ao,1,0,20,ao_buffer)<20)
return(0);
if(!ArraySetAsSeries(ao_buffer,true))
return(0);
}
//--- perform checking of the condition and set the value for sig
if(ao_buffer[1]==0)
sig=1;
else if(ao_buffer[1]==1)
sig=-1;
else sig=0;
//--- return the trade signal
return(sig);
}
//+------------------------------------------------------------------+
int TradeSignal_20()
{
int sig=0;
if(h_ich==INVALID_HANDLE)
{
h_ich=iIchimoku(Symbol(),Period(),IKHtenkansen,IKHkijunsen,IKHsenkouspanb);
return(0);
}
else
{
if(CopyBuffer(h_ich,0,0,2,ich1_buffer)<2)
return(0);
if(CopyBuffer(h_ich,1,0,2,ich2_buffer)<2)
return(0);
if(!ArraySetAsSeries(ich1_buffer,true))
return(0);
if(!ArraySetAsSeries(ich2_buffer,true))
return(0);
}
//--- perform checking of the condition and set the value for sig
if(ich1_buffer[1]>ich2_buffer[1])
sig=1;
else if(ich1_buffer[1]<ich2_buffer[1])
sig=-1;
else sig=0;
//--- return the trade signal
return(sig);
}
//+------------------------------------------------------------------+