#include "Orders.mqh" #include "SUPGran2.0.mqh" //+------------------------------------------------------------------+ //|2ая часть СУПа (контроль ордеров и доп. перемещение зон) | //+------------------------------------------------------------------+ class CSUPOrders : public CSUP { int SO_BuyC; int SO_SellC; double SO_SLC; //Размер зоны установки SL % от размера рубежа double SO_SLvProfitC; //Расстояние после которого SL защищает доп. прибыль умноженное на SL double SO_LotsC; //Размер лота int SO_slippageC; //Проскальзывание double SO_zazorC; //Зазор между экстермумом и зоной в % от ATR ENUM_TIMEFRAMES SO_ATR_TimeFrameC; //TimeFrame ATR int SO_ATR_PeriodC; //Период ATR direction SO_directC; //Направление int SO_MagicC; //MagicNumber int SO_MagicNoC; //MagicNumber исключение ENUM_TIMEFRAMES SO_TimeFrameC; //TimeFrame string SO_nameC; //Название зоны int SO_SLCountMaxC; //Максимальная дальность SL/ордера в SL double SO_zazorOrdC; //Мин расстояние для открытия ордера в % от ATR private: int OrdersSender(); //Устанавливаем ордера int OrderSendRezerv(); //Открываем допю ордера если текущие открыть невозможно bool ZoneMoveBack(); //Возвращает зону на исходное положение если цена проходит расстояние старая позиция плюс StopLoss и так далее пока не дойдем до первой позиции, затем превращаем значения в 0 int OrdersStopLossCreator(); //Устанавливаем StopLoss ордерам bool OrderIs(double IOI_price); //Проверяем наличие ордера с заданной ценой открытия bool FindZoneS(); //Проверяем наличие зоны int OrdersDelete(); //Удаляем ордера int NumberSLGetAndDeleteStruct(); //Получаем номер стоп-лосс последнего закрывшегося ордера, а затем обнуляем структуру OrdClose bool ZoneMove(datetime ZM_time1,double ZM_price1); //Перемещаем зону double SummLots(); //Определяем размер лота bool LotCorrector(); //Корректируем размер лота double MinMax(int var); //Определяем макс/мин значение на временном промежутке double MinMax1(int var); //Определяем макс/мин значение на временном промежутке (запасной) int OrderOpen(); //Определяет профит ордера (положительный или отрицательный) public: void SupOrders(); //Работа СУП (2ая часть) CSUPOrders(double SO_SLX=50, double SO_SLvProfitX=3, double SO_LotsX = 0.01, int SO_slippageX = 10, double SO_zazorX = 0, ENUM_TIMEFRAMES SO_ATR_TimeFrameX = PERIOD_H4, int SO_ATR_PeriodX = 30, direction SO_directX = SELL, int SO_MagicX = 96635, int SO_MagicNoX = 34143, ENUM_TIMEFRAMES SO_TimeFrameX = PERIOD_M5, double SO_zazorOrdX = 5, int SO_SLCountMaxX = 3); ~CSUPOrders(); }; //+------------------------------------------------------------------+ //|Конструктор | //+------------------------------------------------------------------+ CSUPOrders::CSUPOrders(double SO_SLX,double SO_SLvProfitX,double SO_LotsX,int SO_slippageX,double SO_ZazorX,ENUM_TIMEFRAMES SO_ATR_TimeFrameX,int SO_ATR_PeriodX,direction SO_directX,int SO_MagicX,int SO_MagicNoX,ENUM_TIMEFRAMES SO_TimeFrameX,double SO_zazorOrdX,int SO_SLCountMaxX) { SO_SLC = SO_SLX; SO_SLvProfitC = SO_SLvProfitX; SO_slippageC = SO_slippageX; SO_LotsC = SO_LotsX; SO_zazorC = SO_ZazorX; SO_ATR_TimeFrameC = SO_ATR_TimeFrameX; SO_TimeFrameC = SO_TimeFrameX; SO_ATR_PeriodC = SO_ATR_PeriodX; SO_directC = SO_directX; SO_MagicC = SO_MagicX; SO_MagicNoC = SO_MagicNoX; SO_TimeFrameC = SO_TimeFrameX; SO_zazorOrdC = SO_zazorOrdX; SO_SLCountMaxC = SO_SLCountMaxX; SO_nameC = StringConcatenate(IntegerToString(SO_MagicC,MathLog10(SO_MagicC)+1,'0'),"S",IntegerToString(SO_TimeFrameC,MathLog10(SO_TimeFrameC)+1,'0')); OComm.Init(SO_MagicC,SO_TimeFrameC,SO_SLC,0,SO_BuyC,SO_SellC); } //+------------------------------------------------------------------+ //|Работа СУП (2ая часть) | //+------------------------------------------------------------------+ void CSUPOrders::SupOrders() { OComm.OrderTotalComander(); if(FindZoneS()==true) { OrdersSender(); LotCorrector(); OrdersStopLossCreator(); } } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ //+------------------------------------------------------------------+ //|Управление ордерами (упрощенный вариант) | //+------------------------------------------------------------------+ class COrdersCommander { string OC_nameC; //Название объекта double OC_SLC; //Размер зоны установки SL % от размера рубежа ENUM_TIMEFRAMES OC_TimeFrameC; //TimeFrame int Popravka; //Значение нулевого стоп-лосс плюс поправка public: struct Orders //Структура хранит параметры всех ордеров по окончании текущего тика { int ticket; //Тикет double price; //Цена открытия datetime timeopen; //Время открытия datetime timeclose; //Время закрытия double OrdProfit; //Доход ордера double sl; //StopLoss int slnumb; //Порядковый номер стоплосса double tp; //TakeProfit int type; //Тип ордера int mag; //MagicNumber int counter; //Доп.параметр (перенос зоны для SL 2) } Ord[],OrdClose[]; int SellstopC; //Количество ордеров Sellstop int SelllimitC; //Количество ордеров Selllimit int BuystopC; //Количество ордеров Buystop int BuylimitC; //Количество ордеров Buylimit int MagicC; //MagicNumber int OrderTotalComander(); int OrderModificator(int OM_ticket,double OM_sl,double OM_tp,Orders &OrdX[]); //Модифицируем ордера COrdersCommander(int MagicX=96635,ENUM_TIMEFRAMES OC_TimeFrameX=PERIOD_M5,double OC_SLX=3,int PopravkaX=30); //Конструктор void Init(int MagicX,ENUM_TIMEFRAMES OC_TimeFrameX,double OC_SLX,int PopravkaX,int &BuyX,int &SellX); //Инициализация ~COrdersCommander(); //Деструктор private: bool FillOrders(int FO_var,int FO_ticket,double FO_price,double FO_sl,int FO_slnumb,double FO_tp,int FO_type,int FO_counter,Orders &OrdX[]); //Ввод данных bool DeleteOrders(int DO_var,int FO_ticket,Orders &OrdX[],Orders &OrdCloseX[]); //Перемещаем ордера из одной структуры в другую или удаляем из последней структуры bool DelStuctElement(int k,Orders &UZL[]); //Удаляем i-й элемент структуры bool OrderUtochnenieParametrov(); //Уточняем параметры закрывшихся ордеров bool OrderWrite(int OW_var,int OW_ticket,Orders &OrdX[]); //Определяем есть ли ордер с заданным тикетом в данной структуре int SLNumber(double OrdOpnPrice,double OrdStopLoss,int OrdType); //Определяем номер стоп-лосс для структуры Ord int BuyC; //Количество ордеров Buy int SellC; //Количество ордеров Sell bool first; //Режим перового пуска }; //+------------------------------------------------------------------+ //|Конструктор | //+------------------------------------------------------------------+ COrdersCommander::COrdersCommander(int MagicX,ENUM_TIMEFRAMES OC_TimeFrameX,double OC_SLX,int PopravkaX) { MagicC = MagicX; OC_TimeFrameC = OC_TimeFrameX; OC_SLC = OC_SLX; Popravka = PopravkaX; OC_nameC = StringConcatenate(IntegerToString(MagicC,MathLog10(MagicC)+1,'0'),"S",IntegerToString(OC_TimeFrameC,MathLog10(OC_TimeFrameC)+1,'0')); first = true; } //+------------------------------------------------------------------+ //|Конструктор | //+------------------------------------------------------------------+ void COrdersCommander::Init(int MagicX,ENUM_TIMEFRAMES OC_TimeFrameX,double OC_SLX,int PopravkaX,int &BuyX,int &SellX) { BuyC = BuyX; SellC = SellX; MagicC = MagicX; OC_TimeFrameC = OC_TimeFrameX; OC_SLC = OC_SLX; Popravka = PopravkaX; OC_nameC = StringConcatenate(IntegerToString(MagicC,MathLog10(MagicC)+1,'0'),"S",IntegerToString(OC_TimeFrameC,MathLog10(OC_TimeFrameC)+1,'0')); first = true; } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ class CSUP { private: int ZoneHighLowControl(); //Контролируем длинну и ширину зоны bool ZoneMoveOrDraw(datetime ZMD_time1,double ZMD_price1); //Рисуем или перемещаем зону если она нарисована void ZoneController(); //Управляем перемещением зоны int ZoneBigBarController(); //Управляем перемещением зоны внутри больших баров //Вспомогательные функции bool ZoneDraw(datetime DZ_time1,double DZ_price1); //Рисуем зону bool ZoneMoveSUP1(datetime DZ_time1,double DZ_price1); //Перемещаем зону bool ZoneMove(datetime ZM_time1,double ZM_price1); //Перемещаем зону внутри дня void Zashita(); //Защита void ZashitaController(); //Управлене защитой datetime barOpen; //Время открытия текущего бара int ABuyC; //Количество ордеров Buy int ASellC; //Количество ордеров Sell public: COrdersCommander OComm; //Генерируем контроллер ордеров SELL и BUY enum direction { BUY=1, // BUY SELL=-1, // SELL }; ENUM_TIMEFRAMES SUP_TimeFrameC; //TimeFrame double SUP_zazorC; //Зазор между экстермумом и зоной в % от ATR double SUP_zonehightC; //Размер рубежа в % от ATR double SUP_bigbarpersC; //Размер большого бара в % от ATR double SUP_smallbarpersC; //Размер маленького бара в % от ATR double SUP_bigbarperszoneC; //Зазор % от ATR для установки зоны в экстремально больших барах ENUM_TIMEFRAMES SUP_ATR_TimeFrameC; //TimeFrame ATR int SUP_ATR_PeriodC; //Период ATR direction SUP_directC; //Направление appliedprice SUP_applypriceC; //Применить к ценам int SUP_MagicC; //MagicNumber int SUP_BarsHistoryC; //Количество баров истории double SUP_zazorOrdC; //Мин расстояние для открытия ордера в % от ATR double SO_OldZonePrice; //SUPOrders Стартовая цена зоны дня datetime SO_OldZoneTime; //SUPOrders Стартовое время зоны дня int SLCount; //Номер ордера или SL, увеличивающийся при закрытии ордера в убыток double ZBBC_pricezero; //Точка отсчета цены в больших барах //Доп. перемещение зоны внутри дня int SUP_peremeshenieC; //Макс. количество перемещений зоны внутри дня double SUP_SLtoMoveC; //Расстояние в SL, которое должна пройти цена от верхней/нижней границы для ее перемещения внутри дня double SUP_SLC; //Размер зоны установки SL в % от размера рубежа //Вспомогательные color SUP_colorC; //Цвет границы string SUP_NamelabelC; //Название метки со стартовой ценой дня string SUP_nameC; //Название зоны //Экстремумы accur Ext_varC; //Точность определения экстремумов double Ext_DifferentC; //Max допустимый дифферент между двумя соседними мин и макс в % от АТR int Ext_BarsHistoryC; //Смотреть в историю на столько баров bool Ext_etremC; //Рисовать экстремумы color Ext_colorC; //Цвет линий "Экстремумы" CExtremums Extr; //Генерируем определитель экстремумов void SUP(); //СУП void OrderStopLossController(double OSLC_price,int OSLC_peremzone); //Изменяем номер StopLoss ордеров на 3, если зона перемещается в сторону ордера и его номер StopLoss 2 void ZoneDopMove(); //Движение зоны при отклонении цены на указанное количество SL в пределах параметра bool FindZone(); //Проверяем наличие нарисованной зоны int OrdersDeleteALL(); //Удаляем все ордера int OrdersDelete(); //Удаляем ордера int OrderslNumb(int OV_ticket,int OV_slnumb); //Определяем вариант стоп-лосс ордера и нумерует его int OrderStopLossCurrent(int OSLC_ticket); //Определяем номер StopLoss по ticket ордера CSUP( ENUM_TIMEFRAMES SUP_TimeFrameC = PERIOD_M5, double SUP_zazorC = 0, double SUP_zonehightC = 50, double SUP_bigbarpersC = 100, double SUP_smallbarpersC = 0.1, double SUP_bigbarperszoneC = 90, ENUM_TIMEFRAMES SUP_ATR_TimeFrameC = PERIOD_H4, int SUP_ATR_PeriodC = 30, direction SUP_directC = BUY, appliedprice SUP_applypriceC = HighLow, int SUP_MagicC = 96635, int SUP_BarsHistoryC = 800, double SUP_zazorOrdC = 5, int SUP_peremeshenieC = 3, double SUP_SLtoMoveC = 3, double SO_SLX = 50, color SUP_colorC = clrRed, //Экстремумы accur Ext_varC = Grubo, double Ext_DifferentC = 3, int Ext_BarsHistoryC = 200, bool Ext_etremC = true, color Ext_colorC = clrRed); ~CSUP(); }; //+------------------------------------------------------------------+ //|Конструктор | //+------------------------------------------------------------------+ CSUP::CSUP(ENUM_TIMEFRAMES SUP_TimeFrameX,double SUP_zazorX,double SUP_zonehightX,double SUP_bigbarpersX,double SUP_smallbarpersX,double SUP_bigbarperszoneX,ENUM_TIMEFRAMES SUP_ATR_TimeFrameX,int SUP_ATR_PeriodX,direction SUP_directX,appliedprice SUP_applypriceX,int SUP_MagicX,int SUP_BarsHistoryX,double SUP_zazorOrdX,int SUP_peremeshenieX,double SUP_SLtoMoveX,double SO_SLX,color SUP_colorX,accur Ext_varX,double Ext_DifferentX,int Ext_BarsHistoryX,bool Ext_etremX,color Ext_colorX) { SUP_TimeFrameC = SUP_TimeFrameX; SUP_zazorC = SUP_zazorX; SUP_zonehightC = SUP_zonehightX; SUP_bigbarpersC = SUP_bigbarpersX; SUP_smallbarpersC = SUP_smallbarpersX; SUP_bigbarperszoneC = SUP_bigbarperszoneX; SUP_ATR_TimeFrameC = SUP_ATR_TimeFrameX; SUP_ATR_PeriodC = SUP_ATR_PeriodX; SUP_directC = SUP_directX; SUP_applypriceC = SUP_applypriceX; SUP_BarsHistoryC = SUP_BarsHistoryX; SUP_zazorOrdC = SUP_zazorOrdX; SUP_MagicC = SUP_MagicX; SUP_peremeshenieC = SUP_peremeshenieX; SUP_SLtoMoveC = SUP_SLtoMoveX; SUP_SLC = SO_SLX; SUP_colorC = SUP_colorX; //Экстремумы Ext_varC = Ext_varX; Ext_DifferentC = Ext_DifferentX; Ext_BarsHistoryC = Ext_BarsHistoryX; Ext_etremC = Ext_etremX; Ext_colorC = Ext_colorX; SUP_nameC = StringConcatenate(IntegerToString(SUP_MagicC,MathLog10(SUP_MagicC)+1,'0'),"S",IntegerToString(SUP_TimeFrameC,MathLog10(SUP_TimeFrameC)+1,'0')); SUP_NamelabelC = StringConcatenate(SUP_nameC,"LABEL"); SLCount = 1; Extr.Init(Ext_varC,SUP_applypriceC,SUP_TimeFrameC,SUP_ATR_TimeFrameC,SUP_ATR_PeriodC,Ext_DifferentC,SUP_MagicC,Ext_BarsHistoryC,Ext_colorC,Ext_etremC); OComm.Init(SUP_MagicC,SUP_TimeFrameC,SUP_SLC,0,ABuyC,ASellC); } //+------------------------------------------------------------------+ //|СУП | //+------------------------------------------------------------------+ void CSUP::SUP() { //double price1=ObjectGetDouble(0,SUP_nameC,OBJPROP_PRICE1); //int peremeshenie=SO_peremeshenie; Zashita(); ZoneBigBarController(); ZoneDopMove(); //Print(SUP_MagicC,", ",SLCount,", ",SO_OldZonePrice,", ",SO_OldZoneTime); Comm if(barOpen!=iTime(Symbol(),SUP_TimeFrameC,0)) { SLCount=1; Extr.EXTREMUMS(); ZoneHighLowControl(); ZoneController(); barOpen=iTime(Symbol(),SUP_TimeFrameC,0); } ZashitaController(); //OrderStopLossController(price1,peremeshenie); } //+------------------------------------------------------------------+ //|Изменяем доп. парамтр ордеров на 1, если зона перемещается в | //|сторону ордера и его номер StopLoss 2 | //+------------------------------------------------------------------+ void CSUP::OrderStopLossController(double OSLC_price,int OSLC_peremzone) { //OSLC_price - цена price1 зоны, в начале тика (до работы СУП); pricezone - текущая цена price1 зоны //OSLC_peremzone - количество перемещений зоны при срабатывании StopLoss в начале тика //SO_peremeshenie - текущее количество перемещений зоны при срабатывании StopLoss //(ЗАКОММЕНТИРОВАНО)Функция сравнивает текущее количество перемещений и цену price1 зоны с соответствующими значениями в начале тика,если количества перемещений равны, то на этом тике по StopLoss не закрывались, а если при этом price1 разные значит было смещение по 3м вариантам (наш вариант), меняем доп. параметр всех ордеров со StopLoss 2 и положительным профитом на 1 //double pricezone=NormalizeDouble(ObjectGetDouble(0,SUP_nameC,OBJPROP_PRICE1),Digits); if(SUP_directC==SELL) { //if(OSLC_price>pricezone && OSLC_peremzone==SO_peremeshenie) { for(int i=0;iOrd[i].sl) { OComm.Ord[i].counter=1; } } } } if(SUP_directC==BUY) { //if(OSLC_price