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

SAURON

sauron _auto v31.mq5

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

#1.mtf_collider_h4_close_13_v18bar.mq4MQL4 / MetaTrader 4 · 1 общих теговea robofibo source v.11.2.mq4MQL4 / MetaTrader 4 · 1 общих теговsma crossover scalper ea for mt4.mq4MQL4 / MetaTrader 4 · 1 общих теговr15 pivot points expert advisor by @fundedmillionairess.mq4MQL4 / MetaTrader 4 · 1 общих теговnewstrader.mq5MQL5 / MetaTrader 5 · 1 общих теговmm3.0_flip_codepro_v3.1_with_cooldown@lifeindreamsworld.mq5MQL5 / MetaTrader 5 · 1 общих тегов
Вы автор или правообладатель?

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

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

О программе

SAURON — торговый советник для MetaTrader 5, предназначенный для работы на срочном рынке FORTS. Советник использует данные биржевого стакана: отслеживает плотности заявок, объёмы и количество ордеров на покупку и продажу, а также может применять фильтр спроса и предложения. Вход в рынок возможен как по плотностям стакана, так и по уровням фракталов, с автоматическим определением направления торговли по перевесу объёмов.

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

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

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

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

#resource "\\Experts\\SAURON\\Panel2.bmp"
string label_name="currency_label";        // имя объекта OBJ_BITMAP_LABEL 

#property icon        "\\Experts\\SAURON\\Sauron.ico"
#property description "Торговый робот : - SAURON - :"
#property description "Рынок :"
#property description "                 - FORTS -"
#property description "Алгоритм:"
#property description "- Торговля - Сопровождение от плотностей в стакане"
#property description "- Фильтр Спроса - Предложения"
#property description "- Фильтр дневного тренда + Паттерн"
#property description "- Инициализатор клирингов и дней торговли"
#property strict

#include "\\SAURON\\CExpirations.mqh"              //-                                                                    ||
#include "\\SAURON\\COrderSend.mqh"                //- класс работы с ордерами                                            ||
#include "\\SAURON\\CStakan.mqh"                   //- класс работы со стаканом                                           ||                            
#include "\\SAURON\\CGrafikFunktion.mqh"           //- функции графики                                                    ||
#include "\\SAURON\\CTime_tradestate.mqh"          //- класс работы по времени                                            ||

#include <Trade\Trade.mqh>               //~ Основная торговая библиотека ~                                     ||
#include <Trade\AccountInfo.mqh>         //~ Библиотека информации по аккаунту ~                                ||
#include <Trade\SymbolInfo.mqh>         //~ Библиотека информации по аккаунту ~                                ||
COrderSend         m_ordersend;          //~ для работы с установкой - удалением - модификацией ордеров         ||
COrderSendAsync    m_ordersendasync;     //~                                                                    || 
CTrade             m_trade;              //- для работы с торговыми опреациями;                                 ||
CSymbolInfo        m_symbol;             //- для работы с информацией по символу;                               ||
COrderInfo         m_order;              //- для работы с ордерами;                                             ||
CHistoryOrderInfo  m_history_order;      //- для работы с отработанными ордерами, попавшими в историю торговли; ||
CPositionInfo      m_position;           //- для работы с позициями;                                            ||
CDealInfo          m_deal;               //- для работы со сделками;                                            ||
CAccountInfo       m_account;            //- для работы с данными по аккаунту;                                  ||
CTradeState        m_tradestate;         //- для работы с временем торговли;                                    ||
CMarketDepth       m_book_market;        //- для работы с данными уровней стакана                               ||

#define TRADE_DELAY     10

#define SZIP 14               // Размер массива для объектов инфо-панели
#define NAME_EXPERT MQL5InfoString(MQL5_PROGRAM_NAME) // Имя эксперта

bool     isPos=false;         // Признак наличия/отсутствия открытой позиции

int      pos_type;  // Tип позиции
int      pos_volume    =0;    // Объём позиции
double   pos_profit    =0.0;  // Прибыль/убыток позиции
double   pos_history   =0.0;  // Историческая/прибыль-убыток
double   pos_SummProfit=0.0;  // Суммарный профит
bool     pos_recalc;          // Рекалькуляция
double   pos_BALANCE   =0.0,  // Баланс
         pos_CREDIT    =0.0,  // Кредит
         pos_MARGIN    =0.0,  // Маржа
         pos_SREDSTVA  =0.0,  // Средства
         pos_DRAWDOWN  =0.0;  // Просадка

string vl_prop[SZIP]=
  {
   "val_pos_comment",
   "val_pos_type",
   "val_pos_swap",
   "val_pos_commission",
   "val_pos_volume",
   "val_pos_profit",
   "val_pos_history",
   "val_pos_SummProfit"
  };

sinput string  v1="                ТОРГОВЫЕ  ПАРАМЕТРЫ  ";//.

sinput string  v1_0="++-----------:  Вход в рынок    ";//....................
input int      LotBefore           =  1;               // Обьем заявки на вход
input int      Plotnost            =  100;             // Объем плотности, ниже не торгуем.
input bool     ControlLimit        =  true;            // Контроль заявки в диапазоне отступа от плотности.
input int      OtstupVol           =  2;               // Отступ от плотности для тестированных цен
sinput string  v01="";//.

sinput string  v1_1="++-----------:  Сопровождение   ";//....................

enum DLot
  {
   Fix    =0,   // Фиксированный
   Dinamik=1    // Динамический
  };
input DLot     MetodLot            =  1;               // Метод увеличения позиции
sinput string  u0="-----";//.

sinput string  v1_="++-----------:  Расстояние в шагах цены ";//....................
input int      L_StepSmall         =  50;              // Шаг узкий отступ
input int      L_StepBig           =  100;             // Шаг широкий отступ, должно быть >= узкой
sinput string  v2_="++-----------:  Уровень расширения ";//....................
input double   MaxLot_1            =  5;               // Если лот >=  меняем значения отступов 
input int      L_StepSmall_1       =  80;              // Шаг узкий отступ
input int      L_StepBig_1         =  160;             // Шаг широкий отступ
sinput string  v4_="---";//....................
input int      MaxLot=10;                              // Максимальный объем позиции
sinput string  u02="";//.

sinput string  v3="++-----------:  ПАРАМЕТРЫ  ТРЕЙЛИНГА ПРИБЫЛИ  ";//....................
input int      StopLoss            =  0;               // Уровень Стоп Лосс  ноль - не используется
input int      minimum_profit      =  70;              // Уровень прибыли(Руб) к стартовому лоту 0 - вык
input int      TrailingStop        =  50;              // Расстояние трейлинга в шагах цены
input int      TrailingStep        =  10;              // Шаг трейлинга (подтяжка sl) 
sinput string  u03="";//.

sinput string  u002="****************************************";//.
sinput string  v2="++-----------:  ПАРАМЕТРЫ ФИЛЬТРАЦИИ ВХОДА ";//....................
sinput string  u051_="";//.
enum Avt
    {
      AUTO_OF        = 0, // ВЫКЛ
      AUTO_TRADE     = 1  // ВКЛЮЧЕН
    };
input  Avt    AutomaticTrade       =  1;               // Автоматическое направление по перевесу 
sinput string  u050_="";//.
sinput string  v5_1="++-----------:  ПАРАМЕТРЫ FRACTALS ";//..
input bool     FractalOn           =  false;           // Использовать фрактальные уровни ПС
input ENUM_TIMEFRAMES Fractal_TF   =  PERIOD_M15;      // Тайм-Фрейм уровня фрактала
enum FRL
  {
   LEVEL_1=0             ,  // ПО ОДНОМУ ФРАКТАЛУ
   LEVEL_2=1             ,  // ПО ДВУМ ФРАКТАЛАМ 
  };
input FRL      Levels              =  0;               // Определение уровня

enum typeTrade
  {
   PROBOY    =0,    // НА ПРОБОЙ ФРАКТАЛА
   OTBOY     =1,    // НА ОТБОЙ ФРАКТАЛА
   AUTOMATIC =2     // АВТОМАТИЧЕКСКИЙ

  };
input typeTrade TypeTrade          =  2;               // Выбор направления торговли  
input int      FractalDelta        =  50;              // Дельта между High и Low экстремумов 
input int      Otstup              =  10;              // Отступ от первого фрактала в шагах цены
sinput string  u05_="";//.
sinput string  i03="++-----------:  СПРОС И ПРЕДЛОЖЕНИЕ ";//....................
input bool     OiOn                =  false;           // Использовать спрос и предложение
input int      SP_Spread           =  3000;            // Дельта по общему объему ордеров
input int      OR_Spread           =  200;             // Дельта по общему числу ордеров
sinput string  u06="-----";//.

sinput string  u07="****************************************";//.
sinput string  u08="";//.

sinput string  v4="++-----------:  ТЕХНИЧЕСКИЕ  ПАРАМЕТРЫ ";//....................
input bool     TradeSymbol         =  false;           // Режим торговли одного инструмента
input bool     TradeShort          =  true;            // Торговля в Short
input bool     TradeLong           =  true;            // Торговля в Long
input bool     TradeShortSopr      =  true;            // Торговля в Short сопровождение
input bool     TradeLongSopr       =  true;            // Торговля в Long сопровождение
input bool     InfoPanel           =  true;            // Инфо Панель
input bool     Debug               =  true;            // Принты в журнал
input color    ColorDealPrice      =  clrYellow;       // Цвет цены последней сделки
input color    ColorStepSmall      =  clrDarkGray;     // Цвет линии узкого отступа
input color    ColorStepBig        =  clrDarkGray;     // Цвет линии широкого отступа
sinput string  u1="-----------------------------------------------------------";//.              КЛИРИНГИ
input bool     TradeStateTime      =  true;            // Использовать временной фильтр

input string  u2=  "14:00 - 14:05";//Время проведения промежуточного клиринга
input string  u3=  "18:40 - 19:00";//Время проведения основного клиринга 
input string  u4=  "23:40 - 23:59";//Время окончания сессии
input string  u5=  "00:00 - 07:01";//Рынок закрыт,торговля не ведется 
input string  u7=  "00:00 - 23:59";//В субботу торговля не ведется
input string  u8=  "00:00 - 23:59";//В воскресенье торговля не ведется   

string      InpComment="variation margin close"; // Комментарий клиринга
static int  StepBig,StepSmall;       // Статические переменные отступов канала.
ulong       m_slippage=30;           // slippage

int      DeltaBig=1;                   // отступ перед большой заявкой в шагах цены
double   pos_dealPrice=0;              // Цена последней сделки
datetime pos_dealTime=0;               // Время последней сделки
int      TransCount = 0;               // кол-во открытых позиций
datetime TimeTransSend;                // время открытия позиции
ulong    OrderTicketNow=0;             // тикет позиции
ulong    LastDeletedOrder=0;           // от удаления
double   BUY_ORDERS_VOLUME = 0;        // Спрос и предложение buy
double   SELL_ORDERS_VOLUME =0;        // Спрос и предложение sell
long     BUY_ORDERS=0;                 // Общее число ордеров на покупку 
long     SELL_ORDERS=0;                // Общее число ордеров на продажу

double   deltaSP_buy=0;                // дельта между спросом и предложением buy
double   deltaSP_sell=0;               // дельта между спросом и предложением sell
long     deltaOR_buy=0;                // дельта между ордерами для buy
long     deltaOR_sell=0;               // дельта между ордерами для sell

double   SellTestedPrice[3]     ={0,0,0},
         BuyTestedPrice[3]      ={0,0,0},

         SellTestedPriceSmall[3]={0,0,0},
         BuyTestedPriceSmall[3] ={0,0,0};

double   LAST;
double   BID;
double   ASK;

bool     TestedVolumeShortFlag     =0;      // флаг оттестированного объема для шортов
bool     TestedVolumeLongFlag      =0;      // флаг оттестированного объема для лонгов
bool     TestedVolumeShortFlagSmall=0;      // флаг оттестированного объема для шортов
bool     TestedVolumeLongFlagSmall =0;      // флаг оттестированного объема для лонгов

double   m_profit_off  =0.0;
bool     m_close_start=false; //m_trail_enable= false,        
int      m_profit=0;
int      TrailingStop_,
         TrailingStep_,
         StopLoss_;

bool     flag_close_all;
color    col,LotColor,HisColor,ProfColor,SummProfColor,FreezColor,FixProfit;
datetime TimeCur;

int    handle_iFractals;   
double upper=0,lower=0, FDelta=0;

bool     BuyLimitFlag =false;
bool     SellLimitFlag=false;

double   SYMBOL_MARGIN,
         MARGIN_FREE,
         MARGIN_Smal,
         MARGIN_Start;    // Проверка маржи

string Trim(string sVar)
  {
   StringTrimLeft(sVar);
   StringTrimRight(sVar);
   return sVar;
  }

int string_explode(string sDelimiter,string sText,string &sReturn[])
  {

   ushort u_sep=StringGetCharacter(sDelimiter,0);
   StringSplit(sText,u_sep,sReturn);
   int isize=ArraySize(sReturn);
   for(int i=0; i<isize; i++)

     {
      sReturn[i]=Trim(sReturn[i]);
     }

   return ArraySize(sReturn);
  }

int OnInit()
  {
      // код доступен только после оплаты
   }//end OnInit

void OnDeinit(const int reason)
  {
   EventKillTimer();                        // Кил таймера   

   if(Debug){Print(GetTextReason(reason));}

   if(reason==REASON_REMOVE) // При удалении с графика
     {                       // Удалить все объекты с графика,
      DeleteInfoPanel();     // которые относятся к информационной панели
      DeleteInfoPanel2();
      KillLine();            // Удаление всех графических меток.
      KillInfoAuto();                                         // Удаляем надписи авто входа
     }

  }//end OnDeinit

void OnTick()
  {
      // код доступен только после оплаты
   }//end OnTick

void OnBookEvent(const string &symbol)
  {
   if(symbol!=m_book_market.GetMarketBookSymbol())              // проверяем символ стакана
      return;                                                   // если символ стакана не наш, выходим
   m_book_market.Refresh();                                     // обновляем данные по стакану  

  }//end OnBookEvent

void OnTimer()// работа по таймеру
  {

   FiltrSP();                                 // данные фильтра спроса и предложения
   GetPropPosition();                         // Вызов данных о значения позиции                           
   StepMonitoring();                          // Мониторинг расширения диапазонов 
   if(StopLoss!=0){ModifiStopLoss();} 

   TransCount=0;                              // Заявки на вход, счетчик   

   ENUM_TRADE_STATE state=m_tradestate.GetTradeState(TimeCurrent()); // Класс торговли по времени.

   if(TradeStateTime){                                 // Временной фильтр включен 
      switch(state)
        {
         case TRADE_WAIT: // Контроль над открытыми позициями теряется. Новые сигналы игнорируются. Полезен в моменты выхода новостей.   

            break;

         case TRADE_BUY_AND_SELL:                      // Разрешены покупки и продажи.       

            ProfitTrall();                             // трал общего профита

              if(AutomaticTrade!=AUTO_OF){
              DelObjbyName("SellBuy2");
              AutomaticTradeVolume();                  // Авто выбор направления торговли 
              } else {
              DelObjbyName("SellF");
              DelObjbyName("BuyF");
              DelObjbyName("SellBuy");
              BuyLimitFlag =false;
              SellLimitFlag =false;
              CreateLabel(0,0,"SellBuy2","* АВТО OF *",CORNER_LEFT_LOWER,CORNER_LEFT_LOWER,"Calibri",10,clrYellowGreen,150,20,2);
              }

              if(AutomaticTrade==AUTO_OF && FractalOn==true && TypeTrade==AUTOMATIC){
              CreateLabel(0,0,"Auto","* ЗАБЫЛ ВЫБРАТЬ АВТОМАТИЧЕСКОЕ НАПРАВЛЕНИЕ *",CORNER_RIGHT_LOWER,CORNER_RIGHT_UPPER,"Calibri",14,clrRed,550,20,2);}
              else {DelObjbyName("Auto");}

               if(ExistPositions()==0 )                    // Если поза ноль
                 { 
                 DelObjbyName("ML");  
                 DelObjbyName("Stop");                                    // Удаляем надпись TRADE_STOP                                                             

                 if(TradeSymbol){                          
                 if(!IsPositionExists())
                   {

                    if(FractalOn==true){FractalSignsl();}                 // Функция определения уровня фрактала
                    else{DelObjbyName("upper");DelObjbyName("lower"); 
                    DelObjbyName("Textupper"); DelObjbyName("Textlower");}

                    TestBigVolume();                                      // Вызов функции установки заявок под плотность
                    DelObjbyName("SY");                                   // Удаляем надпись
                   }                
                  else{
                  KillLineVhod();                                         // Удаляем линии плотностей входа
                  KillActiveAsyncDen();                                   // удаляем все лимитные заявки, но позы не закрываем
                  CreateLabel(0,0,"SY","* В РЕЖИМЕ ОЖИДАНИЯ *",CORNER_RIGHT_LOWER,CORNER_RIGHT_UPPER,"Calibri",14,clrRed,350,5,2);
                   }
                 } 

                 if(!TradeSymbol){
                 DelObjbyName("SY");                                      // Удаляем надпись

                    if(FractalOn==true){FractalSignsl();}                 // Функция определения уровня фрактала
                    else{DelObjbyName("upper");DelObjbyName("lower"); 
                    DelObjbyName("Textupper"); DelObjbyName("Textlower");}

                    TestBigVolume();                                      // Вызов функции установки заявок под плотность
                   }     
                    KillLineSopr();                                       //---Удаляем линии плотностей сопровождения и ценовой канал     
                 }

               if(ExistPositions()!=0 )                    // Если позиция появилась
                 {                                     
                  KillLineVhod();                                         // Удаляем линии плотностей входа

                  if(FractalOn==true){                                    
                  DelObjbyName("upper");     DelObjbyName("lower"); 
                  DelObjbyName("Textupper"); DelObjbyName("Textlower");}  // Удаляем удаляем линии фракталов

                  if(TradeLongSopr && pos_type==POSITION_TYPE_BUY) {TestBigVolumeBuy();}   // Если позиция бай, вызываем сопровождение
                  if(TradeShortSopr && pos_type==POSITION_TYPE_SELL){TestBigVolumeSell();} // Если позиция сел, вызываем сопровождение                  
                  if(!TradeLongSopr && !TradeShortSopr){KillLineSopr();}                   //---Удаляем линии плотностей сопровождения и ценовой канал 
                }

            break;

        }//end switch 
    }
      else {   
      ProfitTrall();                                                      // трал общего профита                                                           // Временной фильтр выключен

              if(AutomaticTrade!=AUTO_OF){
              DelObjbyName("SellBuy2");
              AutomaticTradeVolume();                                     // Авто выбор направления торговли 
              } else {
              DelObjbyName("SellF");
              DelObjbyName("BuyF");
              DelObjbyName("SellBuy");
              BuyLimitFlag =false;
              SellLimitFlag =false;
              CreateLabel(0,0,"SellBuy2","* АВТО OF *",CORNER_LEFT_LOWER,CORNER_LEFT_LOWER,"Calibri",10,clrYellowGreen,150,20,2);
              }

              if(AutomaticTrade==AUTO_OF && FractalOn==true && TypeTrade==AUTOMATIC){
              CreateLabel(0,0,"Auto","* ЗАБЫЛ ВЫБРАТЬ АВТОМАТИЧЕСКОЕ НАПРАВЛЕНИЕ *",CORNER_RIGHT_LOWER,CORNER_RIGHT_UPPER,"Calibri",14,clrRed,550,20,2);}
              else {DelObjbyName("Auto");}   

               if(ExistPositions()==0 )                    // Если поза ноль
                 { 
                 DelObjbyName("ML");  
                 DelObjbyName("Stop");                                    // Удаляем надпись TRADE_STOP                                                            

                 if(TradeSymbol){                          
                 if(!IsPositionExists())
                   {

                    if(FractalOn==true){FractalSignsl();}                 // Функция определения уровня фрактала
                    else{DelObjbyName("upper");DelObjbyName("lower"); 
                    DelObjbyName("Textupper"); DelObjbyName("Textlower");}

                    TestBigVolume();                                      // Вызов функции установки заявок под плотность
                    DelObjbyName("SY");                                   // Удаляем надпись
                   }                
                  else{
                  KillLineVhod();                                         // Удаляем линии плотностей входа
                  KillActiveAsyncDen();                                   // удаляем все лимитные заявки, но позы не закрываем
                  CreateLabel(0,0,"SY","* В РЕЖИМЕ ОЖИДАНИЯ *",CORNER_RIGHT_LOWER,CORNER_RIGHT_UPPER,"Calibri",14,clrRed,350,5,2);
                   }
                 } 

                 if(!TradeSymbol){

                    if(FractalOn==true){FractalSignsl();}                 // Функция определения уровня фрактала
                    else{DelObjbyName("upper");DelObjbyName("lower"); 
                    DelObjbyName("Textupper"); DelObjbyName("Textlower");}

                    DelObjbyName("SY");                                   // Удаляем надпись
                    TestBigVolume();                                      // Вызов функции установки заявок под плотность
                  }     
                 KillLineSopr();                                          //---Удаляем линии плотностей сопровождения и ценовой канал     
               }

               if(ExistPositions()!=0 )                    // Если позиция появилась
                 {                                     
                  KillLineVhod();                                         // Удаляем линии плотностей входа

                  if(FractalOn==true){                                    
                  DelObjbyName("upper");     DelObjbyName("lower"); 
                  DelObjbyName("Textupper"); DelObjbyName("Textlower");}  // Удаляем удаляем линии фракталов

                  if(TradeLongSopr && pos_type==POSITION_TYPE_BUY) {TestBigVolumeBuy();}   // Если позиция бай, вызываем сопровождение
                  if(TradeShortSopr && pos_type==POSITION_TYPE_SELL){TestBigVolumeSell();} // Если позиция сел, вызываем сопровождение                  
                  if(!TradeLongSopr && !TradeShortSopr){KillLineSopr();}                   //---Удаляем линии плотностей сопровождения и ценовой канал      
                }

       }

  }//end OnTimer

void TestBigVolume() //выставленние заявок от объема
  {
   int    TotalSellLimit        =0,    TotalBuyLimit        =0;
   long   BOOK_Volume_Sell      =0,    BOOK_Volume_Buy      =0;
   double BOOK_Price_Sell       =0,    BOOK_Price_Buy       =0,    
          PriceSellNow          =0,    PriceBuyNow          =0,
          PriceSellNeed         =0,    PriceBuyNeed         =0,
          PriceSell             =0,    PriceBuy             =0;

   if(TradeShort && MARGIN_Start<MARGIN_FREE)
     {        // Разрешаем продажи и проверка маржи

       if(
          (SellLimitFlag==true)
            && 
          (!OiOn ||(deltaSP_sell>=SP_Spread && deltaOR_sell>=OR_Spread))
         )
        {    
         BOOK_Price_Sell    = m_book_market.InfoGetDouble (MBOOK_LAST_ASK_PRICE);            // Цена выбранного объема для SELL
         BOOK_Volume_Sell   = m_book_market.InfoGetInteger(MBOOK_MAX_ASK_VOLUME);            // Выбранный объем для SELL

         PriceSellNow       = m_symbol.NormalizePrice(MyNearestOrderPrice(ORDER_TYPE_SELL_LIMIT));        // Цена ближайшего  SELL_LIMIT
         PriceSellNeed      = m_symbol.NormalizePrice(BOOK_Price_Sell-m_symbol.TickSize()*DeltaBig);      // Отступ перед большой заявкой для SELL_LIMIT
         PriceSell          = m_symbol.NormalizePrice(BOOK_Price_Sell-m_symbol.TickSize()*OtstupVol);        // Отступ от цены объема
         TotalSellLimit     = MyOrderCount(ORDER_TYPE_SELL_LIMIT);                                        // Считаем кол-во SELL_LIMIT

   if(BOOK_Volume_Sell!=0)
     {
      TrendCreate(0,"LineUp_",0,iTime(m_symbol.Name(),PERIOD_CURRENT,1),BOOK_Price_Sell,iTime(m_symbol.Name(),PERIOD_CURRENT,0),BOOK_Price_Sell,clrRed,1,1);  // линия хай          
      TextCreate(0,"TextLineUp_",0,iTime(m_symbol.Name(),PERIOD_CURRENT,1),BOOK_Price_Sell,"               UP - плотность:  "+DoubleToString(BOOK_Volume_Sell,0),0,7,clrAqua);
      TrendCreate(0,"LineUpO_",0,iTime(m_symbol.Name(),PERIOD_CURRENT,1),PriceSell,iTime(m_symbol.Name(),PERIOD_CURRENT,0),PriceSell,clrGray,0,1);
      TextCreateVol(0,"TextLineUpPrice",0,iTime(m_symbol.Name(),PERIOD_CURRENT,2),BOOK_Price_Sell," - "+DoubleToString(BOOK_Price_Sell,m_symbol.Digits()),0,7,clrDarkGray,ANCHOR_RIGHT);  
        }else {DelObjbyName("LineUp_"); DelObjbyName("TextLineUp_"); DelObjbyName("TextLineUpPrice");DelObjbyName("LineUpO_");
     }

   TestRealVolumeSELL(BOOK_Price_Sell);  

         if((ControlLimit==false && ((TotalSellLimit>0 && PriceSellNow!=PriceSellNeed) || BOOK_Price_Sell==0 || TotalSellLimit>1))
             ||
            (ControlLimit==true  && ((TotalSellLimit>0 && (PriceSellNow>PriceSellNeed || PriceSellNow<PriceSell)) || BOOK_Price_Sell==0 || TotalSellLimit>1)))          
           {
            KillActive(ORDER_TYPE_SELL_LIMIT);
           }
         else 
           {
            if(TestedVolumeShortFlag && TotalSellLimit==0) // Флаг дает добро на установку лимитки
              {
                  m_ordersend.PendingOrderLimit(m_symbol.Name(),LotBefore,ORDER_TYPE_SELL_LIMIT,PriceSellNeed,0,0,"BOOK_Short");

               if(Debug){  Print(m_symbol.Name()+": Установка заявки Шорт под плотность:  "+DoubleToString(PriceSellNeed,m_symbol.Digits()));}
               TransCount++;
               Sleep(500);
               TimeTransSend               = TimeCurrent();
               OrderTicketNow              = m_trade.ResultOrder();
               uint    Retcode             = m_trade.ResultRetcode();
              }
           }
           } else {DelObjbyName("LineUp_");  DelObjbyName("TextLineUp_"); DelObjbyName("TextLineUpPrice");DelObjbyName("LineUpO_");
                   KillActive(ORDER_TYPE_SELL_LIMIT);
        }
     }

   if(TradeLong && MARGIN_Start<MARGIN_FREE)         // Разрешаем покупки и проверка маржи
     {      

      if(
         (BuyLimitFlag==true)       
            && 
         (!OiOn ||(deltaSP_buy>=SP_Spread && deltaOR_buy>=OR_Spread))
        )
        {
         BOOK_Price_Buy     = m_book_market.InfoGetDouble(MBOOK_LAST_BID_PRICE);             // Цена выбранного объема для BUY
         BOOK_Volume_Buy    = m_book_market.InfoGetInteger(MBOOK_MAX_BID_VOLUME);            // Выбранный объем для BUY  

         PriceBuyNow        = m_symbol.NormalizePrice(MyNearestOrderPrice(ORDER_TYPE_BUY_LIMIT));         // Цена ближайшего  BUY_LIMIT
         PriceBuyNeed       = m_symbol.NormalizePrice(BOOK_Price_Buy +m_symbol.TickSize()*DeltaBig);      // Отступ перед большой заявкой для BUY_LIMIT
         PriceBuy           = m_symbol.NormalizePrice(BOOK_Price_Buy +m_symbol.TickSize()*OtstupVol);        // Отступ 
         TotalBuyLimit      = MyOrderCount(ORDER_TYPE_BUY_LIMIT);                                         // Считаем кол-во BUY_LIMIT

     if(BOOK_Volume_Buy!=0)
     {
      TrendCreate(0,"LineDn_",0,iTime(m_symbol.Name(),PERIOD_CURRENT,1),BOOK_Price_Buy,iTime(m_symbol.Name(),PERIOD_CURRENT,0),BOOK_Price_Buy,clrBlueViolet,1,1);  // линия лоу          
      TrendCreate(0,"LineDnO_",0,iTime(m_symbol.Name(),PERIOD_CURRENT,1),PriceBuy,iTime(m_symbol.Name(),PERIOD_CURRENT,0),PriceBuy,clrGray,0,1);
      TextCreate(0,"TextLineDn_",0,iTime(m_symbol.Name(),PERIOD_CURRENT,1),BOOK_Price_Buy,"               DN - плотность:  "+DoubleToString(BOOK_Volume_Buy,0),0,7,clrAqua);     
      TextCreateVol(0,"TextLineDnPrice",0,iTime(m_symbol.Name(),PERIOD_CURRENT,2),BOOK_Price_Buy," - "+DoubleToString(BOOK_Price_Buy,m_symbol.Digits()),0,7,clrDarkGray,ANCHOR_RIGHT);  
        }else {DelObjbyName("LineDn_");DelObjbyName("TextLineDn_"); DelObjbyName("TextLineDnPrice");
     }

     TestRealVolumeBUY(BOOK_Price_Buy);

         if((TotalBuyLimit>0 && PriceBuyNow!=PriceBuyNeed) || BOOK_Price_Buy==0 || TotalBuyLimit>1 || !TestedVolumeLongFlag)         
           {
            KillActive(ORDER_TYPE_BUY_LIMIT);
           }
         else 
           {
            if(TestedVolumeLongFlag && TotalBuyLimit==0) // Флаг дает добро на установку лимитки 
              {
                  m_ordersend.PendingOrderLimit(m_symbol.Name(),LotBefore,ORDER_TYPE_BUY_LIMIT,PriceBuyNeed,0,0,"BOOK_Long");

               if(Debug){  Print(m_symbol.Name()+": Установка заяки Лонг под плотность:  "+DoubleToString(PriceBuyNeed,m_symbol.Digits()));}
               TransCount++;
               Sleep(500);
               TimeTransSend               = TimeCurrent();
               OrderTicketNow              = m_trade.ResultOrder();
               uint    Retcode             = m_trade.ResultRetcode();
              }
           }
           }  else {DelObjbyName("LineDn_");DelObjbyName("TextLineDn_"); DelObjbyName("TextLineDnPrice");DelObjbyName("LineDnO_");
                    KillActive(ORDER_TYPE_BUY_LIMIT);
        }

     }

  }//end  TestBigVolume

void TestBigVolumeSell() //выставленние заявок от объема
  {

   double PriceSellNeed          =0,    PriceSellNow       =0,
          PriceBuyNow            =0,    PriceBuy_Big       =0,   
          PriceSell_Small        =0,    PriceBuyNeedbig    =0;

   int    TotalSellLimit         =0,    NewlotSell         =0,
          TotalBuyLimit          =0,    SpSell             =0;

   PriceSell_Small     = m_symbol.NormalizePrice(pos_dealPrice+StepSmall*m_symbol.TickSize());     // Цена отступа для узкой селл лимитки
   PriceBuy_Big        = m_symbol.NormalizePrice(pos_dealPrice-StepBig*m_symbol.TickSize());       // Цена отступа для широкой бай лимитки  

   TrendCreate_OR(0,"LineBuyBig",0,iTime(m_symbol.Name(),PERIOD_CURRENT,20),PriceBuy_Big,iTime(m_symbol.Name(),PERIOD_CURRENT,0),PriceBuy_Big,ColorStepBig,0,1);
   TextCreateVol(0,"TextLineBuyBig",0,iTime(m_symbol.Name(),PERIOD_CURRENT,20),PriceBuy_Big," - "+DoubleToString(PriceBuy_Big,m_symbol.Digits()),0,7,clrDarkGray,ANCHOR_RIGHT);

   TrendCreate_OR(0,"LinePos",0,pos_dealTime,pos_dealPrice,iTime(m_symbol.Name(),PERIOD_CURRENT,0),pos_dealPrice,ColorDealPrice,0,1);

   if(PositionVolume(m_symbol.Name())<MaxLot){
   DelObjbyName("ML");                            // если макс лот в норме, удаляем надпись
   TrendCreate_OR(0,"LineSellSmall",0,iTime(m_symbol.Name(),PERIOD_CURRENT,20),PriceSell_Small,iTime(m_symbol.Name(),PERIOD_CURRENT,0),PriceSell_Small,ColorStepSmall,0,1); 
   TextCreateVol(0,"TextLineSellSmall",0,iTime(m_symbol.Name(),PERIOD_CURRENT,20),PriceSell_Small,""+DoubleToString(PriceSell_Small,m_symbol.Digits()),0,7,ColorStepSmall,ANCHOR_RIGHT);   
   }else {                      
   CreateLabel(0,0,"ML","* ДОСТИГЛИ MAX LOT *",CORNER_RIGHT_LOWER,CORNER_RIGHT_LOWER,"Calibri",14,clrRed,500,80,2);
   }

if(PositionVolume(m_symbol.Name())<MaxLot)
  {// Фильтрация по ограничению лота   
  if(BID>PriceSell_Small && MARGIN_Smal<=MARGIN_FREE) // Цена бид выше отступа + проверка маржи                 
     {     

      PriceSellNeed       = m_symbol.NormalizePrice(ASK+m_symbol.TickSize()*DeltaBig);     // Отступ перед большой заявкой для SELL_LIMIT
      PriceSellNow        = m_symbol.NormalizePrice(MyNearestOrderPrice(ORDER_TYPE_SELL_LIMIT));       // Цена ближайшего  SELL_LIMIT
      TotalSellLimit      = MyOrderCount(ORDER_TYPE_SELL_LIMIT);                                       // Считаем кол-во SELL_LIMIT

      if(BID-PriceSell_Small!=0)
        {
         SpSell=(int)m_symbol.NormalizePrice((BID-PriceSell_Small)/m_symbol.TickSize()/StepSmall);
        }
      if(MetodLot){NewlotSell   =  LotBefore+LotBefore*SpSell;}          // Динамически
      else        {NewlotSell   =  LotBefore;}                           // Фиксированно по дефолту
      if(NewlotSell+pos_volume>MaxLot){NewlotSell=MaxLot-pos_volume;}    // Ограничитель по Макс лоту

      if(TotalSellLimit>1 )
        {
         KillActiveSopr(ORDER_TYPE_SELL_LIMIT);
        }
      else
        {
         if(TotalSellLimit==0)     // Флаг дает добро на установку лимитки 
           {
              m_ordersend.PendingOrderLimit(m_symbol.Name(),NewlotSell,ORDER_TYPE_SELL_LIMIT,LAST,0,0,"BOOK_ShortS");

            if(Debug){  Print(m_symbol.Name()+": Установка заявки сопровождения Шорт Доливка:  "+DoubleToString(PriceSellNeed,m_symbol.Digits()));}
            TransCount++;
            Sleep(500);
            TimeTransSend               = TimeCurrent();
            OrderTicketNow              = m_trade.ResultOrder();
            uint    Retcode             = m_trade.ResultRetcode();
           }
        }

        }else {                                                                             // Удаляем линии плотностей
         KillActiveSopr(ORDER_TYPE_SELL_LIMIT); // Удаляем лимитный ордер если он стоит
     }
 }else {              
      DelObjbyName("LineSellSmall");DelObjbyName("TextLineSellSmall");                       // Удаляем линии узкого отступа
      KillActiveSopr(ORDER_TYPE_SELL_LIMIT);                                                 // Удаляем лимитный ордер если он стоит
 }

  if(ASK<PriceBuy_Big) // Цена аск ниже отступа   
     {      
      PriceBuyNeedbig     = m_symbol.NormalizePrice(BID -m_symbol.TickSize()*DeltaBig);     // Отступ перед большой заявкой для BUY_LIMIT  
      PriceBuyNow         = m_symbol.NormalizePrice(MyNearestOrderPrice(ORDER_TYPE_BUY_LIMIT));           // Цена ближайшего  BUY_LIMIT
      TotalBuyLimit       = MyOrderCount(ORDER_TYPE_BUY_LIMIT);

      if(TotalBuyLimit>1)
        {
         KillActiveSopr(ORDER_TYPE_BUY_LIMIT);
        }
      else
        {
         if(TotalBuyLimit==0)            // Флаг дает добро на установку лимитки без анализа плотности
           {
               m_ordersend.PendingOrderLimit(m_symbol.Name(),LotBefore,ORDER_TYPE_BUY_LIMIT,LAST,0,0,"BOOK_LongS");

            if(Debug){  Print(m_symbol.Name()+": Установка встречной заяки сопровождения Лонг:  "+DoubleToString(PriceBuyNeedbig,m_symbol.Digits()));}
            TransCount++;
            Sleep(500);
            TimeTransSend               = TimeCurrent();
            OrderTicketNow              = m_trade.ResultOrder();
            uint    Retcode             = m_trade.ResultRetcode();
           }
        }
        }else {               
         KillActiveSopr(ORDER_TYPE_BUY_LIMIT); // Удаляем лимитный ордер если он стоит
     }

  }//end TestBigVolumeSell

void TestBigVolumeBuy() //выставленние заявок от объема
  {

   double PriceSellNow         =0,   PriceSell_Big          =0,   
          PriceBuyNeed         =0,   PriceBuyNow            =0,
          PriceBuy_Small       =0,   PriceSellNeedbig       =0;

   int    TotalSellLimit       =0,   SpBuy                  =0,
          TotalBuyLimit        =0,   NewlotBuy              =0;

   PriceSell_Big       = m_symbol.NormalizePrice(pos_dealPrice+StepBig*m_symbol.TickSize());       // Цена отступа для широкой селл лимитки                     
   PriceBuy_Small      = m_symbol.NormalizePrice(pos_dealPrice-StepSmall*m_symbol.TickSize());     // Цена отступа для узкой бай лимитки    

   TrendCreate_OR(0,"LineSellBig",0,iTime(m_symbol.Name(),PERIOD_CURRENT,20),PriceSell_Big,iTime(m_symbol.Name(),PERIOD_CURRENT,0),PriceSell_Big,ColorStepBig,0,1);
   TextCreateVol(0,"TextLineSellBig",0,iTime(m_symbol.Name(),PERIOD_CURRENT,20),PriceSell_Big,""+DoubleToString(PriceSell_Big,0),0,7,ColorStepBig,ANCHOR_RIGHT);

   TrendCreate_OR(0,"LinePos",0,pos_dealTime,pos_dealPrice,iTime(m_symbol.Name(),PERIOD_CURRENT,0),pos_dealPrice,ColorDealPrice,0,1);

   if(PositionVolume(m_symbol.Name())<MaxLot){ 
   DelObjbyName("ML"); 
   TrendCreate_OR(0,"LineBuySmall",0,iTime(m_symbol.Name(),PERIOD_CURRENT,20),PriceBuy_Small,iTime(m_symbol.Name(),PERIOD_CURRENT,0),PriceBuy_Small,ColorStepSmall,0,1);
   TextCreateVol(0,"TextLineBuySmall",0,iTime(m_symbol.Name(),PERIOD_CURRENT,20),PriceBuy_Small,""+DoubleToString(PriceBuy_Small,m_symbol.Digits()),0,7,ColorStepBig,ANCHOR_RIGHT);
   }else { // если макс лот в норме, удаляем надпись                                                                           
   CreateLabel(0,0,"ML","* ДОСТИГЛИ MAX LOT *",CORNER_RIGHT_LOWER,CORNER_RIGHT_LOWER,"Calibri",14,clrRed,500,80,2);
   }

if(PositionVolume(m_symbol.Name())<MaxLot)
  {// Фильтрация по ограничению лота    
   if(ASK<PriceBuy_Small && MARGIN_Smal<=MARGIN_FREE) // Цена аск ниже отступа       
       {

      PriceBuyNeed        = m_symbol.NormalizePrice(BID -m_symbol.TickSize()*DeltaBig);     // Отступ перед большой заявкой для BUY_LIMIT  
      PriceBuyNow         = m_symbol.NormalizePrice(MyNearestOrderPrice(ORDER_TYPE_BUY_LIMIT));        // Цена ближайшего  BUY_LIMIT
      TotalBuyLimit       = MyOrderCount(ORDER_TYPE_BUY_LIMIT);                                        // Считаем кол-во BUY_LIMIT

      if(PriceBuy_Small-ASK!=0)
        {
         SpBuy=(int)m_symbol.NormalizePrice((PriceBuy_Small-ASK)/m_symbol.TickSize()/StepSmall);
        }
      if(MetodLot){NewlotBuy    =  LotBefore+LotBefore*SpBuy;}            // Динамически
      else        {NewlotBuy    =  LotBefore;}                            // Фиксированно по дефолту
      if(NewlotBuy+pos_volume>MaxLot){NewlotBuy=MaxLot-pos_volume;}     // Ограничитель по Макс лоту

      if(TotalBuyLimit>1 )
        {
         KillActiveSopr(ORDER_TYPE_BUY_LIMIT);
        }
      else
        {
         if(TotalBuyLimit==0)     // Флаг дает добро на установку лимитки 
           {
               m_ordersend.PendingOrderLimit(m_symbol.Name(),NewlotBuy,ORDER_TYPE_BUY_LIMIT,LAST,0,0,"BOOK_LongS");

            if(Debug){  Print(m_symbol.Name()+": Установка заяки сопровождения Лонг Доливка:  "+DoubleToString(PriceBuyNeed,m_symbol.Digits()));}
            TransCount++;
            Sleep(500);
            TimeTransSend               = TimeCurrent();
            OrderTicketNow              = m_trade.ResultOrder();
            uint    Retcode             = m_trade.ResultRetcode();
           }
        }
     }else{                                                                                            // Если цена ушла с диапазона     
      KillActiveSopr(ORDER_TYPE_BUY_LIMIT);          // Удаляем лимитный ордер если он стоит
     }
 }else {                                                                                               // Если достигли максимального лота

      DelObjbyName("LineBuySmall");DelObjbyName("TextLineBuySmall");                                   // Удаляем линии узкого отступа
      KillActiveSopr(ORDER_TYPE_BUY_LIMIT);                                                            // Удаляем лимитный ордер если он стоит
 }

 if(BID>PriceSell_Big) // Цена бид выше отступа                  
     {    
      PriceSellNeedbig    = m_symbol.NormalizePrice(ASK+m_symbol.TickSize()*DeltaBig);           // Отступ перед большой заявкой для SELL_LIMIT
      PriceSellNow        = m_symbol.NormalizePrice(MyNearestOrderPrice(ORDER_TYPE_SELL_LIMIT));       // Цена ближайшего  SELL_LIMIT
      TotalSellLimit      = MyOrderCount(ORDER_TYPE_SELL_LIMIT);                                       // Считаем кол-во SELL_LIMIT

      if(TotalSellLimit>1 )
        {
         KillActiveSopr(ORDER_TYPE_SELL_LIMIT);
        }
      else
        {
         if(TotalSellLimit==0)                  
           {
               m_ordersend.PendingOrderLimit(m_symbol.Name(),LotBefore,ORDER_TYPE_SELL_LIMIT,LAST,0,0,"BOOK_ShortS");

            if(Debug){  Print(m_symbol.Name()+": Установка встречной заявки сопровождения Шорт:  "+DoubleToString(PriceSellNeedbig,m_symbol.Digits()));}
            TransCount++;
            Sleep(500);
            TimeTransSend               = TimeCurrent();
            OrderTicketNow              = m_trade.ResultOrder();
            uint    Retcode             = m_trade.ResultRetcode();
           }
        }
     }
   else 
     {                                
      KillActiveSopr(ORDER_TYPE_SELL_LIMIT);// Удаляем лимитный ордер если он стоит
     }

  }//end TestBigVolumeBuy

void BOOK_PRICE()
  {
   MqlTick lastTick;
   ENUM_BOOK_TYPE type;
   long   vols,volb;
   SymbolInfoTick(m_symbol.Name(),lastTick);
   LAST = lastTick.last;
   BID  = lastTick.bid;
   ASK  = lastTick.ask;

   if(ExistPositions()==0)
     {
      if(LAST>=ASK)
        {
         type=BOOK_TYPE_SELL;
         vols= m_book_market.InfoGetInteger(MBOOK_MAX_ASK_VOLUME);          // находим критический объем на продажу
         if(vols!=0) {WriteTestedPriceToArray(type,LAST);}                  // объем больше заданного, тестируем его
         Sleep(300);
         return;
        }
      if(LAST<=BID)
        {
         type=BOOK_TYPE_BUY;
         volb= m_book_market.InfoGetInteger(MBOOK_MAX_BID_VOLUME);          // находим критический объем на покупку
         if(volb!=0) {WriteTestedPriceToArray(type,LAST);}                  // объем больше заданного, тестируем его
         Sleep(300);
         return;
        }
      TestTestedVolume(BID,ASK);                                            // Тестируем плотность   
     }

  }//End  BOOK_PRICE 

void WriteTestedPriceToArray(ENUM_BOOK_TYPE type,double last)
  {
   if(type==BOOK_TYPE_SELL)
     {
      ArraySort(SellTestedPrice); //по возрастанию
      for(int i=0;i<3;i++)
        {
         if(SellTestedPrice[i]>last || SellTestedPrice[i]==0)
           {
            SellTestedPrice[i]=last;
            break;
           }
        }
     }
   else
     {
      ArraySort(BuyTestedPrice);
      for(int i=0;i<3;i++)
        {
         if(BuyTestedPrice[i]<last || BuyTestedPrice[i]==0)
           {
            BuyTestedPrice[i]=last;
            break;
           }
        }
     }
  }//end WriteTestedPriceToArray

void TestTestedVolume(double bid,double ask)
  {
   for(int i=0;i<3;i++)
     {                //обнулим протестированность, если объемы уже убрались или цена ушла мимо  
      if(SellTestedPrice[i]>0)
        {
         long vol=m_book_market.InfoGetInteger(MBOOK_MAX_ASK_VOLUME,(long)SellTestedPrice[i]);
         if((vol>0 && vol<0.07*vol) || SellTestedPrice[i]<ask) SellTestedPrice[i]=0;
        }
      if(BuyTestedPrice[i]>0)
        {
         long vol=m_book_market.InfoGetInteger(MBOOK_MAX_BID_VOLUME,(long)BuyTestedPrice[i]);
         if((vol>0 && vol<0.07*vol) || BuyTestedPrice[i]>bid) BuyTestedPrice[i]=0;
        }
     }
  }//end TestTestedVolume

void TestRealVolumeSELL(double priceSell)
  {
  double DeltaSell       = 0;
   TestedVolumeShortFlag = false;
   if(priceSell)
     {
      for(int i=0;i<3;i++)
        { 

         if(ControlLimit){
         DeltaSell   = priceSell-m_symbol.TickSize()*OtstupVol;
         if(SellTestedPrice[i] <= priceSell && SellTestedPrice[i] > DeltaSell){TestedVolumeShortFlag=true;} 
         }else {       
         if(SellTestedPrice[i]==priceSell){TestedVolumeShortFlag=true;}}     
        }
     }
  }

void TestRealVolumeBUY(double priceBuy)
  {
   double DeltaBuy      = 0;         
   TestedVolumeLongFlag = false;
   if(priceBuy)
     {
      for(int i=0;i<3;i++)
        {     

         if(ControlLimit){
         DeltaBuy = priceBuy+m_symbol.TickSize()*OtstupVol;
         if(BuyTestedPrice[i] >= priceBuy  && BuyTestedPrice[i] < DeltaBuy){TestedVolumeLongFlag=true;}
         } else {                          
         if(BuyTestedPrice[i]==priceBuy){TestedVolumeLongFlag=true;}}
        }
     }
  }//end   

int MyOrderCount(ENUM_ORDER_TYPE type)
  {
   int count=0;
   int total=0;
   total=OrdersTotal();
   if(total==0)

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

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

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

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

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

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

Стоимость полного кода
6 623,20₽ ≈ $80.95