Watch how to download trading robots for free
Interesting script?
So post a link to it -
let others appraise it
You liked the script? Try it in the MetaTrader 5 terminal
Libraries

template method - behavioral design pattern - library for MetaTrader 5

DMITRII PECHERITSA

Views:
904
Rating:
votes: 10
Published:
2020.12.09 10:18
\MQL5\Include\Mqh\Patterns\Template Method\
//+------------------------------------------------------------------+
//|                                               TemplateMethod.mq5 |
//|                                    2019-2020, dimitri pecheritsa |
//|                                                 792112@gmail.com |
//+------------------------------------------------------------------+
//
//   template method - 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
//   
//   define the skeleton of an algorithm in an operation, deferring some 
//steps to subclasses. template method lets subclasses redefine certain 
//steps of an algorithm without changing the algorithm's structure
//
//   structure
//      
//                  |    AbstractClass     |
//                  |----------------------|
//                  |TemplateMethod()      |
//                  | ...                  |
//                  | PrimitiveOperation1()|
//                  | ...                  |
//                  | PrimitiveOperation2()|
//                  | ...                  |
//                  |PrimitiveOperation1() |
//                  |PrimitiveOperation2() |
//                             ^
//                             |
//                  |    ConcreteClass    |
//                  |---------------------|
//                  |PrimitiveOperation1()|
//                  |PrimitiveOperation2()|
//      
//   applicability
//
//   the template method pattern should be used
//      to implement the invariant parts of an algorithm once and leave 
//it up to subclasses to implement the behavior that can vary
//      when common behavior among subclasses should be factored and 
//localized in a common class to avoid code duplication. this is a good 
//example of "refactoring to generalize". you first identify the differences 
//in the existing code and then separate the differences into new operations. 
//finally, you replace the differing code with a template method that 
//calls one of these new operations
//      to control subclasses extensions. you can define a template method 
//that calls "hook" operations (see consequences) at specific points, 
//thereby permitting extensions only at those points
//
//   participants
//
//   abstract class 
//      defines abstract primitive operations that concrete subclasses 
//define to implement steps of an algorithm
//      implements a template method defining the skeleton of an algorithm. 
//the template method calls primitive operations as well as operations 
//defined in abstract class or those of other objects
//   concrete class 
//      implements the primitive operations to carry out subclass-specific 
//steps of the algorithm
//
//   collaborations
//
//   concrete class relies on abstract class to implement the invariant 
//steps of the algorithm
//
//+------------------------------------------------------------------+
//|                                              example of a client |
//+------------------------------------------------------------------+
#include <Mqh\Patterns\Template Method\AbstractClass.mqh>
#include <Mqh\Patterns\Template Method\ConcreteClass.mqh>
void OnStart()
  {
   AbstractClass* instance=new ConcreteClass();
   instance.TemplateMethod();
   delete instance;
  }
//
//   output
//
//   abstract template method requested
//   executing concrete primitive operation 1
//   executing concrete primitive operation 2
//   
//   consequences
//
//   template methods are a fundamental technique for code reuse. they 
//are particularly important in class libraries, because they are the 
//means for factoring out common behavior in library classes.
//   template methods lead to an inverted control structure that's sometimes 
//referred to as "the hollywood principle," that is, "don't call us, we'll 
//call you". this refers to how a parent class calls the operations of 
//a subclass and not the other way around.
//   template methods call the following kinds of operations:
//      concrete operations (either on the concrete class or on client 
//classes);
//      concrete abstract class operations (i.e., operations that are 
//generally useful to subclasses);
//      primitive operations (i.e., abstract operations);
//      factory methods and
//      hook operations, which provide default behavior that subclasses 
//can extend if necessary. a hook operation often does nothing by default
//
//   implementation
//
//   three implementation issues are worth noting:
//      using c++ access control
//         in c++, the primitive operations that a template method calls 
//can be declared protected members. this ensures that they are only called 
//by the template method. primitive operations that must be overridden 
//are declared pure virtual. the template method itself should not be 
//overridden; therefore you can make the template method a nonvirtual 
//member function. 
//      minimizing primitive operations
//         an important goal in designing template methods is to minimize 
//the number of primitive operations that a subclass must override to 
//flesh out the algorithm. the more operations that need overriding, the 
//more tedious things get for clients.
//      naming conventions
//         you can identify the operations that should be overridden by 
//adding a prefix to their names. for example, refix template method names 
//with "do-": "docreatedocument", "doread", and so forth.
//
//   related patterns
//
//   factory methods are often called by template methods
//   strategy: template methods use inheritance to vary part of an algorithm. 
//strategies use delegation to vary the entire algorithm
//
//+------------------------------------------------------------------+
    Print Closed Position Print Closed Position

    Print info about a closed position by its position ticket or identifier.

    Deviation Rate BIAS MT5 Deviation Rate BIAS MT5

    Stock trading indicators. BIAS.

    visitor - behavioral design pattern visitor - behavioral design pattern

    represent an operation to be performed on the elements of an object structure. visitor lets you define a new operation without changing the classes of the elements on which it operates

    Basic Martingale EA Basic Martingale EA

    A Sample of Averaging Up/Down Martingale EA.