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

dragon trade.mq4

Похожие материалы по тегам

2 to 1 strategy with signals.pineTradingView · 2 общих теговmulti_lot_scalper_a.mq4MQL4 / MetaTrader 4 · 2 общих теговfresh algo signals & overlays v25_6334471093901859175.pineTradingView · 2 общих теговfresh algo v24 tradingview indicator_5918156155804195406.pineTradingView · 2 общих теговlinear regression channel.mq4MQL4 / MetaTrader 4 · 2 общих теговtrading criteria.mq4MQL4 / MetaTrader 4 · 2 общих тегов
Вы автор или правообладатель?

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

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

О программе

Dragon Trade — торговый советник для MetaTrader 4, работающий на основе технических индикаторов и ценовых данных. Советник анализирует текущие рыночные условия и автоматически открывает и управляет ордерами на торговом счёте.

Программа поддерживает управление сеткой ордеров с возможностью усреднения позиций и добавления ордеров по профиту. Встроена система сопровождения прибыли с трейлинг-стопом и тейк-профитом для контроля рисков.

Советник оснащён настраиваемой информационной панелью, отображающей баланс, эквити, профит и другую торговую информацию. Реализована фильтрация по спреду, времени работы и количеству сигналов. Встроена система лицензирования для защиты продукта.

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

НастройкаОписание
Комментарий (cmt) Комментарий — Комментарий к ордерам
Размер текста в панели (FontSize) Размер текста в панели — Размер текста в панели
Magic Меджик — Меджик — идентификатор ордеров советника
Time (WorkTime) Время работы — Время работы
Максимальный спред (0 - выкл) (MaxSpread) Максимальный спред (0 - выкл) — Максимальный спред (0 — выключено)
Максимальное количество ордеров по сигналам (MaxSignals) Максимальное количество ордеров по сигналам — Максимальное количество ордеров по сигналам
Инверсия сигналов (Inverse) Инверсия сигналов — Инверсия сигналов
Lot (Lot) Лот — Размер лота
Количество ордеров по профиту (0 - выкл) (MaxOrdersProfit) Количество ордеров по профиту (0 - выкл) — Количество ордеров по профиту (0 — выключено)
Следующий ордер по профиту через (пт) (NextOrderProfit) Следующий ордер по профиту через (пт) — Следующий ордер по профиту через (пт)
Множитель по профиту (ProfitLotMn) Множитель по профиту — Множитель по профиту
Добавочный лот по профиту (ProfitLotAdd) Добавочный лот по профиту — Добавочный лот по профиту
Максимальный лот по профиту (ProfitMaxLot) Максимальный лот по профиту — Максимальный лот по профиту
Количество усредняющих ордеров (0 - выкл) (MaxOrdersMinus) Количество усредняющих ордеров (0 - выкл) — Количество усредняющих ордеров (0 — выключено)
Усредняющий ордер через (пт) (NextOrderMinus) Усредняющий ордер через (пт) — Усредняющий ордер через (пт)
Множитель при усреднении (MinusLotMn) Множитель при усреднении — Множитель при усреднении
Добавочный лот при усреднении (MinusLotAdd) Добавочный лот при усреднении — Добавочный лот при усреднении
Максимальный лот при усреднении (MinusMaxLot) Максимальный лот при усреднении — Максимальный лот при усреднении
Тейк профит для сетки (0 - выкл) (TakeProfit) Тейк профит для сетки (0 - выкл) — Тейк профит для сетки (0 — выключено)
Общий трейлинг старт ($) (TrailingStart) Общий трейлинг старт ($) — Общий трейлинг старт ($)
Общий трейлинг стоп($) (TrailingStop) Общий трейлинг стоп($) — Общий трейлинг стоп ($)
период быстрой средней (fast_ema_period) период быстрой средней — Период быстрой средней
период медленной средней (slow_ema_period) период медленной средней — Период медленной средней
период сигнальной линии (signal_period) период сигнальной линии — Период сигнальной линии
Получить полный код

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

#property version   "1.00"
#property strict

#include <sovetnikovGUI\Orders.mqh>
#include <sovetnikovGUI\Time.mqh>
#include <sovetnikovGUI\Button.mqh>
#include <Charts\Chart.mqh>

#define VALID_KEY "Эксперт активирован."
#define EMPTY_KEY "Отсутствует лицензия."
#define INVALID_KEY "Неверная лицензия."
#define EXPERIED "Закончилось время работы."

#define LICENSE_NAME "dragontrade_key"
#define FILE_EXT "dragon"

#resource "\\Images\\dragon\\panel_dragon.bmp"

#define PANEL_RESOURCE "::Images\\dragon\\panel_dragon.bmp"

#define PANEL_W 524
#define PANEL_H 474

S cmt=""; //Комментарий

I FontSize=11; //Размер текста в панели
I Magic=888;

S WorkTime="00:00-24:00"; //Time

D MaxSpread=0; //Максимальный спред (0 - выкл)

I MaxSignals=3; //Максимальное количество ордеров по сигналам

B Inverse=false; //Инверсия сигналов
D Lot=0.1; //Lot
SEP(10);//.
BLOCK(10,"Профит");//.
I MaxOrdersProfit=100; //Количество ордеров по профиту (0 - выкл)
D NextOrderProfit=20; //Следующий ордер по профиту через (пт)
D ProfitLotMn=1; //Множитель по профиту
D ProfitLotAdd=0;//Добавочный лот по профиту
D ProfitMaxLot=100; //Максимальный лот по профиту
SEP(11);//.
BLOCK(11,"Минус");//.
I MaxOrdersMinus=100; //Количество усредняющих ордеров (0 - выкл)
D NextOrderMinus=100; //Усредняющий ордер через (пт)
D MinusLotMn=1.53; //Множитель при усреднении
D MinusLotAdd=0;//Добавочный лот при усреднении
D MinusMaxLot=100; //Максимальный лот при усреднении
SEP(12);//.
BLOCK(12,"Сопровождение прибыли");//.
D TakeProfit=0; //Тейк профит для сетки (0 - выкл)
D TrailingStart=10;//Общий трейлинг старт ($)
D TrailingStop=5;//Общий трейлинг стоп($)

SEP(1);//.
BLOCK(1,"Indicator settings");//.
ENUM_TIMEFRAMES tf=PERIOD_CURRENT;
I fast_ema_period=12;  // период быстрой средней
I slow_ema_period=24;  // период медленной средней
I signal_period=9; //период сигнальной линии

int  signal_bar=SIGNAL_BAR_OPEN;
int slippage=0;

class CMyOrders: public COrders
  {
public:

   int               signal()
     {

      double dmacd[2],dmacds[2];
      dmacd[0]=iMACD(_Symbol,tf,fast_ema_period,slow_ema_period,signal_period,PRICE_CLOSE,MODE_MAIN,signal_bar);
      dmacd[1]=iMACD(_Symbol,tf,fast_ema_period,slow_ema_period,signal_period,PRICE_CLOSE,MODE_MAIN,signal_bar+1);

      dmacds[0]=iMACD(_Symbol,tf,fast_ema_period,slow_ema_period,signal_period,PRICE_CLOSE,MODE_SIGNAL,signal_bar);
      dmacds[1]=iMACD(_Symbol,tf,fast_ema_period,slow_ema_period,signal_period,PRICE_CLOSE,MODE_SIGNAL,signal_bar+1);

      double dsar=iSAR(_Symbol,tf,0.002,0.02,1);
      double dhigh=iHigh(_Symbol,tf,1);
      double dlow=iLow(_Symbol,tf,1);

      if(dmacd[0]>0 && dsar<dlow)
         return OP_BUY;
      if(dmacd[0]<0 && dsar>dhigh)
         return OP_SELL;

      return -1;
     }

   void              CloseByMagic(long iMagic)
     {

      for(int i=::OrdersTotal()-1; i>=0; i--)
        {
         if(!::OrderSelect(i,SELECT_BY_POS))
            continue;

         if((::OrderMagicNumber()==iMagic ||  ::OrderTicket()==iMagic) && ::OrderSymbol()==m_name)
           {

            OrderClose(::OrderTicket());

           }

        }
     }

   double            ControlByMagic(long iMagic,int itype,bool bclose,bool bspread,int &ib,int &is)
     {
      double array_order_buy[][2], array_order_sell[][2];/*0-price,1-ticket*/

      ArrayResize(array_order_buy,0);
      ArrayResize(array_order_sell,0);

      int cb=0,cs=0;
      double dprofit=0;

      for(int i=::OrdersTotal()-1; i>=0; i--)
        {
         if(!::OrderSelect(i,SELECT_BY_POS))
            continue;

         if((::OrderMagicNumber()==iMagic ||  ::OrderTicket()==iMagic) && ::OrderSymbol()==m_name)
           {

            if(::OrderType()==OP_BUY && itype==OP_BUY)
              {
               if(ArrayResize(array_order_buy,cb+1)!=-1)
                 {
                  array_order_buy[cb][0]=::OrderOpenPrice();
                  array_order_buy[cb][1]=(double)::OrderTicket();
                  cb++;
                  ib++;

                  dprofit+=MacroProfit;
                 }
              }

            if(::OrderType()==OP_SELL && itype==OP_SELL)
              {
               if(ArrayResize(array_order_sell,cs+1)!=-1)
                 {
                  array_order_sell[cs][0]=::OrderOpenPrice();
                  array_order_sell[cs][1]=(double)::OrderTicket();
                  cs++;
                  is++;

                  dprofit+=MacroProfit;
                 }
              }

           }

        }

      if(!bclose && bspread)
        {

         if(itype==OP_BUY && cb>0)
           {

            ArraySort(array_order_buy,WHOLE_ARRAY,0,MODE_ASCEND);

            int tup=(int)array_order_buy[cb-1][1];
            int tdn=(int)array_order_buy[0][1];

            int icountPlus=0,icountMinus=0;
            for(int i=0; i<cb; i++)
              {
               if((int)array_order_buy[0][1]!=iMagic)
                  icountMinus++;
               else
                  break;
              }

            icountPlus=cb-icountMinus;

            if(NextOrderProfit>0 && icountPlus<MaxOrdersProfit)
              {

               if(::OrderSelect(tup,SELECT_BY_TICKET,MODE_TRADES))
                 {

                  if(::OrderCloseTime()==0)
                    {

                     double dpt=OrderStepPoint();

                     if(dpt>=NextOrderProfit)
                       {

                        double dnextlot=NLot(::OrderLots()*ProfitLotMn+ProfitLotAdd);

                        Magic(iMagic);
                        if(dnextlot>ProfitMaxLot)
                           dnextlot=ProfitMaxLot;
                        OrderSend(itype,dnextlot,-1,0,0,StringFormat("+%d",iMagic));

                        Magic(Magic);

                       }

                    }

                 }

              }

            if(NextOrderMinus>0 && icountMinus<MaxOrdersMinus)
              {

               if(::OrderSelect(tdn,SELECT_BY_TICKET,MODE_TRADES))
                 {

                  if(::OrderCloseTime()==0)
                    {

                     double dpt=OrderStepPoint();

                     if(dpt<=-NextOrderMinus)
                       {

                        double dnextlot=NLot(::OrderLots()*MinusLotMn+MinusLotAdd);

                        Magic(iMagic);
                        if(dnextlot>MinusMaxLot)
                           dnextlot=MinusMaxLot;
                        OrderSend(itype,dnextlot,-1,0,0,StringFormat("-%d",iMagic));

                        Magic(Magic);

                       }

                    }

                 }

              }

           }
         else
            if(itype==OP_SELL && cs>0)
              {

               ArraySort(array_order_sell,WHOLE_ARRAY,0,MODE_DESCEND);

               int tup=(int)array_order_sell[0][1];
               int tdn=(int)array_order_sell[cs-1][1];

               int icountPlus=0,icountMinus=0;
               for(int i=0; i<cs; i++)
                 {
                  if((int)array_order_sell[0][1]!=iMagic)
                     icountPlus++;
                  else
                     break;
                 }

               icountMinus=cs-icountPlus;

               if(NextOrderProfit>0 && icountPlus<MaxOrdersProfit)
                 {

                  if(::OrderSelect(tdn,SELECT_BY_TICKET,MODE_TRADES))
                    {

                     if(::OrderCloseTime()==0)
                       {

                        double dpt=OrderStepPoint();

                        if(dpt>=NextOrderProfit)
                          {

                           double dnextlot=NLot(::OrderLots()*ProfitLotMn+ProfitLotAdd);

                           Magic(iMagic);
                           if(dnextlot>ProfitMaxLot)
                              dnextlot=ProfitMaxLot;
                           OrderSend(itype,dnextlot,-1,0,0,StringFormat("+%d",iMagic));

                           Magic(Magic);

                          }

                       }

                    }

                 }

               if(NextOrderMinus>0 && icountMinus<MaxOrdersMinus)
                 {

                  if(::OrderSelect(tup,SELECT_BY_TICKET,MODE_TRADES))
                    {

                     if(::OrderCloseTime()==0)
                       {

                        double dpt=OrderStepPoint();

                        if(dpt<=-NextOrderMinus)
                          {

                           double dnextlot=NLot(::OrderLots()*MinusLotMn+MinusLotAdd);

                           Magic(iMagic);
                           if(dnextlot>MinusMaxLot)
                              dnextlot=MinusMaxLot;
                           OrderSend(itype,dnextlot,-1,0,0,StringFormat("-%d",iMagic));

                           Magic(Magic);

                          }

                       }

                    }

                 }

              }
        }

      return dprofit;//профит сетки

     }

   double            get_AverageByMagic(long iMagic,int itype,int &idirect,double dProfit=0)
     {

      double dprofit[2]= {0,0},
                         m_lots[2]= {0,0},
                                    icount[2]= {0,0};

      idirect=0;

      double dask=SymbolInfoDouble(m_name,SYMBOL_ASK);
      double dbid=SymbolInfoDouble(m_name,SYMBOL_BID);

      for(int i=::OrdersTotal()-1; i>=0; i--)
        {

         if(!::OrderSelect(i,SELECT_BY_POS))
            continue;

         if((::OrderMagicNumber()==iMagic ||  ::OrderTicket()==iMagic) && ::OrderSymbol()==m_name)
           {

            if(::OrderType()==OP_BUY && itype==OP_BUY)
              {
               m_lots[0]+=::OrderLots();
               dprofit[0]+=MacroProfit;
               icount[0]++;
              }
            if(::OrderType()==OP_SELL && itype==OP_SELL)
              {
               m_lots[1]+=::OrderLots();
               dprofit[1]+=MacroProfit;
               icount[1]++;
              }
           }
        }

      if(NormalizeDouble(m_lots[0],2)-NormalizeDouble(m_lots[1],2)==0.0)
         return (0);

      if(NormalizeDouble(m_lots[0],2)>NormalizeDouble(m_lots[1],2))
         idirect=1;
      if(NormalizeDouble(m_lots[0],2)<NormalizeDouble(m_lots[1],2))
         idirect=-1;

      double PriceLevel=0;
      double TickValue=NormalizeDouble(SymbolInfoDouble(m_name,SYMBOL_TRADE_TICK_VALUE),3);
      if(TickValue==0.0)
         return 0;

      double _dpoint=SymbolInfoDouble(m_name,SYMBOL_POINT);
      if(_dpoint==0.0)
         return 0;

      double sp=ND1((dask-dbid)/p);

      int idigits=(int)SymbolInfoInteger(m_name,SYMBOL_DIGITS);

      if((m_lots[0]-m_lots[1])>0)
         PriceLevel=nd(dbid-((dprofit[0]+dprofit[1]+dProfit)/(TickValue*(m_lots[0]-m_lots[1]))*_dpoint),m_name);
      if((m_lots[1]-m_lots[0])>0)
         PriceLevel=nd(dask+((dprofit[0]+dprofit[1]+dProfit)/(TickValue*(m_lots[1]-m_lots[0]))*_dpoint),m_name);

      if(idigits>0)
        {
         if(idigits==5 || idigits==3 || SymbolInfoInteger(m_name,SYMBOL_TRADE_CALC_MODE)==1)
           {
            idigits=(int)(idigits-1);
            return NormalizeDouble(PriceLevel,idigits);
           }
        }

      return NormalizeDouble(PriceLevel,idigits);
     }

   void              OrdersControl(bool bspread,int &ib,int &is)
     {
      /*
      1. контроль усреднений по каждой сделке, вначале формируем список сделок с нашим меджиком
      2. по каждой сделке отрабатываем логику усреднений и трала , паралельно учитываем их общий профит для вклчюения трала по общему профиту
      */
      double dsumm=0;
      ib=0;
      is=0;

      int icount=0;

      for(int i=ArraySize(m_orders)-1; i>=0; i--)
        {
         if(m_orders[i].OrderCloseTime>0)
            continue; //пропустим закрытые

         if(m_orders[i].OrderMagicNumber==Magic && m_orders[i].OrderSymbol==m_name)
           {
            icount++;

            long imagic=m_orders[i].OrderTicket;
            int itype=m_orders[i].OrderType;

            double dprofitsetka=ControlByMagic(imagic,itype,bClose,bspread,ib,is); //обработаем сетку каждого ордера

            if(TakeProfit>0)
              {
               int idirect;
               double davg=get_AverageByMagic(imagic,itype,idirect);

               if(davg>0)
                 {
                  if(itype==OP_BUY && Bid>=davg+TakeProfit*p)
                    {
                     dprofitsetka=0;
                     CloseByMagic(imagic);

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

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

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

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

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

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

Стоимость полного кода
1 649,60₽ ≈ $20.16