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

part close v1.0.mq4

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

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

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

О программе

Советник использует библиотеку sovetnikovGUI для управления ордерами и рисования графических объектов. Все ключевые параметры — размер закрываемой части, расстояние до уровня, допустимое проскальзывание и магический номер — задаются через пользовательские настройки. В тестере стратегий при отсутствии активных позиций советник отправляет тестовые заявки на покупку и продажу для проверки работоспособности.

Настройки программы

НастройкаОписание
slippage Проскальзывание — Допустимое отклонение цены при исполнении ордера в пунктах; 0 означает отсутствие ограничения.
Magic Магический номер — Идентификатор ордеров советника; -1 обрабатывает все ордера, 0 — только ручные сделки.
Part Lot (%) (PartLot) Доля закрытия — Процент от текущего объёма лота, который будет закрыт при достижении уровня частичного закрытия.
Part Profit (pt) (PartProfit) Прибыль для частичного закрытия — Расстояние в пунктах от цены открытия, на котором устанавливается уровень частичного закрытия.
Alert Use (Alert_PartClose_Use) Использовать оповещение — Включает или отключает звуковое уведомление при частичном закрытии позиции.
Sound File (Alert_Sound_File) Файл звука — Имя звукового файла, который воспроизводится при частичном закрытии позиции.
TakeProfit (pt) (TakeProfit) Тейк-профит — Расстояние в пунктах от цены открытия для установки тейк-профита, если он отсутствует.
Line Width (Line_Width) Толщина линии — Толщина горизонтальной линии уровня частичного закрытия на графике.
Text Size (Text_Size) Размер текста — Размер шрифта текстовой метки, отображаемой рядом с уровнем частичного закрытия.
Получить полный код

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

#property version   "1.00"
#property strict
#include <sovetnikovGUI\Orders.mqh>

I slippage=0;

I Magic=-1;

D PartLot=50; //Part Lot (%)
D PartProfit=12; //Part Profit (pt)

B Alert_PartClose_Use=true; //Alert Use
S Alert_Sound_File="news.wav"; //Sound File

D TakeProfit=50; //TakeProfit (pt)

C Line_Color=clrBlue; //Line Color
I Line_Width=0; //Line Width

STYLE Line_Style=STYLE_DASHDOTDOT; //Line Style

C Text_Color=clrBlue; //Text Color
I Text_Size=12; //Text Size

class CMyOrders: public COrders
  {
public:

   void              OrdersControl(CDraw &draw,datetime tmStart)
     {
      __COPYRIGHT__
      for(int i=ArraySize(m_orders)-1; i>=0; i--)
        {
         if(m_orders[i].OrderCloseTime>0)
            continue;
         if(m_orders[i].OrderType>=2)
            continue; //отложки не трогаем

         if(CheckMagic(m_orders[i].OrderMagicNumber,m_orders[i].OrderComment) && CheckSymbol(m_orders[i].OrderSymbol))
           {

            /*
            проверяем если ли у ордера запомненные тр, сл и уровень.
            если нету , то проверяем открыт ли ордер после запуска, если открыт то создаем им с настройками по умолчанию
            если подошли к уровню частичного закрытия, то если ордер не закрывался - закроем часть
            если дошли до сл или тр то закроем ордер
            */
            long iticket=m_orders[i].OrderTicket;
            double dopen=m_orders[i].OrderOpenPrice;
            double dstop=m_orders[i].OrderStopLoss;
            double dtake=m_orders[i].OrderTakeProfit;
            string spart=StringFormat("%d_part",iticket);

            double dpart=virtual_get_var(iticket,"part"); //уровень частичного закрытия
            int idir=0;

            if(m_orders[i].OrderType==OP_BUY)
               idir=1;
            if(m_orders[i].OrderType==OP_SELL)
               idir=-1;

            double dAsk=Ask(m_orders[i].OrderSymbol);
            double dBid=Bid(m_orders[i].OrderSymbol);

            bool bModify=false;

            if(dstop==0)
              {
               dstop=dopen-idir*PartProfit*p;
               bModify=true;
              }

            if(dtake==0)
              {
               dtake=dopen+idir*TakeProfit*p;
               bModify=true;
              }

            if(bModify)
              {

               OrderModify((int)iticket,-1,dstop,dtake,0,clrNONE,false,true);
              }

            double dsumm=0;
            int icount=get_part((int)iticket,dsumm);

            if(icount>0)
              {
               draw.Delete(0,spart); //удалим линию если уже часть ордера закрыли
               continue; //удалим и пропустим работу с этим ордером
              }

            if(dpart==0)
              {

               if(icount==0 && m_orders[i].OrderOpenTime>=tmStart)
                 {

                  dpart=dopen+idir*PartProfit*p;

                  if(dstop>0)
                    {
                     double ddelta=Abs(dopen-dstop);

                     if(ddelta>0)
                       {
                        dpart=dopen+idir*ddelta;
                       }
                    }

                  if(idir==1 && dstop>=dopen && dstop>0)
                    {
                     dpart=0;
                    }

                  if(idir==-1 && dstop<=dopen && dstop>0)
                    {
                     dpart=0;
                    }

                  if(dpart==0)
                    {

                     draw.Delete(0,spart); //удалим линию если уже часть ордера закрыли
                     virtual_set_var(iticket,"part",0); //уровень частичного закрытия сохраним новы
                    }
                  else
                    {

                     draw.DrawHLine(0,spart,0,Time[1],dpart,Line_Width,Line_Style,Line_Color,true,false);
                     virtual_set_var(iticket,"part",dpart); //уровень частичного закрытия сохраним новы
                    }

                 }

              }
            else
              {

               double dprice=nd(draw.GetValuePrice1(0,spart),m_orders[i].OrderSymbol);//получим линию

               if(dprice==0)
                 {
                  dprice=dpart;
                  virtual_set_var(iticket,"part",dprice); //уровень частичного закрытия сохраним новы
                  draw.DrawHLine(0,spart,0,Time[1],dprice,Line_Width,Line_Style,Line_Color,true,false);//восстановим линию
                 }
               else
                 {

                  if(dpart!=dprice)
                    {

                     double ddelta=Abs(dopen-dprice);

                     if(idir==1 && dprice>dopen)
                       {

                        dstop=dopen-idir*ddelta;

                        virtual_set_var(iticket,"part",dprice); //уровень частичного закрытия сохраним новы
                        dpart=dprice;
                        OrderModify((int)iticket,-1,dstop,dtake,0,clrNONE,false,true);
                       }

                     if(idir==-1 && dprice<dopen)
                       {

                        dstop=dopen-idir*ddelta;

                        virtual_set_var(iticket,"part",dprice); //уровень частичного закрытия сохраним новы
                        dpart=dprice;
                        OrderModify((int)iticket,-1,dstop,dtake,0,clrNONE,false,true);
                       }

                    }
                  else
                    {

                     double doldstop=m_orders[i].OrderStopLoss;

                     double ddelta=Abs(dopen-dprice);

                     if(idir==1 && dprice>dopen)
                       {

                        dstop=dopen-idir*ddelta;

                        if(doldstop!=dstop)
                          {

                           ddelta=Abs(dopen-doldstop);

                           if(ddelta>0)
          

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

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

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

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

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

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

Стоимость полного кода
682,80₽ ≈ $8.35