456 lines
55 KiB
MQL5
456 lines
55 KiB
MQL5
//============================================================================================= 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<MaxLoss))//Нашли бай
|
|
{
|
|
MaxLoss=Pos_Profit;
|
|
MaxLoss_Pos_Tick=Pos_Tick;
|
|
}}//if((Pos_Type==POSITION_TYPE_BUY)&&(Pos_Profit<MaxLoss))
|
|
}}//for(i=PositionsTotal()-1;i>=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<MaxLoss))//Нашли бай
|
|
{
|
|
MaxLoss=Pos_Profit;
|
|
MaxLoss_Pos_Tick=Pos_Tick;
|
|
}}//if((Pos_Type==POSITION_TYPE_BUY)&&(Pos_Profit<MaxLoss))
|
|
}}//for(i=PositionsTotal()-1;i>=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"))
|