//+-------------------------------------------------------------------------+//| Pan PrizMA CD Phase Synthetic EA (4_sloja).mq5 |//| Copyright 2017, Aleksey Panfilov. |//| filpan1@yandex.ru |//+-------------------------------------------------------------------------+#property copyright"Copyright 2017, Aleksey Panfilov."#property link"filpan1@yandex.ru"#property version"1.00"//#resource "\\Indicators\\Pan PrizMA CD Phase Synthetic.ex5"//--- входные параметрыinputdouble Lot = 0.1;
inputint StopLoss = 3000; // Stop Lossinputint TakeProfit = 3000;// Take Profit//input double Koeff = 1.6; // Первый индикатор определяет точки входаinputint L0_Start = 241;
inputint L0_Interval = 120;
inputint L0_LIN_1_STEP = 3; //L0_Line_1_powerinputint L0_LIN_1_PLECHO = 132; //L0_Fast_line_1_leverageinputint L0_LIN_2_PLECHO = 0; //L0__Fast_line_2_leverageint L0_base = 0;
inputdouble L0_Synthetic_Channel = 18;
inputdouble L0_Weight_Prices = 0;
inputdouble L0_Weight_Volume = 1;
// Первый индикатор определяет точки входаinputint L1_Start = 0;
inputint L1_Interval = 370;
inputint L1_LIN_1_STEP = 4; //L1_Line_1_powerinputint L1_LIN_1_PLECHO = 30; //L1_Fast_line_1_leverageinputint L1_LIN_2_PLECHO = 0; //L1_Fast_line_2_leverageint L1_base = 0;
inputdouble L1_Synthetic_Channel = 0;
inputdouble L1_Weight_Prices = -0.3;
inputdouble L1_Weight_Volume = 1.3;
// Второй индикатор определяет основные уровни входа/выходаinputint L2_Start = 0;
inputint L2_Interval = 370;
inputint L2_LIN_1_STEP = 4; //L2_Line_1_powerinputint L2_LIN_1_PLECHO = 180; //L2_Fast_line_1_leverageinputint L2_LIN_2_PLECHO = 0; //L2_Fast_line_2_leverageint L2_base = 0;
inputdouble L2_Synthetic_Channel = 0;
inputdouble L2_Weight_Prices = -0.3;
inputdouble L2_Weight_Volume = 1.3;
// Третий индикатор фильтрует сигналы по трендуinputint L3_Start = 0;
inputint L3_Interval = 370;
inputint L3_LIN_1_STEP = 4; //L3_Line_1_powerinputint L3_LIN_1_PLECHO = 1100;//L3_Fast_line_1_leverageinputint L3_LIN_2_PLECHO = 0; //L3_Fast_line_2_leverageint L3_base = 0;
inputdouble L3_Synthetic_Channel = 0;
inputdouble L3_Weight_Prices = -0.3;
inputdouble L3_Weight_Volume = 1.3;
int point_shift_1 = 3;
inputint Multiplikator = 1000000;
inputint Multiplikator_2 = 10;
inputint InpSignalSMA = 9; // Signal SMA Periodinputint EA_Magic = 12345; // Magic Number slippage inputint EA_Slippage = 30; // Slippage from the current price//--- глобальные переменныеdouble modified_lot = Lot;
int TOCHKA_VHODA; // int LIN_1_INTERVAL=1; // Далее учитывается в расчете точки входа.int LIN_2_INTERVAL=1; //Далее учитывается в расчете точки входа. int Pan_PrizMA_CD_Phase_Handle_L0; // хэндл индикатора Pan_PrizMA_CD_Phase_L1int Pan_PrizMA_CD_Phase_Handle_L1; // хэндл индикатора Pan_PrizMA_CD_Phase_L1int Pan_PrizMA_CD_Phase_Handle_L2; // хэндл индикатора Pan_PrizMA_CD_Phase_L2int Pan_PrizMA_CD_Phase_Handle_L3; // хэндл индикатора Pan_PrizMA_CD_Phase_L3double Phase_Verh_L0[],Phase_Nis_L0[]; // динамические массивы для хранения численных значений фазы выше нуля и ниже нуля.double Phase_Verh_L1[],Phase_Nis_L1[]; // динамические массивы для хранения численных значений фазы выше нуля и ниже нуля.double Phase_Verh_L2[],Phase_Nis_L2[]; // динамические массивы для хранения численных значений фазы выше нуля и ниже нуля.double Phase_Verh_L3[],Phase_Nis_L3[]; // динамические массивы для хранения численных значений фазы выше нуля и ниже нуля.double LotS;
//====================================================================================================================//====================================================================================================================//+------------------------------------------------------------------+//| Expert initialization function Секция инициализации советника |//+------------------------------------------------------------------+intOnInit()
{
//Расчитываем точку входа, необходимую для определения числа баров минимальной истории.if(TOCHKA_VHODA <= (L0_LIN_1_PLECHO+25)*LIN_1_INTERVAL) TOCHKA_VHODA=(L0_LIN_1_PLECHO+25)*LIN_1_INTERVAL;
if(TOCHKA_VHODA <= (L0_LIN_2_PLECHO+25)*LIN_2_INTERVAL) TOCHKA_VHODA=(L0_LIN_2_PLECHO+25)*LIN_2_INTERVAL;
if(TOCHKA_VHODA <= (L1_LIN_1_PLECHO+25)*LIN_1_INTERVAL) TOCHKA_VHODA=(L1_LIN_1_PLECHO+25)*LIN_1_INTERVAL;
if(TOCHKA_VHODA <= (L1_LIN_2_PLECHO+25)*LIN_2_INTERVAL) TOCHKA_VHODA=(L1_LIN_2_PLECHO+25)*LIN_2_INTERVAL;
if(TOCHKA_VHODA <= (L2_LIN_1_PLECHO+25)*LIN_1_INTERVAL) TOCHKA_VHODA=(L2_LIN_1_PLECHO+25)*LIN_1_INTERVAL;
if(TOCHKA_VHODA <= (L2_LIN_2_PLECHO+25)*LIN_2_INTERVAL) TOCHKA_VHODA=(L2_LIN_2_PLECHO+25)*LIN_2_INTERVAL;
if(TOCHKA_VHODA <= (L3_LIN_1_PLECHO+25)*LIN_1_INTERVAL) TOCHKA_VHODA=(L3_LIN_1_PLECHO+25)*LIN_1_INTERVAL;
if(TOCHKA_VHODA <= (L3_LIN_2_PLECHO+25)*LIN_2_INTERVAL) TOCHKA_VHODA=(L3_LIN_2_PLECHO+25)*LIN_2_INTERVAL;
if(TOCHKA_VHODA <= (L0_base*2+25)) TOCHKA_VHODA=(L0_base*2+25);
if(TOCHKA_VHODA <= (L1_base*2+25)) TOCHKA_VHODA=(L1_base*2+25);
if(TOCHKA_VHODA <= (L2_base*2+25)) TOCHKA_VHODA=(L2_base*2+25);
if(TOCHKA_VHODA <= (L3_base*2+25)) TOCHKA_VHODA=(L3_base*2+25);
//---Получить хэндл индикатора Pan PrizMA CD Phase
Pan_PrizMA_CD_Phase_Handle_L0=iCustom(NULL,0,"Pan PrizMA CD Phase Synthetic.ex5",L0_LIN_1_STEP,L0_LIN_1_PLECHO,L0_LIN_2_PLECHO,L0_base,L0_Synthetic_Channel,L0_Weight_Prices,L0_Weight_Volume,Multiplikator,Multiplikator_2,InpSignalSMA);
Pan_PrizMA_CD_Phase_Handle_L1=iCustom(NULL,0,"Pan PrizMA CD Phase Synthetic.ex5",L1_LIN_1_STEP,L1_LIN_1_PLECHO,L1_LIN_2_PLECHO,L1_base,L1_Synthetic_Channel,L1_Weight_Prices,L1_Weight_Volume,Multiplikator,Multiplikator_2,InpSignalSMA);
Pan_PrizMA_CD_Phase_Handle_L2=iCustom(NULL,0,"Pan PrizMA CD Phase Synthetic.ex5",L2_LIN_1_STEP,L2_LIN_1_PLECHO,L2_LIN_2_PLECHO,L2_base,L2_Synthetic_Channel,L2_Weight_Prices,L2_Weight_Volume,Multiplikator,Multiplikator_2,InpSignalSMA);
Pan_PrizMA_CD_Phase_Handle_L3=iCustom(NULL,0,"Pan PrizMA CD Phase Synthetic.ex5",L3_LIN_1_STEP,L3_LIN_1_PLECHO,L3_LIN_2_PLECHO,L3_base,L3_Synthetic_Channel,L3_Weight_Prices,L3_Weight_Volume,Multiplikator,Multiplikator_2,InpSignalSMA);
//--- Нужно проверить, не были ли возвращены значения Invalid Handleif(Pan_PrizMA_CD_Phase_Handle_L0<0 || Pan_PrizMA_CD_Phase_Handle_L1<0 || Pan_PrizMA_CD_Phase_Handle_L2<0 || Pan_PrizMA_CD_Phase_Handle_L3<0)
{
Alert("Error Creating Handles for indicators - error:",GetLastError(),"!!");
return(-1);
}
return(0);
//==================================================================================================================
}
//+------------------------------------------------------------------+//| Expert deinitialization function Раздел деинициализации советника|//+------------------------------------------------------------------+voidOnDeinit(constint reason)
{
//--- Освобождаем хэндлы индикаторовIndicatorRelease(Pan_PrizMA_CD_Phase_Handle_L0);
IndicatorRelease(Pan_PrizMA_CD_Phase_Handle_L1);
IndicatorRelease(Pan_PrizMA_CD_Phase_Handle_L2);
IndicatorRelease(Pan_PrizMA_CD_Phase_Handle_L3);
}
//+----------------------------------------------------------------------------------------------------------------+//| Expert tick function Обработка события NewTick, которое генерируется при приходе новой котировки для символа |//+----------------------------------------------------------------------------------------------------------------+voidOnTick()
{
//---Проверить достаточность баров историиif(Bars(_Symbol,_Period)-5<TOCHKA_VHODA)//return(0);
{
Alert("Not enough bars on the chart, the EA will not work!!");
return;
}
//==================================================================================================================//==================================================================================================================//Ограничение на работу только при открытии бара - соответствует быстрой оптимизации по точкам открытия.// Для сохранения значения времени бара мы используем static-переменную Old_Time.// При каждом выполнении функции OnTick мы будем сравнивать время текущего бара с сохраненным временем.// Если они не равны, это означает, что начал строится новый бар./*
static datetime Old_Time;
datetime New_Time[1];
bool IsNewBar=false;
// копируем время текущего бара в элемент New_Time[0]
int copied=CopyTime(_Symbol,_Period,0,1,New_Time);
if(copied>0) // ok, успешно скопировано
{
if(Old_Time!=New_Time[0]) // если старое время не равно
{
IsNewBar=true; // новый бар
if(MQL5InfoInteger(MQL5_DEBUGGING)) Print("We have new bar here ",New_Time[0]," old time was ",Old_Time);
Old_Time=New_Time[0]; // сохраняем время бара
}
}
else
{
Alert("Error in copying historical times data, error =",GetLastError());
ResetLastError();
return;
}
//--- советник должен проверять условия совершения новой торговой операции только при новом баре
if(IsNewBar==false)
{
return;
}
*///=================================================================================================================//--- Объявляем структуры, которые будут использоваться для торговлиMqlTick latest_price; // Будет использоваться для текущих котировокMqlTradeRequest mrequest; // Будет использоваться для отсылки торговых запросовMqlTradeResult mresult; // Будет использоваться для получения результатов выполнения торговых запросовMqlRates mrate[]; // Будет содержать цены, объемы и спред для каждого бараZeroMemory(mrequest); // На каждом тике обнуляемая переменная.//--- Получить текущее значение котировки в структуру типа MqlTickif(!SymbolInfoTick(_Symbol,latest_price))
{
Alert("Error getting the latest price quote - error:",GetLastError(),"!!");
return;
}
//--- Получить исторические данные последних 3-х баровif(CopyRates(_Symbol,_Period,0,3,mrate)<0)
{
Alert("Error copying rates/history data - error:",GetLastError(),"!!");
return;
}
/**///=====================================================================================================================//=====================================================================================================================//--- Используя функцию CopyBuffer, мы копируем по 3 последних новых значения индикаторов в динамические массивыif(
CopyBuffer(Pan_PrizMA_CD_Phase_Handle_L0,4,0,1,Phase_Verh_L0)<0 || CopyBuffer(Pan_PrizMA_CD_Phase_Handle_L0,5,0,1,Phase_Nis_L0)<0 ||
CopyBuffer(Pan_PrizMA_CD_Phase_Handle_L1,4,0,1,Phase_Verh_L1)<0 || CopyBuffer(Pan_PrizMA_CD_Phase_Handle_L1,5,0,1,Phase_Nis_L1)<0 ||
CopyBuffer(Pan_PrizMA_CD_Phase_Handle_L2,4,0,1,Phase_Verh_L2)<0 || CopyBuffer(Pan_PrizMA_CD_Phase_Handle_L2,5,0,1,Phase_Nis_L2)<0 ||
CopyBuffer(Pan_PrizMA_CD_Phase_Handle_L3,4,0,1,Phase_Verh_L3)<0 || CopyBuffer(Pan_PrizMA_CD_Phase_Handle_L3,5,0,1,Phase_Nis_L3)<0)
{
Alert("Error copying indicator Buffers - error:",GetLastError(),"!!");
return;
}
/*
Установим индексацию в массивах котировок и индикаторов
как в таймсериях
*/// массив котировокArraySetAsSeries(mrate,true);
// массив значений индикатора фаза верхArraySetAsSeries(Phase_Verh_L0,true);
// массив значений индикатора фаза низArraySetAsSeries(Phase_Nis_L0,true);
// массив значений индикатора фаза верхArraySetAsSeries(Phase_Verh_L1,true);
// массив значений индикатора фаза низArraySetAsSeries(Phase_Nis_L1,true);
// массив значений индикатора фаза верхArraySetAsSeries(Phase_Verh_L2,true);
// массив значений индикатора фаза низArraySetAsSeries(Phase_Nis_L2,true);
// массив значений индикатора фаза верхArraySetAsSeries(Phase_Verh_L3,true);
// массив значений индикатора фаза низArraySetAsSeries(Phase_Nis_L3,true);
//====================================================================================================================//====================================================================================================================//--- есть ли открытые позиции?bool Buy_opened=false; // переменные, в которых будет храниться информация bool Sell_opened=false; // о наличии соответствующих открытых позицийif(PositionSelect(_Symbol)==true) // есть открытая позиция
{
if(PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_BUY)
{
Buy_opened=true; //это длинная позиция
}
elseif(PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_SELL)
{
Sell_opened=true; // это короткая позиция
}
}
//====================================================================================================================/*
1. Проверка условий для покупки : Верхняя фаза находится в интервале от "StartBuy" до плюс "IntervalBuy"
например от 240 градусов до плюс 60 градусов (до 300), изменяется от 0 до 360
*///-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------if(
((Phase_Verh_L0[0] >= L0_Start && Phase_Verh_L0[0] < L0_Start + L0_Interval ) || (Phase_Verh_L0[0] >= L0_Start - 360 && Phase_Verh_L0[0] < L0_Start + L0_Interval - 360 )) && // Условие Phase_Verh_L1[0] >= L1_Start - 360 && лишнее, но так легче прочитиать код.
((Phase_Verh_L1[0] >= L1_Start && Phase_Verh_L1[0] < L1_Start + L1_Interval ) || (Phase_Verh_L1[0] >= L1_Start - 360 && Phase_Verh_L1[0] < L1_Start + L1_Interval - 360 )) && // Условие Phase_Verh_L1[0] >= L1_Start - 360 && лишнее, но так легче прочитиать код.
((Phase_Verh_L2[0] >= L2_Start && Phase_Verh_L2[0] < L2_Start + L2_Interval ) || (Phase_Verh_L2[0] >= L2_Start - 360 && Phase_Verh_L2[0] < L2_Start + L2_Interval - 360 )))
{
if((Phase_Verh_L3[0] >= L3_Start && Phase_Verh_L3[0] < L3_Start + L3_Interval ) || (Phase_Verh_L3[0] >= L3_Start - 360 && Phase_Verh_L3[0] < L3_Start + L3_Interval - 360 ) || Sell_opened )
{
// есть ли в данный момент открытая позиция на покупку?if(Buy_opened)
{
// Alert("Уже есть позиция на покупку!!!");return; // не добавлять к открытой позиции на покупку
}
if(Sell_opened && ((Phase_Verh_L3[0] >= L3_Start && Phase_Verh_L3[0] < L3_Start + L3_Interval ) || (Phase_Verh_L3[0] >= L3_Start - 360 && Phase_Verh_L3[0] < L3_Start + L3_Interval - 360 )))
{ LotS = 2*Lot; }
else LotS = 1*Lot;
mrequest.action = TRADE_ACTION_DEAL; // немедленное исполнение
mrequest.price = NormalizeDouble(latest_price.ask,_Digits); // последняя цена ask
mrequest.sl = NormalizeDouble(latest_price.ask - StopLoss *_Point,_Digits); // Stop Loss
mrequest.tp = NormalizeDouble(latest_price.ask + TakeProfit*_Point,_Digits); // Take Profit
mrequest.symbol = _Symbol; // символ
mrequest.volume = LotS; // количество лотов для торговли
mrequest.magic = EA_Magic; // Magic Number
mrequest.type = ORDER_TYPE_BUY; // ордер на покупку
mrequest.type_filling = ORDER_FILLING_FOK; // тип исполнения ордера - все или ничего
mrequest.deviation=EA_Slippage; // проскальзывание от текущей цены//--- отсылаем ордерOrderSend(mrequest,mresult);
// анализируем код возврата торгового сервераif(mresult.retcode==10009 || mresult.retcode==10008) //запрос выполнен или ордер успешно помещен
{
Alert("A Buy order has been successfully placed with Ticket#:",mresult.order,"!!");
}
else
{
Alert("The Buy order request could not be completed -error:",GetLastError());
return;
}
}
}
/*
2. Проверка условий для продажи : Нижняя фаза + 360 находится в интервале от "StartSell" до плюс "IntervalSell"
например от -120 + 360 =240 градусов до плюс 60 градусов (до 300 ), изменяется от -360 до 0
*///-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------if(
(( Phase_Nis_L0[0]+360 >= L0_Start && Phase_Nis_L0[0]+360 < L0_Start + L0_Interval) || ( Phase_Nis_L0[0]+360 >= L0_Start - 360 && Phase_Nis_L0[0]+360 < L0_Start + L0_Interval-360)) && // Условие Phase_Nis_L1[0]+360 >= L1_Start - 360 && лишнее, но так легче прочитиать код.
(( Phase_Nis_L1[0]+360 >= L1_Start && Phase_Nis_L1[0]+360 < L1_Start + L1_Interval) || ( Phase_Nis_L1[0]+360 >= L1_Start - 360 && Phase_Nis_L1[0]+360 < L1_Start + L1_Interval-360)) && // Условие Phase_Nis_L1[0]+360 >= L1_Start - 360 && лишнее, но так легче прочитиать код.
(( Phase_Nis_L2[0]+360 >= L2_Start && Phase_Nis_L2[0]+360 < L2_Start + L2_Interval) || ( Phase_Nis_L2[0]+360 >= L2_Start - 360 && Phase_Nis_L2[0]+360 < L2_Start + L2_Interval-360)))
{
if(( Phase_Nis_L3[0]+360 >= L3_Start && Phase_Nis_L3[0]+360 < L3_Start + L3_Interval) || ( Phase_Nis_L3[0]+360 >= L3_Start - 360 && Phase_Nis_L3[0]+360 < L3_Start + L3_Interval-360) || Buy_opened )
{
// есть ли в данный момент открытая позиция на продажу?if(Sell_opened)
{
// Alert("Уже есть позиция на продажу!!!");return; // не добавлять к открытой позиции на продажу
}
if(Buy_opened && (( Phase_Nis_L3[0]+360 >= L3_Start && Phase_Nis_L3[0]+360 < L3_Start + L3_Interval) || ( Phase_Nis_L3[0]+360 >= L3_Start - 360 && Phase_Nis_L3[0]+360 < L3_Start + L3_Interval-360)))
{ LotS = 2*Lot; }
else LotS = 1*Lot;
mrequest.action = TRADE_ACTION_DEAL; // немедленное исполнение
mrequest.price = NormalizeDouble(latest_price.bid,_Digits); // последняя цена Bid
mrequest.sl = NormalizeDouble(latest_price.bid + StopLoss *_Point,_Digits); // Stop Loss
mrequest.tp = NormalizeDouble(latest_price.bid - TakeProfit*_Point,_Digits); // Take Profit
mrequest.symbol = _Symbol; // символ
mrequest.volume = LotS; // количество лотов для торговли
mrequest.magic = EA_Magic; // Magic Number
mrequest.type= ORDER_TYPE_SELL; // ордер на продажу
mrequest.type_filling = ORDER_FILLING_FOK; // тип исполнения ордера - все или ничего
mrequest.deviation=EA_Slippage; // проскальзывание от текущей цены//--- отсылаем ордерOrderSend(mrequest,mresult);
// анализируем код возврата торгового сервераif(mresult.retcode==10009 || mresult.retcode==10008) //Request is completed or order placed
{
Alert("A Sell order has been successfully placed with Ticket#:",mresult.order,"!!");
}
else
{
Alert("The Sell order request could not be completed -error:",GetLastError());
return;
}
}
}
//====================================================================================================================return;
}
//+------------------------------------------------------------------+
К вам тот же вопрос - что такое "угол 10 градусов" ?
Если у Вас есть синусоидальная линия, то какой бы амплитуды она не была или периода, или как бы она не была растянута по оси Х или У, Вы всегда сможете однозначно сопоставить точку синусоиды с углом поворота радиус - вектора или касательной к нему.
вы обязательно должны указывать масштаб, причем сразу по двум направлениям - цена на пиксел и бары на пиксел (но, для угла требуется только их отношение, так что можно обойтись и одним значением).
Незачем. Поскольку график не идеальная синусоида то описание граничных условий и требований было бы весьма объемным. Если вообще возможным. Поэтому речь идет об аналоге фазы и достаточно, что она рассчитывается на любых графиках по одному алгоритму, с учетом внешних переменных конечно.
Так сов. напиши !!! А так не понятно за эти деньги ?
Цена аренды минимальна. А сов. со временем может быть. Не писать же его на одном индикаторе.
Цена аренды минимальна. А сов. со временем может быть. Не писать же его на одном индикаторе.
Дополнительные пояснения.
Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий
Расчёт угла наклона трендовой линии.
George Merts, 2017.06.01 05:35
К вам тот же вопрос - что такое "угол 10 градусов" ?
Если у Вас есть синусоидальная линия, то какой бы амплитуды она не была или периода, или как бы она не была растянута по оси Х или У, Вы всегда сможете однозначно сопоставить точку синусоиды с углом поворота радиус - вектора или касательной к нему.
Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий
Расчёт угла наклона трендовой линии.
George Merts, 2017.06.01 05:35
вы обязательно должны указывать масштаб, причем сразу по двум направлениям - цена на пиксел и бары на пиксел (но, для угла требуется только их отношение, так что можно обойтись и одним значением).
Незачем. Поскольку график не идеальная синусоида то описание граничных условий и требований было бы весьма объемным. Если вообще возможным. Поэтому речь идет об аналоге фазы и достаточно, что она рассчитывается на любых графиках по одному алгоритму, с учетом внешних переменных конечно.
Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий
Расчёт угла наклона трендовой линии.
George Merts, 2017.06.01 05:35
Не будет ли правильнее вобще отказаться от его использования ?