Ищу мультииндикаторный шаблон советник - страница 2

 

//+-------------------------------------------------------------------------------------+
//| Расчет сигнала |
//| Если значение Signal больше нуля, значит Buy |
//| Если значение Signal меньше нуля, значит Sell |
//+-------------------------------------------------------------------------------------+
void GetSignal()
{
Signal = 0;

// - 1 - ============== Индикатор ADX ===================================================
if (UseADX)
{
double PlusDI1 = iADX(Symbol(), 0, ADXPeriod, ADXPrice, MODE_PLUSDI, 1);
double MinusDI1 = iADX(Symbol(), 0, ADXPeriod, ADXPrice, MODE_MINUSDI, 1);
if (PlusDI1 > MinusDI1) // Buy Signal
Signal++;
if (PlusDI1 < MinusDI1) // Sell Signal
Signal--;
}
// - 1 - ====================== Окончание блока =========================================

// - 2 - ============== Индикатор Bollinger Bands =======================================
if (UseBollinger)
{
double BandsUp = iBands(Symbol(), 0, BandsPeriod, BandsDeviation, BandsShift,
BandsPrice, MODE_UPPER, 1);
double BandsDn = iBands(Symbol(), 0, BandsPeriod, BandsDeviation, BandsShift,
BandsPrice, MODE_LOWER, 1);
if (Close[1] < BandsDn) // Buy Signal
Signal++;
if (Close[1] > BandsUp) // Sell Signal
Signal--;
}
// - 2 - ====================== Окончание блока =========================================

// - 3 - ============== Индикатор CCI ===================================================
if (UseCCI)
{
double CCI1 = iCCI(Symbol(), 0, CCIPeriod, CCIPrice, 1);
double CCI2 = iCCI(Symbol(), 0, CCIPeriod, CCIPrice, 2);
if (CCI2 < CCILowLevel && CCI1 > CCILowLevel && CCI1 < CCIHighLevel) // Buy Signal
Signal++;
if (CCI2 > CCIHighLevel && CCI1 < CCIHighLevel && CCI1 > CCILowLevel) // Sell Signal
Signal--;
}
// - 3 - ====================== Окончание блока =========================================

// - 4 - ============== Пересечение средних =============================================
if (UseCrossMA)
{
double MAFast = iMA(Symbol(), 0, MAFastPeriod, MAFastShift, MAFastMethod,
MAFastPrice, 1);
double MASlow = iMA(Symbol(), 0, MASlowPeriod, MASlowShift, MASlowMethod,
MASlowPrice, 1);
if (MAFast > MASlow) // Buy Signal
Signal++;
if (MAFast < MASlow) // Sell Signal
Signal--;
}
// - 4 - ====================== Окончание блока =========================================

// - 5 - ============== Parabolic SAR индикатор =========================================
if (UseSAR)
{
double SAR = iSAR(Symbol(), 0, SARStep, SARMaximum, 1);
if (SAR < Open[1]) // Buy Signal
Signal++;
if (SAR > Open[1]) // Sell Signal
Signal--;
}
// - 5 - ====================== Окончание блока =========================================

// - 6 - ============== Standart Deviation индикатор ====================================
if (UseStDev)
{
double SD1 = iStdDev(Symbol(), 0, StDevPeriod, StDevShift, StDevMethod,
StDevPrice, 1);
double SD2 = iStdDev(Symbol(), 0, StDevPeriod, StDevShift, StDevMethod,
StDevPrice, 2);
if (SD1 > SD2) // Buy Signal
Signal++;
if (SD1 < SD2) // Sell Signal
Signal--;
}
// - 6 - ====================== Окончание блока =========================================

// - 7 - ============== MACD индикатор ==================================================
if (UseMACD)
{
double MACDMain = iMACD(Symbol(), 0, MACDFast, MACDSlow, MACDSignal, MACDPrice,
MODE_MAIN, 1);
double MACDSig = iMACD(Symbol(), 0, MACDFast, MACDSlow, MACDSignal, MACDPrice,
MODE_SIGNAL, 1);
if (MACDMain > MACDSig) // Buy Signal
Signal++;
if (MACDMain < MACDSig) // Sell Signal
Signal--;
}
// - 7 - ====================== Окончание блока =========================================

// - 8 - ============== DeMarker индикатор ==============================================
if (UseDeMarker)
{
double DM1 = iDeMarker(Symbol(), 0, DMPeriod, 1);
double DM2 = iDeMarker(Symbol(), 0, DMPeriod, 2);
if (DM1 > DMLowLevel && DM2 < DMLowLevel && DM1 < DMHighLevel) // Buy Signal
Signal++;
if (DM1 < DMHighLevel && DM2 > DMHighLevel && DM1 > DMLowLevel) // Sell Signal
Signal--;
}
// - 8 - ====================== Окончание блока =========================================

// - 9 - ============== Envelopes индикатор =============================================
if (UseEnvelopes)
{
double EnvUp = iEnvelopes(Symbol(), 0, EnvPeriod, EnvMethod, EnvShift, EnvPrice,
EnvDeviation, MODE_UPPER, 1);
double EnvDn = iEnvelopes(Symbol(), 0, EnvPeriod, EnvMethod, EnvShift, EnvPrice,
EnvDeviation, MODE_LOWER, 1);
if (Close[1] < EnvDn) // Buy Signal
Signal++;
if (Close[1] > EnvUp) // Sell Signal
Signal--;
}
// - 9 - ====================== Окончание блока =========================================

// - 10 - ============== Force Index индикатор ==========================================
if (UseForceIndex)
{
double FI = iForce(Symbol(), 0, FIPeriod, FIMethod, FIPrice, 1);
if (FI > 0) // Buy Signal
Signal++;
if (FI < 0) // Sell Signal
Signal--;
}
// - 10 - ====================== Окончание блока ========================================

// - 11 - ============== Momentum индикатор =============================================
if (UseMomentum)
{
double Mom1 = iMomentum(Symbol(), 0, MomPeriod, MomPrice, 1);
double Mom2 = iMomentum(Symbol(), 0, MomPeriod, MomPrice, 2);
if (Mom1 > Mom2) // Buy Signal
Signal++;
if (Mom1 < Mom2) // Sell Signal
Signal--;
}
// - 11 - ====================== Окончание блока ========================================

// - 12 - ============== OsMA индикатор =================================================
if (UseOsMA)
{
double OsMA = iOsMA(Symbol(), 0, OsMAFast, OsMASlow, OsMASignal, OsMAPrice, 1);

if (OsMA > 0) // Buy Signal
Signal++;
if (OsMA < 0) // Sell Signal
Signal--;
}
// - 12 - ====================== Окончание блока ========================================

// - 13 - ============== Индикатор RSI ==================================================
if (UseRSI)
{
double RSI1 = iRSI(Symbol(), 0, RSIPeriod, RSIPrice, 1);
double RSI2 = iRSI(Symbol(), 0, RSIPeriod, RSIPrice, 2);
if (RSI2 < RSILowLevel && RSI1 > RSILowLevel && RSI1 < RSIHighLevel) // Buy Signal
Signal++;
if (RSI2 > RSIHighLevel && RSI1 < RSIHighLevel && RSI1 > RSILowLevel) // Sell Signal
Signal--;
}
// - 13 - ====================== Окончание блока ========================================

 

// - 14 - ============== Индикатор RVI ==================================================
if (UseRVI)
{
double RVIM = iRVI(Symbol(), 0, RVIPeriod, MODE_MAIN, 1);
double RVIS = iRVI(Symbol(), 0, RVIPeriod, MODE_SIGNAL, 1);
if (RVIM > RVIS) // Buy Signal
Signal++;
if (RVIM < RVIS) // Sell Signal
Signal--;
}
// - 14 - ====================== Окончание блока ========================================

// - 15 - ============== Индикатор Stochastic Oscillator ================================
if (UseStochastic)
{
double StochM = iStochastic(Symbol(), 0, StochK, StochD, StochSlowing, StochMethod,
StochPrice, MODE_MAIN, 1);
double StochS = iStochastic(Symbol(), 0, StochK, StochD, StochSlowing, StochMethod,
StochPrice, MODE_SIGNAL, 1);
if (StochM > StochS) // Buy Signal
Signal++;
if (StochM < StochS) // Sell Signal
Signal--;
}
// - 15 - ====================== Окончание блока ========================================

// - 16 - ============== Индикатор Williams Percent Range ===============================
if (UseWPR)
{
double WPR1 = iWPR(Symbol(), 0, WPRPeriod, 1);
double WPR2 = iWPR(Symbol(), 0, WPRPeriod, 2);
if (WPR1 > WPRLowLevel && WPR2 < WPRLowLevel && WPR1 < WPRHighLevel) // Buy Signal
Signal++;
if (WPR1 < WPRHighLevel && WPR2 > WPRHighLevel && WPR1 > WPRLowLevel) // Sell Signal
Signal--;
}
// - 16 - ====================== Окончание блока ========================================

// - 17 - ============== Индикатор Awesome Oscillator ===================================
if (UseAO)
{
double AO1 = iAO(Symbol(), 0, 1);
double AO2 = iAO(Symbol(), 0, 2);
double AO3 = iAO(Symbol(), 0, 3);
double AO4 = iAO(Symbol(), 0, 4);
if (AO1 > 0 && AO3 > AO4 && AO2 < AO3 && AO1 > AO2) // Buy Signal
Signal++;
if (AO1 < 0 && AO3 < AO4 && AO2 > AO3 && AO1 < AO2) // Sell Signal
Signal--;
}
// - 17 - ====================== Окончание блока ========================================

// - 18 - ============== Индикатор Accelerator/Decelerator Oscillator ===================
if (UseAC)
{
double AC1 = iAC(Symbol(), 0, 1);
double AC2 = iAC(Symbol(), 0, 2);
double AC3 = iAC(Symbol(), 0, 3);
if (AC1 > 0 && AC3 < AC2 && AC2 < AC1) // Buy Signal
Signal++;
if (AC1 < 0 && AC3 > AC2 && AC2 > AC1) // Sell Signal
Signal--;
}
// - 18 - ====================== Окончание блока ========================================

// - 19 - ============== Индикатор Fractals =============================================
if (UseFractals)
{
int i = 3;
int DnN = 0, UpN = 0;
double UpFr = 0, DnFr = 0;
while (i < Bars && (UpFr == 0 || DnFr == 0))
{
if (iFractals(Symbol(), 0, MODE_UPPER, i) != 0)
if (UpFr == 0)
{
UpFr = iFractals(Symbol(), 0, MODE_UPPER, i);
UpN = i;
}
if (iFractals(Symbol(), 0, MODE_LOWER, i) != 0)
if (DnFr == 0)
{
DnFr = iFractals(Symbol(), 0, MODE_LOWER, i);
DnN = i;
}
i++;
}
if (i < Bars)
{
int DnBit = iLowest(Symbol(), 0, MODE_LOW, DnN);
int UpBit = iHighest(Symbol(), 0, MODE_HIGH, UpN);
bool BitUp = False, BitDn = False;
if (High[UpBit] > UpFr) BitUp = True;
if (Low[DnBit] < DnFr) BitDn = True;
if (BitUp && BitDn)
{
if (UpBit < DnBit)
Signal++;
else
Signal--;
}
else
{
if (BitUp) Signal++;
if (BitDn) Signal--;
}
}
}
// - 19 - ====================== Окончание блока ========================================

// - 20 - ============== Индикатор Alligator ============================================
if (UseAlligator)
{
double Jaw = iAlligator(Symbol(), 0, JawPeriod, JawShift, TeethPeriod, TeethShift,
LipsPeriod, LipsShift, AlligatorMethod, AlligatorPrice,
MODE_GATORJAW, 0);
double Teeth = iAlligator(Symbol(), 0, JawPeriod, JawShift, TeethPeriod, TeethShift,
LipsPeriod, LipsShift, AlligatorMethod, AlligatorPrice,
MODE_GATORTEETH, 0);
double Lips = iAlligator(Symbol(), 0, JawPeriod, JawShift, TeethPeriod, TeethShift,
LipsPeriod, LipsShift, AlligatorMethod, AlligatorPrice,
MODE_GATORLIPS, 0);
if (Jaw < Teeth && Teeth < Lips) // Buy Signal
Signal++;
if (Jaw > Teeth && Teeth > Lips) // Sell Signal
Signal--;
}
// - 20 - ====================== Окончание блока ========================================

// - 21 - ============== Индикатор Bill Williams MFI ====================================
if (UseBWMFI)
{
for (i = 2; i < Bars; i++)
{
double MFI = iBWMFI(Symbol(), 0, i);
double MFI2 = iBWMFI(Symbol(), 0, i+1);
if (MFI < MFI2 && Volume[i] > Volume[i+1])
break;
}
if (i < Bars)
{
if (Close[1] > High[i])
Signal++;
if (Close[1] < Low[i])
Signal--;
}
}
// - 21 - ====================== Окончание блока ========================================

if (UseInd == MathAbs(Signal))
if (Signal > 0)
{
if (LastBuySignal <= LastSellSignal)
LastBuySignal = Time[0];
}
else
if (LastSellSignal <= LastBuySignal)
LastSellSignal = Time[0];

}

//+-------------------------------------------------------------------------------------+
//| Расшифровка сообщения об ошибке |
//+-------------------------------------------------------------------------------------+
string ErrorToString(int Error)
{
switch(Error)
{
case 2: return("зафиксирована общая ошибка, обратитесь в техподдержку.");
case 5: return("у вас старая версия терминала, обновите ее.");
case 6: return("нет связи с сервером, попробуйте перезагрузить терминал.");
case 64: return("счет заблокирован, обратитесь в техподдержку.");
case 132: return("рынок закрыт.");
case 133: return("торговля запрещена.");
case 149: return("запрещено локирование.");
}
}

 

//+-------------------------------------------------------------------------------------+
//| "Правильное" открытие позиции |
//| В отличие от OpenOrder проверяет соотношение текущих уровней и устанавливаемых |
//| Возвращает: |
//| 0 - нет ошибок |
//| 1 - Ошибка открытия |
//| 2 - Ошибка значения Price |
//| 3 - Ошибка значения SL |
//| 4 - Ошибка значения TP |
//| 5 - Ошибка значения Lots |
//+-------------------------------------------------------------------------------------+
int OpenOrderCorrect(int Type, double Price, double SL, double TP,
bool Redefinition = True)
// Redefinition - при True доопределять параметры до минимально допустимых
// при False - возвращать ошибку
{
// - 1 - == Проверка достаточности свободных средств ====================================
if(AccountFreeMarginCheck(Symbol(), OP_BUY, Lots) <= 0 || GetLastError() == 134)
{
if(!FreeMarginAlert)
{
Print("Недостаточно средств для открытия позиции. Free Margin = ",
AccountFreeMargin());
FreeMarginAlert = True;
}
return(5);
}
FreeMarginAlert = False;
// - 1 - == Окончание блока =============================================================

// - 2 - == Корректировка значений Price, SL и TP или возврат ошибки ====================

RefreshRates();
switch (Type)
{
case OP_BUY:
string S = "BUY";
if (MathAbs(Price-Ask)/Point > 3)
if (Redefinition) Price = NP(Ask);
else return(2);
if (ND(TP-Bid) <= StopLevel && TP != 0)
if (Redefinition) TP = NP(Bid+StopLevel+Tick);
else return(4);
if (ND(Bid-SL) <= StopLevel)
if (Redefinition) SL = NP(Bid-StopLevel-Tick);
else return(3);
break;
case OP_SELL:
S = "SELL";
if (MathAbs(Price-Bid)/Point > 3)
if (Redefinition) Price = NP(Bid);
else return(2);
if (NP(Ask-TP) <= StopLevel)
if (Redefinition) TP = NP(Ask-StopLevel-Tick);
else return(4);
if (ND(SL-Ask) <= StopLevel && SL != 0)
if (Redefinition) SL = NP(Ask+StopLevel+Tick);
else return(3);
break;
case OP_BUYSTOP:
S = "BUYSTOP";
if (ND(Price-Ask) <= StopLevel)
if (Redefinition) Price = NP(Ask+StopLevel+Tick);
else return(2);
if (ND(TP-Price) <= StopLevel && TP != 0)
if (Redefinition) TP = NP(Price+StopLevel+Tick);
else return(4);
if (ND(Price-SL) <= StopLevel)
if (Redefinition) SL = NP(Price-StopLevel-Tick);
else return(3);
break;
case OP_SELLSTOP:
S = "SELLSTOP";
if (ND(Bid-Price) <= StopLevel)
if (Redefinition) Price = NP(Bid-StopLevel-Tick);
else return(2);
if (ND(Price-TP) <= StopLevel)
if (Redefinition) TP = NP(Price-StopLevel-Tick);
else return(4);
if (ND(SL-Price) <= StopLevel && SL != 0)
if (Redefinition) SL = NP(Price+StopLevel+Tick);
else return(3);
break;
case OP_BUYLIMIT:
S = "BUYLIMIT";
if (ND(Ask-Price) <= StopLevel)
if (Redefinition) Price = NP(Ask-StopLevel-Tick);
else return(2);
if (ND(TP-Price) <= StopLevel && TP != 0)
if (Redefinition) TP = NP(Price+StopLevel+Tick);
else return(4);
if (ND(Price-SL) <= StopLevel)
if (Redefinition) SL = NP(Price-StopLevel-Tick);
else return(3);
break;
case OP_SELLLIMIT:
S = "SELLLIMIT";
if (ND(Price - Bid) <= StopLevel)
if (Redefinition) Price = NP(Bid+StopLevel+Tick);
else return(2);
if (ND(Price-TP) <= StopLevel)
if (Redefinition) TP = NP(Price-StopLevel-Tick);
else return(4);
if (ND(SL-Price) <= StopLevel && SL != 0)
if (Redefinition) SL = NP(Price+StopLevel+Tick);
else return(3);
break;
}
// - 2 - == Окончание блока =============================================================

// - 3 - == Открытие ордера с ожидание торгового потока =================================
if(WaitForTradeContext()) // ожидание освобождения торгового потока
{
Comment("Отправлен запрос на открытие позиции ", S, " ...");
int ticket=OrderSend(Symbol(), Type, Lots, Price, 3,
SL, TP, NULL, MagicNumber, 0);// открытие позиции
// Попытка открытия позиции завершилась неудачей
if(ticket<0)
{
int Error = GetLastError();
if(Error == 2 || Error == 5 || Error == 6 || Error == 64
|| Error == 132 || Error == 133 || Error == 149) // список фатальных ошибок
{
Comment("Фатальная ошибка при открытии позиции т. к. "+
ErrorToString(Error)+" Советник отключен!");
FatalError = True;
}
else
Comment("Ошибка открытия позиции ", S, ": ", Error); // нефатальная ошибка

return(1);
}
// ---------------------------------------------

// Удачное открытие позиции
Comment("Позиция ", S, " открыта успешно!");
PlaySound(OpenOrderSound);
return(0);
// ------------------------
}
else
{
Comment("Время ожидания освобождения торгового потока истекло!");
return(1);
}
// - 3 - == Окончание блока =============================================================
}

//+-------------------------------------------------------------------------------------+
//| Приведение значений к точности одного пункта |
//+-------------------------------------------------------------------------------------+
double ND(double A)
{
return(NormalizeDouble(A, Digits));
}

//+-------------------------------------------------------------------------------------+
//| Приведение значений к точности одного тика |
//+-------------------------------------------------------------------------------------+
double NP(double A)
{
return(MathFloor(A/Tick)*Tick);
}

//+-------------------------------------------------------------------------------------+
//| Ожидание торгового потока. Если поток свободен, то результат True, иначе - False |
//+-------------------------------------------------------------------------------------+
bool WaitForTradeContext()
{
int P = 0;
// цикл "пока"
while(IsTradeContextBusy() && P < 5)
{
P++;
Sleep(1000);
}
// -------------
if(P == 5)
return(False);
return(True);
}

//+-------------------------------------------------------------------------------------+
//| Замена стандартного блока "if-else" |
//+-------------------------------------------------------------------------------------+
double IF(bool Condition, double IfTrue, double IfFalse)
{
if (Condition) return(IfTrue); // Если условие истинно, то возвращаем значение IfTrue
else return(IfFalse); // Если условие ложно, то возвращаем значение IfFalse
}

//+-------------------------------------------------------------------------------------+
//| Закрывает все позиции типа Type. Если закрыть не удалось закрыть, то 1. |
//| Если присутствует противоположная, то возвращает 2. В случае успеха 0. |
//+-------------------------------------------------------------------------------------+
int CheckOrdersReal(int Type)
{
for (int i = OrdersTotal()-1; i >= 0; i--)
if(OrderSelect(i, SELECT_BY_POS))
if(OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber
&& OrderType() < 2) // поиск "своей" сделки
if(OrderType() == Type) // Если позиция типа Type
{
if (WaitForTradeContext())
{
if(Type == OP_BUY)
double Pr = ND(MarketInfo(Symbol(), MODE_BID));
else
Pr = ND(MarketInfo(Symbol(), MODE_ASK));
if (!OrderClose(OrderTicket(), OrderLots(), Pr, 3))// то пытаемся закрыть ее
return(1); // не удалось закрыть - вернем 1
}
else
return(1);//вернем 1, если не удалось дождаться освобождения торгового потока
}
else
return(2); // вернем 2, если открыта позиция, противоположная указанной
return(0); // если все ОК, то вернем 0
}

//+-------------------------------------------------------------------------------------+
//| Функция START эксперта |
//+-------------------------------------------------------------------------------------+
int start()
{
// - 1 - == Разрешено ли советнику работать? ===========================================
if (!Activate || FatalError) // Отключается работа советника, если функция
return(0); // init завершилась с ошибкой или имела место фатальная ошибка
// - 1 - == Окончание блока ============================================================
if (LastMess + 300 < TimeCurrent())
Comment(Comm);
TrailingStopDoubleLevel();
// - 2 - == Контроль открытия нового бара ==============================================
if (LastBar == Time[0]) //Если время посчитанного бара равно времени текущего бара
return(0); // то это означает, что новый бар еще не открылся
// - 2 - == Окончание блока ============================================================

// - 3 - == Сбор информации об условиях торговли ========================================
Spread = ND(MarketInfo(Symbol(), MODE_SPREAD)*Point); // текущий спрэд
StopLevel = ND(MarketInfo(Symbol(), MODE_STOPLEVEL)*Point); // текущий уровень стопов
// - 3 - == Окончание блока ============================================================

// - 4 - == Расчет текущего сигнала =====================================================
GetSignal();
// - 4 - == Окончание блока ============================================================

double Price = 0;
int Type = -1;

// - 5 - ================ Обработка сигнала BUY =========================================
if (LastBuySignal == Time[0])
{
int Res = CheckOrdersReal(OP_SELL);
RefreshRates();
if (Res == 0) // если нет открытых позиций
{
Price = ND(Ask);
double TP = NP(IF(TakeProfit == 0, 0, Price + TakeProfit*Tick));
double SL = NP(IF(StopLoss == 0, 0, Price - StopLoss*Tick));
Type = OP_BUY;
}
if (Res == 1) return(0); // не удалось закрыть противоположную позицию
}
// - 5 - ====================== Окончание блока =========================================

// - 6 - ============ Обработка сигнала SELL ============================================
if (LastSellSignal == Time[0])
{
Res = CheckOrdersReal(OP_BUY);
if (Res == 0) // Нет открытых позиций
{
RefreshRates();
Price = ND(Bid);
TP = ND(IF(TakeProfit == 0, 0, Price - TakeProfit*Tick));
SL = ND(IF(StopLoss == 0, 0, Price + StopLoss*Tick));
Type = OP_SELL;
}
if (Res == 1) return(0); // не удалось закрыть противоположную позицию
}
// - 6 - ====================== Окончание блока =========================================

if (Type >= 0)
if (OpenOrderCorrect(Type, Price, SL, TP) > 0)
return(0);

LastBar = Time[0];

return(0);
}
//+--------------------------------------------------------------

 

Извини, почему-то файл не цеплялся .Пришлось так извратиться.

Надеюсь такого шаблона хватит.

 

Ура. Спасибо друг.!!!!! Пусть у тебя будет бесконечно много денег и радости!

 
gss:

Извини, почему-то файл не цеплялся .Пришлось так извратиться.

Надеюсь такого шаблона хватит.


    спс, на mql5 такого шаблона нет?

, а то в mql4 тяжело мультисоветники/мультивалютные индикаторы тестировать

покрутил сегодня тестер впервые mql5 - "небо и земля" по сравнению с тестером mql4

Файлы:
 
IgorM:


спс, на mql5 такого шаблона нет?

, а то в mql4 тяжело мультисоветники/мультивалютные индикаторы тестировать

покрутил сегодня тестер впервые mql5 - "небо и земля" по сравнению с тестером mql4


К сожеленью нет.А написать на mql5 у самого ума не хватает.
Причина обращения: