← К каталогу
Исходный код · ID 2984

order.mqh

Вы автор или правообладатель?

Сообщите нам, если считаете, что материал размещён без разрешения.

Краткий обзор

О программе

Файл order.mqh представляет собой библиотечный модуль языка MQL5, предназначенный для управления торговыми позициями. Он содержит два класса, реализующих логику трейлинга, безубытка и контроля состояния открытых сделок.

Класс CTral обеспечивает расчёт уровня стоп-лосса с учётом трейлинга и перевода в безубыток. Он принимает параметры трейлинга, триггеров и шагов, а также вычисляет итоговый уровень защиты на основе текущей цены и направления позиции.

Класс CThisTrade инкапсулирует данные и логику управления конкретной торговой позицией. Он отслеживает тикет, символ, тип, прибыль в пунктах, состояние открытия и завершения, а также поддерживает сеточный режим и блокировку.

Состав библиотеки

Классов: 2 · методов: 23 · конструкторов: 3 · деструкторов: 0 · отдельных функций: 0

Классы
Класс class CTral

Класс для расчёта уровня стоп-лосса с учётом трейлинга и безубытка позиции.

Класс class CThisTrade

Класс для управления данными и состоянием торговой позиции.

Методы и конструкторы
Конструктор · CTral CTral(uint mTral,uint tralTrigger, uint tralStep, uint breakEvenTrigger, int mBrekEven)

Конструктор класса CTral с параметрами трейлинга, триггеров и шагов.

Метод · CTral double GetSL(double mPrice,double mSL,double mPriceOpen)

Возвращает рассчитанный уровень стоп-лосса с учётом трейлинга и безубытка.

Метод · CTral CTral* Init(CTradeConst* mTradeConst,int mDirection)

Инициализирует параметры трейлинга и безубытка для класса CTral.

Конструктор · CThisTrade CThisTrade()

Конструктор по умолчанию класса CThisTrade.

Конструктор · CThisTrade CThisTrade(const CThisTrade& o)

Конструктор копирования класса CThisTrade.

Метод · CThisTrade _tTicket Ticket()

Возвращает тикет торговой позиции.

Метод · CThisTrade _tTicket CtrlTicket()

Возвращает контрольный тикет позиции.

Метод · CThisTrade string Symbol()

Возвращает символ торговой позиции.

Метод · CThisTrade int Type()

Возвращает тип торговой позиции.

Метод · CThisTrade string Ident()

Возвращает идентификатор позиции.

Метод · CThisTrade int ProfitPoint()

Возвращает прибыль позиции в пунктах.

Метод · CThisTrade bool IsLocked()

Проверяет, заблокирована ли позиция.

Метод · CThisTrade bool IsGrid()

Проверяет, находится ли позиция в сеточном режиме.

Метод · CThisTrade void Locked(bool val)

Устанавливает состояние блокировки позиции.

Метод · CThisTrade bool IsOpen()

Проверяет, открыта ли позиция.

Метод · CThisTrade bool IsFinish()

Проверяет, завершена ли позиция.

Метод · CThisTrade double Price()

Возвращает текущую цену позиции.

Метод · CThisTrade double Point()

Возвращает размер пункта символа.

Метод · CThisTrade int GridStep()

Возвращает текущий шаг сетки.

Метод · CThisTrade bool Control()

Выполняет контроль состояния позиции и обновляет данные.

Метод · CThisTrade bool Closing()

Проверяет, находится ли позиция в процессе закрытия.

Метод · CThisTrade bool InitLock(string m_symbol,int m_type,_tTicket m_ticket,string mComment)

Инициализирует защитную (лок) позицию с заданными параметрами.

Метод · CThisTrade bool InitMain(SSignal &sgnl,_tTicket mTicket,int mPrevGridStep)

Инициализирует основную торговую позицию с заданными параметрами.

Метод · CThisTrade void RememberPosition(bool m_is_main)

Запоминает данные позиции по её идентификатору.

Метод · CThisTrade void RememberOrder(bool m_is_main)

Запоминает данные позиции по ордеру.

Метод · CThisTrade void Remember(bool m_is_main)

Возвращает количество классов в библиотеке.

Получить полный код

Поиск по коду файла

??#include "Header.mqh"



#ifndef _THIS_ORDER_

#define _THIS_ORDER_



#include "Lib/STD/Memory/SharedPtr.mqh"

#include "Lib/Objects/Trade/CPosition.mqh"

#include "Lib/Objects/Trade/Tral/CClassicTral.mqh"



class CTral : public ITral

  {

private:

   uint _tral;

   uint _tralTrigger;

   uint _tralStep;

   uint _breakEvenTrigger;

   int _breakEven;

   double            cTralTrigger;

   double            cTral;

   double            cTralStep;

   double            cBreakEvenTrigger;

   double            cBreakEven;

   bool  isInit;

   bool isBE;

protected:

   CTradeConst*      cTradeConst;

   int               cDirection;

public:

                     CTral(uint mTral,uint tralTrigger, uint tralStep, uint breakEvenTrigger, int mBrekEven);

   double            GetSL(double mPrice,double mSL,double mPriceOpen);

   CTral*     Init(CTradeConst* mTradeConst,int mDirection);

private:

   double            BreackEvenControl(double mPrice,double sl);

   double            TralControl(double mPrice,double sl);

   double            NormalizePrice(double mPrice)    {return NormalizeDouble(MathRound(mPrice/_tickSize)*_tickSize,_digits);}

   void Init(double price);

  };

CTral::CTral(uint mTral,uint tralTrigger, uint tralStep, uint breakEvenTrigger, int mBrekEven):

   _tral(mTral),_tralTrigger(tralTrigger),_tralStep(tralStep),_breakEvenTrigger(breakEvenTrigger),_breakEven(mBrekEven),isInit(false),isBE(false){}

//-------------------------------------------------------------------------------------------

CTral* CTral::Init(CTradeConst* mTradeConst,int mDirection){

   cTradeConst=mTradeConst;

   cDirection=mDirection;

   cTral=::NormalizePrice(_tral*mTradeConst.point,mTradeConst.tickSize,mTradeConst.digits);

   cTralStep=::NormalizePrice(_tralStep*mTradeConst.point,mTradeConst.tickSize,mTradeConst.digits);

   return GetPointer(this);}

//-----------------------------------------------------------------------------------------------------

void CTral::Init(double price){

   isInit=true;

   cTralTrigger=!_tralTrigger?0.0:(::NormalizePrice(price+cDirection*cTradeConst.point*_tralTrigger,cTradeConst.tickSize,cTradeConst.digits));

   cBreakEvenTrigger=!_breakEvenTrigger?0.0:(::NormalizePrice(price+cDirection*cTradeConst.point*_breakEvenTrigger,cTradeConst.tickSize,cTradeConst.digits));

   cBreakEven=::NormalizePrice(price+cDirection*cTradeConst.point*_breakEven,cTradeConst.tickSize,cTradeConst.digits);

   if (!_breakEvenTrigger) isBE=true;

}

//----------------------------------------------------------------------------------------------------

double CTral::GetSL(double mPrice,double mSL,double mPriceOpen){

   if (!isInit)

      Init(mPriceOpen);

   double bSL=BreackEvenControl(mPrice,mSL);

   double tSL=TralControl(mPrice,mSL);

   return cDirection>0?MathMax(mSL,MathMax(bSL,tSL)):MathMin(mSL,MathMin(bSL,tSL));

}

//----------------------------------------------------------------------------------------------------

double CTral::BreackEvenControl(double mPrice,double sl){

   if (!isBE&&ComparePrice(mPrice,cBreakEvenTrigger,cDirection,cTradeConst.digits)==MORE){

      isBE=true;

      return cBreakEven;

   }

   return sl;

}

//---------------------------------------------------------------------------------------------------

double CTral::TralControl(double mPrice,double sl){

   if (cTral>0.0&&(!cTralTrigger||ComparePrice(mPrice,cTralTrigger,cDirection,cTradeConst.digits)==MORE)){

      if (!sl||!cTralStep||ComparePrice(mPrice,sl+cDirection*cTralStep,cDirection,cTradeConst.digits)==MORE){

         return NormalizeDouble(mPrice-cDirection*cTral,cTradeConst.digits); 

      }

   }

   return sl;

}



class CThisTrade{

   _tSharedPtr<CPosition> cPos;

   SFlag             flag;

   SPrice            price;           

   _tTicket               cMainTicket;   //B8:5B ?@54K4CI53> >@45@0 2 A5B:5

   int               cGridStep;

   double            volume;

   _tTicket          ctrl_ticket;

   string            ident;

   int               profit_point;

   int               digits;

   double            point;

   double            tick_size;

   bool              cIsFinish;

public:

                     CThisTrade();

                     CThisTrade(const CThisTrade& o) {this=o;}

   _tTicket Ticket() const {CPosition* pos=cPos.Get(); return pos==NULL?-1:pos.GetIdent(); }

   _tTicket CtrlTicket() const {return ctrl_ticket;}

   string Symbol() const {CPosition* pos=cPos.Get(); return pos==NULL?NULL:pos.GetSymbol();}

   int Type() const {CPosition* pos=cPos.Get(); return pos==NULL?0:(int)pos.Type();}

   string Ident() const {return ident;}

   int ProfitPoint() const {return profit_point;}

   bool IsLocked() const {return flag.lock;}

   bool IsGrid() const {return flag.isGrid;}

   void Locked(bool val) {flag.lock=val;}

   bool IsOpen() const  {CPosition* pos=cPos.Get(); return pos!=NULL&&pos.IsOpen();}

   bool IsFinish() const {CPosition* pos=cPos.Get(); return cIsFinish||(pos!=NULL&&pos.IsFinish());}

   double Price() const {return IsOpen()?cPos.Get().GetDealPrice():price.price;}

   double Point() const {return point;}

   int GridStep() const {return cGridStep;}

   bool              Control();

   bool              Closing() {CPosition* pos=cPos.Get(); return pos==NULL||pos.Closing();}

   bool              InitLock(string m_symbol,int m_type,_tTicket m_ticket,string mComment);

   bool              InitMain(SSignal &sgnl,_tTicket mTicket,int mPrevGridStep);

#ifdef __MQL5__

   void              RememberPosition(bool m_is_main);

   void              RememberOrder(bool m_is_main);

#else

   void              Remember(bool m_is_main);

#endif

private:

   _tTicket          TicketIdent(string m_comment);

   void              ProfitCalculate(int &prof);

   bool              Deal();

   void TralOn();

  };

//+------------------------------------------------------------------+

CThisTrade::CThisTrade():

   cMainTicket(0),   //B8:5B ?@54K4CI53> >@45@0 2 A5B:5

   cGridStep(0),

   volume(0.0),

   ctrl_ticket(0),

   ident(NULL),

   profit_point(0),

   digits(0),

   point(0.0),

   tick_size(0.0),

   cIsFinish(true)

   {}

//+------------------------------------------------------------------+

#ifdef __MQL5__

void CThisTrade::RememberPosition(bool m_is_main){

   flag.main=m_is_main;

   CPosition* pos=new CPosition(NULL,PositionGetInteger(POSITION_IDENTIFIER));

   cPos=pos;

   Control();

   price.price=pos.GetDealPrice();

   ctrl_ticket=TicketIdent(pos.Comment());

   point=SymbolInfoDouble(pos.GetSymbol(),SYMBOL_POINT);

   digits=(int)SymbolInfoInteger(pos.GetSymbol(),SYMBOL_DIGITS);

   tick_size=SymbolInfoDouble(pos.GetSymbol(),SYMBOL_TRADE_TICK_SIZE);

   ProfitCalculate(profit_point);

   price.sl_delta=(flag.main)?point*::main_sl:point*lock_sl;

   price.tp_delta=(flag.main)?point*::main_tp:point*lock_tp;

   price.sl_del

Показано первые 50% кода (символов: 25456)

Открыть по тарифу

Купите тариф с пакетом открытий или войдите, если тариф уже есть. Открытый файл останется в вашем кабинете навсегда.

Разовая покупка файла

На этой странице откроется полный исходный код файла вместо ознакомительного фрагмента.

Чтобы оформить заказ, введите email и перейдите к оплате.

Стоимость полного кода
2 545,60₽ ≈ $31.11