!!!9 Чудо Света.mq4
Сообщите нам, если считаете, что материал размещён без разрешения.
Сообщить о материале
Обращение по товару «!!!9 Чудо Света.mq4» отправится на рассмотрение. Укажите контакт для ответа и опишите причину.
О программе
Советник предназначен для автоматической торговли на платформе MetaTrader 4. Он считывает сигналы до пяти пользовательских индикаторов через настраиваемые буферы и открывает позиции BUY или SELL в зависимости от направления сигнала. Каждый индикатор настраивается отдельно с указанием номеров буферов покупки и продажи, а также смещения бара для ожидания сигнала.
Советник поддерживает множество управляющих механизмов: фильтрацию по времени суток, доливку позиций с различными типами шагов, безубыток, трейлинг-стоп, фиксацию прибыли и ограничение убытков. Лот рассчитывается от баланса, прибыли или задаётся статически. Все торговые операции выполняются через стандартный торговый API MetaTrader 4.
В интерфейсе доступны кнопки для ручного открытия и закрытия позиций, а также настройка уровня проскальзывания, магического числа и уведомлений. Советник работает на любых счётах, включая демо и реальные с небольшим депозитом.
Настройки программы
| Настройка | Описание |
|---|---|
| iMaxOneDirection | Максимальное количество позиций в одном направлении |
| INDICATOR1 | Имя пользовательского индикатора 1 (буферы) |
| Buffer_1_BUY1 | Номер буфера индикатора 1 на покупку |
| Buffer_1_SELL1 | Номер буфера индикатора 1 на продажу |
| SignalBar_11 | Бар, на котором ожидается сигнал индикатора 1 (0 — текущий, 1 — прошлый) |
| ____1 | Разделитель настроек индикатора 1 |
| INDICATOR2 | Имя пользовательского индикатора 2 (буферы) |
| Buffer_1_BUY2 | Номер буфера индикатора 2 на покупку |
| Buffer_1_SELL2 | Номер буфера индикатора 2 на продажу |
| SignalBar_12 | Бар, на котором ожидается сигнал индикатора 2 (0 — текущий, 1 — прошлый) |
| ____2 | Разделитель настроек индикатора 2 |
| INDICATOR3 | Имя пользовательского индикатора 3 (буферы) |
| Buffer_1_BUY3 | Номер буфера индикатора 3 на покупку |
| Buffer_1_SELL3 | Номер буфера индикатора 3 на продажу |
| SignalBar_13 | Бар, на котором ожидается сигнал индикатора 3 (0 — текущий, 1 — прошлый) |
| ____3 | Разделитель настроек индикатора 3 |
| INDICATOR4 | Имя пользовательского индикатора 4 (буферы) |
| Buffer_1_BUY4 | Номер буфера индикатора 4 на покупку |
| Buffer_1_SELL4 | Номер буфера индикатора 4 на продажу |
| SignalBar_14 | Бар, на котором ожидается сигнал индикатора 4 (0 — текущий, 1 — прошлый) |
| ____4 | Разделитель настроек индикатора 4 |
| INDICATOR5 | Имя пользовательского индикатора 5 (буферы) |
| Buffer_1_BUY5 | Номер буфера индикатора 5 на покупку |
| Buffer_1_SELL5 | Номер буфера индикатора 5 на продажу |
| SignalBar_15 | Бар, на котором ожидается сигнал индикатора 5 (0 — текущий, 1 — прошлый) |
| ____5 | Разделитель настроек индикатора 5 |
| txt_3 | Заголовок секции фильтров времени |
| time_type | Режим фильтрации времени: разрешить или запретить торговлю в указанные периоды |
| hour_filtr | Периоды суток для фильтрации торговли в формате ЧЧ:ММ-ЧЧ:ММ (если пусто, фильтр отключён) |
| ____6 | Разделитель перед фильтрами времени |
| Adding | Доливка позиции на свободную освободившуюся маржу |
| StepType | Тип доливки: true — в пунктах, false — в процентах от баланса |
| Step | Шаг доливки в процентах от баланса |
| Step1 | Шаг доливки в долларах от прибыли |
| d_type | Тип расчёта шага доливки: геометрическая или арифметическая прогрессия |
| _____ | Разделитель настроек доливки |
| lot_type | Тип расчёта лота: от баланса, от прибыли или статический |
| Lot | Размер лота в процентах от баланса или фиксированное значение |
| lot_doliv | Расчёт лота доливки: умножение на коэффициент или фиксированный лот |
| koef_lot | Коэффициент или фиксированное значение для расчёта лота доливки |
| ______ | Разделитель настроек закрытия |
| CloseRevers | Закрытие позиций при встречном сигнале индикатора |
| NoLossStart | Прибыль в процентах от баланса, при которой включается безубыток (0 — отключено) |
| MinProfitNoLoss | Минимальная прибыль безубытка в валюте депозита |
| ProfitTral | Прибыль в процентах от баланса, при которой стартует трал (0 — отключено) |
| TralStop | Откат прибыли в процентах от максимальной, при котором останавливается трал |
| _______ | Разделитель настроек безубытка и трала |
| ProfClose | Прибыль в процентах от баланса, при которой закрываются все сделки (0 — отключено) |
| LossClose | Убыток в процентах от баланса, при котором закрываются все сделки |
| TP | Тейк-профит в пунктах от цены открытия |
| SL | Стоп-лосс в пунктах от цены открытия |
| Bezubytik_Start | Начальное значение безубытка в пунктах от цены открытия |
| Trailing_Stop | Начало трейлинг-стопа в пунктах от цены открытия |
| Trailing_Step | Шаг трейлинг-стопа в пунктах |
| ________ | Разделитель настроек ордеров |
| slippage | Допустимое проскальзывание в пунктах |
| Magic | Магический номер для идентификации позиций советника |
| AlertON | Уведомление (алерт) при появлении сигнала на открытие позиции |
| s01 | Разделитель секции отложенных ордеров |
| iBuyColor | Цвет линии и меток Buy |
| iSellColor | Цвет линий и меток Sell |
| iLineStyle | Стиль линий индикатора |
| iLineWidth | Толщина линий индикатора |
Поиск по коду файла
#property version "9.00"
#property strict
#property description "Советник для любого индикатора"
#property description "Советник работает бесплатно в тестере, на всех демо счетах и на реальных счетах с депозитом до 100 usd. На более крупные депозиты можно купить советник без ограничений."
/*1) при определенном % прибыли что бы он выставлял без убыток и тралил в % по нарастающему %?.
True/false
2) Доливал позицию на свободную освободившеюся маржу
True /false
3)Открывал по сигналу сделку и закрывал по сигналу сделку
True /false
.4)Фиксация прибыли в % ограничение потерь в %*/
enum TYPE_D
{
MULT, // геометрическая прогрессия
SUMM // арифмитическая прогрессия
};
enum type_time
{
en_time, // разрешить торговлю
dis_time // запретить торговлю
};
enum type_lot
{
balance, // баланса
profit, // профита
standard // статика
};
enum doliv_lot
{
koef, // умножать на коэффициент
fix // фиксированный лот
};
input int iMaxOneDirection = 1000; //макс. в одном направлении
extern string INDICATOR1 = "HGI_v16.09"; //индикатор буферов #1
extern int Buffer_1_BUY1 = 0; //номер буфера на покупку
extern int Buffer_1_SELL1 = 1; //номер буфера на продажу
extern int SignalBar_11 = 1; //бар на котором ждем сигнал (0- текущий 1 - прошлый)
extern string ____1 = "";//___
extern string INDICATOR2 = ""; //индикатор буферов #2
extern int Buffer_1_BUY2 = 2; //номер буфера на покупку
extern int Buffer_1_SELL2 = 3; //номер буфера на продажу
extern int SignalBar_12 = 1; //бар на котором ждем сигнал (0- текущий 1 - прошлый)
extern string ____2 = "";//___
extern string INDICATOR3 = ""; //индикатор буферов #3
extern int Buffer_1_BUY3 = 0; //номер буфера на покупку
extern int Buffer_1_SELL3 = 1; //номер буфера на продажу
extern int SignalBar_13 = 1; //бар на котором ждем сигнал (0- текущий 1 - прошлый)
extern string ____3 = "";//___
extern string INDICATOR4 = ""; //индикатор буферов #4
extern int Buffer_1_BUY4 = 0; //номер буфера на покупку
extern int Buffer_1_SELL4 = 1; //номер буфера на продажу
extern int SignalBar_14 = 1; //бар на котором ждем сигнал (0- текущий 1 - прошлый)
extern string ____4 = "";//___
extern string INDICATOR5 = ""; //индикатор буферов #5
extern int Buffer_1_BUY5 = 0; //номер буфера на покупку
extern int Buffer_1_SELL5 = 1; //номер буфера на продажу
extern int SignalBar_15 = 1; //бар на котором ждем сигнал (0- текущий 1 - прошлый)
extern string ____5 = "";//___
extern string txt_3 = "______ФИЛЬТРЫ ВРЕМЕНИ_______";//.
extern type_time time_type = en_time; // В указаные ниже периоды...
extern string hour_filtr = ""; // Периоды суток формата ЧЧ:ММ-ЧЧ:ММ (если пусто, то фильтр откл.)
extern string ____6 = "";//___
extern bool Adding = true; //Доливал позицию на свободную освободившеюся маржу
extern bool StepType = true; //Тип доливки (true - пункты, false - % от баланса)
extern int Step = 30; //шаг доливки (% от баланса)
extern int Step1 = 100; //шаг доливки ($ от прибыли)
extern TYPE_D d_type = SUMM; //тип шага доливки
extern string _____ = "";
extern type_lot lot_type = standard; //Расчет лота от ...
extern double Lot = 0.1; //лот в %
extern doliv_lot lot_doliv = koef; //Расчет лота доливки
extern double koef_lot = 0.4; //Значение для расчета лота доливки (коэфф. или фикс.)
extern string ______ = "";
extern bool CloseRevers = false ; //закрывать ордера при встречном сигнале
extern double NoLossStart = 0; //безубыток в % от Баланса (0- откл)
extern double MinProfitNoLoss = 0; //минимальная прибыль безубытка в валюте депозита
extern double ProfitTral = 0; //прибыль в % от Баланса при котором стартует трал (0- откл)
extern double TralStop = 0; //откат прибыли в % от максимальной
extern string _______ = "";
extern double ProfClose = 0; //прибыль в % от Баланса при которой закрываем все сделки (0- откл)
extern double LossClose = 0; //убыток в % от Баланса при котором закрываем все сделки (0- откл)
extern int TP = 0;
extern int SL = 0;
extern int Bezubytik_Start = 200;
extern int Trailing_Stop = 200;
extern int Trailing_Step = 10;
extern string ________ = "";
extern int slippage = 0; // проскальзывание
extern int Magic = 12345;
int Orders = 1000; //максимальное кол-во открытых позиций
extern bool AlertON = true; //алерт при появлении сигнала на открытие позиции
input string s01 = "-----"; //Отложенные ордера
input color iBuyColor = clrLime; //Цвет Buy
input color iSellColor = clrRed; //Цвет Sell
input ENUM_LINE_STYLE iLineStyle = STYLE_DASH; //Стиль линии
input int iLineWidth = 1; //Толщина
datetime TimeBar;
double STOPLEVEL;
string val;
double ProfitTrallStart=0;
bool Trall=false;
bool NoLoss=false;
int step_dolivka = 0;
int step_dolivka1 = Step1;
ushort u_sep; // код символа разделителя
string result[];
int k;
double _lot;
int CountBuy;
int CountSell;
int OnInit()
{
// код доступен только после оплаты
}
void OnTick()
{
// код доступен только после оплаты
}
Comment(txt,"\nProfit = ",DoubleToString(Profit,2)," (",DoubleToString(((Profit/AB)*100),1),"%)",
"\nBalance = ",DoubleToString(AB,2),
"\nEquity = ",DoubleToString(AccountEquity(),2),
"\nFreeMargin = ",DoubleToString(AccountFreeMargin(),2),
"\n",IntegerToString(b)," buy ",IntegerToString(s)," sell",
"\n",DoubleToStr(lot_buy,2)," lots buy",
"\n",DoubleToStr(lot_sell,2)," lots sell");
if(!IsNewOrderAllowed()) return;
if(S1!=0 && !timetrade()) {S1 = 0; TimeBar=Time[0];}
if ((S1>0 && CountBuy < iMaxOneDirection) || (Adding && ProfitB>0 && b>0))
{
if (CloseRevers && s>0)
{
if (AlertON) Alert("Закрытие SELL на обратном сигнале ");
CLOSEORDER(OP_SELL);
_lot = LOT();
step_dolivka = 0;
}
if(StepType)
{
step_dolivka1 = Step1 * OrdersTotal();
if (step_dolivka1 == 0)
step_dolivka1 = Step1;
if (b<Orders && (ProfitB)>= step_dolivka1)
{
if (AlertON) Alert(Symbol()," Сигнал на доливку BUY");
if (lot_doliv==koef) _lot*=koef_lot;
else _lot=koef_lot;
_lot = CheckVolumeValue(_lot);
if(SendOrder(OP_BUY, _lot, NormalizeDouble(Ask,Digits))) {return;}
}
}
else
if (b<Orders && (ProfitB+AB)>=calc_step(step_dolivka))
{
if (AlertON) Alert(Symbol()," Сигнал на доливку BUY");
if (lot_doliv==koef) _lot*=koef_lot;
else _lot=koef_lot;
_lot = CheckVolumeValue(_lot);
if(SendOrder(OP_BUY, _lot, NormalizeDouble(Ask,Digits))) {step_dolivka++; return;}
}
if (b<Orders && S1>0 && TimeBar!=Time[0])
{
CountBuy++;
CountSell = 0;
if (AlertON) Alert(Symbol()," Сигнал от индикатора на открытие BUY");
_lot = LOT();
TimeBar=Time[0];
if(SendOrder(OP_BUY, _lot, NormalizeDouble(Ask,Digits))) return;
}
}
if ((S1<0 && CountSell < iMaxOneDirection) || (Adding && ProfitS>0 && s>0))
{
if (CloseRevers && b>0)
{
if (AlertON) Alert("Закрытие BUY на обратном сигнале ");
CLOSEORDER(OP_BUY);
_lot = LOT();
step_dolivka = 0;
}
if(StepType)
{
step_dolivka1 = Step1 * OrdersTotal();
if (step_dolivka1 == 0)
step_dolivka1 = Step1;
if (s<Orders && (ProfitS)>=step_dolivka1)
{
if (AlertON) Alert(Symbol()," Сигнал на доливку SELL");
if (lot_doliv==koef) _lot*=koef_lot;
else _lot=koef_lot;
_lot = CheckVolumeValue(_lot);
if(SendOrder(OP_SELL, _lot, NormalizeDouble(Bid,Digits))) {return;}
}
}
else
if (s<Orders && (ProfitS+AB)>=calc_step(step_dolivka))
{
if (AlertON) Alert(Symbol()," Сигнал на доливку SELL");
if (lot_doliv==koef) _lot*=koef_lot;
else _lot=koef_lot;
_lot = CheckVolumeValue(_lot);
if(SendOrder(OP_SELL, _lot, NormalizeDouble(Bid,Digits))) {step_dolivka++; return;}
}
if (s<Orders && S1<0 && TimeBar!=Time[0])
{
CountSell++;
CountBuy = 0;
if (AlertON) Alert(Symbol()," Сигнал от индикатора на открытие SELL");
_lot = LOT();
TimeBar=Time[0];
if(SendOrder(OP_SELL, _lot, NormalizeDouble(Bid,Digits))) return;
}
}
}
double FirstOrderOpenPrice(int type, int mn, string sym)
{
datetime time=TimeCurrent();
int i;
double profit = -1;
for(i=OrdersTotal()-1;i>=0;i--)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
{
if( OrderType() == type && OrderSymbol()==sym && OrderMagicNumber()==mn)
{
if(OrderOpenTime() < time)
{
time=OrderOpenTime();
profit= OrderOpenPrice();
}
}
}
}
return(profit);
}
bool timetrade()
{
if(k<1) return(true);
int index_hour;
datetime start_time, end_time;
for(index_hour=0; index_hour<k; index_hour++)
{
start_time = StringToTime(TimeToString(TimeCurrent(),TIME_DATE)+" "+StringSubstr(result[index_hour],0,5));
end_time = StringToTime(TimeToString(TimeCurrent(),TIME_DATE)+" "+StringSubstr(result[index_hour],6,5));
if(time_type==0) //если разрешить
{
if( TimeCurrent()>=start_time && TimeCurrent()<=end_time ) return(true); else return(false);
}
if(time_type==1) //если запретить
{
if( TimeCurrent()>=start_time && TimeCurrent()<=end_time ) return(false); else return(true);
}
}
return(false);
}
double calc_step(int st)
{
double calc = AccountBalance();
for(int i=0; i<=st; i++)
{
if(d_type==SUMM) calc+=(AccountBalance()*Step/100);
else calc+=(calc*Step/100);
}
return(NormalizeDouble(calc,2));
}
bool SendOrder(int tip, double lots, double price, double sl=0, double tp=0)
{
if (tip<2)
{
if (AccountFreeMarginCheck(Symbol(),tip,lots)<0)
{
Alert("Недостаточно средств");
return(false);
}
}
double tmp_tp = 0.0;
double tmp_sl = 0.0;
for (int i=0; i<10; i++)
{
if( SL > 0)
{
if( tip == OP_BUY )
{
tmp_sl = 0.0;
if( SL > 0 )
{
tmp_sl = FirstOrderOpenPrice( OP_BUY, Magic, Symbol());
if( tmp_sl > 0 )
tmp_sl = NormalizeDouble( tmp_sl - SL*Point, Digits);
else
tmp_sl = NormalizeDouble( Bid - SL*Point, Digits);
}
}
if( tip == OP_SELL )
{
tmp_sl = 0.0;
if( SL > 0 )
{
tmp_sl = FirstOrderOpenPrice( OP_SELL, Magic, Symbol());
if( tmp_sl > 0 )
tmp_sl = NormalizeDouble( tmp_sl + SL*Point, Digits);
else
tmp_sl = NormalizeDouble( Ask + SL*Point, Digits);
}
}
}
if (OrderSend(Symbol(),tip, lots,price,slippage,tmp_sl,0.0,NULL,Magic,0,clrNONE)!=-1) return(true);
Alert(" попытка ",i," Ошибка открытия ордера ",Strtip(tip)," <<",Error(GetLastError()),">> lot=",lots," pr=",price," sl=",sl," tp=",tp);
Sleep(500);
RefreshRates();
if (IsStopped()) return(false);
}
return(false);
}
string StrPer(int per)
{
if (per == PERIOD_CURRENT) per=Period();
if (per == PERIOD_M1) return("M1");
if (per == PERIOD_M5) return("M5");
if (per == PERIOD_M15) return("M15");
if (per == PERIOD_M30) return("M30");
if (per == PERIOD_H1) return("H1");
if (per == PERIOD_H4) return("H4");
if (per == PERIOD_D1) return("D1");
if (per == PERIOD_W1) return("W1");
if (per == PERIOD_MN1) return("MN1");
return("ошибка периода");
}
string Strtip(int tip)
{
switch(tip)
{
case OP_BUY:
return("BUY");
case OP_SELL:
return("SELL");
case OP_BUYSTOP:
return("BUYSTOP");
case OP_SELLSTOP:
return("SELLSTOP");
case OP_BUYLIMIT:
return("BUYLIMIT");
case OP_SELLLIMIT:
return("SELLLIMIT");
}
return("error");
}
bool CLOSEORDER(int ord=-1)
{
bool error=true;
int j,err,nn=0,OT,OMN;
while (!IsStopped())
{
for (j = OrdersTotal()-1; j >= 0; j--)
{
if (OrderSelect(j, SELECT_BY_POS))
{
OMN = OrderMagicNumber();
if (OrderSymbol() == Symbol() && OMN == Magic)
{
OT = OrderType();
if (OT==OP_BUY && (ord == OT || ord == -1))
{
error=OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(Bid,Digits),slippage,Blue);
}
if (OT==OP_SELL && (ord == OT || ord == -1))
{
error=OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(Ask,Digits),slippage,Red);
}
if (!error)
{
err = GetLastError();
if (err<2) continue;
if (err==129)
{
RefreshRates();
continue;
}
if (err==146)
{
if (IsTradeContextBusy()) Sleep(2000);
continue;
}
}
}
}
}
int n=0;
for (j = 0; j < OrdersTotal(); j++)
{
if (OrderSelect(j, SELECT_BY_POS))
{
OMN = OrderMagicNumber();
if (OrderSymbol() == Symbol() && OMN == Magic)
{
OT = OrderType();
if ((OT==OP_BUY && (ord == OT || ord == -1)) || (OT==OP_SELL && (ord == OT || ord == -1))) n++;
}
}
}
if (n==0) return(true);
nn++;
if (nn>10) {Alert(Symbol()," Не удалось закрыть все сделки, осталось еще ",n);return(false);}
Sleep(1000);
RefreshRates();
}
return(true);
}
color Color(bool P,color a,color b)
{
if (P) return(a);
else return(b);
}
void DrawLABEL(string name, string Name, int X, int Y, color clr)
{
if (ObjectFind(name)==-1)
{
ObjectCreate(name, OBJ_LABEL, 0, 0, 0);
ObjectSet(name, OBJPROP_CORNER, 1);
ObjectSet(name, OBJPROP_XDISTANCE, X);
ObjectSet(name, OBJPROP_YDISTANCE, Y);
}
ObjectSetText(name,Name,12,"Arial",clr);
}
string Error(int code)
{
switch(code)
{
case 0: return("Нет ошибок");
case 1: return("Нет ошибки, но результат неизвестен");
case 2: return("Общая ошибка");
case 3: return("Неправильные параметры");
case 4: return("Торговый сервер занят");
case 5: return("Старая версия клиентского терминала");
case 6: return("Нет связи с торговым сервером");
case 7: return("Недостаточно прав");
case 8: return("Слишком частые запросы");
case 9: return("Недопустимая операция нарушающая функционирование сервера");
case 64: return("Счет заблокирован");
case 65: return("Неправильный номер счета");
case 128: return("Истек срок ожидания совершения сделки");
case 129: return("Неправильная цена");
case 130: return("Неправильные стопы");
case 131: return("Неправильный объем");
case 132: return("Рынок закрыт");
case 133: return("Торговля запрещена");
case 134: return("Недостаточно денег для совершения операции");
case 135: return("Цена изменилась");
case 136: return("Нет цен");
case 137: return("Брокер занят");
case 138: return("Новые цены");
case 139: return("Ордер заблокирован и уже обрабатывается");
case 140: return("Разрешена только покупка");
case 141: return("Слишком много запросов");
case 145: return("Модификация запрещена, так как ордер слишком близок к рынку");
case 146: return("Подсистема торговли занята");
case 147: return("Использование даты истечения ордера запрещено брокером");
case 148: return("Количество открытых и отложенных ордеров достигло предела, установленного брокером.");
case 4000: return("Нет ошибки");
case 4001: return("Неправильный укПоказано первые 50% кода (символов: 48030)
Открыть по тарифу
Купите тариф с пакетом открытий или войдите, если тариф уже есть. Открытый файл останется в вашем кабинете навсегда.
Разовая покупка файла
На этой странице откроется полный исходный код файла вместо ознакомительного фрагмента.
Зачем нужен email? После подтверждения оплаты файл сохранится в кабинете на этот email. Если аккаунта ещё нет, мы создадим его и пришлём ссылку для задания пароля. Если аккаунт уже есть, покупка добавится в него. Укажите адрес, к которому у вас есть доступ.
Чтобы оформить заказ, введите email и перейдите к оплате.