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

ea_price_action_v6_grid.mq4

Похожие материалы по тегам

ea robofibo source v.11.2.mq4MQL4 / MetaTrader 4 · 3 общих теговmarket crusher ea guidlines.txtMQL · 3 общих тегов2 to 1 strategy with signals.pineTradingView · 3 общих теговfresh algo signals & overlays v25_6334471093901859175.pineTradingView · 3 общих теговfresh algo v24 tradingview indicator_5918156155804195406.pineTradingView · 3 общих теговtrading criteria.mq4MQL4 / MetaTrader 4 · 3 общих тегов
Вы автор или правообладатель?

Сообщите нам, если считаете, что материал размещён без разрешения.

Краткий обзор

О программе

Данный код представляет собой Expert Advisor (советник) для платформы MetaTrader 4, написанный на языке MQL4. Это не индикатор и не библиотека, а полноценный торговый советник, предназначенный для автоматической торговли на рынке Форекс. Программа реализует стратегию Price Action Scalping с множеством встроенных инструментов управления рисками и фильтров.

Советник поддерживает сеточную торговлю (Grid) с возможностью открытия лимитных и стоп-ордеров, усечение убытков по брейк-эвену (Breakeven), а также скользящий стоп-лосс (Trailing Stop). Для фильтрации сигналов используются RSI, EMA (быстрая/медленная) и MACD. Дополнительно реализован фильтр торговых новостей с загрузкой данных из внешнего источника и ограничениями по времени до/после важных событий.

Система управления рисками включает контроль дневной прибыли и убытков (по деньгам или процентам от баланса), настройку объёма лотов (фиксированный или с мультипликатором), ограничение по количеству уровней сетки, а также возможность принудительного закрытия всех позиций при достижении заданных финансовых лимитов. Время торговли ограничивается настраиваемыми часами начала и окончания.

Настройки программы

НастройкаОписание
SimpleForexTeam__ Информация команды — Информационный текст команды разработчика.
EA_Name Имя советника — Имя советника, отображаемое в интерфейсе.
Use_TradeAgain Описание повторной торговли — Описание параметра повторной торговли.
TradeAgain Повторная торговля — Если TRUE — советник продолжает торговлю повторно, если FALSE — отключается.
Use_Loop Описание циклов — Описание параметра количества циклов торговли.
Loop Количество циклов — Количество циклов/проходов торговли в рамках одной сессии.
StartTrade Час начала торговли — Час начала разрешённой торговой сессии (0–24).
EndTrade Час окончания торговли — Час окончания разрешённой торговой сессии (0–24).
RSI_Filter Фильтр RSI включён — Включение/отключение фильтра по индексу RSI.
RSI_Period Период RSI — Период расчёта индекса RSI.
RSI_Price Тип цены RSI — Тип цены для расчёта RSI (Close, Open, High, Low и др.).
RSI_High RSI верхний уровень — Верхний порог RSI для фильтрации перекупленности.
RSI_Low RSI нижний уровень — Нижний порог RSI для фильтрации перепроданности.
Use_DbLots Описание расчёта лотов — Описание режима расчёта лотов: мультипликатор или фиксированное значение.
DbLots Тип расчёта лотов — Режим расчёта лотов: 1 — с использованием мультипликатора, 2 — фиксированный лот.
Lots Объём лота — Начальный фиксированный объём лота для открытия позиций.
SL Стоп-лосс (пункты) — Стоп-лосс в пунктах для основных позиций (0 = без стоп-лосса).
TP Тейк-профит (пункты) — Тейк-профит в пунктах для основных позиций.
Distance Расстояние открытия — Расстояние в пунктах для открытия позиций в основной стратегии.
Multiplier Множитель лота — Множитель увеличения лота при повторном открытии позиций.
MaxLevel Макс. уровень — Максимальный уровень сетки, при котором активны сигналы на открытие.
LotsDecimal Знаки лота — Количество знаков после запятой для округления размера лота.
MagicNumber Магический номер — Уникальный магический номер для идентификации ордеров данного советника.
EMA_Filter_On Включить фильтр EMA — Включение/отключение фильтра по скользящим средним EMA.
EMA_Fast_Period Период быстрой EMA — Период быстрой скользящей средней EMA для фильтра направления тренда.
EMA_Slow_Period Период медленной EMA — Период медленной скользящей средней EMA для фильтра направления тренда.
tmacd Заголовок MACD — Заголовок секции настроек MACD.
macd_filter_on Фильтр MACD включён — Включение/отключение фильтра по индикатору MACD.
macd_fast_periods Быстрый период MACD — Быстрый период MACD для фильтра направления тренда.
macd_slow_periods Медленный период MACD — Медленный период MACD для фильтра направления тренда.
macd_signal_periods Период сигнальной MACD — Период сигнальной линии MACD.
EA_Comment Комментарий к ордерам — Комментарий, добавляемый к ордерам в истории сделок.
MoneyPerLot Деньги на лот — Сумма в долларах на один лот для расчёта рибейта.
TNEWS Заголовок новостей — Заголовок секции настроек новостей.
NEWS_FILTER_ON Фильтр новостей включён — Включение/отключение фильтрации торговых новостей.
NEWS_IMPOTANCE_LOW Важность: Низкая — Включение/отключение учёта новостей низкой важности в фильтре.
NEWS_IMPOTANCE_MEDIUM Важность: Средняя — Включение/отключение учёта новостей средней важности в фильтре.
NEWS_IMPOTANCE_HIGH Важность: Высокая — Включение/отключение учёта новостей высокой важности в фильтре.
STOP_BEFORE_NEWS Мин. пауза до новости — Количество минут до начала новости, в течение которых торговля запрещена.
START_AFTER_NEWS Мин. пауза после новости — Количество минут после завершения новости, в течение которых торговля запрещена.
Currencies_Check Проверка валют — Список валют для фильтрации новостей через запятую.
DRAW_NEWS_CHART Показывать новости на графике — Отображение предстоящих новостей на графике в виде текстовых меток.
News_Font Шрифт новостей — Шрифт текстовых меток новостей на графике.
Font_Color Цвет шрифта новостей — Цвет шрифта текстовых меток новостей на графике.
DRAW_NEWS_LINES Рисовать линии новостей — Отрисовка вертикальных линий на графике в момент наступления новостей.
Line_Color Цвет линий новостей — Цвет вертикальных линий новостей на графике.
Tlimits Заголовок дневных лимитов — Заголовок секции настроек дневных лимитов.
uDailyProfitOn Контроль дневной прибыли включён — Включение/отключение контроля дневной прибыли.
limitProfitMode Режим контроля прибыли — Режим контроля дневной прибыли: по сумме или по проценту от баланса.
uDayLimitProfit Макс. дневная прибыль — Максимальная дневная прибыль в долларах или процентах (в зависимости от режима).
uDailyLossOn Контроль дневного убытка включён — Включение/отключение контроля дневного убытка.
limitLossMode Режим контроля убытка — Режим контроля дневного убытка: по сумме или по проценту от баланса.
uDayLimitLoss Макс. дневной убыток — Максимальный дневной убыток в долларах или процентах (в зависимости от режима).
uConsiderFloatting Учитывать плавающий доход — Учёт плавающего (незакрытого) дохода при расчёте дневных лимитов.
TtpOptions Заголовок закрытия — Заголовок секции настроек принудительного закрытия.
closeAllControlON Принудительное закрытие включено — Включение/отключение системы принудительного закрытия всех позиций по финансовым лимитам.
closeBy Режим закрытия — Режим принудительного закрытия: по деньгам, по проценту от баланса или по пипсам.
closeAllMoney Закрытие по деньгам (прибыль) — Сумма в долларах для принудительного закрытия при достижении прибыли (режим CloseByMoney).
closeAllMoneyLoss Закрытие по деньгам (убыток) — Сумма в долларах для принудительного закрытия при достижении убытка (режим CloseByMoney).
closeByPipsWin Пипсы прибыли для закрытия — Количество пипсов прибыли для принудительного закрытия (режим CloseByPips).
closeByPipsLoss Пипсы убытка для закрытия — Количество пипсов убытка для принудительного закрытия (режим CloseByPips).
Tbk Заголовок брейк-эвана — Заголовок секции настроек брейк-эвана.
breakevenOn Брейк-эван включён — Включение/отключение функции брейк-эвана для перевода убыточных позиций в безубыточные.
userBkvPips Пипсы брейк-эвана — Количество пипсов движения цены для активации брейк-эвана.
tTailingStop Заголовок Trailing Stop — Заголовок секции настроек скользящего стоп-лосса.
TslON Trailing Stop включён — Включение/отключение скользящего стоп-лосса (Trailing Stop).
userTslInitialStep Начальный шаг TSL — Начальный шаг в пунктах для активации скользящего стоп-лосса.
userTslStep Шаг TSL — Шаг в пунктах для каждого последующего перемещения стоп-лосса.
userTslDistance Расстояние TSL — Расстояние в пунктах для скользящего стоп-лосса (Trailing Stop Distance).
tGrid Заголовок сетки — Заголовок секции настроек сетки.
GridON Сетка включена — Включение/отключение сеточной торговли.
uGridType Тип сетки — Тип сетки: limit (лимитные ордера) или stop (стоп-ордера).
GridUser_maxCount Макс. количество уровней сетки — Максимальное количество попыток открытия ордеров в сетке.
GridUser_maxLot Макс. лот сетки — Максимальное значение лота для ордеров сетки.
GridUser_multiplier Множитель лота сетки — Множитель увеличения лота при каждом новом уровне сетки.
GridUser_gap Шаг сетки (пункты) — Расстояние в пунктах между ордерами сетки.
closeGridOn Сетка закрытия включена — Включение/отключение сетки принудительного закрытия позиций по финансовым лимитам.
closeGridTP Сетка: тейк-профит ($) — Прибыль в долларах для принудительного закрытия сетки (Take Profit Grid).
closeGridSL Сетка: стоп-лосс ($) — Убыток в долларах для принудительного закрытия сетки (Stop Loss Grid).
Получить полный код

Поиск по коду файла

#property version "1.0"
#property strict

#define NEWS_FILTER
#define DAILY_LIMITS
#define CLOSE_ALL_ON
#define BREAKEVEN_ON
#define TRAILING_STOP_ON

enum TSLMode
  {
   byPips,  // By Pips
   byMA     // By Moving Average
  };
enum CloseAllMode
  {
   CloseByMoney,           // by Money
   CloseByAccountPercent,  // by Account Percent
   CloseByPips             // By Pips
  };

input string SimpleForexTeam__ = "free tools for forex! Join our channel for more free eas";
input string The_our_telegram = "";
extern string EA_Name = "EA HOKKYDJONG";
extern string Use_TradeAgain = "If => TRUE,EA will trade again,If => FALSE => EA will Off";
extern bool   TradeAgain = TRUE;
extern string Use_Loop = "Example = 10,EA will trader for 10 Laps";
extern int    Loop = 10000;
int           Gi_108;
extern int    StartTrade = 0;
extern int    EndTrade = 24;

extern bool   RSI_Filter = true;
extern int    RSI_Period = 14;
extern ENUM_APPLIED_PRICE RSI_Price = PRICE_CLOSE;
extern int RSI_High = 70;
extern int RSI_Low = 30;
extern string Use_DbLots = "If = 1-> Use Multiplier Lot, If = 2-> Use Fixed Lot";
extern int    DbLots = 1;
extern double Lots = 0.01;
extern double SL = 0.0;
extern double TP = 4.0;
extern double Distance = 3.0;
extern double Multiplier = 1.6;
extern int    MaxLevel = 20;
double        Gd_176 = 3.0;
extern double LotsDecimal = 2.0;
extern int    MagicNumber = 163991;

extern bool   EMA_Filter_On = true;
extern int    EMA_Fast_Period = 12;
extern int    EMA_Slow_Period = 26;
double        EMA_Fast;
double        EMA_Slow;
int           EMA_Filter = 0;

#define MACD_Section
#ifdef MACD_Section

interface iActions { bool execute(); };
interface iConditions { bool evaluate(); };

input string tmacd               = "== MACD Setup =="; // ————————————————————————
input bool   macd_filter_on = false; // MACD Filter On:
input int    macd_fast_periods   = 12;                 // Fast Periods:
input int    macd_slow_periods   = 26;                 // Slow Periods:
input int    macd_signal_periods = 9;                  // MACD Periods:

double macd(int i) { return iMACD(NULL, 0, macd_fast_periods, macd_slow_periods, macd_signal_periods, PRICE_CLOSE, 0, i); }
double macd_signal(int i) { return iMACD(NULL, 0, macd_fast_periods, macd_slow_periods, macd_signal_periods, PRICE_CLOSE, 1, i); }

class ConditionMACDBuy : public iConditions
{
  public:
    bool evaluate()
    {
      if (!macd_filter_on) { return true; }

        double macd5 = macd(5);
        double macd4 = macd(4);
        double macd3 = macd(3);
        double macd2 = macd(2);
        double macd1 = macd(1);

        return macd1 > macd2 && macd2 < macd3 && macd3 < macd4 && macd4 < macd5;
    }
};
ConditionMACDBuy cdMACDBuy;

class ConditionMACDSell : public iConditions
{
  public:
    bool evaluate() {
        if (!macd_filter_on) { return true; }
        double macd5 = macd(5);
        double macd4 = macd(4);
        double macd3 = macd(3);
        double macd2 = macd(2);
        double macd1 = macd(1);

        return macd1 < macd2 && macd2 > macd3 && macd3 > macd4 && macd4 > macd5;
    }
};
ConditionMACDSell cdMACDSell;

#endif

extern string EA_Comment = "ea_hokkydjong";
double        Gd_unused_204 = 0.0;
double        G_price_212;
double        G_price_220;
double        G_bid_228;
double        G_ask_236;
double        Gd_244;
double        Gd_252;
bool          Gi_260;
datetime      G_time_264 = 0;
int           Gi_268 = 0;
double        lots;
int           G_pos_280 = 0;
int           Gi_284;
double        Gd_288 = 0.0;
bool          Gi_296 = FALSE;
bool          Gi_300 = FALSE;
bool          Gi_304 = FALSE;
int           Gi_308;
bool          Gi_312 = FALSE;
double        Gd_316;
int           Gi_324 = 65535;
int           Gi_328 = 65535;
int           Gi_332 = 16776960;
double        Gd_336;
extern double MoneyPerLot = 1.7;
int     magico = MagicNumber;

#ifdef NEWS_FILTER

input string TNEWS = "== News Setup ==";  // ????????????
input string note = ""; // You Must to allow this URL:
input bool               NEWS_FILTER_ON = false;                      // News Filter On
input bool               NEWS_IMPOTANCE_LOW = false;                     // Low
input bool               NEWS_IMPOTANCE_MEDIUM = true;                      // Medium
input bool               NEWS_IMPOTANCE_HIGH = true;                      // High
input int                STOP_BEFORE_NEWS = 30;                        // Minutes Stop Before News
input int                START_AFTER_NEWS = 30;                        // Minutes Stop After News
input string             Currencies_Check = "USD,EUR,CAD,AUD,NZD,GBP"; // Currencys
bool               Check_Specific_News = false;
string             Specific_News_Text = "employment";
input bool               DRAW_NEWS_CHART = true; // Show Up comming News
int                X = 10;//Chart X-Axis Position
int                Y = 280;//Chart Y-Axis Position
input string             News_Font = "Arial"; // Font
input color              Font_Color = clrBlack; // Font Color
input bool               DRAW_NEWS_LINES = false; // Draw Lines News
input color              Line_Color = clrBlack; // Line Color
ENUM_LINE_STYLE    Line_Style = STYLE_DOT;
int                Line_Width = 1;
int Font_Size = 8;
string LANG = "en-US";

datetime date;
int TIME_CORRECTION, NEWS_ON = 0;

class News
  {

public:
                     News() { ; }
                    ~News() { ; }

   bool              StopForNews() { if(NEWS_ON == 1) {return true;} return false; }

   struct sNews
     {
      datetime          dTime;
      string            time;
      string            currency;
      string            importance;
      string            news;
      string            Actual;
      string            forecast;
      string            previus;
     };
   sNews NEWS_TABLE  [], HEADS;

   int               OnInit()
     {
      // код доступен только после оплаты
   }

   void              OnDeinit(const int reason)
     {
      DEINIT_PANEL();
      EventKillTimer();
     }

   void              OnTimer()
     {
      OnTick();
      if(NEWS_FILTER_ON == false)
         return;
      static int waiting = 0;
      if(waiting <= 0)
        {
         if(!MQLInfoInteger(MQL_TESTER) || !MQLInfoInteger(MQL_OPTIMIZATION))
           {
            if(READ_NEWS(NEWS_TABLE))
               waiting = 100;
            if(ArraySize(NEWS_TABLE) <= 0)
               return;
            DRAW_NEWS(NEWS_TABLE);
           }
        }
      else
         waiting--;
      if(ArraySize(NEWS_TABLE) <= 0)
         return;
      datetime time = TimeCurrent();

      for(int i = 0; i < ArraySize(NEWS_TABLE); i++)
        {
         datetime news_time = NEWS_TABLE[i].dTime + TIME_CORRECTION;
         bool Importance_Check = false;
         if((!NEWS_IMPOTANCE_LOW && NEWS_TABLE[i].importance == "*") ||
            (!NEWS_IMPOTANCE_MEDIUM && NEWS_TABLE[i].importance == "* *") ||
            (!NEWS_IMPOTANCE_HIGH && NEWS_TABLE[i].importance == "* * *"))
            Importance_Check = true;
         if(Importance_Check || StringFind(Currencies_Check, NEWS_TABLE[i].currency, 0) == -1 || (Check_Specific_News && (StringFind(NEWS_TABLE[i].news, Specific_News_Text) == -1)))
            continue;
         if((news_time <= time && (news_time + (datetime)(START_AFTER_NEWS * 60)) >= time) ||
            (news_time >= time && (news_time - (datetime)(STOP_BEFORE_NEWS * 60)) <= time))
           {
            NEWS_ON = 1;
            Comment("News Time...");
            break;
           }
         else
           {
            NEWS_ON = 0;
            Comment("No News");
           }
        }
      return;
     }

   void              OnTick()
     {
      // код доступен только после оплаты
   }

   void              DEL_ROW(sNews& l_a_news [], int row)
     {
      int size = ArraySize(l_a_news) - 1;
      for(int i = row; i < size; i++)
        {
         l_a_news[i].Actual = l_a_news[i + 1].Actual;
         l_a_news[i].currency = l_a_news[i + 1].currency;
         l_a_news[i].dTime = l_a_news[i + 1].dTime;
         l_a_news[i].forecast = l_a_news[i + 1].forecast;
         l_a_news[i].importance = l_a_news[i + 1].importance;
         l_a_news[i].news = l_a_news[i + 1].news;
         l_a_news[i].previus = l_a_news[i + 1].previus;
         l_a_news[i].time = l_a_news[i + 1].time;
        }
      ArrayResize(l_a_news, size);
     }

   bool              READ_NEWS(sNews& l_NewsTable [])
     {
      string cookie = NULL, referer = NULL, headers;
      char post [], result [];
      string tmpStr = "";
      string st_date = TimeToString(TimeCurrent(), TIME_DATE), end_date = TimeToString((TimeCurrent() + (datetime)(7 * 24 * 60 * 60)), TIME_DATE);
      StringReplace(st_date, ".", "");
      StringReplace(end_date, ".", "");
      string url = "" + LANG + "&view=range&start=" + st_date + "&end=" + end_date + "&timezone=UTC" + "&columns=date%2Ctime%2Ccountry%2Ccountrycurrency%2Cevent%2Cconsensus%2Cprevious%2Cvolatility%2Cactual&showcountryname=false&showcurrencyname=true&isfree=true&_=1455009216444";
      ResetLastError();
      WebRequest("GET", url, cookie, referer, 10000, post, sizeof(post), result, headers);
      if(ArraySize(result) <= 0)
        {
         int er = GetLastError();
         ResetLastError();
         Print("ERROR_TXT IN WebRequest");
         if(er == 4060)
            MessageBox("YOU MUST ADD THE ADDRESS '" + "" + "' IN THE LIST OF ALLOWED URL IN THE TAB 'ADVISERS'", "ERROR_TXT", MB_ICONINFORMATION);
         return false;
        }
      tmpStr = CharArrayToString(result, 0, WHOLE_ARRAY, CP_UTF8);
      int handl = FileOpen("News.txt", FILE_WRITE | FILE_TXT);
      FileWrite(handl, tmpStr);
      FileFlush(handl);
      FileClose(handl);
      StringReplace(tmpStr, "&#39;", "'");
      StringReplace(tmpStr, "&#163;", "");
      StringReplace(tmpStr, "&#165;", "");
      StringReplace(tmpStr, "&amp;", "&");
      int st = StringFind(tmpStr, "fxst-thevent", 0);
      st = StringFind(tmpStr, ">", st) + 1;
      int end = StringFind(tmpStr, "</th>", st);
      HEADS.news = (st < end ? StringSubstr(tmpStr, st, end - st) : "");
      st = StringFind(tmpStr, "fxst-thvolatility", 0);
      st = StringFind(tmpStr, ">", st) + 1;
      end = StringFind(tmpStr, "</th>", st);
      HEADS.importance = (st < end ? StringSubstr(tmpStr, st, fmin(end - st, 8)) : "");
      st = StringFind(tmpStr, "fxst-thactual", 0);
      st = StringFind(tmpStr, ">", st) + 1;
      end = StringFind(tmpStr, "</th>", st);
      HEADS.Actual = (st < end ? StringSubstr(tmpStr, st, fmin(end - st, 8)) : "");
      st = StringFind(tmpStr, "fxst-thconsensus", 0);
      st = StringFind(tmpStr, ">", st) + 1;
      end = StringFind(tmpStr, "</th>", st);
      HEADS.forecast = (st < end ? StringSubstr(tmpStr, st, fmin(end - st, 8)) : "");
      st = StringFind(tmpStr, "fxst-thprevious", 0);
      st = StringFind(tmpStr, ">", st) + 1;
      end = StringFind(tmpStr, "</th>", st);
      HEADS.previus = (st < end ? StringSubstr(tmpStr, st, end - st) : "");
      HEADS.currency = "";
      HEADS.dTime = 0;
      HEADS.time = "";
      int startLoad = StringFind(tmpStr, "<tbody>", 0) + 7;
      int endLoad = StringFind(tmpStr, "</tbody>", startLoad);
      if(startLoad >= 0 && endLoad > startLoad)
        {
         tmpStr = StringSubstr(tmpStr, startLoad, endLoad - startLoad);
         while(StringReplace(tmpStr, "  ", " "));
        }
      else
         return false;
      int begin = -1;
      do
        {
         begin = StringFind(tmpStr, "<span", 0);
         if(begin >= 0)
           {
            end = StringFind(tmpStr, "</span>", begin) + 7;
            tmpStr = StringSubstr(tmpStr, 0, begin) + StringSubstr(tmpStr, end);
           }
        }
      while(begin >= 0);
      StringReplace(tmpStr, "<strong>", NULL);
      StringReplace(tmpStr, "</strong>", NULL);
      int BackShift = 0;
      string arNews [];
      for(uchar tr = 1; tr < 255; tr++)
        {
         if(StringFind(tmpStr, CharToString(tr), 0) > 0)
            continue;
         int K = StringReplace(tmpStr, "</tr>", CharToString(tr));

         K = StringSplit(tmpStr, tr, arNews);
         ArrayResize(l_NewsTable, K);
         for(int td = 0; td < ArraySize(arNews); td++)
           {
            st = StringFind(arNews[td], "fxst-td-date", 0);
            if(st > 0)
              {
               st = StringFind(arNews[td], ">", st) + 1;
               end = StringFind(arNews[td], "</td>", st) - 1;
               int d = (int) StringToInteger(StringSubstr(arNews[td], end - 4, end - st));
               MqlDateTime time;
               TimeCurrent(time);
               if(d < (time.day - 5))
                 {
                  if(time.mon == 12)
                    {
                     time.mon = 1;
                     time.year++;
                    }
                  else
                    {
                     time.mon++;
                    }
                 }
               time.day = d;
               time.min = 0;
               time.hour = 0;
               time.sec = 0;
               date = StructToTime(time);
               BackShift++;
               continue;
              }
            st = StringFind(arNews[td], "fxst-evenRow", 0);
            if(st < 0)
              {
               BackShift++;
               continue;
              }
            int st1 = StringFind(arNews[td], "fxst-td-time", st);
            st1 = StringFind(arNews[td], ">", st1) + 1;
            end = StringFind(arNews[td], "</td>", st1);
            l_NewsTable[td - BackShift].time = StringSubstr(arNews[td], st1, end - st1);
            if(StringFind(l_NewsTable[td - BackShift].time, ":") > 0)
              {
               l_NewsTable[td - BackShift].dTime = StringToTime(TimeToString(date, TIME_DATE) + " " + StringSubstr(arNews[td], st1, end - st1));
              }
            else
              {
               l_NewsTable[td - BackShift].dTime = date;
              }
            st1 = StringFind(arNews[td], "fxst-td-currency", st);
            st1 = StringFind(arNews[td], ">", st1) + 1;
            end = StringFind(arNews[td], "</td>", st1);
            l_NewsTable[td - BackShift].currency = (st1 < end ? StringSubstr(arNews[td], st1, end - st1) : "");
            st1 = StringFind(arNews[td], "fxst-i-vol", st);
            st1 = StringFind(arNews[td], ">", st1) + 1;
            end = StringFind(arNews[td], "</td>", st1);
            StringInit(l_NewsTable[td - BackShift].importance, (int) StringToInteger(StringSubstr(arNews[td], st1, end - st1)), '*');
            st1 = StringFind(arNews[td], "fxst-td-event", st);
            int st2 = StringFind(arNews[td], "fxst-eventurl", st1);
            st1 = StringFind(arNews[td], ">", fmax(st1, st2)) + 1;
            end = StringFind(arNews[td], "</td>", st1);
            int end1 = StringFind(arNews[td], "</a>", st1);
            l_NewsTable[td - BackShift].news = StringSubstr(arNews[td], st1, (end1 > 0 ? fmin(end, end1) : end) - st1);
            st1 = StringFind(arNews[td], "fxst-td-act", st);
            st1 = StringFind(arNews[td], ">", st1) + 1;
            end = StringFind(arNews[td], "</td>", st1);
            l_NewsTable[td - BackShift].Actual = (end > st1 ? StringSubstr(arNews[td], st1, end - st1) : "");
            st1 = StringFind(arNews[td], "fxst-td-cons", st);
            st1 = StringFind(arNews[td], ">", st1) + 1;
            end = StringFind(arNews[td], "</td>", st1);
            l_NewsTable[td - BackShift].forecast = (end > st1 ? StringSubstr(arNews[td], st1, end - st1) : "");
            st1 = StringFind(arNews[td], "fxst-td-prev", st);
            st1 = StringFind(arNews[td], ">", st1) + 1;
            end = StringFind(arNews[td], "</td>", st1);
            l_NewsTable[td - BackShift].previus = (end > st1 ? StringSubstr(arNews[td], st1, end - st1) : "");
           }
         break;
        }
      ArrayResize(l_NewsTable, (ArraySize(l_NewsTable) - BackShift));
      return(true);
     }

   void              DRAW_NEWS(sNews& l_a_news [])
     {
      if(DRAW_NEWS_LINES || DRAW_NEWS_CHART)
        {
         if(NEWS_FILTER_ON == false)
            return;
         for(int i = ArraySize(l_a_news) - 1; i >= 0; i--)
           {
            StringReplace(l_a_news[i].currency, " ", "");
            int Currency_check_counter = 0;
            datetime t1 = (l_a_news[i].dTime + (datetime)(START_AFTER_NEWS * 60));
            datetime t2 = ((TimeCurrent() - (datetime) TIME_CORRECTION));
            if(StringFind(Currencies_Check, l_a_news[i].currency) == -1 || t1 < t2 || (Check_Specific_News && (StringFind(l_a_news[i].news, Specific_News_Text) == -1)))
              {
               DEL_ROW(l_a_news, i);
               continue;
              }
            if((!NEWS_IMPOTANCE_LOW && l_a_news[i].importance == "*") ||
               (!NEWS_IMPOTANCE_MEDIUM && l_a_news[i].importance == "* *") ||
               (!NEWS_IMPOTANCE_HIGH && l_a_news[i].importance == "* * *"))
              {
               DEL_ROW(l_a_news, i);
               continue;
              }
            string NAME = (" " + l_a_news[i].currency + " " + l_a_news[i].importance + " " + l_a_news[i].news);
            if(DRAW_NEWS_LINES)
              {
               if(ObjectFind(0, NAME) < 0)
                 {
                  ObjectCreate(0, NAME, OBJ_VLINE, 0, l_a_news[i].dTime + TIME_CORRECTION, 0);
                  ObjectSetInteger(0, NAME, OBJPROP_SELECTABLE, false);
                  ObjectSetInteger(0, NAME, OBJPROP_SELECTED, false);
                  ObjectSetInteger(0, NAME, OBJPROP_HIDDEN, true);
                  ObjectSetInteger(0, NAME, OBJPROP_BACK, false);
                  ObjectSetInteger(0, NAME, OBJPROP_COLOR, Line_Color);
                  ObjectSetInteger(0, NAME, OBJPROP_STYLE, Line_Style);
                  ObjectSetInteger(0, NAME, OBJPROP_WIDTH, Line_Width);
                 }
              }
           }
         string NAME;
         int K = 0, Z = 0;
         if(DRAW_NEWS_CHART)
           {
            for(int l = 1; l <= 9 && Z < ArraySize(l_a_news); l++)
              {
               for(K = Z; K < ArraySize(l_a_news); K++)
                  if(l_a_news[K].currency != "")
                     break;
               Z = K + 1;
               NAME = "PANEL_NEWS_N" + (string) l;
               if(ObjectFind(0, NAME) < 0)
                  OBJECT_LABEL(0, NAME, 0, X + 110, Y - (int)(18 * (l + 5)), CORNER_LEFT_LOWER, ((TimeToString(l_a_news[K].dTime + TIME_CORRECTION, TIME_DATE | TIME_MINUTES) + " " + l_a_news[K].currency + " " + l_a_news[K].importance + " " + l_a_news[K].news)), News_Font, Font_Size, Font_Color, 0, ANCHOR_LEFT_UPPER, false, false, true, 0);
              }
           }
         return;
        }
     }

   void              DEINIT_PANEL()
     {
      ObjectsDeleteAll(0);
     }

   bool              OBJECT_LABEL(const long              CHART_ID = 0,
                                  const string            NAME = "",
                                  const int               SUB_WINDOW = 0,
                                  const int               X_Axis = 0,
                                  const int               Y_Axis = 0,
                                  const ENUM_BASE_CORNER  CORNER = CORNER_LEFT_UPPER,
                                  const string            TEXT = "",
                                  const string            FONT = "",
                                  const int               FONT_SIZE = 10,
                                  const color             CLR = color("255,0,0"),
                                  const double            ANGLE = 0.0,
                                  const ENUM_ANCHOR_POINT ANCHOR = ANCHOR_LEFT_UPPER,
                                  const bool              BACK = false,
                                  const bool              SELECTION = false,
                                  const bool              HIDDEN = true,
                                  const long              ZORDER = 0,
                                  string                  TOOLTIP = "\n")
     {
      ResetLastError();
      if(ObjectFind(0, NAME) < 0)
        {
         ObjectCreate(CHART_ID, NAME, OBJ_LABEL, SUB_WINDOW, 0, 0);
         ObjectSetInteger(CHART_ID, NAME, OBJPROP_XDISTANCE, X_Axis);
         ObjectSetInteger(CHART_ID, NAME, OBJPROP_YDISTANCE, Y_Axis);
         ObjectSetInteger(CHART_ID, NAME, OBJPROP_CORNER, CORNER);
         ObjectSetString(CHART_ID, NAME, OBJPROP_TEXT, TEXT);
         ObjectSetString(CHART_ID, NAME, OBJPROP_FONT, FONT);
         ObjectSetInteger(CHART_ID, NAME, OBJPROP_FONTSIZE, FONT_SIZE);
         ObjectSetDouble(CHART_ID, NAME, OBJPROP_ANGLE, ANGLE);
         ObjectSetInteger(CHART_ID, NAME, OBJPROP_ANCHOR, ANCHOR);
         ObjectSetInteger(CHART_ID, NAME, OBJPROP_COLOR, CLR);
         ObjectSetInteger(CHART_ID, NAME, OBJPROP_BACK, BACK);
         ObjectSetInteger(CHART_ID, NAME, OBJPROP_SELECTABLE, SELECTION);
         ObjectSetInteger(CHART_ID, NAME, OBJPROP_SELECTED, SELECTION);
         ObjectSetInteger(CHART_ID, NAME, OBJPROP_HIDDEN, HIDDEN);
         ObjectSetInteger(CHART_ID, NAME, OBJPROP_ZORDER, ZORDER);
         ObjectSetString(CHART_ID, NAME, OBJPROP_TOOLTIP, TOOLTIP);
        }
      else
        {
         ObjectSetInteger(CHART_ID, NAME, OBJPROP_COLOR, CLR);
         ObjectSetString(CHART_ID, NAME, OBJPROP_TEXT, TEXT);
         ObjectSetInteger(CHART_ID, NAME, OBJPROP_XDISTANCE, X);
         ObjectSetInteger(CHART_ID, NAME, OBJPROP_YDISTANCE, Y);
        }
      return(true);
      ChartRedraw();
     }

  };

News news();

#endif

#ifdef DAILY_LIMITS
enum DayLimitsMode
  {
   LimitsByAmount,         // by Amount
   LimitsByAccountPercent  // by Account %
  };
input string        Tlimits = "== Daily Limits Setup ==";  // ————————————
input bool          uDailyProfitOn = false;                       // Control Daily Profit On:
input DayLimitsMode limitProfitMode = LimitsByAmount;              // Mode to control daily profit:
input double        uDayLimitProfit = 2000;                        // Max Daily Profit ($ or %):
input bool          uDailyLossOn = false;                       // Control Daily Loss On:
input DayLimitsMode limitLossMode = LimitsByAmount;              // Mode to control daily loss:
input double        uDayLimitLoss = -1000;                       // Max Daily Loss ($ or %):
input bool          uConsiderFloatting = false;                       // Consider Floating:
#endif

#ifdef CLOSE_ALL_ON
input string       TtpOptions = "== Close All Options ==";  // ————————————
input bool         closeAllControlON = false;                      // Close All Control On:
input CloseAllMode closeBy = CloseByMoney;               // Close All Mode:
input double       closeAllMoney = 100;                        // Close by Money $:
input double       closeAllMoneyLoss = -100;                       // Close by Money Lossing $:
input double       accountPerWin = 1;                          // Account Percent Win:
input double       accountPerLos = -1;                         // Account Percent Loss:
input double       closeByPipsWin = 10;                         // Close Pips Win:
input double       closeByPipsLoss = 10;                         // Close Pips Loss:
#endif

#ifdef BREAKEVEN_ON
input string Tbk = "== Breakeven Setup ==";  // ————————————
input bool   breakevenOn = false;                    // Breakeven On:
input double userBkvPips = 3;                        // Breakeven Pips
#endif

#ifdef TRAILING_STOP_ON
input string tTailingStop = "== TrailingStop Setup ==";  // ————————————
input bool   TslON = false;                       // TSL ON:
TSLMode      userTslMode = byPips;                      // TSL Mode:
input int    userTslInitialStep = 1;                           // TSL Initial Step:
input int    userTslStep = 1;                           // TSL Step:
input int    userTslDistance = 20;                          // TSL Distance:
#endif

#define GRID_ON
#ifdef GRID_ON

enum GridType
  {
   limit, stop 
  };

input string tGrid                 = "== Grid Setup ==";  // ————————————
input bool   GridON                = false;               // Grid On:
input GridType uGridType           = limit;              // Grid Type: Limit Or Stop
input int      GridUser_maxCount   = 5;                   // Max attempts:
input double   GridUser_maxLot     = 10;                  // Max lot value:
input double   GridUser_multiplier = 1.5;                 // Multiplier:
input int      GridUser_gap        = 30;                  // Gap betwen orders (pips):
input bool     closeGridOn         = true;                // Use Close Grid?
input double   closeGridTP         = 100;                 // Take Profit Grid $
input double   closeGridSL         = -100;                // Stop Loss Grid -$
#endif

bool   filterMagicsOn = true;                    // Use magic number filter?

interface IOrders
  {
public:
   virtual void Add() = 0;
   virtual void Release() = 0;

   virtual bool AddOrder() = 0;
   virtual bool DeleteOrder() = 0;
   virtual bool Select() = 0;
  };

class Order
  {
   int               _id;
   string            _symbol;
   double            _price;
   double            _sl;
   double            _tp;
   double            _lot;
   int               _type;
   int               _magic;
   string            _comment;
   string            _strategy;
   datetime          _expireTime;
   datetime          _signalTime;
   double            _profit;
   double            _tslNext;
   bool              _bkvWasDoIt;
   int               _countPartials;

public:
                     Order(
      int      id,
      string   symbol,
      double   price,
      double   sl,
      double   tp,
      double   lot,
      int      type,
      int      magic,
      string   comment,
      string   strategy,
      datetime expireTime,
      datetime signalTime,
      double   profit,
      double   bkvWasDoIt,
      int      countPartials) : _id(id),
                     _symbol(symbol),
                     _price(price),
                     _sl(sl),
                     _tp(tp),
                     _lot(lot),
                     _type(type),
                     _magic(magic),
                     _comment(comment),
                     _strategy(strategy),
                     _expireTime(expireTime),
                     _signalTime(signalTime),
                     _profit(profit),
                     _bkvWasDoIt(bkvWasDoIt),
                     _countPartials(countPartials)
     {}

                     Order() {}
                    ~Order() {}

   Order*            id(int id) { _id = id; return &this; }
   Order*            symbol(string symbol) { _symbol = symbol; return &this; }
   Order*            price(double price) { _price = price; return &this; }
   Order*            sl(double sl) { _sl = sl; return &this; }
   Order*            tp(double tp) { _tp = tp; return &this; }
   Order*            lot(double lot) { _lot = lot; return &this; }
   Order*            type(int type) { _type = type; return &this; }
   Order*            magic(int magic) { _magic = magic; return &this; }
   Order*            comment(string comment) { _comment = comment; return &this; }
   Order*            expireTime(datetime expireTm) { _expireTime = expireTm; return &this; }
   Order*            signalTime(datetime signalTm) { _signalTime = signalTm; return &this; }
   Order*            profit(double profit) { _profit = profit; return &this; }
   Order*            strategy(string strategy) { _strategy = strategy; return &this; }
   Order*            tslNext(double tslNext) { _tslNext = tslNext; return &this; }
   Order*            breakevenWasDoIt(bool bkvWasDoIt) { _bkvWasDoIt = bkvWasDoIt; return &this; }
   Order*            countPartials(int count) { _countPartials = _countPartials + count; return &this; }

   int               id() { return _id; }
   string            symbol() { return _symbol; }
   double            price() { return _price; }
   double            sl() { return _sl; }
   double            tp() { return _tp; }
   double            lot() { return _lot; }
   int               type() { return _type; }
   int               magic() { return _magic; }
   string            comment() { return _comment; }
   string            strategy() { return _strategy; }
   datetime          expireTime() { return _expireTime; }
   datetime          signalTime() { return _signalTime; }
   double            profit() { if(OrderSelect(_id, SELECT_BY_TICKET)) return OrderProfit(); return -1; }
   double            tslNext() { return _tslNext; }
   double            breakevenWasDoIt() { return _bkvWasDoIt; }
   int               countPartials() { return _countPartials; }
  };

class FilterBySymbols
  {
   string _symbols   [];

public:
                     FilterBySymbols(string userSymbols) { getSymbols(userSymbols); }
                    ~FilterBySymbols() { ; }

   void              getSymbols(string userSymbols)
     {
      string Simbolos [];
      string sep = ",";
      ushort u_sep;
      u_sep = StringGetCharacter(sep, 0);
      int k = StringSplit(userSymbols, u_sep, Simbolos);
      ArrayResize(_symbols, ArrayRange(Simbolos, 0), 0);
      for(int i = 0; i < ArrayRange(Simbolos, 0); i++)
        {
         _symbols[i] = Simbolos[i];
        }
      printSymbols();
     }

   bool              control(const string symbolToControl)
     {
      if(ArraySize(_symbols) > 0)
        {
         for(int i = 0; i < ArraySize(_symbols); i++)
           {
            if(_symbols[i] == symbolToControl)
              {
               return true;
              }
           }
        }
      return false;
     }

   void              printSymbols()
     {
      for(int i = 0; i < ArraySize(_symbols); i++)
        {
         Print(_symbols[i]);
        }
     }

  };

class FilterByMagics
  {
   int _magics       [];

public:
                     FilterByMagics(string userMagics) { getMagics(userMagics); }
                    ~FilterByMagics() { ; }

   void              getMagics(string userMagics)
     {
      string Magicos [];
      string sep = ",";
      ushort u_sep;
      u_sep = StringGetCharacter(sep, 0);
      int k = StringSplit(userMagics, u_sep, Magicos);
      ArrayResize(_magics, ArrayRange(Magicos, 0), 0);
      for(int i = 0; i < ArrayRange(Magicos, 0); i++)
        {
         _magics[i] = (int) Magicos[i];
        }
      if(ArrayRange(_magics, 0) > 0)
        {
         ArraySort(_magics, WHOLE_ARRAY, 0, MODE_ASCEND);
        }
      printMagics();
     }

   bool              control(const int magicToControl)
     {
      if(ArraySize(_magics) > 0)
        {
         int p = ArrayBsearch(_magics, magicToControl, WHOLE_ARRAY, 0, MODE_ASCEND);
         if(_magics[p] == magicToControl)
           {
            return true;
           }
        }
      return false;
     }

   void              printMagics()
     {
      for(int i = 0; i < ArraySize(_magics); i++)
        {
         Print(_magics[i]);
        }
     }

  };

class OrdersList
  {
   Order* orders     [];
   bool              _filterByMagicOn;
   bool              _filterBySymbolsOn;
   FilterByMagics*   _magics;
   FilterBySymbols*  _symbols;

public:
                     OrdersList() { ; }
                     OrdersList(bool uFilterByMagicOn, string uMagics, bool uFilterBySymbolsOn, string uSymbols)
     {
      _filterByMagicOn = uFilterByMagicOn;
      _filterBySymbolsOn = uFilterBySymbolsOn;
      _magics = new FilterByMagics(uMagics);
      _symbols = new FilterBySymbols(uSymbols);
      Print("New OrderList Created");
     }
                    ~OrdersList()
     {
      delete _magics;
      delete _symbols;
      clearList();
     }

   void              setOrdersList(bool magicOn, string magics, bool symbolsOn, string symbols)
     {
      _filterByMagicOn = magicOn;
      _filterBySymbolsOn = symbolsOn;
      _magics = new FilterByMagics(magics);
      _symbols = new FilterBySymbols(symbols);
     }

   bool              AddOrder(Order* order)
     {
      int t = ArraySize(orders);
      if(ArrayResize(orders, t + 1))
        {
         orders[t] = order;
         return true;
        }
      return false;
     }

   void              GetMarketOrders()
     {
      for(int i = OrdersTotal() - 1; i >= 0; i--)
        {
         if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
           {
            if(_filterByMagicOn)
               if(!_magics.control(OrderMagicNumber()))
                 {
                  continue;
                 }
            if(_filterBySymbolsOn)
               if(!_symbols.control(OrderSymbol()))
                 {
                  continue;
                 }
            if(exist(OrderTicket()) == true)
              {
               continue;
              }
            Order* newOrder = new Order();
            newOrder
            .id(OrderTicket())
            .symbol(OrderSymbol())
            .price(OrderOpenPrice())
            .sl(OrderStopLoss())
            .tp(OrderTakeProfit())
            .lot(OrderLots())
            .type(OrderType())
            .magic(OrderMagicNumber())
            .comment(OrderComment())
            .expireTime(OrderExpiration())
            .profit(OrderProfit())
            .breakevenWasDoIt(false)
            .countPartials(0);
            if(AddOrder(newOrder))
              {
               PrintOrder(i);
              }
           }
        }
     }

   bool              GetLastMarketOrder()
     {
      for(int i = OrdersTotal() - 1; i >= 0; i--)
        {
         if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
           {
            if(_filterByMagicOn)
               if(!_magics.control(OrderMagicNumber()))
                 {
                  continue;
                 }
            if(_filterBySymbolsOn)
               if(!_symbols.control(OrderSymbol()))
                 {
                  continue;
                 }
            if(exist(OrderTicket()) == true)
              {
               continue;
              }
            Order* newOrder = new Order();
            newOrder
            .id(OrderTicket())
            .symbol(OrderSymbol())
            .price(OrderOpenPrice())
            .sl(OrderStopLoss())
            .tp(OrderTakeProfit())
            .lot(OrderLots())
            .type(OrderType())
            .magic(OrderMagicNumber())
            .comment(OrderComment())
            .expireTime(OrderExpiration())
            .profit(OrderProfit())
            .breakevenWasDoIt(false)
            .countPartials(0);
            if(AddOrder(newOrder))
              {
               Print(__FUNCTION__, " ", "* Nueva Orden De Mercado * ", id(i), "magic: ", magic(i));

               return true;
              }
           }
         return false;
        }
      return false;
     }

   bool              exist(int id)
     {
      for(int i = qnt() - 1; i >= 0; i--)
        {
         if(id(i) == id)
           {
            return true;
           }
        }
      return false;
     }

   bool              deleteOrder(int index)
     {
      if(notOverFlow(index))
        {
         delete orders[index];
        }
      if(qnt() > index)
        {
         for(int i = index; i < qnt() - 1; i++)
           {
            orders[i] = orders[i + 1];
           }
         ArrayResize(orders, qnt() - 1);
         return true;
        }
      return false;
     }

   void              clearList()
     {
      for(int i = 0; i < qnt(); i++)
        {
         if(CheckPointer(orders[i]) != POINTER_INVALID)
           {
            deleteOrder(i);
           }
        }
     }

   Order*            last()
     {
      int lastIndex = ArraySize(orders) - 1;
      if(lastIndex == -1)
        {
         return NULL;
        }
      return GetPointer(orders[lastIndex]);
     }

   Order*            index(int in)
     {
      if(CheckPointer(orders[in]) == POINTER_INVALID)
        {
         return NULL;
        }
      return GetPointer(orders[in]);
     }

   int               lastId()
     {
      int lastIndex = ArraySize(orders) - 1;
      return orders[lastIndex].id();
     }

   bool              notOverFlow(int index)
     {
      if(index > ArraySize(orders) - 1)
         return false;
      if(index < 0)
         return false;
      if(CheckPointer(orders[index]) == POINTER_INVALID)
         return false;
      return true;
     }

   int               qnt()
     {
      return ArraySize(orders);
     }

   int               id(int index)
     {
      if(notOverFlow(index))
        {
         return orders[index].id();
        }
      return -1;
     }
   string            symbol(int index)
     {
      if(notOverFlow(index))
        {
         return orders[index].symbol();
        }
      return "";
     }
   double            price(int index)
     {
      if(notOverFlow(index))
        {
         return orders[index].price();
        }
      return -1;
     }
   double            sl(int index)
     {
      if(notOverFlow(index))
        {
         return orders[index].sl();
        }
      return -1;
     }
   double            tp(int index)
     {
      if(notOverFlow(index))
        {
         return orders[index].tp();
        }
      return -1;
     }
   double            lot(int index)
     {
      if(notOverFlow(index))
        {
         return orders[index].lot();
        }
      return -1;
     }
   int               magic(int index)
     {
      if(notOverFlow(index))
        {
         return orders[index].magic();
        }
      return -1;
     }
   datetime          expire(int index)
     {
      if(notOverFlow(index))
        {
         return orders[index].expireTime();
        }
      return -1;
     }
   datetime          signalTime(int index)
     {
      if(notOverFlow(index))
        {
         return orders[index].signalTime();
        }
      return -1;
     }
   string            comment(int index)
     {
      if(notOverFlow(index))
        {
         return orders[index].comment();
        }
      return "";
     }
   ENUM_ORDER_TYPE   type(int index)
     {
      if(notOverFlow(index))
        {
         return orders[index].type();
        }
      return -1;
     }
   double            profit(int index)
     {
      if(notOverFlow(index))
        {
         return orders[index].profit();
        }
      return -1;
     }

   bool              isClose(int index)
     {
      if(notOverFlow(index))
        {
         if(OrderSelect(id(index), SELECT_BY_TICKET))
           {
            if(OrderCloseTime() != 0)
               return true;
           }
        }
      return false;
     }

   void              cleanCloseOrders()
     {
      if(qnt() == 0)
        {
         return;
        }
      for(int i = 0; i < qnt(); i++)
        {
         if(isClose(i))
           {
            deleteOrder(i);
           }
        }
     }

   int               closeAllInList()
     {
      cleanCloseOrders();
      int errors = 0;
      for(int i = 0; i < ArraySize(orders); i++)
        {
         int tk;
         if(isClose(i))
           {
            continue;
           }
         if(CheckPointer(orders[i]) != POINTER_INVALID)
           {
            tk = orders[i].id();
           }
         else
           {
            continue;
           }
         if(OrderSelect(tk, SELECT_BY_TICKET))
           {
            double ask = SymbolInfoDouble(OrderSymbol(), SYMBOL_ASK);
            double bid = SymbolInfoDouble(OrderSymbol(), SYMBOL_BID);
            double closePrice = OrderType() == OP_BUY ? bid : ask;
            if(!OrderClose(OrderTicket(), OrderLots(), closePrice, 1000, clrNONE))
              {
               Print(__FUNCTION__, " ", "Error in close order ", orders[i].id(), ": ", GetLastError());
               errors++;
              }
           }
        }
      cleanCloseOrders();
      return errors;
     }

   void              PrintOrder(const int index)
     {
      if(!notOverFlow(index))
        {
         return;
        }
      if(CheckPointer(orders[index]) == POINTER_INVALID)
        {
         return;
        }

      Print("Order ", index, " id: ", orders[index].id());
      Print("Order ", index, " symbol: ", orders[index].symbol());
      Print("Order ", index, " type: ", orders[index].type());
      Print("Order ", index, " lot: ", orders[index].lot());
      Print("Order ", index, " price: ", orders[index].price());
      Print("Order ", index, " sl: ", orders[index].sl());
      Print("Order ", index, " tp: ", orders[index].tp());
      Print("Order ", index, " magic: ", orders[index].magic());
      Print("Order ", index, " comment: ", orders[index].comment());
      Print("Order ", index, " strategy: ", orders[index].strategy());
      Print("Order ", index, " expire time: ", orders[index].expireTime());
      Print("Order ", index, " signal time: ", orders[index].signalTime());
      Print("Order ", index, " profit: ", orders[index].profit());
      Print("Order ", index, " countPartials: ", orders[index].countPartials());

     }

   void              PrintList()
     {
      for(int i = 0; i < qnt(); i++)
        {
         PrintOrder(i);
        }
     }
  };
OrdersList mainOrders(filterMagicsOn, (string) magico, true, _Symbol);

class ConcurrentConditions
  {
protected:
   iConditions* _conditions [];

public:
                     ConcurrentConditions(void) {}
                    ~ConcurrentConditions(void) { releaseConditions(); }

   void              releaseConditions()
     {
      for(int i = 0; i < ArraySize(_conditions); i++)
        {
         delete _conditions[i];
        }
      ArrayFree(_conditions);
     }

   void              AddCondition(iConditions* condition)
     {
      int t = ArraySize(_conditions);
      ArrayResize(_conditions, t + 1);
      _conditions[t] = condition;
     }

   bool              EvaluateConditions(void)
     {
      for(int i = 0; i < ArraySize(_conditions); i++)
        {
         if(!_conditions[i].evaluate())
           {
            return false;
           }
        }
      return true;
     }
  };

class MoveSL : public iActions
  {
   Order*            _order;
   double            _newSL;

public:
                     MoveSL() { ; }
                    ~MoveSL() { ; }

   MoveSL*           order(Order* or)
     {
      _order = or ;
      return &this;
     }
   MoveSL*           newSL(double newSL)
     {
      _newSL = newSL;
      return &this;
     }

   bool              controlPointer(Order* or)
     {
      if(CheckPointer( or))
        {
         return true;
        }
      else
        {
         Print("Order Pointer Invalid");
         return false;
        }
     }

   bool              execute()
     {
      if(!controlPointer(_order))
        {
         Print(__FUNCTION__, " ", "Can't Move Stop Loss");
         return false;
        }
      if(OrderSelect(_order.id(), SELECT_BY_TICKET))
        {
         if(OrderCloseTime() > 0)
           {
            Print(__FUNCTION__, " ", "Order are closed ", _order.id());
            return false;
           }
         if(OrderModify(_order.id(), OrderOpenPrice(), _newSL, OrderTakeProfit(), OrderExpiration(), clrNONE))
           {
            _order.sl(_newSL);
            _order.breakevenWasDoIt(true);
            Print(__FUNCTION__, " ", _order.id(), " Modify: new SL: ", _newSL);
            return true;
           }
        }
      else
        {
         Print(__FUNCTION__, " ", "Can't Select the order ", _order.id());
        }
      return false;
     }
  };
MoveSL* breackevenAction;

class ActionCloseOrdersByType : public iActions
  {
   ENUM_ORDER_TYPE   _type;
   string            _symbol;
   int               _magic;
   int               _slippage;
   double            _price;

public:
                     ActionCloseOrdersByType(string side, int magic = 0, string symbol = "", int slippage = 10000)
     {
      if(side == "buy")
         _type = OP_BUY;
      if(side == "sell")
         _type = OP_SELL;
      if(symbol == "")
        {
         _symbol = Symbol();
        }
      else
        {
         _symbol = symbol;
        }
      if(magic != 0)
        {
         _magic = magic;
        }
      if(slippage != 10000)
        {
         _slippage = slippage;
        }
     }
                    ~ActionCloseOrdersByType() {}

   void              setPrice()
     {
      if(_type == OP_BUY)
        {
         _price = SymbolInfoDouble(_symbol, SYMBOL_BID);
        }
      if(_type == OP_SELL)
        {
         _price = SymbolInfoDouble(_symbol, SYMBOL_ASK);
        }
     }

   bool              execute()
     {
      setPrice();
      for(int i = OrdersTotal() - 1; i >= 0; i--)
        {
         if(OrderSele

Показано первые 50% кода (символов: 57273)

Открыть по тарифу

Купите тариф с пакетом открытий или войдите, если тариф уже есть. Открытый файл останется в вашем кабинете навсегда.

Разовая покупка файла

На этой странице откроется полный исходный код файла вместо ознакомительного фрагмента.

Чтобы оформить заказ, введите email и перейдите к оплате.

Стоимость полного кода
5 727,30₽ ≈ $70.01