94 lines
3.1 KiB
Plaintext
94 lines
3.1 KiB
Plaintext
//+------------------------------------------------------------------+
|
|
//| Classifier.mqh — 7+ trạng thái §1.1 (bar đóng shift 1) |
|
|
//+------------------------------------------------------------------+
|
|
#ifndef HYPERICT_CLASSIFIER_MQH
|
|
#define HYPERICT_CLASSIFIER_MQH
|
|
|
|
#include <HyperICT/Types.mqh>
|
|
#include <HyperICT/Config.mqh>
|
|
#include <HyperICT/FibValidator.mqh>
|
|
#include <HyperICT/KeyLevels.mqh>
|
|
|
|
//+------------------------------------------------------------------+
|
|
class CClassifier
|
|
{
|
|
public:
|
|
static ENUM_HTF_STATE Evaluate(HtfContext &ctx)
|
|
{
|
|
if(!ctx.snapshotReady || !ctx.swings.IsComplete())
|
|
return HTF_NEUTRAL;
|
|
|
|
if(ctx.structBias == STRUCT_NONE)
|
|
return HTF_NEUTRAL;
|
|
|
|
const int sh = 1;
|
|
const double bodyMid = (iClose(ctx.symbol, ctx.htf, sh) +
|
|
iOpen(ctx.symbol, ctx.htf, sh)) * 0.5;
|
|
|
|
if(ctx.update.phase != UPD_PHASE_IDLE)
|
|
{
|
|
if(ctx.structBias == STRUCT_BULL)
|
|
{
|
|
if(ctx.update.event == UPD_CONTINUE)
|
|
return HTF_BULL_CONTINUE;
|
|
if(ctx.update.event == UPD_CHOCH)
|
|
return HTF_BULL_CHOCH;
|
|
}
|
|
else if(ctx.structBias == STRUCT_BEAR)
|
|
{
|
|
if(ctx.update.event == UPD_CONTINUE)
|
|
return HTF_BEAR_CONTINUE;
|
|
if(ctx.update.event == UPD_CHOCH)
|
|
return HTF_BEAR_CHOCH;
|
|
}
|
|
}
|
|
|
|
if(!ctx.fibOk)
|
|
{
|
|
if(ctx.structBias == STRUCT_BULL)
|
|
return HTF_BULL_INCOMPLETE;
|
|
if(ctx.structBias == STRUCT_BEAR)
|
|
return HTF_BEAR_INCOMPLETE;
|
|
}
|
|
|
|
if(ctx.structBias == STRUCT_BULL)
|
|
{
|
|
if(CKeyLevels::BodyBreakBelow(ctx.symbol, ctx.htf, sh, ctx.keyLv1.price))
|
|
return HTF_BULL_CHOCH;
|
|
if(CKeyLevels::BodyBreakAbove(ctx.symbol, ctx.htf, sh, ctx.keyLv2.price))
|
|
return HTF_BULL_CONTINUE;
|
|
if(CKeyLevels::PriceBetween(bodyMid, ctx.keyLv1.price, ctx.keyLv2.price))
|
|
return HTF_BULL_PULLBACK;
|
|
}
|
|
else if(ctx.structBias == STRUCT_BEAR)
|
|
{
|
|
if(CKeyLevels::BodyBreakAbove(ctx.symbol, ctx.htf, sh, ctx.keyLv1.price))
|
|
return HTF_BEAR_CHOCH;
|
|
if(CKeyLevels::BodyBreakBelow(ctx.symbol, ctx.htf, sh, ctx.keyLv2.price))
|
|
return HTF_BEAR_CONTINUE;
|
|
if(CKeyLevels::PriceBetween(bodyMid, ctx.keyLv1.price, ctx.keyLv2.price))
|
|
return HTF_BEAR_PULLBACK;
|
|
}
|
|
|
|
return HTF_NEUTRAL;
|
|
}
|
|
|
|
static string StateText(const ENUM_HTF_STATE s)
|
|
{
|
|
switch(s)
|
|
{
|
|
case HTF_BULL_INCOMPLETE: return "BULL (Fib pending)";
|
|
case HTF_BEAR_INCOMPLETE: return "BEAR (Fib pending)";
|
|
case HTF_BULL_PULLBACK: return "BULL PULLBACK";
|
|
case HTF_BULL_CHOCH: return "BULL CHoCH";
|
|
case HTF_BULL_CONTINUE: return "BULL CONTINUE";
|
|
case HTF_BEAR_PULLBACK: return "BEAR PULLBACK";
|
|
case HTF_BEAR_CHOCH: return "BEAR CHoCH";
|
|
case HTF_BEAR_CONTINUE: return "BEAR CONTINUE";
|
|
default: return "NEUTRAL";
|
|
}
|
|
}
|
|
};
|
|
|
|
#endif // HYPERICT_CLASSIFIER_MQH
|