怎么用 ,适合多大周期
jiangping123:
Как использовать, подходит для какого периода
Как использовать, подходит для какого периода
- Советник: Pan PrizMA CD Phase Synthetic EA (4_sloja)
- Символ: EURUSD
- Период: M1 (2015.04.02 - 2017.04.04)
- Параметры: Lot=0,1; StopLoss=3000 ; TakeProfit=3000
- L0_Start=271; L0_Interval=120 ; L0_LIN_1_STEP=3 ; L0_LIN_1_PLECHO=16 ; L0_LIN_2_PLECHO=0 ; L0_Synthetic_Channel=0 ; L0_Weight_Prices=0 ; L0_Weight_Volume=1 ;
- L1_Start=181 ; L1_Interval=120 ; L1_LIN_1_STEP=3 ; L1_LIN_1_PLECHO=30 ; L1_LIN_2_PLECHO=0 ; L1_Synthetic_Channel=10 ; L1_Weight_Prices=0 ; L1_Weight_Volume=1 ;
- L2_Start=241 ; L2_Interval=120 ; L2_LIN_1_STEP=3 ; L2_LIN_1_PLECHO=132 ; L2_LIN_2_PLECHO=0 ; L2_Synthetic_Channel=18 ; L2_Weight_Prices=0 ; L2_Weight_Volume=1 ;
- L3_Start=180 ; L3_Interval=300 ; L3_LIN_1_STEP=3 ; L3_LIN_1_PLECHO=740 ; L3_LIN_2_PLECHO=0 ; L3_Synthetic_Channel=10 ; L3_Weight_Prices=0 ; L3_Weight_Volume=1 ;
- Multiplikator=1000000 ; Multiplikator_2=10 ; InpSignalSMA=9 ; EA_Magic=12345 ; EA_Slippage=30;
//+-------------------------------------------------------------------------+ //| 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" //--- входные параметры input double Lot = 0.1; input int StopLoss = 3000; // Stop Loss input int TakeProfit = 3000;// Take Profit //input double Koeff = 1.6; // Первый индикатор определяет точки входа input int L0_Start = 241; input int L0_Interval = 120; input int L0_LIN_1_STEP = 3; //L0_Line_1_power input int L0_LIN_1_PLECHO = 132; //L0_Fast_line_1_leverage input int L0_LIN_2_PLECHO = 0; //L0__Fast_line_2_leverage int L0_base = 0; input double L0_Synthetic_Channel = 18; input double L0_Weight_Prices = 0; input double L0_Weight_Volume = 1; // Первый индикатор определяет точки входа input int L1_Start = 0; input int L1_Interval = 370; input int L1_LIN_1_STEP = 4; //L1_Line_1_power input int L1_LIN_1_PLECHO = 30; //L1_Fast_line_1_leverage input int L1_LIN_2_PLECHO = 0; //L1_Fast_line_2_leverage int L1_base = 0; input double L1_Synthetic_Channel = 0; input double L1_Weight_Prices = -0.3; input double L1_Weight_Volume = 1.3; // Второй индикатор определяет основные уровни входа/выхода input int L2_Start = 0; input int L2_Interval = 370; input int L2_LIN_1_STEP = 4; //L2_Line_1_power input int L2_LIN_1_PLECHO = 180; //L2_Fast_line_1_leverage input int L2_LIN_2_PLECHO = 0; //L2_Fast_line_2_leverage int L2_base = 0; input double L2_Synthetic_Channel = 0; input double L2_Weight_Prices = -0.3; input double L2_Weight_Volume = 1.3; // Третий индикатор фильтрует сигналы по тренду input int L3_Start = 0; input int L3_Interval = 370; input int L3_LIN_1_STEP = 4; //L3_Line_1_power input int L3_LIN_1_PLECHO = 1100;//L3_Fast_line_1_leverage input int L3_LIN_2_PLECHO = 0; //L3_Fast_line_2_leverage int L3_base = 0; input double L3_Synthetic_Channel = 0; input double L3_Weight_Prices = -0.3; input double L3_Weight_Volume = 1.3; int point_shift_1 = 3; input int Multiplikator = 1000000; input int Multiplikator_2 = 10; input int InpSignalSMA = 9; // Signal SMA Period input int EA_Magic = 12345; // Magic Number slippage input int 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_L1 int Pan_PrizMA_CD_Phase_Handle_L1; // хэндл индикатора Pan_PrizMA_CD_Phase_L1 int Pan_PrizMA_CD_Phase_Handle_L2; // хэндл индикатора Pan_PrizMA_CD_Phase_L2 int Pan_PrizMA_CD_Phase_Handle_L3; // хэндл индикатора Pan_PrizMA_CD_Phase_L3 double 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 Секция инициализации советника | //+------------------------------------------------------------------+ int OnInit() { //Расчитываем точку входа, необходимую для определения числа баров минимальной истории. 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 Handle if(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 Раздел деинициализации советника| //+------------------------------------------------------------------+ void OnDeinit(const int 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, которое генерируется при приходе новой котировки для символа | //+----------------------------------------------------------------------------------------------------------------+ void OnTick() { //---Проверить достаточность баров истории 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); // На каждом тике обнуляемая переменная. //--- Получить текущее значение котировки в структуру типа MqlTick if(!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; //это длинная позиция } else if(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; } //+------------------------------------------------------------------+
Файл
jiangping123 :
怎么用,适合多大周期
怎么用,适合多大周期
这是一个具有类似MT5指标的示例
Pan PrizMA CD Phase Sin leverage_72:
计算预期波的相位和
作者: Aleksey Panfilov