//+------------------------------------------------------------------+
//| State.mq5 |
//| 2019-2020, dimitri pecheritsa |
//| 792112@gmail.com |
//+------------------------------------------------------------------+
//
// state - behavioral design pattern
//
// from: design patterns: elements of reusable object-oriented software
// by gof: erich gamma, richard helm, ralph johnson, john vlissides
// published in 1994
//
// intent
//
// allow an object to alter its behavior when its internal state changes.
//the object will appear to change its class
//
// applicability
//
// an object's behavior depends on its state, and it must change its
//behavior at run-time depending on that state
// operations have large, multipart conditional statements that depend
//on the object's state. this state is usually represented by one or more
//enumerated constants. often, several operations will contain this same
//conditional structure. the state pattern puts each branch of the conditional
//in a separate class. this lets you treat the object's state as an object
//in its own right that can vary independently from other objects
//
// structure
//
// state
// |Context |o------------------>|State |
// |---------------| |--------|
// |Request() | |Handle()|
// | state.Handle()| |
// +--------------------+--- - - - -
// | |
// |ConcreteStateA| |ConcreteStateB|
// |--------------| |--------------|
// |Handle() | |Handle() |
//
// participants
//
// context
// defines the interface of interest to clients
// maintains an instance of a concrete state subclass that defines
//the current state
// state
// defines an interface for encapsulating the behavior associated
//with a particular state of the context
// concrete state subclasses
// each subclass implements a behavior associated with a state of
//the context
//
// collaborations
//
// context delegates state-specific requests to the current concrete
//state object
// a context may pass itself as an argument to the state object handling
//the request. this lets the state object access the context if necessary
// context is the primary interface for clients. clients can configure
//a context with state objects. once a context is configured, its clients
//don't have to deal with the state objects directly
// either context or the concrete state subclasses can decide which
//state succeeds another and under what circumstances
//+------------------------------------------------------------------+
//| client |
//+------------------------------------------------------------------+
#include <Mqh\Patterns\State\State.mqh>
#include <Mqh\Patterns\State\Context.mqh>
#include <Mqh\Patterns\State\ConcreteStateA.mqh>
#include <Mqh\Patterns\State\ConcreteStateB.mqh>
void OnStart(void)
{
Context context(new ConcreteStateA);
context.Request();
context.Request();
}
// output
//
// context is requesting its state 2097152 which will handle this context
// concrete state a (2097152) is handling context and changing the context state
// context state changed to: 3145728
// context is requesting its state 3145728 which will handle this context
// concrete state b (3145728) is handling context and changing the context state
// context state changed to: 4194304
//
// consequences
//
// it localizes state-specific behavior and partitions behavior for
//different states
// it makes state transitions explicit
// state objects can be shared
//
// implementation
//
// who defines the state transitions?
// a table-based alternative
// creating and destroying state objects
// using dynamic inheritance
//
// related patterns
//
// flyweight pattern explains when and how state objects can be shared
// state objects are often singletons
//
//+------------------------------------------------------------------+
#32121LibrariesMetaTrader 5👁 4472 views
state - behavioral design pattern
D
Author
DMITRII PECHERITSAPublished date
Nov 25, 2020
📚Related Articles
← View other articles →#77531Libraries
CSetupLedger: a per-setup win rate ledger for Expert Advisors
Why I wrote it My scalper trades two setups. A bullish order block and the bearish mirror of it. The Strategy Tester gave me one profit factor for both of them. I spent two weeks t...
Ali AkbarView detail →
#77488Libraries
Position sizing from risk, using the broker's own tick value and volume step
Every lot size calculator that assumes one pip is worth ten dollars is wrong on gold, wrong on indices, wrong on JPY crosses and wrong on any account not denominated in USD which i...
Ralph Ivan SimeonView detail →
#77156Libraries
PropFirm Defense
A prop firm account runs under a second rulebook MetaTrader 5 knows nothing about: a maximum loss measured from a fixed starting balance, a daily limit that resets at an hour the b...
Bruno Nunes Myrrha RibeiroView detail →