//============================================================================================= MQL5 === // LibreCLOP Main_5 v1.005 MQL5 // Модуль обработки событий // LibreCoin (c)2014-2017 //====================================================================================================== #property strict //============================================================================================= MQL5 === // INCLUDE - подключаемые модули //------------------------------------------------------------------------------------------------------ //----- Обратные ссылки на основной файл проекта #include "LCL_Ref_5_v1.005.mqh" //============================================================================================= MQL5 === // EVENT PROCESSING MODULE //------------------------------------------------------------------------------------------------------ // //============================================================================================= MQL5 === // On_Init() - инициализация советника //------------------------------------------------------------------------------------------------------ ENUM_INIT_RETCODE On_Init(){ //----- Счетчики и настройки счетчиков gTick=0; //gInTimer=false; //----- Определяем необходимость использования графики GraphUse=( false //Тут надо проверить какой режим с каким совместим || ((!MQLInfoInteger(MQL_TESTER))&&(!MQLInfoInteger(MQL_OPTIMIZATION))) //Не тестирование и не оптимизация || (MQLInfoInteger(MQL_VISUAL_MODE)) //или визуальный режим ); //----- Определяем имя программы ProgramName=MQLInfoString(MQL_PROGRAM_NAME); //----- Глобальные параметры TheSymbol=Symbol(); //----- Выбор индикаторов для сигналов открытия int LastError=0; //----- Запуск LibreInfoPDO {if(GraphUse) //{if((!GraphUse)&&((OpenMethod==Open_ADXW)||(CloseProfitMethod==CloseProfit_ADXW)||(CloseLossMethod==CloseLoss_ADXW))) { ResetLastError(); lip_handle=iCustom( TheSymbol, PERIOD_CURRENT, "Projects\\Indicatores\\LIP\\Main\\LIP_v01.005\\LibreInfoPDO v1.005.ex5", //----- Input parameters aInpPeriodADXW, //Period aInpMethodADXW, //Method (MODE_SMA,MODE_EMA,MODE_SMMA,MODE_LWMA) aSSCBaseMode, //Корр (0..3)-(off/spread/close/midHLC) aInpFastPeriodEMA, //Fast EMA period aInpSlowPeriodEMA, //Slow EMA period aDICalcMode, //DICalcMode(0..8)-(hi/low/mahl/mihl/suhl/isuhl/imahl/imihl) //----- Параметры сброса тенденции adDI, //Для +-DI в долях от (макс-старт) adActiv, //Для Активности ((+DI)+(-DI)) в долях от максимальной adDelta, //Для Дельты ((+DI)-(-DI)) в долях от максимальной //----- Levels aL0, //L0 ADXOpenLvl aL1, //L1 ADXOpenLvlMax aL2, //L2 ADXCloseLvl aL3, //L3 ADXReversLvl aL4, //L4 ADXReversLvlMax //----- Scale aScaleMax //ScaleMax ); LastError=GetLastError(); {if(LastError!=0) { Print("LCL: On_Init(): lip_handle = ",lip_handle," error = ",LastError); }}//if(LastError!=0) {if((GraphUse)&&(!ChartIndicatorAdd(0,(int)ChartGetInteger(0,CHART_WINDOWS_TOTAL),lip_handle))) ////----- // {if((!GraphUse)&&((OpenMethod==Open_ADXW)||(CloseProfitMethod==CloseProfit_ADXW)||(CloseLossMethod==CloseLoss_ADXW))) // { // ResetLastError(); // adxw_handle=iCustom( TheSymbol, // PERIOD_CURRENT, // "Projects\\Indicatores\\MQ5\\ADX\\adxw_zat_117.ex5", // //----- Input parameters // aInpPeriodADXW, //Period // aInpMethodADXW, //Method (MODE_SMA,MODE_EMA,MODE_SMMA,MODE_LWMA) // aSSCBaseMode, //Корр (0..3)-(off/spread/close/midHLC) // aInpFastPeriodEMA, //Fast EMA period // aInpSlowPeriodEMA, //Slow EMA period // aDICalcMode, //DICalcMode(0..8)-(hi/low/mahl/mihl/suhl/isuhl/imahl/imihl) // //----- Параметры сброса тенденции // adDI, //Для +-DI в долях от (макс-старт) // adActiv, //Для Активности ((+DI)+(-DI)) в долях от максимальной // adDelta, //Для Дельты ((+DI)-(-DI)) в долях от максимальной // //----- Levels // aL0, //L0 ADXOpenLvl // aL1, //L1 ADXOpenLvlMax // aL2, //L2 ADXCloseLvl // aL3, //L3 ADXReversLvl // aL4, //L4 ADXReversLvlMax // //----- Scale // aScaleMax //ScaleMax // ); // LastError=GetLastError(); // {if(LastError!=0) // { // Print("LIP: adxw_handle = ",adxw_handle," error = ",LastError); // }}//if(LastError!=0) {if((GraphUse)&&(!ChartIndicatorAdd(0,(int)ChartGetInteger(0,CHART_WINDOWS_TOTAL),adxw_handle))) { Print("LCL: On_Init(): Не добавлен adxw_zat"); //return(INIT_FAILED); }}//if((GraphUse)&&(!ChartIndicatorAdd(0,(int)ChartGetInteger(0,CHART_WINDOWS_TOTAL),adxw_handle))) }else{ Print("LCL: On_Init(): Не графический режим"); return(INIT_FAILED); }}//if((!GraphUse)&&((OpenMethod==Open_ADXW)||(CloseProfitMethod==CloseProfit_ADXW)||(CloseLossMethod==CloseLoss_ADXW))) //----- Обнуление глобальных переменных datetime TimeSet=0; {for(int i=1;i<=3;i++)//Перебор типов Команд { {for(int j=0;j<=1;j++)//Перебор типов Позиций { ReadyExp[(int)CommandCode((enCommandType)i,(ENUM_POSITION_TYPE)j)]=0; //Сбрасываем внутренние флаги завершения команды N: ReadyExp_N=0 RunCommand[(int)CommandCode((enCommandType)i,(ENUM_POSITION_TYPE)j)]=false; //Сбрасываем флаги запуска команд GlobalSetUlong("LIP_"+TheSymbol+"_Command_"+IntegerToString(CommandCode((enCommandType)i,(ENUM_POSITION_TYPE)j)),TimeSet,0); //Сбрасываем команды Command_N=0 GlobalSetUlong("LIP_"+TheSymbol+"_Ready_"+IntegerToString(CommandCode((enCommandType)i,(ENUM_POSITION_TYPE)j)),TimeSet,1); //Устанавливаем флаги завершения Ready_N=1 }}//for(int j=0;i<=1;i++) }}//for(int i=1;i<=2;i++) //----- Запоминаем хендл ADXW в глобальной переменной //GlobalSetUlong("LIP_"+TheSymbol+"_ADXW",TimeSet,adxw_handle); //----- Запоминаем ChartID в глобальной переменной //GlobalSetUlong("LIP_"+TheSymbol+"_ChartID",TimeSet,ChartID()); //----- Получаем короткое имя индикатора ADXW, номер окна и номер индикатора в окне //Indicator_Search_Handle(adxw_handle,Chart_Ind_Name,Chart_Ind_Window,Chart_Ind_N); //Print(ChartIndicatorName(0,Chart_Ind_Window,Chart_Ind_N)); //string Indicator_Name=""; //bool res=Indicator_Delete_Handle(adxw_handle,Indicator_Name); //Print("adxw_handle=",adxw_handle," res=",res," Indicator_Name=",Indicator_Name); //----- Выход return(INIT_SUCCEEDED); }//On_Init() // //============================================================================================= MQL5 === // On_Tick() - Основной обработчик тиков //------------------------------------------------------------------------------------------------------ void On_Tick(){ //----- //{if(!gInTimer) //{ gTick++; // gInTimer=false; //}}//if(!InTimer) {if(gTick>4294967000) { gTick=100; }}//if(gTick>4294967000) //{if(Indicator_Search_Handle(adxw_handle,Chart_Ind_Name,Chart_Ind_Window,Chart_Ind_N)) //{ // Print("adxw_handle=",adxw_handle); // Print("Chart_Ind_Window=",Chart_Ind_Window); // Print("Chart_Ind_N=",Chart_Ind_N); // Print("ChartIndicatorName=",ChartIndicatorName(0,Chart_Ind_Window,Chart_Ind_N)); //}else{ // Print("Error!!","adxw_handle=",adxw_handle); //}}//if(Indicator_Search_Handle(adxw_handle,Chart_Ind_Name,Chart_Ind_Window,Chart_Ind_N)) //----- Блок для обмена с индикатором //1. Цикл проверки заданий и постановки на выполнение. Перебираем все команды от 1 до N. Для каждой: // //1.0. Если канал занят BuseInd_N=1, - не используем ибо используется в индикаторе, чтобы не выдавать новую команду до окончания обработки предыдущей. // 1.1. Если обнаружена команда N: Command_N=N, то выполняем: // 1.1.1. Если снят флаг завершения Ready_N=0, то выполняем: // 1.1.1.1. Сбрасываем команду Command_N=0 // 1.1.1.2. Сбрасываем для советника внутренний флаг завершения команды N: ReadyExp_N=0; (изначально все эти флаги сброшены, но на всякий) // 1.1.1.3. Запускаем команду на выполнение (после выполнения команды должен быть установлен внутренний флаг выполнения команды N: ReadyExp_N=1; // //В результате должно быть: Ready_N=0 (сброшено индикатором), Command_N=0 (сброшено советниом), ReadyExp_N=0??? (сброшено советником) // //Ситуация Ready_N=0 + Command_N=0, говорит о том, что команда запущена на выполнение, но ещё не выполнена. datetime TimeSet=0; ulong CommandGet=0; ulong ReadyGet=0; {for(int i=1;i<=3;i++)//Перебор типов Команд { {for(int j=0;j<=1;j++)//Перебор типов Позиций { {if(GlobalGetUlong("LIP_"+TheSymbol+"_Command_"+IntegerToString(CommandCode((enCommandType)i,(ENUM_POSITION_TYPE)j)),CommandGet) &&(CommandGet==CommandCode((enCommandType)i,(ENUM_POSITION_TYPE)j))) //Если обнаружена команда N: Command_N=N { {if(GlobalGetUlong("LIP_"+TheSymbol+"_Ready_"+IntegerToString(CommandGet),ReadyGet)&&(ReadyGet==0)) //Если снят флаг завершения Ready_N=0 { {if(GlobalSetUlong("LIP_"+TheSymbol+"_Command_"+IntegerToString(CommandCode((enCommandType)i,(ENUM_POSITION_TYPE)j)),TimeSet,0))//Сбрасываем команду Command_N=0 { ReadyExp[(int)CommandCode((enCommandType)i,(ENUM_POSITION_TYPE)j)]=0; //Сбрасываем для советника внутренний флаг завершения команды N: ReadyExp_N=0 RunCommand[(int)CommandCode((enCommandType)i,(ENUM_POSITION_TYPE)j)]=true; //Имитация запуска команды if(PrintDebug)Print("LCL: запущена команда "+IntegerToString(CommandCode((enCommandType)i,(ENUM_POSITION_TYPE)j))+" "); }}//if(GlobalSetUlong("LIP_"+TheSymbol+"_Command_"+IntegerToString(CommandCode((enCommandType)i,(ENUM_POSITION_TYPE)j)),TimeSet,0) }}//if(GlobalGetUlong("LIP_"+TheSymbol+"_Ready_"+IntegerToString(CommandGet),ReadyGet)&&(ReadyGet==0)) }}//if(GlobalGetUlong("LIP_"+TheSymbol+"_Command_"+IntegerToString(CommandCode((enCommandType)i,(ENUM_POSITION_TYPE)j)),CommandGet) }}//for(int j=0;i<=1;i++) }}//for(int i=1;i<=2;i++) //2. Цикл проверки выполнения. Перебираем все команды от 1 до N. Для каждой: // 2.1. Если установлен внутренний флаг завершения команды N: ReadyExp_N=1, то выполняем: // 2.1.1. Устанавливается флаг завершения Ready_N=1 для переменной Ready_N (команда N выполнена) // 2.1.2. Сбрасываем для советника внутренний флаг завершения команды N: ReadyExp_N=0; // //В результате должно быть: Ready_N=1 (установлено советником), Command_N=0 (сброшено советниом), ReadyExp_N=0 (сброшено советником) {for(int i=1;i<=3;i++)//Перебор типов Команд { {for(int j=0;j<=1;j++)//Перебор типов Позиций { {if(ReadyExp[(int)CommandCode((enCommandType)i,(ENUM_POSITION_TYPE)j)]==1) //Если установлен внутренний флаг завершения команды N: ReadyExp_N=1 { {if(GlobalSetUlong("LIP_"+TheSymbol+"_Ready_"+IntegerToString(CommandCode((enCommandType)i,(ENUM_POSITION_TYPE)j)),TimeSet,1))//Устанавливается флаг завершения Ready_N=1 { ReadyExp[(int)CommandCode((enCommandType)i,(ENUM_POSITION_TYPE)j)]=0; //Сбрасываем для советника внутренний флаг завершения команды N: ReadyExp_N=0 if(PrintDebug)Print("LCL: завершена команда "+IntegerToString(CommandCode((enCommandType)i,(ENUM_POSITION_TYPE)j))+" "); }}//if(GlobalSetUlong("LIP_"+TheSymbol+"_Ready_"+IntegerToString(CommandCode((enCommandType)i,(ENUM_POSITION_TYPE)j)),TimeSet,1) }}//if(ReadyExp[(int)CommandCode((enCommandType)i,(ENUM_POSITION_TYPE)j)]==1) }}//for(int j=0;i<=1;i++) }}//for(int i=1;i<=2;i++) //----- Цикл выполнения. ulong Deal; uint Result; bool ResultB; {for(int i=1;i<=6;i++)//Перебор Команд { {if(RunCommand[i]) { {switch(i) { case(1)://Open Buy { Result=PositionOrderSend( TheSymbol, //string symbol ORDER_TYPE_BUY, //ENUM_ORDER_TYPE type 0.01, //double volume SymbolInfoDouble(TheSymbol,SYMBOL_ASK), //double price 5, //ulong iSlip, 0.0, //double iSL, 0.0, //double iTP, "", //string iComment, 0, //ulong iMagic, 0, //datetime iExpir, Deal); //ulong &iDeal if(PrintInfo)Print("LCL: выполнена команда 1>>"+" Open Buy"+" gTick="+IntegerToString(gTick)); break; } case(2)://Open Sell { Result=PositionOrderSend( TheSymbol, //string symbol ORDER_TYPE_SELL, //ENUM_ORDER_TYPE type 0.01, //double volume SymbolInfoDouble(TheSymbol,SYMBOL_BID), //double price 5, //ulong iSlip, 0.0, //double iSL, 0.0, //double iTP, "", //string iComment, 0, //ulong iMagic, 0, //datetime iExpir, Deal); //ulong &iDeal if(PrintInfo)Print("LCL: выполнена команда 2>>"+" Open Sell"+" gTick="+IntegerToString(gTick)); break; } case(3)://Close Buy Profit { {if(PositionsTotal()>0)//Если есть открытые ордера { {for(int j=PositionsTotal()-1;j>=0;j--)//Перебираем от конца к началу { ulong Pos_Tick=PositionGetTicket(j);//Выбор по номеру {if(Pos_Tick<=0){continue;}}//Неудачно - следующий {if(!PositionSelectByTicket(Pos_Tick)){continue;}}//Выбор по тикету, неудачно - следующий {if(PositionGetString(POSITION_SYMBOL)!=TheSymbol){continue;}}//Отбор по инструменту //{if(PositionGetInteger(POSITION_MAGIC)!=iMagic){continue;}}//Отбор по магику double Pos_Profit=PositionGetDouble(POSITION_PROFIT)+PositionGetDouble(POSITION_SWAP); ENUM_POSITION_TYPE Pos_Type=(ENUM_POSITION_TYPE)PositionGetInteger(POSITION_TYPE); {if((Pos_Type==POSITION_TYPE_BUY)&&(Pos_Profit>MinProfit))//Нашли бай и профит > 1.0 { ResultB=PositionCloseOne(Pos_Tick, //Ticket 5); //Slip }}//if((Pos_Type==OP_BUY)&&((iType==OP_ALL)||(iType==OP_BUY))) }}//for(i=PositionsTotal()-1;i>=0;i--) }}//if(PositionsTotal()>0) if(PrintInfo)Print("LCL: выполнена команда 3>>"+" Close Buy PROFIT"+" gTick="+IntegerToString(gTick)); break; } case(4)://Close Sell Profit { {if(PositionsTotal()>0)//Если есть открытые ордера { {for(int j=PositionsTotal()-1;j>=0;j--)//Перебираем от конца к началу { ulong Pos_Tick=PositionGetTicket(j);//Выбор по номеру {if(Pos_Tick<=0){continue;}}//Неудачно - следующий {if(!PositionSelectByTicket(Pos_Tick)){continue;}}//Выбор по тикету, неудачно - следующий {if(PositionGetString(POSITION_SYMBOL)!=TheSymbol){continue;}}//Отбор по инструменту //{if(PositionGetInteger(POSITION_MAGIC)!=iMagic){continue;}}//Отбор по магику double Pos_Profit=PositionGetDouble(POSITION_PROFIT)+PositionGetDouble(POSITION_SWAP); ENUM_POSITION_TYPE Pos_Type=(ENUM_POSITION_TYPE)PositionGetInteger(POSITION_TYPE); {if((Pos_Type==POSITION_TYPE_SELL)&&(Pos_Profit>MinProfit))//Нашли селл { ResultB=PositionCloseOne(Pos_Tick, //Ticket 5); //Slip }}//if((Pos_Type==OP_SELL)&&((iType==OP_ALL)||(iType==OP_SELL))) }}//for(i=PositionsTotal()-1;i>=0;i--) }}//if(PositionsTotal()>0) if(PrintInfo)Print("LCL: выполнена команда 4>>"+" Close Sell PROFIT"+" gTick="+IntegerToString(gTick)); break; } case(5)://Close Buy Loss - ищем ордер с максимальным убытком и закрываем { {if(PositionsTotal()>0)//Если есть открытые ордера { double MaxLoss=0.0; ulong MaxLoss_Pos_Tick=0; {for(int j=PositionsTotal()-1;j>=0;j--)//Перебираем от конца к началу { ulong Pos_Tick=PositionGetTicket(j);//Выбор по номеру {if(Pos_Tick<=0){continue;}}//Неудачно - следующий {if(!PositionSelectByTicket(Pos_Tick)){continue;}}//Выбор по тикету, неудачно - следующий {if(PositionGetString(POSITION_SYMBOL)!=TheSymbol){continue;}}//Отбор по инструменту //{if(PositionGetInteger(POSITION_MAGIC)!=iMagic){continue;}}//Отбор по магику double Pos_Profit=PositionGetDouble(POSITION_PROFIT)+PositionGetDouble(POSITION_SWAP); ENUM_POSITION_TYPE Pos_Type=(ENUM_POSITION_TYPE)PositionGetInteger(POSITION_TYPE); {if((Pos_Type==POSITION_TYPE_BUY)&&(Pos_Profit=0;i--) {if((PositionSelectByTicket(MaxLoss_Pos_Tick))&&(MaxLoss<-MinLoss)) { ResultB=PositionCloseOne(MaxLoss_Pos_Tick, //Ticket 5); //Slip }}//Выбор по тикету }}//if(PositionsTotal()>0) if(PrintInfo)Print("LCL: выполнена команда 5>>"+" Close Buy LOSS"+" gTick="+IntegerToString(gTick)); break; } case(6)://Close Sell Loss - ищем ордер с максимальным убытком и закрываем { {if(PositionsTotal()>0)//Если есть открытые ордера { double MaxLoss=0.0; ulong MaxLoss_Pos_Tick=0; {for(int j=PositionsTotal()-1;j>=0;j--)//Перебираем от конца к началу { ulong Pos_Tick=PositionGetTicket(j);//Выбор по номеру {if(Pos_Tick<=0){continue;}}//Неудачно - следующий {if(!PositionSelectByTicket(Pos_Tick)){continue;}}//Выбор по тикету, неудачно - следующий {if(PositionGetString(POSITION_SYMBOL)!=TheSymbol){continue;}}//Отбор по инструменту //{if(PositionGetInteger(POSITION_MAGIC)!=iMagic){continue;}}//Отбор по магику double Pos_Profit=PositionGetDouble(POSITION_PROFIT)+PositionGetDouble(POSITION_SWAP); ENUM_POSITION_TYPE Pos_Type=(ENUM_POSITION_TYPE)PositionGetInteger(POSITION_TYPE); {if((Pos_Type==POSITION_TYPE_SELL)&&(Pos_Profit=0;i--) {if((PositionSelectByTicket(MaxLoss_Pos_Tick))&&(MaxLoss<-MinLoss)) { ResultB=PositionCloseOne(MaxLoss_Pos_Tick, //Ticket 5); //Slip }}//Выбор по тикету }}//if(PositionsTotal()>0) if(PrintInfo)Print("LCL: выполнена команда 6>>"+" Close Sell LOSS"+" gTick="+IntegerToString(gTick)); break; } default: { break; } }}// ReadyExp[i]=1; //Устанавливаем для советника внутренний флаг завершения команды N: ReadyExp_N=1 RunCommand[i]=false; }}//if(RunCommand[i]) }}//for(int i=1;i<=6;i++) //----- //Print("gTick=",gTick); //Comment("gTick=",gTick); //----- return; }//On_Tick() // //============================================================================================= MQL5 === // On_Timer - Обработка событий по таймеру //------------------------------------------------------------------------------------------------------ void On_Timer(){ //----- //gnTimer++; //{if(gnTimer>4294967000) //{ // gnTimer=100; //}}//if(gnTimer>4294967000) //gInTimer=true; On_Tick(); }//On_Timer() // //============================================================================================= MQL5 === // CommandCode - формирование кода команды для из типа команды и типа позиции // Вх: // iCommand : тип команды (Command_None/Command_Open/Command_Close) // iPosType : тип позиции (Buy/Sell) // Вых: // ulong : код команды (0/1/2/3/4) - (неткоманды/покупка/продажа/закрытиепокупки/закрытиепродажи) //------------------------------------------------------------------------------------------------------ ulong CommandCode(enCommandType iCommand, //тип команды ENUM_POSITION_TYPE iPosType){ //тип позиции //----- Demo {if(iCommand==Command_Open) { {if(iPosType==POSITION_TYPE_BUY) { return(1);//Открыть Покупку }}//if(iPosType==POSITION_TYPE_BUY) {if(iPosType==POSITION_TYPE_SELL) { return(2);//Открыть Продажу }}//if(iPosType==POSITION_TYPE_SELL) }}//if(iCommand==Commmand_Open) {if(iCommand==Command_Close) { {if(iPosType==POSITION_TYPE_BUY) { return(3);//Закрыть Покупку в прибыль }}//if(iPosType==POSITION_TYPE_BUY) {if(iPosType==POSITION_TYPE_SELL) { return(4);//Закрыть Продажу в прибыль }}//if(iPosType==POSITION_TYPE_SELL) }}//if(iCommand==Commmand_Close) {if(iCommand==Command_CloseLoss) { {if(iPosType==POSITION_TYPE_BUY) { return(5);//Закрыть Покупку в убыток }}//if(iPosType==POSITION_TYPE_BUY) {if(iPosType==POSITION_TYPE_SELL) { return(6);//Закрыть Продажу в убыток }}//if(iPosType==POSITION_TYPE_SELL) }}//if(iCommand==Command_CloseLoss) return(0);//нет команды }//CheckCloseCondition() // //----- ////{if(GlobalSetDouble("tst_01",TimeSet,999.999)) ////{ //// Print("TimeSet1=",TimeSet); // {if(GlobalGetDouble("LIP_"+TheSymbol+"_Ask",DateSet)) // { // //Print("LIP_"+TheSymbol+"_Ask=",DateSet); // }}//if(GlobalGetDouble("tst_01",DateSet)) // {if(GlobalGetDouble("LIP_"+TheSymbol+"_Bid",DateSet)) // { // //Print("LIP_"+TheSymbol+"_Bid=",DateSet); // }}//if(GlobalGetDouble("tst_01",DateSet)) ////}}//if(GlobalSetDouble("tst_01",999.999,TimeSet)) //----- //string StringSet=""; ////{if(GlobalSetString("tst_02",TimeSet,"EURUSD.z")) ////{ //// Print("TimeSet2=",TimeSet); // {if(GlobalGetString("LIP_"+TheSymbol+"_Symbol",StringSet)) // { // //Print("LIP_"+TheSymbol+"_Symbol=",StringSet); // }}//if(GlobalGetString("tst_02",StringSet)) ////}}//if(GlobalSetString("tst_02",TimeSet,"EURUSD.z"))