МТС "на Alligator'е vol.2.1"

Виталя

Активный участник
Здесь http://codebase.mql4.com/ru/5072 выложена первая рабочая версия моего советника, приносящего прибыль в условиях нынешнего кризиса. Данная стратегия имеет простое решение входа и выхода из рынка, но благодаря применению малого количества фильтров и жесткой привязки сигналов только к одному индикатору, система допускает много ложных сигналов и пропускает много настоящих.
Усовершенствованная система следует тренду, и даже в случае открытия во время флета приносит минимум убытков.
Потери можно ограничить путем слежения за балансом. Работает как трейлинг-стоп, но при просадке баланса на определенный процент - включает ручник и перестает открывать новые сделки. Но продолжает сопровождать открытые ордера для возможного выхода в плюс.
Убрал из старой версии мартингейл и проверку фракталами. Использует кроме Alligator'а, скользящие средние, Stochastik.
Все параметры настраиваются, вплоть до полного отключения некоторых функций. Манименеджмент присутствует в полном объеме.
Кроме ex4 - файла даю ini - файл для самостоятельной оптимизации.
Посмотреть вложение 1453
ex4 - файл $50
mq4 - $1000

Покупателям (при добросовестном соблюдении авторских прав) полное техническое обслуживание по советнику и скидки на следующие версии продукта.
 

Юлия

Главный редактор
А в работе тестировали? на демо или в реале?
 

Виталя

Активный участник
Пользуюсь на реале, но показывать там нечего. Из сотен сделок - с десяток, сделанные "Alligator'ами". Остальные привели к большим потерям из-за использования непроверенных советников.
Благо счет центовый и депо небольшой - 300р.
Сейчас открыт ордер с минусом в 40 пунктов. В понедельник думаю выправится. Если не выправится - советник закроет его.
 

sonic

Активный участник
блин, во второй теме подряд то же самое писать буду))
почему ех4 скомпиленный под демо нельзя выложить?
то как бектесты под историю оптимизируются все знают.

тем более глубина теста всего год.
 

RATionnel

Почетный гражданин
Alligator
//+------------------------------------------------------------------+
//| аллигатор.mq4 |
//| Copyright 2016, MetaQuotes Software Corp. |
//| https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2016, MetaQuotes Software Corp."
#property link "https://www.mql5.com"
//+------------------------------------------------------------------+
//| expert initialization function |
//+------------------------------------------------------------------+

extern double MaxLot = 0.5, //ограничиваем размер стартового лота
koeff = 1.3, //коэффициент увеличения лотов при мартингейле
risk = 0.04, //риск, влияет на размер стартового лота
shirina1 = 0.0005, //ширина "зева" Alligator'а на открытие ордера
shirina2 = 0.0001; //ширина "зева" Alligator'а на закрытие ордера

extern bool Ruchnik = false, //"Плавно" завершает сессию. Если надо отклюяить советник
Vhod_Alligator= true, //Разрешает открывать ордера Аллигатору
Vhod_Fractals = false, //Проверка Аллигатора Фракталом
Vyhod_Alligator = false, //Разрешает закрывать ордера Аллигатору
OnlyOneOrder = true, //Если False, включается докупка при повторе сигнала
EnableMartingail = true, //Мартингейл
Trailing = true; //ТрейлингСтоп

extern int TP = 80, //TP
SL = 80, //SL :)
TrailingStop = 30, //тоже понятно
profit = 20, //Гарантирует прибыль при срабатывании трейлинга
blue = -8, //настройки Аллигатора
red = -3,
green = 8,
Fractal_bars = 10, //Количество баров...
visota_fractal = 30, //среди которых ищется соответствующий по высоте и направлению фрактал
spred = 10, //Я не ставил спред из ДЦ. Ручками. А лучше сразе 10
Koleno = 10, //Количество "Колен" Мартингейла
Zaderzhka = 2000; //Пауза между сделками

bool Proverka_buy,Proverka_sell,Prodazha,Pokupka,Trailing_buy,Trailing_sell,Vihod_Alligator_sell,Vihod_Alligator_buy, Fractal;
int seychas_buy=1,seychas_sell=1, bylo_buy,bylo_sell,i;
string text ;
double Lot, Magic_number, up, down;
//+------------------------------------------------------------------+
//| expert deinitialization function |
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
//| expert start function |
//+------------------------------------------------------------------+
int init () //объясняем как будем торговать
{
text = "На Alligatorе: ";
if (Period() == 1) string per = "M1 ";
if (Period() == 5) per = "M5 ";
if (Period() == 15) per = "M15 ";
if (Period() == 30) per = "M30 ";
if (Period() == 60) per = "H1 ";
if (Period() == 240) per = "H4 ";
if (Period() == 1440) per = "D1 ";
text = text + Symbol()+" "+per;
if (Vhod_Alligator)
{
text = text + "Аллигатор вкл ";
}
if (Vhod_Fractals)
{
text = text + "Fraktals вкл ";
}
if (!OnlyOneOrder)
{
text = text + "докупка вкл ";
}
if (EnableMartingail)
{
text = text + "Мартингейл вкл ";
}
if (Trailing)
{
text = text + "Trailing вкл ";
}
Alert (text);
return (0);
}
int deinit()
{
text="";
}
//return (0);

int start()
{

RefreshRates();
bool order_est_buy = false; //сбрасываем счетчик открытых ордеров
int Magic_number = Period(); //Даем Магическое число для торговли на разных ТФ
int Orders = OrdersTotal(); //счетчик проверки ордеров
if (Trailing==true)
{
Trailing_start (); //Запускаем трейлинг стоп
}
if (Vhod_Alligator== true) // Используя настройки Аллигатора определяем момент входа в рынок....
{
bylo_buy = seychas_buy; //"Сегодня также как вчера" :)
bylo_sell = seychas_sell;
double blue_line=iAlligator(NULL, 0, 13, 8, 8, 5, 5, 3, MODE_SMMA, PRICE_WEIGHTED, MODE_GATORJAW, blue);
double red_line=iAlligator(NULL, 0, 13, 8, 8, 5, 5, 3, MODE_SMMA, PRICE_WEIGHTED, MODE_GATORTEETH , red);
double green_line=iAlligator(NULL, 0, 13, 8, 8, 5, 5, 3, MODE_SMMA, PRICE_WEIGHTED, MODE_GATORLIPS , green);
double PriceHigh= High[0];
if (green_line>blue_line+shirina1) // сигналы входа
seychas_buy=1;
if (blue_line>green_line+shirina1)
seychas_sell=1;
if (green_line+shirina2<red_line) // сигналы выхода
seychas_buy=0;
if (blue_line+shirina2<red_line)
seychas_sell=0;
}
if (Vhod_Fractals) //Проверяем фракталом
{
Fractal();
}
if (!Proverka_buy ()||OnlyOneOrder == false) //Если открытых ордеров нет...
{
for (i = OrdersTotal() ; i>=0; i--) //Интересуемся...
{
OrderSelect(i, SELECT_BY_POS, MODE_TRADES); //Есть ли у нас отложенные?
if(OrderType() == OP_BUYLIMIT && OrderSymbol () ==Symbol() && OrderMagicNumber() == Magic_number)
{
OrderDelete(OrderTicket()); //Закрываем их
RefreshRates ();
Sleep (Zaderzhka); // Отдохнем
}
}
if (Ruchnik == false && (seychas_buy > bylo_buy||Vhod_Alligator== false))// Если Аллигатор дал команду или не мешает...
{
if(up>0||Vhod_Fractals == false) //И фрактал дает добро
{
Pokupka(); //Открываем длинную
}
}
}
if (!Proverka_sell()||OnlyOneOrder == false) //тоже самое, только для коротких
{
for (i = OrdersTotal() ; i>=0; i--)
{
OrderSelect(i, SELECT_BY_POS, MODE_TRADES);
if(OrderType() == OP_SELLLIMIT && OrderSymbol () ==Symbol() && OrderMagicNumber() == Magic_number)
{
OrderDelete(OrderTicket());
RefreshRates ();
Sleep (Zaderzhka);
}
}
if (Ruchnik == false && (seychas_sell > bylo_sell||Vhod_Alligator== false))
{
if(down>0||Vhod_Fractals == false)
{
Prodazha();
}
}
}
if (Vyhod_Alligator == true) //Если Аллигатор дал команду на закрытие
{
if (seychas_buy < bylo_buy&&Vihod_Alligator_buy == true)
{
for (i = 0 ; i<=Orders; i++) //ищем открытые ордера
{
OrderSelect(i, SELECT_BY_POS, MODE_TRADES);
if(OrderType()==OP_BUY && OrderSymbol() ==Symbol() &&OrderMagicNumber()==Magic_number)
OrderClose(OrderTicket() ,OrderLots(),Bid,3,Blue); //И сносим их
}
}
if (seychas_sell < bylo_sell&&Vihod_Alligator_sell == true)
{
Orders=OrdersTotal();
for (i = 0 ; i<=Orders; i++)
{
OrderSelect(i, SELECT_BY_POS, MODE_TRADES);
if(OrderType()==OP_SELL&& OrderSymbol() ==Symbol() &&OrderMagicNumber() == Magic_number)
OrderClose(OrderTicket() ,OrderLots(),Ask,3,Blue);
}
}
}
return(0);
}

//+------------------------------------------------------------------+
// Проверка наличия открытых ордеров
bool Proverka_buy()
{
bool Otkryt_orders_buy = false; //флаг "открытых ордеров нет"
for (i = OrdersTotal() ; i>=0; i--)
{
OrderSelect(i, SELECT_BY_POS, MODE_TRADES);
int Magic_number= Period();
if(OrderType() == OP_BUY && OrderSymbol () ==Symbol() && OrderMagicNumber() == Magic_number)
Otkryt_orders_buy = true; //Попался!!!
}
if (Otkryt_orders_buy==true)
return(true);
else
{
Vihod_Alligator_buy = true;
return (false);
}
}
//--------------------------

bool Proverka_sell()
{
bool Otkryt_orders_sell = false;
for (i = OrdersTotal() ; i>=0; i--)
{
Magic_number= Period();
OrderSelect(i, SELECT_BY_POS, MODE_TRADES);
if(OrderType() == OP_SELL && OrderSymbol () ==Symbol() && OrderMagicNumber() == Magic_number)
Otkryt_orders_sell= true;
}
if (Otkryt_orders_sell==true)
return(true);
else
{
Vihod_Alligator_sell = true;
return (false);
}
}






// Выставление ордеров на продажу
bool Prodazha()
{
Lot = AccountFreeMargin()/1000*risk; //Берем процент от маржи
if (Lot >MaxLot) Lot = MaxLot; //выравниваем его
if (Lot <0.01) Lot = 0.01;
if (EnableMartingail == true) TP=SL/koeff; //Если мартингейл вкл, то ТП не оптимизируем
Magic_number=Period();
Sleep (Zaderzhka);
RefreshRates ();
if (TP == 0)
OrderSend(Symbol(),OP_SELL,Lot,Bid,1,Ask + SL*Point,0,text,Magic_number);
else
OrderSend(Symbol(),OP_SELL,Lot,Bid,1,Ask + SL*Point,Bid - TP*Point,text,Magic_number);
if (EnableMartingail == true) //Если мы используем мартингейл
{
for (i=1; i<=Koleno; i++)
{
Lot = Lot*2*koeff; //Коэффициент 1.5 даст увеличение следующего лота в 3 раза
Sleep (Zaderzhka);
RefreshRates ();
OrderSend(Symbol(),OP_SELLLIMIT,Lot,Ask+(SL*Point*(i)-spred*Point),1,Ask + SL*Point*(i+1),Ask+TP*Point*(i-1),text,Magic_number);
}
}
}


// Выставление ордеров на покупку
bool Pokupka()
{
double Lot = AccountFreeMargin()/1000*risk;
if (Lot >MaxLot) Lot = MaxLot;
if (Lot <0.01) Lot = 0.01;
if (EnableMartingail == true) TP=SL/koeff;
Magic_number=Period();
Sleep (Zaderzhka);
RefreshRates ();
if (TP == 0)
OrderSend(Symbol(),OP_BUY,Lot,Ask,1,Bid - SL*Point,0,text,Magic_number);
else
OrderSend(Symbol(),OP_BUY,Lot,Ask,1,Bid - SL*Point,Ask + TP*Point,text,Magic_number);
if (EnableMartingail == true)
{
for (i=1; i<=Koleno; i++)
{
Lot = Lot*2*koeff;
Sleep (Zaderzhka);
RefreshRates ();
OrderSend(Symbol(),OP_BUYLIMIT,Lot,Bid - (SL*Point*(i)-spred*Point),1,Bid - SL*Point*(i+1),Bid - TP*Point*(i-1),text,Magic_number);

}
}
}


int Trailing_start ()
{
for (i = OrdersTotal() ; i>=0; i--) //ищем открытые ордера
{
RefreshRates();
Magic_number= Period();
OrderSelect(i, SELECT_BY_POS, MODE_TRADES);
if(OrderType() == OP_BUY && OrderSymbol () ==Symbol() && OrderMagicNumber() == Magic_number)
{
if (TP==0)
double TrailingStopKoeff = TrailingStop;
else
{
//Коэффициент Трейлинга дает эффект прижимания SL к TP при приближении цены к TP
TrailingStopKoeff = (OrderTakeProfit() - OrderOpenPrice())/(OrderTakeProfit () - Bid)*TrailingStop;
//Если он больше заложенного в параметрах, то он становится ему равным
if (TrailingStopKoeff >TrailingStop) TrailingStopKoeff = TrailingStop;
}

//Если SL двльше трейлинга, то SL = трейлингу
if(Bid-OrderOpenPrice()>profit&&Bid>Point*TrailingStopKoeff +OrderOpenPrice()&&OrderStopLoss()<Bid-Point*TrailingStopKoeff )
{
OrderModify(OrderTicket(),OrderOpenPrice(),Bid-Point*TrailingStopKoeff,OrderTakeProfit(),text,Blue);
Sleep (Zaderzhka);
Vihod_Alligator_buy = false;
}
}
if(OrderType() == OP_SELL && OrderSymbol () ==Symbol() && OrderMagicNumber() == Magic_number)
{

TrailingStopKoeff = (OrderOpenPrice()-OrderTakeProfit())/(Ask - OrderTakeProfit ())*TrailingStop;
if (TrailingStopKoeff >TrailingStop) TrailingStopKoeff = TrailingStop;
if(OrderOpenPrice()-Ask>profit&&OrderOpenPrice()-Ask>Point*TrailingStopKoeff&&OrderStopLoss()>Ask+Point*TrailingStopKoeff )
{
OrderModify(OrderTicket(),OrderOpenPrice(),Ask+Point*TrailingStopKoeff,OrderTakeProfit(),text,Blue);
Sleep (Zaderzhka);
Vihod_Alligator_sell = false;
}
}
}
return (0);
}


double Fractal ()
{
up =0; //Сброс сигналов
down = 0;
for (i=Fractal_bars;i>=3;i--)
{
double up_prov =iFractals(NULL, 0, MODE_UPPER, i); //В наших барах должен быть
if (up_prov >up) //фрактал
up = up_prov;
double down_prov=iFractals(NULL, 0, MODE_LOWER, i);
if (down_prov>down)
down = down_prov;
}
if (up<Ask+visota_fractal*Point) //И этот фрактал должен быть заметен
up = 0;
if (down<Bid-visota_fractal*Point)
down = 0;
}
 
Верх