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

fibotrader lite mt4.mq4

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

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

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

О программе

FiboTrader Lite — торговый советник для MetaTrader 4, работающий на основе анализа фибоначчиевых уровней. Советник строит фибо сетку на графике, анализирует ценовые импульсы и управляет торговыми позициями с различными режимами стоп-лосса, тейк-профита и безубытка. Поддерживается фильтрация сигналов по скользящим средним и параболику, а также частичное закрытие позиций и трейлинг по средствам.

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

НастройкаОписание
Debug mode (Debug) Отладка — Включает режим отладки для вывода дополнительной информации в журнал.
Time work (WorkTime) Время работы — Задаёт временной диапазон, в течение которого советник активен (формат ЧЧ:ММ-ЧЧ:ММ).
Comment (cmt) Комментарий — Текстовый комментарий, добавляемый к ордерам советника.
Draw orders (DrawOrders) Отрисовка ордеров — Включает визуальное отображение линий ордеров на графике (только для MT4).
Magic Магический номер — Идентификатор ордеров советника для их уникальной маркировки.
TF (tf) Таймфрейм — Таймфрейм, на котором советник анализирует ценовые данные и строит фибо сетку.
Manual first fibo (ManualFirstFibo) Ручная фибо сетка — Позволяет вручную задать начальную фибо сетку на графике вместо автоматического построения.
Draw new fibo (NewFibo) Новая фибо сетка — Включает автоматическое построение новой фибо сетки при отсутствующей на графике.
Add new orders (pyramiding) (AddNew) Добавление ордеров — Разрешает открытие дополнительных ордеров (пиррамидинг) по направлению текущей позиции.
Ignore risk for new orders (IgnoreRisk) Игнорировать риск — Отключает проверку риска при открытии новых ордеров.
Max orders (MaxOrders) Максимум ордеров — Максимальное количество ордеров, разрешённых для одного направления.
Swing trading (close by inverse signal) (SwingTrading) Свинг-торговля — При активации закрывает позицию при появлении обратного сигнала на фибо уровне.
Flat Minimal Bars (FlatMinimalBars) Минимум баров плоскости — Минимальное количество баров коррекции, при котором направление считается плоским.
Reverse signal sensitivity % (ReverseSensitivity) Чувствительность разворота — Процентная чувствительность определения разворотного сигнала на фибо уровне.
Impulse minimal at points (0 - off) (ImpulseSizeMin) Минимум импульса — Минимальный размер ценового импульса в пунктах для обработки сигнала (0 — выключено).
Impulse maximum at points (0 - off) (ImpulseSizeMax) Максимум импульса — Максимальный размер ценового импульса в пунктах для обработки сигнала (0 — без ограничения).
Draw fibo (DrawFibo) Отрисовка фибо — Включает отображение фибо сетки и уровней на графике.
Risk mode (Risk) Режим риска — Режим управления риском: в валюте счёта, в процентах или фиксированный лот.
Risk in valute (RiskValute) Риск в валюте — Размер допустимого риска в валюте счёта на одну сделку.
Risk in % (RiskProcent) Риск в процентах — Размер допустимого риска в процентах от баланса на одну сделку.
Fix lot (Lot) Фиксированный лот — Фиксированный размер лота для открытия ордеров.
Max risk by chart % (0 - off) (MaxRiskByChart) Макс. риск по графику — Максимальный допустимый риск по текущему графику в процентах (0 — выключено).
Maximum stop (count) (MaxStop) Максимум стопов — Максимальное количество стоп-лоссов, разрешённых для направления.
Maximum positions on the account (MaxPositions) Макс. позиции — Максимальное количество одновременных позиций на счёте (0 — без ограничения).
Minimum margin on the account (%) (MinimalMargin) Минимальная маржа — Минимальный уровень свободной маржи в процентах, при котором советник прекращает торговлю.
Open Level1 (OpenLevel1) Уровень входа — Фибо-уровень (в процентах от импульса), на котором выполняется вход в сделку.
TP1 (Safe) mode (TP1) Режим тейк-профита — Режим фиксации прибыли: отключён или по касанию уровня.
No close if the position in BU (NoCloseBU) Не закрывать в БУ — Запрещает закрытие позиции, если она уже переведена в безубыток.
Part close % (TP1_ProcentClose) Процент частичного закрытия — Процент объёма позиции, закрываемый при достижении тейк-профита.
Take Level % (TP1_Level) Уровень тейк-профита — Фибо-уровень (в процентах от импульса) для частичной фиксации прибыли.
SL mode (SL) Режим стоп-лосса — Режим расчёта стоп-лосса: по касанию уровня или по пробою.
SL Level % (SL_Level) Уровень стоп-лосса — Процент от размера импульса для расчёта уровня стоп-лосса.
SL Offset in points (SL_Offset) Смещение стоп-лосса — Дополнительное смещение стоп-лосса в пунктах от расчётного уровня.
Close signal sensitivity % (CloseSensitivity) Чувствительность закрытия — Процентная чувствительность при закрытии позиции по пробою стопа.
BU mode (BU) Режим безубытка — Режим перевода позиции в безубыток: отключён или по достижении уровня.
BU Level % (BU_Level) Уровень безубытка — Фибо-уровень (в процентах от импульса), при достижении которого позиция переводится в БУ.
Min profit in points (BU_MinProfit) Мин. прибыль для БУ — Минимальная прибыль в пунктах, необходимая для активации перевода в безубыток.
Trailing equity start % (TrailingEquity) Трейлинг по средствам — Процент прибыли, с которого начинается трейлинг стоп-лосса по средствам.
Trailing equity step % (TrailingEquityStep) Шаг трейлинга — Процентный шаг сдвига трейлинг-стопа по средствам.
Close by profit % (0-off) (CloseByProfit) Закрытие по прибыли — Процент прибыли от баланса, при достижении которого все позиции закрываются (0 — выключено).
Filter mode (Filter) Режим фильтра — Режим фильтрации торговых сигналов: выключен, MA+SAR или по импульсу.
Filter TF (FilterTF) Таймфрейм фильтра — Таймфрейм, на котором рассчитываются индикаторы фильтра.
MA_Fast Быстрая MA — Период быстрой экспоненциальной скользящей средней для фильтра.
MA_Slow Медленная MA — Период медленной экспоненциальной скользящей средней для фильтра.
SAR_Step Шаг SAR — Шаг параболического индикатора SAR.
SAR_Maximum Максимум SAR — Максимальное значение шага параболического индикатора SAR.
Получить полный код

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

#property version   "1.22"
#property description "telegram: @trade_moex"
#property strict
#property icon        "\\Images\\fibotraderlite.ico";

/*
1.22 - добавлено удаление фибо советника при перезапуске, убран режим Use leverage, теперь он автоматически определяет.
1.19 - оптимизация поиска паттерна
1.17 - добавлена опция выключения плеча и исправление частичного закрытия
1.16 - исправлен порядок закрытие по тр и перенос в бу, при определенных настройках вначале переносило в бу, а затем првоеряло можн
1.15 - исправление логики поиска уровней
1.14 - исправлено отображение линии бу от другого инструмента и округление лота на акциях
*/

#define LICENSE_OFF

#define LICENSE_DEMO

#define TRIAL_DAYS 30

#define LICENSE_NAME "$zq2fl{t}{n~~~@mf5j#y|~b@aanx66x"
#define LICENSE_FILE "ftl"

#define VALID_KEY "Expert active. "
#define EMPTY_KEY "You must activate the adviser."
#define INVALID_KEY "Invalid license."
#define EXPERIED "License expired."

bool     bcheck=false;

#define POINTS_NEW

#include <sovetnikovNET\Orders.mqh>
#include <sovetnikovNET\Time.mqh>
#include <sovetnikovNET\Draw.mqh>
#include <sovetnikovNET\Bcrypt.mqh>

enum enum_take
  {
   TAKE_OFF, //Off
   TAKE_LEVEL, //Take level %
  };

enum enum_stop
  {
   STOP_LEVEL, //Touch level and tral
   STOP_BREAK, //Breakout level and tral
  };

enum enum_bu
  {
   BU_OFF, //Off
   BU_LEVEL, //BU Level %
  };

enum enum_filter
  {
   FILTER_OFF, //Off
   FILTER_MASAR, //MA+SAR
   FILTER_IMPULSE,//Main impulse
  };

enum enum_mm
  {
   RISK_VALUTE, //Risk in valute
   RISK_PROCENT,//Risk in %
   RISK_FIX,//Fix lot
  };

GROUP("Main settings");//.
B Debug=true; //Debug mode

TRADEMODE TradeMode=TRADEMODE_LONG;
S WorkTime="00:00-24:00"; //Time work
S cmt=""; //Comment

#ifndef __MQL5__
B DrawOrders=true; //Draw orders
#endif
I Magic=20200221;

TF tf=PERIOD_D1; //TF
GROUP("Fibo config");//.
B ManualFirstFibo=false; //Manual first fibo
B NewFibo=true; //Draw new fibo
B AddNew=true; //Add new orders (pyramiding)
B IgnoreRisk=false; //Ignore risk for new orders
I MaxOrders=1; //Max orders
B SwingTrading=false; //Swing trading (close by inverse signal)
I FlatMinimalBars=1; //Flat Minimal Bars
D ReverseSensitivity=5; //Reverse signal sensitivity %
D ImpulseSizeMin=0; //Impulse minimal at points (0 - off)
D ImpulseSizeMax=0; //Impulse maximum at points (0 - off)
B DrawFibo=true; //Draw fibo
C ColorFibo=clrSandyBrown;//Color fibo
C ColorFiboLevels=clrRed;//Color fibo levels
C ColorLineTP=clrGreen;// Color line TP
STYLE StyleLineTP=STYLE_DASH; //Style line TP
C ColorLineBU=clrDarkTurquoise;//Color line BU
STYLE StyleLineBU=STYLE_DASH;//Style line BU
GROUP("MM settings");//.

input enum_mm Risk=RISK_PROCENT; //Risk mode
D RiskValute=0; //Risk in valute
D RiskProcent=5; //Risk in %
D Lot=1; //Fix lot
D MaxRiskByChart=10; //Max risk by chart % (0 - off)
I MaxStop=1; //Maximum stop (count)
D MaxPositions=4; //Maximum positions on the account
D MinimalMargin=10; //Minimum margin on the account (%)

GROUP("Open settings");//.
D OpenLevel1=38.2; //Open Level1
GROUP("Take profit and Part close settings");//.
input enum_take TP1=TAKE_LEVEL; //TP1 (Safe) mode
B NoCloseBU=true; //No close if the position in BU
D TP1_ProcentClose=50; //Part close %
D TP1_Level=-50; //Take Level %
GROUP("Stop loss settings");//.
input enum_stop SL=STOP_BREAK; //SL mode
D SL_Level=100; //SL Level %
D SL_Offset=0; //SL Offset in points
D CloseSensitivity=30; //Close signal sensitivity %
GROUP("Breakeven settings");//.
input enum_bu BU=BU_LEVEL; //BU mode
D BU_Level=-50; //BU Level %
D BU_MinProfit=1; //Min profit in points
GROUP("Trailing settings");//.
D TrailingEquity=10; //Trailing equity start %
D TrailingEquityStep=5; //Trailing equity step %
D CloseByProfit=20; //Close by profit % (0-off)

GROUP("Filter settings");//.
input enum_filter Filter=FILTER_MASAR; //Filter mode
TF FilterTF=PERIOD_D1; //Filter TF
I MA_Fast=20;
I MA_Slow=200;
D SAR_Step=0.002;
D SAR_Maximum=0.02;

CGlobal           m_global;

int slippage=0;

class CMyOrders: public COrders
  {
public:
   double            ma_fast;
   double            ma_slow;
   double            sar;

   double            dtickPrice,dMaxDD;

   double            dProfit;//+=m_position.Profit()+m_position.Swap()+m_position.Commission();

#ifdef __MQL5__
   int               hma_fast,hma_slow,hsar;

   virtual bool      OnInitIndicators()
     {

      hma_fast=iMA(_Symbol,FilterTF,MA_Fast,0,MODE_EMA,PRICE_CLOSE);
      hma_slow=iMA(_Symbol,FilterTF,MA_Slow,0,MODE_EMA,PRICE_CLOSE);
      hsar=iSAR(_Symbol,FilterTF,SAR_Step,SAR_Maximum);

      if(hma_fast==INVALID_HANDLE ||    hma_slow==INVALID_HANDLE || hsar==INVALID_HANDLE)
        {
         PrintFormat("Critical error. Invalid create indicators. %d",GetLastError());
         return false;
        }
      return true;
     }

   virtual bool      OnDeInitIndicators()
     {
      IndicatorRelease(hsar);
      IndicatorRelease(hma_fast);
      IndicatorRelease(hma_slow);

      return true;
     }
#endif

   virtual void      OnInit(string n,int iimagic,int iislippage)
     {
      // код доступен только после оплаты
   }

   virtual void      Position()
     {
      dProfit+=m_position.Profit()+m_position.Swap()+m_position.Commission()*2;

      double dopen=OrderOpenPrice();
      double dstop=OrderStopLoss();
      double dlot=OrderLots();

      ENUM_ORDER_TYPE itype=(ENUM_ORDER_TYPE)OrderType();

      if(SL==STOP_BREAK || SL==STOP_LEVEL)
        {

         if(itype==OP_BUY)
           {
            double dlevel0=m_global.LoadParam("long0",0);
            double dlevel100=m_global.LoadParam("long100",0);

            if(dlevel0>0 && dlevel100>0)
              {
               double dsizeImpulse=ND1(Abs((dlevel0-dlevel100)/p));

               dstop=nd(dlevel0-p*dsizeImpulse*SL_Level/100-SL_Offset*p);

              }
           }
         else
            if(itype==OP_SELL)
              {
               double dlevel0=m_global.LoadParam("short0",0);//оптимизировать лоадпарам
               double dlevel100=m_global.LoadParam("short100",0);

               if(dlevel0>0 && dlevel100>0)
                 {
                  double dsizeImpulse=ND1(Abs((dlevel0-dlevel100)/p));

                  dstop=nd(dlevel0+p*dsizeImpulse*SL_Level/100+SL_Offset*p);

                 }
              }
        }

      if(dstop>0 && dopen>0)
        {

         if(itype==OP_BUY && dstop>=dopen)
            return;
         if(itype==OP_SELL && dstop<=dopen)
            return;

         double dSummLot=0,dprofit=0;

         int ipart=get_part(m_position.Ticket(),dSummLot,dprofit);//подсчитаем сколкьо принесли частичное закрытие и вычтем из общего убытка

         double dSL=0;

         if(itype==OP_BUY && dstop<dopen)
           {
            dSL=ND1((dstop-dopen)/p);
           }
         if(itype==OP_SELL && dstop>dopen)
           {
            dSL=ND1((dopen-dstop)/p);
           }

         dMaxDD+=NormalizeDouble(dtickPrice*dSL*dlot,2);

        }
     }

   int               filterMASAR(CNewBar &m_bar,ENUM_TIMEFRAMES etf,int ibar=0)
     {

      if(m_bar.isNewBar() || sar==0)
        {
#ifdef __MQL5__

         double buf[1];
         if(CopyBuffer(hma_fast,0,ibar,1,buf)==1)
            ma_fast=buf[0];
         if(CopyBuffer(hma_slow,0,ibar,1,buf)==1)
            ma_slow=buf[0];
         if(CopyBuffer(hsar,0,ibar,1,buf)==1)
            sar=buf[0];
#else
         ma_fast=iMA(_Symbol,etf,MA_Fast,0,MODE_EMA,PRICE_CLOSE,ibar);
         ma_slow=iMA(_Symbol,etf,MA_Slow,0,MODE_EMA,PRICE_CLOSE,ibar);
         sar=iSAR(_Symbol,etf,SAR_Step,SAR_Maximum,ibar);
#endif
        }

      if(sar>0)
        {

         if(ma_fast>0 && ma_fast>ma_slow && sar<ma_fast && iClose(_Symbol,etf,1)>ma_fast && iClose(_Symbol,etf,1)>ma_slow)
            return OP_BUY;
         if(ma_fast>0 && ma_fast<ma_slow && sar>ma_fast && iClose(_Symbol,etf,1)<ma_fast && iClose(_Symbol,etf,1)<ma_slow)
            return OP_SELL;
        }

      return -1;
     }

   double            freeRisk()
     {

      return NormalizeDouble(dMaxDD*100/AccountBalance(),2); //вернем в % риск (число положительное)
     }

   void              DrawLines(CDrawPos &m_pos)
     {
      if(IsDraw)
        {

         for(int i=m_global.GlobalVariablesTotal()-1; i>=0; i--)
           {

            string svar=m_global.GlobalVariableName(i);
            datetime tm1=m_global.GlobalVariableTime(svar);

            if(StringFind(svar,"_level_bu")>0)
              {
               string sret[];
               if(string_explode("_",svar,sret)==3)
                 {
                  ulong iticket=(ulong)StringToInteger(sret[0]);
                  double dprice=m_global.GlobalVariableGet(svar);
#ifndef __MQL5__
                  if(::OrderSelect((int)iticket,SELECT_BY_TICKET))
                    {
                     string symbol=::OrderSymbol();

                     if(::OrderCloseTime()>0)
                       {
                        m_pos.Delete(0,svar);
                        m_global.GlobalVariableDel(svar);//подчистим от закрытых ордеров
                       }
                     else
                       {
                        if((::OrderType()==OP_BUY && ::OrderStopLoss()>=::OrderOpenPrice()) || (::OrderType()==OP_SELL && ::OrderStopLoss()>0 && ::OrderStopLoss()<=::OrderOpenPrice()))
                          {
                           m_pos.Delete(0,svar);
                          }
                        else
                          {
                           if(_Symbol==symbol)
                              m_pos.DrawHLine(0,svar,0,tm1,dprice,1,StyleLineBU,ColorLineBU,false,false,StringFormat("BU #%lld",iticket));
                           else
                              m_pos.Delete(0,svar);
                          }
                       }
                    }

#else
                  if(!::PositionSelectByTicket(iticket))
                    {

                     m_pos.Delete(0,svar);
                     m_global.GlobalVariableDel(svar);//подчистим от закрытых ордеров

                    }
                  else
                    {
                     string symbol=PositionGetString(POSITION_SYMBOL);

                     if((::PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_BUY && ::PositionGetDouble(POSITION_SL)>=::PositionGetDouble(POSITION_PRICE_OPEN)) ||
                        (::PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_SELL && ::PositionGetDouble(POSITION_SL)>0 && ::PositionGetDouble(POSITION_SL)<=::PositionGetDouble(POSITION_PRICE_OPEN)))
                       {
                        m_pos.Delete(0,svar);
                       }
                     else
                       {
                        if(_Symbol==symbol)
                           m_pos.DrawHLine(0,svar,0,tm1,dprice,1,StyleLineBU,ColorLineBU,false,false,StringFormat("BU #%lld",iticket));
                        else
                           m_pos.Delete(0,svar);
                       }

                    }

#endif
                 }
              }

            if(StringFind(svar,"_level_tp")>0)
              {
               string sret[];

               if(string_explode("_",svar,sret)==3)
                 {
                  ulong iticket=(ulong)StringToInteger(sret[0]);
                  double dprice=m_global.GlobalVariableGet(svar);
#ifndef __MQL5__
                  if(::OrderSelect((int)iticket,SELECT_BY_TICKET))
                    {
                     string symbol=::OrderSymbol();

                     if(::OrderCloseTime()>0)
                       {
                        m_pos.Delete(0,svar);
                        m_global.GlobalVariableDel(svar);//подчистим от закрытых ордеров
                       }
                     else
                       {
                        if((::OrderType()==OP_BUY && ::OrderStopLoss()>=::OrderOpenPrice()) || (::OrderType()==OP_SELL && ::OrderStopLoss()>0 && ::OrderStopLoss()<=::OrderOpenPrice()))
                          {
                           m_pos.Delete(0,svar);
                          }
                        else
                          {
                           if(_Symbol==symbol)
                              m_pos.DrawHLine(0,svar,0,tm1,dprice,1,StyleLineTP,ColorLineTP,false,false,StringFormat("TP1 #%lld",iticket));
                           else
                              m_pos.Delete(0,svar);
                          }
                       }
                    }

#else
                  if(!::PositionSelectByTicket(iticket))
                    {

                     m_pos.Delete(0,svar);
                     m_global.GlobalVariableDel(svar);//подчистим от закрытых ордеров
                    }
                  else
                    {
                     string symbol=PositionGetString(POSITION_SYMBOL);

                     if((::PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_BUY && ::PositionGetDouble(POSITION_SL)>=::PositionGetDouble(POSITION_PRICE_OPEN)) ||
                        (::PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_SELL && ::PositionGetDouble(POSITION_SL)>0 && ::PositionGetDouble(POSITION_SL)<=::PositionGetDouble(POSITION_PRICE_OPEN)))
                       {
                        m_pos.Delete(0,svar);
                       }
                     else
                       {
                        if(_Symbol==symbol)
                           m_pos.DrawHLine(0,svar,0,tm1,dprice,1,StyleLineTP,ColorLineTP,false,false,StringFormat("TP1 #%lld",iticket));
                        else
                           m_pos.Delete(0,svar);
                       }
                    }

#endif
                 }
              }

           }

        }

     }

   void              checkOrders(bool bNewBar)
     {
      double dclose=iClose(_Symbol,tf,1);
      double dopen=iOpen(_Symbol,tf,1);

      bool bcontinue=false;

      double dstopBuy=0,dstopSell=0;

      int itotal=PositionsTotal();

      for(int i=itotal-1; i>=0; i--)
        {
         if(SelectByIndex(i,true))
           {
            double dopenPrice=OrderOpenPrice();
            double dstopPrice=OrderStopLoss();
            double dstopFirst=dstopPrice;
            double dlot=OrderLots();
            ENUM_ORDER_TYPE itype=(ENUM_ORDER_TYPE)OrderType();

            double dtakePrice=nd(m_global.GlobalVariableGet(StringFormat("%lld_level_tp",m_position.Ticket())));//получим тейк, который был рассчитан для ордера

            if(dtakePrice>0)
              {
               bcontinue=false;

               if(NoCloseBU)
                 {

                  if((itype==OP_BUY && dstopPrice>=dopenPrice) || (itype==OP_SELL && dstopPrice<=dopenPrice && dstopPrice>0))
                     bcontinue=true;

                  if(!bcontinue)
                    {

                     if(SL==STOP_LEVEL)
                       {
                        if(itype==OP_BUY)
                          {
                           double dlevel0=m_global.LoadParam("long0",0);
                           double dlevel100=m_global.LoadParam("long100",0);

                           if(dlevel0>0 && dlevel100>0 && dlevel0>dlevel100)
                             {
                              double dsizeImpulse=ND1(Abs((dlevel0-dlevel100)/p));

                              dstopPrice=nd(dlevel0-p*dsizeImpulse*SL_Level/100-SL_Offset*p);

                             }
                          }
                        else
                           if(itype==OP_SELL)
                             {
                              double dlevel0=m_global.LoadParam("short0",0);
                              double dlevel100=m_global.LoadParam("short100",0);

                              if(dlevel0>0 && dlevel100>0 && dlevel0<dlevel100)
                                {
                                 double dsizeImpulse=ND1(Abs((dlevel0-dlevel100)/p));

                                 dstopPrice=nd(dlevel0+p*dsizeImpulse*SL_Level/100+SL_Offset*p);

                                }
                             }
                       }
                     else
                        if(SL==STOP_BREAK)
                          {

                           if(itype==OP_BUY)
                             {
                              double dlevel0=m_global.LoadParam("long0",0);
                              double dlevel100=m_global.LoadParam("long100",0);

                              if(dlevel0>0 && dlevel100>0 && dlevel0>dlevel100)
                                {
                                 double dsizeImpulse=ND1(Abs((dlevel0-dlevel100)/p));

                                 dstopPrice=nd(dlevel0-p*dsizeImpulse*SL_Level/100-SL_Offset*p);

                                }
                             }
                           else
                              if(itype==OP_SELL)
                                {
                                 double dlevel0=m_global.LoadParam("short0",0);
                                 double dlevel100=m_global.LoadParam("short100",0);

                                 if(dlevel0>0 && dlevel100>0 && dlevel0<dlevel100)
                                   {
                                    double dsizeImpulse=ND1(Abs((dlevel0-dlevel100)/p));

                                    dstopPrice=nd(dlevel0+p*dsizeImpulse*SL_Level/100+SL_Offset*p);

                                   }
                                }
                          }//if
                    }

                  if((itype==OP_BUY && dstopPrice>=dopenPrice) || (itype==OP_SELL && dstopPrice<=dopenPrice && dstopPrice>0))
                     bcontinue=true;
                 }

               if(TP1==TAKE_LEVEL  && !bcontinue)
                 {

                  if((itype==OP_BUY && _Bid>=dtakePrice) || (itype==OP_SELL && _Ask<=dtakePrice))
                    {
                     double dSummLot=0;
                     int ipart=get_part(m_position.Ticket(),dSummLot);

                     if(ipart==0)
                       {
                        if(OrderClose(m_position.Ticket(),NLot(dlot*TP1_ProcentClose/100))) //закроем часть ордера (защита стопа)
                           continue; //пропустим
                       }
                    }
                 }
              }

            if(BU==BU_LEVEL)
              {
               bcontinue=false;

               double dpt=OrderProfitPoint();
               if(dpt>=0)
                 {

                  if(dstopPrice>0 && (dstopPrice>dstopBuy || dstopBuy==0))
                     dstopBuy=dstopPrice;
                  if(dstopPrice>0 && (dstopPrice<dstopSell || dstopSell==0))
                     dstopSell=dstopPrice;

                  if(itype==OP_BUY && dstopPrice>0 && dstopPrice>=dopenPrice)
                     bcontinue=true;
                  if(itype==OP_SELL && dstopPrice>0 && dstopPrice<=dopenPrice)
                     bcontinue=true;

                  if(!bcontinue)
                    {

                     dtakePrice=nd(m_global.GlobalVariableGet(StringFormat("%lld_level_bu",m_position.Ticket())));//получим bu

                     if(dtakePrice>0)
                       {

                        double dprofit=m_position.Swap()+m_position.Commission()*2;
                        double dMinBU=ND1(dprofit/(dtickPrice*m_position.Volume()));

                        double dnewStop=nd(dopenPrice+(itype==OP_BUY?(BU_MinProfit+dMinBU):-(BU_MinProfit+dMinBU))*p);

                        if(itype==OP_BUY && _Bid>=dtakePrice && (dstopPrice==0 || dnewStop>dstopPrice) && dnewStop>=dopenPrice)
                          {

                           if(_Bid>dnewStop)
                             {
                              DEBUG("(%d) %lld bu: %.5f",__LINE__,m_position.Ticket(),dnewStop);
                              m_trade.PositionModify(m_position.Ticket(),dnewStop,0); //перенос в бу
                              if(dnewStop>0 && (dnewStop>dstopBuy || dstopBuy==0))
                                 dstopBuy=dnewStop;
                             }

                          }

                        if(itype==OP_SELL && _Ask<=dtakePrice && (dstopPrice==0 || dnewStop<dstopPrice) && dnewStop<=dopenPrice)
                          {

                           if(_Ask<dnewStop)
                             {
                              DEBUG("(%d) %lld bu: %.5f",__LINE__,m_position.Ticket(),dnewStop);
                              m_trade.PositionModify(m_position.Ticket(),dnewStop,0); //перенос в бу
                              if(dnewStop>0 && (dnewStop<dstopSell || dstopSell==0))
                                 dstopSell=dnewStop;
                             }
                          }
                       }
                    }
                 }
              }

            if(bNewBar)
              {

               if(SL==STOP_LEVEL)
                 {
                  if(itype==OP_BUY)
                    {
                     double dlevel0=m_global.LoadParam("long0",0);
                     double dlevel100=m_global.LoadParam("long100",0);

                     if(dlevel0>0 && dlevel100>0 && dlevel0>dlevel100)
                       {
                        double dsizeImpulse=ND1(Abs((dlevel0-dlevel100)/p));

                        dstopPrice=nd(dlevel0-p*dsizeImpulse*SL_Level/100-SL_Offset*p);

                        if(dstopFirst==0 || dstopPrice>dstopFirst)
                          {
                           DEBUG("(%d) %lld new stop: %.5f",__LINE__,m_position.Ticket(),dstopPrice);
                           m_trade.PositionModify(m_position.Ticket(),dstopPrice,0); //переставим стоп
                          }
                       }
                    }
                  else
                     if(itype==OP_SELL)
                       {
                        double dlevel0=m_global.LoadParam("short0",0);
                        double dlevel100=m_global.LoadParam("short100",0);

                        if(dlevel0>0 && dlevel100>0 && dlevel0<dlevel100)
                          {
                           double dsizeImpulse=ND1(Abs((dlevel0-dlevel100)/p));

                           dstopPrice=nd(dlevel0+p*dsizeImpulse*SL_Level/100+SL_Offset*p);

                           if(dstopFirst==0 || dstopPrice<dstopFirst)
                             {
                              DEBUG("(%d) %lld new stop: %.5f",__LINE__,m_position.Ticket(),dstopPrice);
                              m_trade.PositionModify(m_position.Ticket(),dstopPrice,0); //переставим стоп
                             }
                          }
                       }
                 }
               else
                  if(SL==STOP_BREAK)
                    {

                     if(itype==OP_BUY)
                       {
                        double dlevel0=m_global.LoadParam("long0",0);
                        double dlevel100=m_global.LoadParam("long100",0);

                        if(dlevel0>0 && dlevel100>0 && dlevel0>dlevel100)
                          {
                           double dsizeImpulse=ND1(Abs((dlevel0-dlevel100)/p));

                           dstopPrice=nd(dlevel0-p*dsizeImpulse*SL_Level/100-SL_Offset*p);

                           bool bReverse=false;

                           if((dstopPrice-dopen)!=0 && dopen>dstopPrice && dclose<dstopPrice)
                             {
                              if(dclose<dopen && NormalizeDouble((dstopPrice-dclose)*100/(dopen-dclose),2)>=CloseSensitivity)
                                 bReverse=true;
                             }

                           if((dopen<=dstopPrice && dclose<dstopPrice) || bReverse)
                             {
                              DEBUG("Close by SL = BREAK, stopPrice: %.5f Reverse: %s dopen: %.5f",dstopPrice,BoolToString(bReverse),dopen);
                              OrderClose(m_position.Ticket()); //закроем ордер (если их несколкьо они все будут проанализирвоаны и щакрыты в этой точке)
                             }

                          }
                       }
                     else
                        if(itype==OP_SELL)
                          {
                           double dlevel0=m_global.LoadParam("short0",0);
                           double dlevel100=m_global.LoadParam("short100",0);

                           if(dlevel0>0 && dlevel100>0 && dlevel0<dlevel100)
                             {
                              double dsizeImpulse=ND1(Abs((dlevel0-dlevel100)/p));

                              dstopPrice=nd(dlevel0+p*dsizeImpulse*SL_Level/100+SL_Offset*p);

                              bool bReverse=false;

                              if((dopen-dstopPrice)!=0 && dopen<dstopPrice && dclose>dstopPrice)
                                {
                                 if(dclose>dopen && NormalizeDouble((dclose-dstopPrice)*100/(dclose-dopen),2)>=CloseSensitivity)
                                    bReverse=true;
                                }

                              if((dopen>=dstopPrice && dclose>dstopPrice) || bReverse)
                                {
                                 DEBUG("Close by SL = BREAK, stopPrice: %.5f Reverse: %s dopen: %.5f",dstopPrice,BoolToString(bReverse),dopen);
                                 OrderClose(m_position.Ticket()); //закроем ордер (если их несколкьо они все будут проанализирвоаны и щакрыты в этой точке)
                                }

                             }
                          }
                    }//if
              }
           }
        }

      if(AddNew)
        {
         if(dstopBuy>0 && orders[OP_BUY]>1)
            SetAll(OP_BUY,dstopBuy,-1,true,true); //если пирамидим, то входим
         if(dstopSell>0 && orders[OP_SELL]>1)
            SetAll(OP_SELL,dstopSell,-1,true,true); //если пирамидим, то входим
        }

     }

  };

class CMain: public CMainDefault
  {
protected:
   CMyOrders         m_main;
   CNewBar           m_bar;
   CNewBar           m_barM1;
   CDrawPos          m_pos;

   int               iFlatMinimalBars;

   double            dLevel0,dLevel100;
   datetime          tmTime0,tmTime100;
   double            m_freeRisk;

   CTime             m_time;
   CTimer            m_timer;

   bool              bfirst;

public:

   void              FindImpulse(string m_name,bool bFilter,ENUM_TIMEFRAMES etf,datetime &time0,double &level0,datetime &time100,double &level100)
     {

      if(level0<=0 || level100<=0)
        {
         return;
        }

      int icount=0;
      int ibar0=-1,ibar100=-1;

      double dhigh=0,dlow=0,dopen=0,dclose=0;

      ibar0=iBarShift(m_name,etf,time0); //определим сколько баров от 0 точки
      ibar100=iBarShift(m_name,etf,time100); //определим сколько баров от 100 точки

      int imaxSize=(int)MathMin(ibar0,ibar100);

      MqlRates rates[];
      bool bUpdate=false;

      if(CopyRates(m_name,etf,0,imaxSize+1,rates)==imaxSize+1) //загрузим данные
        {
         ArraySetAsSeries(rates,true);

         for(int i=imaxSize; i>=0; i--)
           {

            dhigh=rates[i].high;//iHigh(m_name,etf,i);
            dlow=rates[i].low;//iLow(m_name,etf,i);
            dclose=rates[i].close;//iClose(m_name,etf,i);
            dopen=rates[i].open; //iOpen(m_name,etf,i);

            ibar0=iBarShift(m_name,etf,time0); //определим сколько баров от 0 точки
            ibar100=iBarShift(m_name,etf,time100); //определим сколько баров от 100 точки

            datetime tmDebug=iTime(m_name,tf,i);

            if(level0>level100)
              {

               if((dclose<dopen || icount>0) && i>0)
                 {
                  icount++; //нужна хотя бы одна коррекционная свечка, с нее включаем анализ коррекций, но не от этйо свечки. от тайм0
                 }

               if(dhigh>=level0 && level0>0)
                 {

                  level0=dhigh;
                  time0=rates[i].time;

                  int ibarsHigh=ibar0-i;
                  int ibarsLow=ibar0-i;

                  if(ibarsHigh>=0)
                    {

                     if(icount>0 && icount>iFlatMinimalBars)
                       {

                        int ihigh=iHighest(m_name,etf,MODE_HIGH,ibarsHigh+1,i); //ищем реальный максимум от точки 0
                        int ilow=iLowest(m_name,etf,MODE_LOW,ibarsLow+1,i);

                        if(ihigh!=-1)
                          {

                           time0=iTime(m_name,etf,ihigh); //верхняя точка
                           level0=iHigh(m_name,etf,ihigh);

                           if(dclose>=dopen)
                              icount=0; //не обновлять если свечка в другую сторону
                          }

                        if(ilow!=-1)
                          {
                           level100=iLow(m_name,etf,ilow);
                           time100=iTime(m_name,etf,ilow);

                           if(dclose>=dopen)
                              icount=0; //не обновлять если свечка в другую сторону
                          }

                       }
                     else
                        if(icount==0 || icount<=iFlatMinimalBars)
                          {

                           int ihigh=iHighest(m_name,etf,MODE_HIGH,ibarsHigh+1,i); //ищем реальный максимум от точки 0
                           if(ihigh!=-1)
                             {

                              time0=iTime(m_name,etf,ihigh); //верхняя точка
                              level0=iHigh(m_name,etf,ihigh);
                              if(dclose>=dopen)
                                 icount=0; //не обновлять если свечка в другую сторону
                             }

                          }

                     if(!bFilter)
                       {

                        m_global.SaveParam("long0",level0);
                        m_global.SaveParam("long100",level100);
                        m_global.SaveParam("long0_time",time0);
                        m_global.SaveParam("long100_time",time100);
                       }
                    }

                 }

               if(dlow<level100 && i>0)
                 {
                  bool bReverse=false;

                  if((dopen-level100)!=0 && dopen>level100 && dclose<level100)
                    {
                     if(dclose<dopen && NormalizeDouble((level100-dclose)*100/(dopen-dclose),2)>=ReverseSensitivity)
                        bReverse=true;
                    }

                  if((dopen<=level100 && dclose<level100) || bReverse)
                    {

                     int ibarsHigh=ibar100-i;

                     if(ibarsHigh>=0)
                       {

                        int ihigh=iHighest(m_name,etf,MODE_HIGH,ibarsHigh+1,i);
                        int ilow=iLowest(m_name,etf,MODE_LOW,ibarsHigh,i);

                        if(ihigh!=-1)
                          {

                           time100=iTime(m_name,etf,ihigh); //верхняя точка
                           level100=iHigh(m_name,etf,ihigh);
                           icount=0;
                          }

                        if(ilow!=-1)
                          {

                           time0=iTime(m_name,etf,ilow); //верхняя точка
                           level0=iLow(m_name,etf,ilow);
                           icount=0;
                          }

                        if(!bFilter)
                          {

                           m_global.SaveParam("short0",level0);
                           m_global.SaveParam("short100",level100);
                           m_global.SaveParam("short0_time",time0);
                           m_global.SaveParam("short100_time",time100);
                          }

                       }

                    }
                 }
              }//long fibo
            else
               if(level0<level100)//short
                 {

                  if((dclose>dopen || icount>0) && i>0)
                    {
                     icount++; //нужна хотя бы одна коррекционная свечка, с нее включаем анализ коррекций, но не от этйо свечки. от тайм0
                    }

                  if(dlow<=level0 && level0>0)
                    {

                     level0=dlow;
                     time0=rates[i].time;

                     int ibarsLow=ibar0-i;
                     int ibarsHigh=ibar0-i;

                     if(ibarsLow>=0)
                       {
                        if(icount>0 && icount>iFlatMinimalBars)
                          {

                           int ilow=iLowest(m_name,etf,MODE_LOW,ibarsLow+1,i); //ищем реальный максимум от точки 0
                           int ihigh=iHighest(m_name,etf,MODE_HIGH,ibarsHigh+1,i);

                           if(ilow!=-1)
                             {

                          

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

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

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

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

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

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

Стоимость полного кода
3 937,80₽ ≈ $48.13