teodosi_ea.mq4
Сообщите нам, если считаете, что материал размещён без разрешения.
Сообщить о материале
Обращение по товару «teodosi_ea.mq4» отправится на рассмотрение. Укажите контакт для ответа и опишите причину.
О программе
Данный продукт представляет собой торговый советник для платформы MetaTrader 4, написанный на языке MQL4. Советник автоматически анализирует рыночную ситуацию и выполняет торговые операции через стандартные API платформы.
В основе работы лежит считывание данных пользовательского индикатора, который формирует сигналы для открытия длинных и коротких позиций. При появлении соответствующего сигнала советник открывает позицию заданного объёма с установленными стоп-лоссом и тейк-профитом.
Советник поддерживает модификацию ордеров по текущему рынку, повторные попытки отправки при ошибках, а также создание скриншотов торговых операций при включённой соответствующей настройке. Также реализованы функции закрытия позиций и управления стоп-лоссом.
Настройки программы
| Настройка | Описание |
|---|---|
| Lots | Объём лота — Объём торгового лота для открытия позиции |
| Stop | Стоп-лосс — Расстояние до стоп-лосса в пунктах |
| TakeProfit | Тейк-профит — Расстояние до тейк-профита в пунктах |
| Lookback | Период анализа — Количество баров для анализа экстремумов цен при модификации стоп-лосса |
| firstMA | Первая скользящая средняя — Период первой скользящей средней, используемой индикатором |
| secondMA | Вторая скользящая средняя — Период второй скользящей средней, используемой индикатором |
| thirdMA | Третья скользящая средняя — Период третьей скользящей средней, используемой индикатором |
| fourthMA | Четвёртая скользящая средняя — Период четвёртой скользящей средней, используемой индикатором |
| rsiPeriod | Период RSI — Период индикатора RSI, используемого в системе |
| MagicNumber | Магический номер — Идентификатор для фильтрации ордерами данного советника |
| WriteScreenshots | Скриншоты — Включает или отключает сохранение скриншотов торговых операций |
Поиск по коду файла
#define DECIMAL_CONVERSION 10
#define COMMENT_DIGITS 2
#define INITIAL_CROSS_BAR 2
#define EVAL_BAR 1
#define THIS_BAR 0
#define NEGATIVE_VALUE -1
#define BULLISH 1
#define BEARISH 0
#define RETRYCOUNT 10
#define RETRYDELAY 500
#define LONG 1
#define SHORT -1
#define ALL 0
#define LONG_COMMENT "Long Order"
#define SHORT_COMMENT "Short Order"
extern double Lots = 0.1;
extern int Stop = 50;
extern int TakeProfit = 100;
extern int Lookback = 20;
extern int firstMA = 5;
extern int secondMA = 12;
extern int thirdMA = 18;
extern int fourthMA = 28;
extern int rsiPeriod = 21;
extern int MagicNumber = 11190;
extern bool WriteScreenshots = true;
datetime lastTradeTime, lastTradeLevel2;
int Slippage = 2;
int handle;
double maxStop;
int tradeTicket;
string display = "";
string nameIndy = "Teodosi_4_movinq_averages_system";
int init()
{
// код доступен только после оплаты
}
int deinit() { return(0); }
int start()
{
// код доступен только после оплаты
}
bool DoTrade(int dir, double volume, int stop, int take, string comment) {
double sl, tp;
bool retVal = false;
switch(dir) {
case LONG:
if (stop != 0) { sl = Ask-(stop*Point); }
else { sl = 0; }
if (take != 0) { tp = Ask +(take*Point); }
else { tp = 0; }
retVal = OpenTrade(LONG, volume, sl, tp, comment);
break;
case SHORT:
if (stop != 0) { sl = Bid+(stop*Point); }
else { sl = 0; }
if (take != 0) { tp = Bid-(take*Point); }
else { tp = 0; }
retVal = OpenTrade(SHORT, volume, sl, tp, comment);
break;
}
return(retVal);
}
bool OpenTrade(int dir, double volume, double stop, double take, string comment, int t = 0) {
int i, j, ticket, cmd;
double prc, sl, tp, lots;
string cmt;
color theColor;
Print("OpenTrade("+dir+","+DoubleToStr(volume,3)+","+DoubleToStr(stop,Digits)+","+DoubleToStr(take,Digits)+","+t+")");
lots = CheckLots(volume);
for (i=0; i<RETRYCOUNT; i++) {
for (j=0; (j<50) && IsTradeContextBusy(); j++)
Sleep(100);
RefreshRates();
if (dir == LONG) {
cmd = OP_BUY;
prc = Ask;
sl = stop;
tp = take;
theColor = Blue;
}
if (dir == SHORT) {
cmd = OP_SELL;
prc = Bid;
sl = stop;
tp = take;
theColor = Red;
}
Print("OpenTrade: prc="+DoubleToStr(prc,Digits)+" sl="+DoubleToStr(sl,Digits)+" tp="+DoubleToStr(tp,Digits));
cmt = comment;
if (t > 0)
cmt = comment + "|" + t;
ticket = OrderSend(Symbol(), cmd, lots, prc, Slippage, 0, 0, cmt, MagicNumber, 0, theColor);
tradeTicket = ticket;
if (ticket != -1 && ( sl > 0 || tp > 0) ) {
Print("OpenTrade: opened ticket " + ticket);
Screenshot("OpenTrade");
for (i=0; i<RETRYCOUNT; i++) {
for (j=0; (j<50) && IsTradeContextBusy(); j++)
Sleep(100);
RefreshRates();
if ( OrderModify(ticket, 0, sl, tp, 0) ) {
Print("OpenTrade: SL/TP are set");
Screenshot("OpenTrade_SLTP");
break;
}
Print("OpenTrade: error \'"+ErrorDescription(GetLastError())+"\' when setting SL/TP");
Sleep(RETRYDELAY);
}
return (true);
}
if(ticket != -1 && sl == 0 && tp == 0 ) {
Print("OpenTrade: opened ticket " + ticket);
Screenshot("OpenTrade");
return (true);
}
Print("OpenTrade: error \'"+ErrorDescription(GetLastError())+"\' when entering with "+DoubleToStr(lots,3)+" @"+DoubleToStr(prc,Digits));
Sleep(RETRYDELAY);
}
Print("OpenTrade: can\'t enter after "+RETRYCOUNT+" retries");
return (false);
}
string ConvertBoolToStr(bool value)
{
if (value) { return("True"); }
else { return("False"); }
}
double CheckLots(double lots)
{
double lot, lotmin, lotmax, lotstep, margin;
lotmin = MarketInfo(Symbol(), MODE_MINLOT);
lotmax = MarketInfo(Symbol(), MODE_MAXLOT);
lotstep = MarketInfo(Symbol(), MODE_LOTSTEP);
margin = MarketInfo(Symbol(), MODE_MARGINREQUIRED);
if (lots*margin > AccountFreeMargin())
lots = AccountFreeMargin() / margin;
lot = MathFloor(lots/lotstep + 0.5) * lotstep;
if (lot < lotmin)
lot = lotmin;
if (lot > lotmax)
lot = lotmax;
return (lot);
}
void Screenshot(string moment_name)
{
if ( WriteScreenshots )
WindowScreenShot(WindowExpertName()+"_"+Symbol()+"_M"+Period()+"_"+
Year()+"-"+two_digits(Month())+"-"+two_digits(Day())+"_"+
two_digits(Hour())+"-"+two_digits(Minute())+"-"+two_digits(Seconds())+"_"+
moment_name+".gif", 1024, 768);
}
string two_digits(int i)
{
if (i < 10)
return ("0"+i);
else
return (""+i);
}
bool NoOpenPositionsExist(string theComment)
{
int total = OrdersTotal();
for(int i = 0; i < total; i++)
{
OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
if (OrderMagicNumber() == MagicNumber && OrderSymbol() == Symbol() && OrderComment() == theComment)
{ return (false); }
}
return (true);
}
bool Exit(int ticket, int dir, double volume, color clr, int t = 0) {
int i, j, cmd;
double prc, sl, tp, lots;
string cmt;
bool closed;
Print("Exit("+dir+","+DoubleToStr(volume,3)+","+t+")");
for (i=0; i<RETRYCOUNT; i++) {
for (j=0; (j<50) && IsTradeContextBusy(); j++)
Sleep(100);
RefreshRates();
if (dir == LONG) {
prc = Bid;
}
if (dir == SHORT) {
prc = Ask;
}
Print("Exit: prc="+DoubleToStr(prc,Digits));
closed = OrderClose(ticket,volume,prc,Slippage,clr);
if (closed) {
Print("Trade closed");
Screenshot("Exit");
return (true);
}
Print("Exit: error \'"+ErrorDescription(GetLastError())+"\' when exiting with "+DoubleToStr(volume,3)+" @"+DoubleToStr(prc,Digits));
Sleep(RETRYDELAY);
}
Print("Exit: can\'t enter after "+RETRYCOUNT+" retries");
return (false);
}
string ConvertPeriod(int period) {
string retVal;
if(period == 0 ) { period = Period(); }
switch(period) {
case PERIOD_M1:
retVal = "M1";
break;
case PERIOD_M5:
retVal = "M5";
break;
case PERIOD_M15:
retVal = "M15";
break;
case PERIOD_M30:
retVal = "M30";
break;
case PERIOD_H1:
retVal = "H1";
break;
case PERIOD_H4:
retVal = "H4";
break;
case PERIOD_D1:
retVal = "D1";
break;
case PERIOD_W1:
retVal = "W1";
break;
case PERIOD_MN1:
retVal = "MN1";
break;
}
return(retVal);
}
string ErrorDescription(int error_code)
{
string error_string;
switch( error_code ) {
case 0:
case 1: error_string="no error"; break;
case 2: error_string="common error"; break;
case 3: error_string="invalid trade parameters"; break;
case 4: error_string="trade server is busy"; break;
case 5: error_string="old version of the client terminal"; break;
case 6: error_string="no connection with trade server"; break;
case 7: error_string="not enough rights"; break;
case 8: error_string="too frequent requests"; break;
case 9: error_string="malfunctional trade operation (never returned error)"; break;
case 64: error_string="account disabled"; break;
case 65: error_string="invalid account"; break;
case 128: error_string="trade timeout"; break;
case 129: error_string="invalid price"; break;
case 130: error_string="invalid stops"; break;
case 131: error_string="invalid trade volume"; break;
case 132: error_string="market is closed"; break;
case 133: error_string="trade is disabled"; break;
case 134: error_string="not enough money"; break;
case 135: error_string="price changed"; break;
case 136: error_string="off quotes"; break;
case 137: error_string="broker is busy (never returned error)"; break;
case 138: error_string="requote"; break;
case 139: error_string="order is locked"; break;
case 140: error_string="long positions only allowed"; break;
case 141: error_string="too many requests"; break;
case 145: error_string="modification denied because order too close to market"; break;
case 146: error_string="trade context is busy"; break;
case 147: error_string="expirations are denied by broker"; break;
case 148: error_string="amount of open and pending orders has reached the limit"; break;
case 149: error_string="hedging is prohibited"; break;
case 150: error_string="prohibited by FIПоказано первые 50% кода (символов: 15874)
Открыть по тарифу
Купите тариф с пакетом открытий или войдите, если тариф уже есть. Открытый файл останется в вашем кабинете навсегда.
Разовая покупка файла
На этой странице откроется полный исходный код файла вместо ознакомительного фрагмента.
Зачем нужен email? После подтверждения оплаты файл сохранится в кабинете на этот email. Если аккаунта ещё нет, мы создадим его и пришлём ссылку для задания пароля. Если аккаунт уже есть, покупка добавится в него. Укажите адрес, к которому у вас есть доступ.
Чтобы оформить заказ, введите email и перейдите к оплате.