97 lines
3.3 KiB
MQL5
97 lines
3.3 KiB
MQL5
#include "..\IStrategy.mqh"
|
|
#include "..\KnowledgeBase.mqh"
|
|
#include "..\TradeManager.mqh"
|
|
|
|
class CAlligatorStrategy : public IStrategy
|
|
{
|
|
private:
|
|
int m_jawPeriod;
|
|
int m_teethPeriod;
|
|
int m_lipsPeriod;
|
|
int m_jawShift;
|
|
int m_teethShift;
|
|
int m_lipsShift;
|
|
|
|
// Cached values
|
|
double m_jaw, m_teeth, m_lips;
|
|
double m_close0, m_close1;
|
|
|
|
public:
|
|
CAlligatorStrategy(const string symbol, const ENUM_TIMEFRAMES tf) : IStrategy("AlligatorStrategy", symbol, tf)
|
|
{
|
|
m_jawPeriod = 13; m_teethPeriod = 8; m_lipsPeriod = 5;
|
|
m_jawShift = 8; m_teethShift = 5; m_lipsShift = 3;
|
|
m_jaw = m_teeth = m_lips = 0;
|
|
m_close0 = m_close1 = 0;
|
|
}
|
|
|
|
virtual string Name() { return "AlligatorStrategy"; }
|
|
|
|
virtual void Refresh()
|
|
{
|
|
m_close0 = iClose(m_symbol, m_timeframe, 0);
|
|
m_close1 = iClose(m_symbol, m_timeframe, 1);
|
|
|
|
double jaw_buffer[], teeth_buffer[], lips_buffer[];
|
|
|
|
// Alligator Jaw (Blue)
|
|
int jaw_handle = iAlligator(m_symbol, m_timeframe, m_jawPeriod, m_jawShift, m_teethPeriod, m_teethShift, m_lipsPeriod, m_lipsShift, MODE_SMMA, PRICE_MEDIAN);
|
|
|
|
if(jaw_handle > 0)
|
|
{
|
|
CopyBuffer(jaw_handle, 0, 0, 1, jaw_buffer);
|
|
CopyBuffer(jaw_handle, 1, 0, 1, teeth_buffer);
|
|
CopyBuffer(jaw_handle, 2, 0, 1, lips_buffer);
|
|
|
|
m_jaw = jaw_buffer[0];
|
|
m_teeth = teeth_buffer[0];
|
|
m_lips = lips_buffer[0];
|
|
}
|
|
}
|
|
|
|
virtual TradeOrder CheckSignal()
|
|
{
|
|
TradeOrder ord; ord.strategy_name = Name();
|
|
|
|
// Alligator awakening (lines converge then diverge)
|
|
bool awakening_up = (m_lips > m_teeth && m_teeth > m_jaw);
|
|
bool awakening_down = (m_lips < m_teeth && m_teeth < m_jaw);
|
|
|
|
if(awakening_up && m_close0 > m_lips)
|
|
{
|
|
// Bullish awakening
|
|
ord.action = ACTION_BUY;
|
|
ord.order_type = ORDER_TYPE_BUY;
|
|
double atr = GetATR(14, 0);
|
|
double spread = SymbolInfoDouble(_Symbol, SYMBOL_ASK) - SymbolInfoDouble(_Symbol, SYMBOL_BID);
|
|
double min_stop = MathMax(atr * 1.5, MathMax(spread*3, SymbolInfoInteger(_Symbol, SYMBOL_TRADE_STOPS_LEVEL) * _Point));
|
|
ord.stop_loss = m_jaw - min_stop;
|
|
ord.take_profit = m_close0 + min_stop * 3.0;
|
|
if(spread > min_stop*0.5) return ord;
|
|
return ord;
|
|
}
|
|
else if(awakening_down && m_close0 < m_lips)
|
|
{
|
|
// Bearish awakening
|
|
ord.action = ACTION_SELL;
|
|
ord.order_type = ORDER_TYPE_SELL;
|
|
double atr = GetATR(14, 0);
|
|
double spread = SymbolInfoDouble(_Symbol, SYMBOL_ASK) - SymbolInfoDouble(_Symbol, SYMBOL_BID);
|
|
double min_stop = MathMax(atr * 1.5, MathMax(spread*3, SymbolInfoInteger(_Symbol, SYMBOL_TRADE_STOPS_LEVEL) * _Point));
|
|
ord.stop_loss = m_jaw + min_stop;
|
|
ord.take_profit = m_close0 - min_stop * 3.0;
|
|
if(spread > min_stop*0.5) return ord;
|
|
return ord;
|
|
}
|
|
|
|
return ord;
|
|
}
|
|
|
|
virtual void ExportFeatures(CFeaturesKB* kb, const datetime ts)
|
|
{
|
|
if(CheckPointer(kb)==POINTER_INVALID) return;
|
|
(*kb).WriteKV(ts, m_symbol, Name(), "jaw", m_jaw);
|
|
(*kb).WriteKV(ts, m_symbol, Name(), "teeth", m_teeth);
|
|
(*kb).WriteKV(ts, m_symbol, Name(), "lips", m_lips);
|
|
}
|
|
};
|