iplaton_fx5_divergence_1.0.mq4
Похожие материалы по тегам
Сообщите нам, если считаете, что материал размещён без разрешения.
Сообщить о материале
Обращение по товару «iplaton_fx5_divergence_1.0.mq4» отправится на рассмотрение. Укажите контакт для ответа и опишите причину.
О программе
Советник iPlaton FX5 Divergence ориентирован на торговлю по сигналам дивергенции на базе пользовательского индикатора FX5_Divergence_V2[1].1 в платформе MetaTrader 4. При обнаружении бычьей или медвежьей дивергенции он открывает соответствующие позиции и при необходимости закрывает противоположные ордера.
Продукт поддерживает сетную торговлю с ограничением максимального количества открытых ордеров, а также полный набор инструментов управления рисками: фиксированные уровни Take Profit и Stop Loss, перевод стопа в безубыток, Trailing Stop и оптимизацию лота по риску от депозита.
Доступны настройки торговых часов, ежедневное закрытие позиций к заданному часу, режим автоматической торговли и подробная визуализация открытых и закрытых ордеров на графике. Советник также выводит уведомления о состоянии соединения и торговых ограничениях.
Внутренняя константа nameEA определена как EA_RSI_Divergence_1.0. Торговые комментарии формируются с использованием этого имени и магического номера для идентификации ордеров.
Настройки программы
| Настройка | Описание |
|---|---|
| s001 | Разделитель настроек. |
| separator1 | Разделитель блока настроек. |
| fastEMA | Период быстрой скользящей средней. |
| slowEMA | Период медленной скользящей средней. |
| signal | Период сигнальной линии. |
| UseClose | Управляет закрытием позиций при появлении нового сигнала: без закрытия, только противоположные или любые позиции. |
| TradeON | Включает или отключает автоматическую торговлю советником. |
| Magic | Магический номер для идентификации ордеров, управляемых советником. |
| Lots | Стартовый лот для открытия ордеров. |
| MaxLot | Максимально допустимый лот при оптимизации размера позиции. |
| LotsOptimized | Включает оптимизацию размера лота на основе заданного риска в процентах от депозита. |
| Risk | Максимальный риск при открытии ордера, выраженный в процентах от депозита. |
| MinMinutOpen | Минимальный интервал в минутах между последовательными открытыми ордерами. |
| GridSize | Максимальное количество одновременно открытых ордеров. |
| TakeProfit | Тейк-профит по умолчанию, в пунктах. |
| StopLoss | Стоп-лосс по умолчанию, в пунктах. Если значение равно 0, стоп-лосс не применяется. |
| UseBreakEvent | Включает автоматический перевод стоп-лосса в безубыток. |
| BreakEventStopPips | Расстояние стоп-лосса от текущей цены, в пунктах, при переводе стопа в безубыток. |
| BreakEventStartPips | Расстояние стоп-лосса от цены открытия ордера, в пунктах, при переводе стопа в безубыток. |
| UseTrailing | Включает или отключает Trailing Stop. |
| TrailingStopPips | Расстояние Trailing Stop от текущей цены, в пунктах. |
| TrailingStartPips | Расстояние от цены открытия ордера, при котором начинается работа Trailing Stop, в пунктах. |
| TrailingStepPips | Шаг перемещения стоп-лосса при срабатывании Trailing Stop, в пунктах. |
| UseDayClose | Ежедневное закрытие всех открытых ордеров пары к заданному часу. |
| HourCloseOrders | Час (по времени брокера), после которого ежедневно закрываются все ордера пары. |
| TimeSourceToUse | Источник времени для расчётов: местное время, время брокера или UTC. |
| tradingHours | Периоды времени торговли в формате +ЧЧ.ММ,-ЧЧ.ММ. Если пусто, торговля разрешена круглосуточно. |
| debug | Запись диагностических сообщений в журнал. |
| Show_OpenTrades | Отображение на графике трасс открытых ордеров. |
| Show_ClosedTrades | Отображение на графике трасс закрытых ордеров. |
| LookbackDays | Количество дней истории закрытых ордеров, отображаемых на графике. |
| X_msgM | Горизонтальная позиция текстового сообщения на экране. |
| Y_msgM | Вертикальная позиция текстового сообщения на экране. |
Поиск по коду файла
#define nameEA "EA_RSI_Divergence_1.0"
#property strict
#include <stderror.mqh>
#include <stdlib.mqh>
enum YN
{
NO = 0, //Нет
YES = 1 //Да
};
enum ENUM_TIMESRC
{
tLocal = 0, //Время Местное
tBROKER = 1, //Время Брокера
tGMT = 2 //Время UTC по Гринвичу
};
enum CLOSING_MANAGEMENT
{
None, //Не закрывать (без СЛ - опасно!)
OnlyCounters,//Закрывать только противоположные
All //Закрывать любые
};
extern string •pips = "^^^ Внимание! Пункты 5-ти знака ставить как для 4-х знака"; //^^^ Внимание! Пункты 5-ти знака ставить как для 4-х знака
extern string s001="================================================================";//================================================================
extern string separator1 = "*** OSMA Settings ***";
extern int fastEMA = 12; // Период быстрой MA
extern int slowEMA = 26; // Период медленной МА
extern int signal = 9; // Период сигнальной линии
extern string •trade = "=== УПРАВЛЕНИЕ ТОРГОВЛЕЙ ==="; //=== УПРАВЛЕНИЕ ТОРГОВЛЕЙ ===
extern CLOSING_MANAGEMENT UseClose = OnlyCounters;//Управление закрытием позиций при новом сигнале
extern YN TradeON = YES; // Автоматическая торговля ( ДА или НЕТ ).
extern int Magic = 200; // Магик номер
extern double Lots = 0.1; // Стартовый лот
extern double MaxLot = 100; // Максимальный лот
extern YN LotsOptimized = YES; // Оптимизировать лот ( ДА или НЕТ )
extern double Risk = 1.5; // Максимальный риск при открытии ордера, в % от депозита
extern double MinMinutOpen = 0; // Минимальное время между ордерами, в минутах
extern int GridSize = 10; // Максимальное количество открытых ордеров
extern string •tpsl = "^^^ Управление TP и SL ордеров"; //^^^ Управление TP и SL ордеров
extern int TakeProfit = 0; // Take Profit (TP) по умолчанию, в пунктах
extern int StopLoss = 0; // Stop Loss (SL) по умолчанию, в пунктах. Если=0, не применять
extern string •be = "^^^ Перевод Stoploss ордеров в безубыток"; //^^^ Перевод Stoploss ордеров в безубыток
extern YN UseBreakEvent = YES; // Включить перевод Stoploss в безубыток ( ДА )
extern int BreakEventStopPips = 7; // Расстояние Stoploss от текущей цены, в пунктах
extern int BreakEventStartPips = 1; // Расстояние Stoploss от цены открытия ордера, в пунктах
extern string •tr = "^^^ Модернизация ордеров Trailing stoploss"; //^^^ Модернизация ордеров Trailing stoploss
extern YN UseTrailing = YES; // Включить Trailing stoploss ( ДА )
extern int TrailingStopPips = 7; // Расстояние Trailing stoploss от текущей цены, в пунктах
extern int TrailingStartPips = 4; // Старт Trailing stoploss от цены открытия ордера, в пунктах
extern int TrailingStepPips = 1; // Шаг срабатывания Trailing stoploss, в пунктах
extern string •closeday = "^^^ Ежедневно закрывать все ордера пары ^^^"; //^^^ Ежедневно закрывать все ордера пары ^^^
extern YN UseDayClose = NO; // Ежедневно закрывать все ордера пары ( ДА или НЕТ )
extern int HourCloseOrders = 22; // После какого часа закрывать ордера, по времени Брокера
extern string •hours = "=== ЧАСЫ ТОРГОВЛИ СОВЕТНИКА ==="; //=== ЧАСЫ ТОРГОВЛИ СОВЕТНИКА ===
extern ENUM_TIMESRC TimeSourceToUse = tBROKER; //Выберите тип времени
extern string •example = "^^^ +03.00,-10.30, +12.15,-15.00, +20.30,-23.45"; //ПРИМЕР, где: ' + ' начало ' - ' конец ' , 'запятая новый период
extern string tradingHours = ""; //Периоды времени торговли. Если пусто, то 24 часа
string TradeComment = ""; //Комментарий для идентификации ордеров
extern string •ord ="=== Визуализация ===";//=== Визуализация ===
extern YN debug = NO; // Запись сообщений в журнал ( ДА или НЕТ )
extern YN Show_OpenTrades = NO; // Показать на графике трассы открытых ордеров
extern YN Show_ClosedTrades = NO; // Показать на графике трассы закрытых ордерщв
extern int LookbackDays = 1; // За сколько дней на графике показать трассы закрытых ордеров
extern int X_msgM = 10; // Позиция X текста сообщения на экране
extern int Y_msgM = 10; // Позиция Y текста сообщения на экране
color Color_Trade_Long = clrLime;
color Color_Trade_Short = clrRed;
color Color_Dot_Center = clrBlack;
color Color_Dot_Closed = clrDarkGray;
color Color_Trade_Positive = clrAqua;
color Color_Trade_Negative = clrRed;
double priceUp, priceDn;
int mdg=1;
datetime LatestTradeTime, LatestCloseTime;
bool CLOSE_PROFIT_DAY = false;
string CLOSE_PROFIT_GvName;
int tradeHours[]; //Массив временных интервалов в течении дня (когда разрешена торговля советником)
string tradingHoursDisplay = "";
datetime OldCloseOrdersHistoryTotal=0;
double sm = 25.2;
string symbol;
datetime RefreshTime=0;
int OnInit()
{
// код доступен только после оплаты
}//End int OnInit()
void OnDeinit(const int reason)
{
Comment("");
DeleteAlert();
deleteTick();
deleteInfo();
deleteShowOpenTrade();
deleteShowCloseTrade();
return;
}//End void OnDeinit(const int reason)
void OnTick()
{
// код доступен только после оплаты
}//End void OnTick()
bool CalculateSignal()
{
if(iCustom(_Symbol,0,"FX5_Divergence_V2[1].1","",fastEMA,slowEMA,signal,"",false,2,2) != EMPTY_VALUE)
{
if(UseClose != None) CloseTrades(OP_SELL);
if(UseClose == All) CloseTrades(OP_BUY);
openOrder(OP_BUY);
return(true);
} else
if(iCustom(_Symbol,0,"FX5_Divergence_V2[1].1","",fastEMA,slowEMA,signal,"",false,3,2) != EMPTY_VALUE)
{
if(UseClose != None) CloseTrades(OP_BUY);
if(UseClose == All) CloseTrades(OP_SELL);
openOrder(OP_SELL);
return(true);
}
return(false);
}//End void CalculateSignal()
void CloseEveryDay()
{
if(OrdersTotal()==0) return;
MqlDateTime tm;
TimeCurrent(tm);
int HCO = HourCloseOrders; //После какого часа закрывать ордера (от 1 до 23)
if(HCO <= 0) HCO = 1;
if(HCO > 23) HCO = 23;
if(tm.hour != HCO) { CLOSE_PROFIT_DAY=false; return;} // сейчас не заданный час по текущему времени Брокера
if(CLOSE_PROFIT_DAY==true) return; // да, ордера уже закрывались в заданном часе и поэтому ничего не надо делать.
if(GlobalVariableCheck(CLOSE_PROFIT_GvName)==true)
{
datetime dt = (datetime)GlobalVariableGet(CLOSE_PROFIT_GvName);
if(TimeYear(dt)==tm.year && TimeMonth(dt)==tm.mon && TimeDay(dt)==tm.day && TimeHour(dt)==HCO)
return; // да, ордера уже закрывались в заданном часе и поэтому ничего не надо делать.
GlobalVariableDel(CLOSE_PROFIT_GvName);
}
double pl=0, pl_sum=0;
int close_count=0;
for(int cc = OrdersTotal() - 1; cc >= 0; cc--)
{
if(!OrderSelect(cc,SELECT_BY_POS,MODE_TRADES) ) continue;
if(OrderSymbol() != Symbol()) continue;
if(OrderMagicNumber() != Magic) continue;
if(OrderCloseTime()>0) continue;
pl = OrderProfit()+OrderSwap()+OrderCommission();
bool result=CloseOrder(OrderTicket());
if(result)
{
close_count++;
pl_sum+=pl;
}
}//for(cc = OrdersTotal() - 1; cc >= 0; cc--)
if(close_count>0)
{
MqlDateTime tm1;
TimeCurrent(tm1);
if(debug==YES) Print(TradeComment, ">>> По расписанию в " + IntegerToString(tm1.hour) + " чac. " + IntegerToString(tm1.min) + " мин. Закрыто ордеров ("+
IntegerToString(close_count)+") по суммарному профиту "+DoubleToString(pl_sum,2)+" <<<");
CLOSE_PROFIT_DAY=true;
GlobalVariableSet(CLOSE_PROFIT_GvName,(double)(TimeCurrent()));
}
return;
}//End void CloseEveryDay()
bool CloseOrder(int ticket)
{
double ClosePrice, LOT;
bool result=false;
int digits;
if(!OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) return(false);
if(OrderType() > 1) return(false);
RefreshRates();
digits = (int)SymbolInfoInteger(OrderSymbol(),SYMBOL_DIGITS);
ClosePrice = NormalizeDouble(SymbolInfoDouble(OrderSymbol(),SYMBOL_BID),digits);
if(OrderType()==OP_SELL)
ClosePrice = NormalizeDouble(SymbolInfoDouble(OrderSymbol(),SYMBOL_ASK),digits);
LOT=OrderLots();
result=OrderClose(ticket,LOT,ClosePrice,5*mdg,clrBlue);
if(result) return(true);
return(false);
}//End bool CloseOrder(int ticket)
void CloseTrades(int type)
{
if(OrdersTotal() == 0) return;
int cc;
double pl=0;
for(cc=OrdersTotal()-1; cc>=0; cc--)
{
if(!OrderSelect(cc,SELECT_BY_POS,MODE_TRADES)) continue;
if(OrderSymbol() != Symbol()) continue;
if(OrderMagicNumber() != Magic) continue;
if(OrderType()!=type) continue;
if(OrderCloseTime()>0) continue;
pl=OrderProfit()+OrderSwap()+OrderCommission();
bool result=CloseOrder(OrderTicket());
MqlDateTime tm1;
TimeCurrent(tm1);
if(result) Print(TradeComment,">> ",symbol,": Закрыт при смене направления сигнала order №",IntegerToString(OrderTicket())," в "+
IntegerToString(tm1.hour) + " чac. " + IntegerToString(tm1.min) + " мин. Profit = ",DoubleToStr(pl,2)," cash <<<-");
}//for(cc=OrdersTotal()-1; cc>=0; cc--)
}//End void CloseTrades(int type)
double GetLots()
{
double Maxlot = SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_MAX);
double Minlot = SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_MIN);
double lotstep = SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_STEP); // Минимальный шаг изменения объема для заключения сделки
double LotSize = MarketInfo(Symbol(),MODE_LOTSIZE); // Размер контракта в базовой валюте инструмента
double OneLot = MarketInfo(Symbol(),MODE_MARGINREQUIRED); // Размер свободных средств, необходимых для открытия 1 лота на покупку
double Leverage = AccountLeverage();
double lotsTmp = MathMin(Maxlot, MathMax(Minlot, Lots));
if(LotsOptimized==NO || Risk==0.0) return(lotsTmp);
if(LotsOptimized==YES)
{
if(Risk==0) return(lotsTmp);
if(Risk>100) Risk=100;
lotsTmp = MathFloor(AccountFreeMargin()*Risk/100/OneLot/lotstep)*lotstep;
if(lotsTmp > MaxLot) lotsTmp = MaxLot;
lotsTmp = MathMax(Minlot, MathMin(Maxlot, NormalizeDouble(lotsTmp / Minlot, 0) * Minlot));
double needMoney = lotsTmp*OneLot;
if(needMoney > AccountFreeMargin()) // денег не достаточно на наш лот
{
Comment("Low Account Balance. Lots = ", lotsTmp, " , Free Margin = ", AccountFreeMargin());
if(debug==YES) Print(TradeComment, " Low Account Balance. Lots = ", lotsTmp, " , Free Margin = ", AccountFreeMargin());
lotsTmp = MathFloor(AccountFreeMargin()/OneLot/lotstep)*lotstep;
lotsTmp = MathMax(Minlot, MathMin(Maxlot, NormalizeDouble(lotsTmp / Minlot, 0) * Minlot));
return(lotsTmp);
}
return(lotsTmp);
}
return(Lots);
}//End double GetLots()
void openOrder(int type)
{
double sl, tp;
int i, try, ticket;
bool rez=false;
double minstop = MarketInfo(Symbol(),MODE_STOPLEVEL);
int cnt = 0, LatestOrderType = 99;
LatestCloseTime = 0;
for(i=0; i<OrdersHistoryTotal(); i++)
{
if(!OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)) continue;
if(OrderSymbol() != Symbol()) continue;
if(OrderMagicNumber() != Magic) continue;
if(OrderType()>1) continue;
if(OrderCloseTime()==0) continue;
if(OrderCloseTime() > LatestCloseTime)
LatestCloseTime = OrderCloseTime(); // Дата время закрытия последнего ордера
}
LatestOrderType = type;
LatestTradeTime = 0;
for(i = OrdersTotal()-1; i>=0; i--)
{
if(!OrderSelect(i,SELECT_BY_POS,MODE_TRADES) ) continue;
if(OrderSymbol() != Symbol()) continue;
if(OrderMagicNumber() != Magic) continue;
if(OrderCloseTime()>0) continue;
cnt++;
if(OrderOpenTime() > LatestTradeTime)
{
LatestTradeTime = OrderOpenTime(); // Дата время открытия последнего ордера
LatestOrderType = OrderType(); // Тип направления последнего ордера
}
}
if(TimeCurrent()-LatestCloseTime < MinMinutOpen*60 ||
TimeCurrent()-LatestTradeTime < MinMinutOpen*60) return; // MinMinutOpen -- Минимальное время между открытием ордеров в минутах
if(cnt >= GridSize || LatestOrderType != type) return;
RefreshRates();
if(type == OP_SELL)
{
for(try = 1; try <= 3; try++)
{
ticket=OrderSend(Symbol(),OP_SELL,GetLots(),Bid,10,0,0 ,"", Magic, 0, Red);
if(ticket>0)
{
if(StopLoss > 0 || TakeProfit > 0)
{
if(OrderSelect(ticket, SELECT_BY_TICKET, MODE_TRADES))
{
while (!IsTradeAllowed()) Sleep(500);
RefreshRates();
sl=0; if(StopLoss*mdg > minstop) sl=NormalizeDouble(Ask + StopLoss*Point*mdg, Digits);
tp=0; if(TakeProfit*mdg > minstop) tp=NormalizeDouble(Bid - TakeProfit*Point*mdg, Digits);
rez=OrderModify(OrderTicket(),OrderOpenPrice(),sl,tp,0, Red);
}
}
return;
}//if(ticket>0)
else
{
if(debug==YES) Print(TradeComment, "Ошибка ", ErrorDescription(GetLastError()),". Невозможно открыть ордер, попытка ", try);
Sleep(1000);
RefreshRates();
}
}//for(try = 1; try <= 2; try++)
return;
}//if(type == OP_SELL)
if(type == OP_BUY)
{
for(try = 1; try <= 3; try++)
{
ticket=OrderSend(Symbol(),OP_BUY,GetLots(),Ask,10,0,0, "", Magic, 0, Green);
if(ticket>0)
{
if(StopLoss > 0 || TakeProfit > 0)
{
if(OrderSelect(ticket, SELECT_BY_TICKET, MODE_TRADES))
{
while (!IsTradeAllowed()) Sleep(500);
RefreshRates();
sl=0; if(StopLoss*mdg > minstop) sl=NormalizeDouble(Bid - StopLoss*Point*mdg, Digits);
tp=0; if(TakeProfit*mdg > minstop) tp=NormalizeDouble(Ask + TakeProfit*Point*mdg, Digits);
rez=OrderModify(OrderTicket(),OrderOpenPrice(),sl,tp,0, Green);
}
}
return;
}//if(ticket>0)
else
{
if(debug==YES) Print(TradeComment, "Ошибка ", ErrorDescription(GetLastError()),". Невозможно открыть ордер, попытка ", try);
Sleep(1000);
RefreshRates();
}
}//for(try = 1; try <= 2; try++)
return;
}//if(type == OP_BUY)
}//End void openOrder(int type)
void OrdersSLModify()
{
int digits=(int)SymbolInfoInteger(symbol,SYMBOL_DIGITS);
double ask =SymbolInfoDouble(symbol,SYMBOL_ASK);
double bid =SymbolInfoDouble(symbol,SYMBOL_BID);
double point =SymbolInfoDouble(symbol,SYMBOL_POINT);
if(point==0) return;
double level = SymbolInfoInteger(symbol,SYMBOL_TRADE_STOPS_LEVEL) * point;
double sl=0.0,price=0.0;
double BreakEventStart = BreakEventStartPips*mdg*point;
double BreakEventStop = BreakEventStopPips*mdg*point;
double TrailingStart = TrailingStartPips*mdg*point;
double TrailingStop = TrailingStopPips*mdg*point;
double TrailingStep = TrailingStepPips*mdg*point;
for(int i=OrdersTotal()-1; i>=0; i--)
{
if(!OrderSelect(i,SELECT_BY_POS)) continue;
if(OrderSymbol()!=symbol) continue;
if(OrderMagicNumber() != Magic) continue;
if(OrderCloseTime()>0 || OrderType()>1) continue;
sl = OrderStopLoss();
price = OrderOpenPrice();
if(OrderType()==OP_BUY)
{
if(UseBreakEvent==YES)
if((sl==0 || sl<price) && bid-price > BreakEventStart+BreakEventStop) sl=NormalizeDouble(price+BreakEventStart,digits);
if(UseTrailing==YES)
{
if((sl==0 || sl<price) && bid-price > TrailingStart+TrailingStop) sl=NormalizeDouble(price+TrailingStart,digits); //else
if(sl>price && bid>= (NormalizeDouble(price+BreakEventStart - sl,digits) == 0 ? price + (TrailingStop + TrailingStart) :
sl+(TrailingStop+TrailingStep))) sl=NormalizeDouble(bid-TrailingStop,digits);
}
if(sl==0 || (sl>0 && bid<sl+level)) sl=OrderStopLoss();
if(!ZE(sl,OrderStopLoss(),point))
{
if(!OrderModify(OrderTicket(),price,sl,OrderTakeProfit(),0))
if(debug==YES) Print(TradeComment, "Не получилось переставить стоп, ошибка " ,GetLastError());
return;
}
}//if(OrderType()==OP_BUY)
if(OrderType()==OP_SELL)
{
if(UseBreakEvent==YES)
if((sl==0 || sl>price) && price-ask > BreakEventStart+BreakEventStop) sl=NormalizeDouble(price-BreakEventStart,digits);
if(UseTrailing==YES)
{
if((sl==0 || sl>price) && price-ask > TrailingStart+TrailingStop) sl=NormalizeDouble(price-TrailingStart,digits); else
if(sl<price && ask<= (NormalizeDouble(price-BreakEventStart - sl,digits) == 0 ? price - (TrailingStop + TrailingStart) :
sl - (TrailingStop + TrailingStep))) sl=NormalizeDouble(ask+TrailingStop,digits);
}
if(sl==0 || (sl>0 && ask>sl-level)) sl=OrderStopLoss();
if(!ZE(sl,OrderStopLoss(),point))
{
if(!OrdПоказано первые 50% кода (символов: 31665)
Открыть по тарифу
Купите тариф с пакетом открытий или войдите, если тариф уже есть. Открытый файл останется в вашем кабинете навсегда.
Разовая покупка файла
На этой странице откроется полный исходный код файла вместо ознакомительного фрагмента.
Зачем нужен email? После подтверждения оплаты файл сохранится в кабинете на этот email. Если аккаунта ещё нет, мы создадим его и пришлём ссылку для задания пароля. Если аккаунт уже есть, покупка добавится в него. Укажите адрес, к которому у вас есть доступ.
Чтобы оформить заказ, введите email и перейдите к оплате.