SAURON
Похожие материалы по тегам
Сообщите нам, если считаете, что материал размещён без разрешения.
Сообщить о материале
Обращение по товару «sauron _auto v31.mq5» отправится на рассмотрение. Укажите контакт для ответа и опишите причину.
О программе
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? После подтверждения оплаты файл сохранится в кабинете на этот email. Если аккаунта ещё нет, мы создадим его и пришлём ссылку для задания пароля. Если аккаунт уже есть, покупка добавится в него. Укажите адрес, к которому у вас есть доступ.
Чтобы оформить заказ, введите email и перейдите к оплате.