← К каталогу
Исходный код · ID 655

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 и перейдите к оплате.

Стоимость полного кода
1 587,40₽ ≈ $19.40