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

Forexgain SDL

trendsignalea-ita.mq4
Вы автор или правообладатель?

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

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

О программе

Forexgain SDL — торговый советник для MetaTrader 4, который определяет направление тренда через внешний индикатор TrendSignal и открывает BUY или SELL ордера в зависимости от полученного сигнала. Режим reverse позволяет торговать против сигнала индикатора. Советник поддерживает фиксированные стоп-лосс и тейк-профит, поэтапное закрытие части позиции по нескольким уровням прибыли, а также трейлинг-стоп в пипах.

Встроена фильтрация по спреду и защита от дублирования ордеров. Реализовано автоматическое закрытие всех открытых и отложенных ордеров при достижении целевых сумм по прибыли за день, по балансу счёта или при падении эквити ниже заданного порога. Также доступен денежный трейлинг-стоп на уровне эквити.

Советник ведёт журнал данных счёта в HTML-файл (баланс, эквити, свободный маржин, прибыль по ордерам), отображает текущий спред и состояние эквити на графике, рисует трендовые стрелки на графике за заданное количество баров назад. Для работы требуется наличие индикатора TrendSignal в папке EXPERTS/INDICATORS.

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

НастройкаОписание
help_lots help_lots — Подсказка: количество лотов базового ордера
lots Лот — Базовый размер лота для ордеров
help_spreadLimit help_spreadLimit — Подсказка: лимит спреда в пипах для предотвращения открытия при высоком спреде
help_fixStopLoss help_fixStopLoss — Подсказка: фиксированный стоп-лосс в пипах (0 — нет)
fixStopLoss Фиксированный стоп-лосс — Фиксированный стоп-лосс в пипах (0 — без стоп-лосса)
help_fixTakeProfit help_fixTakeProfit — Подсказка: фиксированный тейк-профит в пипах (0 — нет)
fixTakeProfit Фиксированный тейк-профит — Фиксированный тейк-профит в пипах (0 — без тейк-профита)
help_partialTake_1 help_partialTake_1 — Подсказка: уровни частичного тейк-профита в пипах и лоты для закрытия
help_partialTake_2 help_partialTake_2 — Подсказка: false — не применять частичные тейк-профиты
partialTake Частичный тейк-профит — Переключатель: включить/выключить частичные тейк-профиты
partialTake1 Частичный тейк 1 — Первый уровень частичного тейк-профита в пипах
partialLots1 Частичный лот 1 — Количество лотов для частичного закрытия при первом уровне тейк-профита
partialTake2 Частичный тейк 2 — Второй уровень частичного тейк-профита в пипах
partialLots2 Частичный лот 2 — Количество лотов для частичного закрытия при втором уровне тейк-профита
partialTake3 Частичный тейк 3 — Третий уровень частичного тейк-профита в пипах
partialLots3 Частичный лот 3 — Количество лотов для частичного закрытия при третьем уровне тейк-профита
partialTake4 Частичный тейк 4 — Четвёртый уровень частичного тейк-профита в пипах
partialLots4 Частичный лот 4 — Количество лотов для частичного закрытия при четвёртом уровне тейк-профита
partialTake5 Частичный тейк 5 — Пятый уровень частичного тейк-профита в пипах
partialLots5 Частичный лот 5 — Количество лотов для частичного закрытия при пятом уровне тейк-профита
help_startPips help_startPips — Подсказка: после скольких пипов прибыли срабатывает трейлинг-стоп (0 — сразу)
startPips Старт трейлинга в пипах — Количество пипов прибыли, после которых активируется трейлинг-стоп (0 — сразу)
help_trailPips help_trailPips — Подсказка: трейлинг-стоп в пипах (0 — без трейлинга)
trailPips Трейлинг-стоп в пипах — Трейлинг-стоп в пипах (0 — без трейлинга)
help_signal help_signal — Подсказка: разделитель
help_reverse help_reverse — Подсказка: true для открытия ордеров в противоположном направлении от тренда
reverse Реверс — Переключатель: торговать в противоположном направлении от сигнала индикатора
help_closeOther help_closeOther — Подсказка: закрывать другие ордера при открытии нового
closeOther closeOther — Переключатель: при открытии нового ордера закрывать все остальные ордера на символе
help_timeframe help_timeframe — Подсказка: таймфрейм для работы (0 — текущий график)
timeframe Таймфрейм — Таймфрейм для работы советника (0 — текущий график)
help_signalName help_signalName — Подсказка: имя индикатора в папке EXPERTS/INDICATORS
signalName Имя индикатора сигнала — Имя индикатора TrendSignal в папке EXPERTS/INDICATORS
RISK RISK — Параметр риска, передаваемый в индикатор TrendSignal
CountBars CountBars — Количество баров для расчёта трендовых сигналов
help_backDays_1 help_backDays_1 — Подсказка: сколько дней рисовать назад
help_backDays_2 help_backDays_2 — Подсказка: только для контроля, не влияет на ордера
backDays backDays — Количество дней для визуализации трендовых сигналов на графике (только для отображения, не влияет на ордера)
colorUpTrend Цвет восходящего тренда — Цвет стрелки восходящего тренда на графике
colorDnTrend Цвет нисходящего тренда — Цвет стрелки нисходящего тренда на графике
help_money help_money — Подсказка: разделитель настроек управления деньгами
help_ordersTP_1 help_ordersTP_1 — Подсказка: денежный тейк-профит по открытым ордерам (0 — отключено)
help_ordersTP_2 help_ordersTP_2 — Подсказка: при достижении закрыть все ордера и начать заново
ordersTP Тейк-профит ордеров в деньгах — Денежный тейк-профит по открытым ордерам (0 — отключено). При достижении все ордера закрываются
help_dailyProfit help_dailyProfit — Подсказка: целевая прибыль за день в деньгах
dailyProfit Целевая дневная прибыль — Целевая прибыль в день в денежном выражении (0 — отключено). При достижении все ордера закрываются
help_targetMoney_1 help_targetMoney_1 — Подсказка: целевая сумма на счёте (0 — отключено)
help_targetMoney_2 help_targetMoney_2 — Подсказка: при достижении эквити цели — закрыть все ордера
targetMoney Целевая сумма на счёте — Целевая сумма на счёте (0 — отключено). При достижении эквити цели все ордера закрываются
help_saveMoney_1 help_saveMoney_1 — Подсказка: минимальная сумма для сохранения на счёте (0 — отключено)
help_saveMoney_2 help_saveMoney_2 — Подсказка: при падении эквити ниже — закрыть все ордера
saveMoney Минимальное сохранение на счёте — Минимальная сумма для сохранения на счёте (0 — отключено). При падении эквити ниже — закрытие всех ордеров
help_moneyTrail help_moneyTrail — Подсказка: денежный трейлинг-стоп на эквити (0 — отключено)
moneyTrail Денежный трейлинг-стоп — Денежный трейлинг-стоп на уровне эквити (0 — отключено)
help_closePending help_closePending — Подсказка: удалять также отложенные ордера при закрытии
closePending closePending — Переключатель: при закрытии ордеров также удалять отложенные ордера
Получить полный код

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

#property show_inputs

extern string help_lots           = "numero di lotti ordine base";
extern double      lots           =   0.50;
extern string help_spreadLimit    = "limite pip di spread per evitare ordini se troppo alto";
       double      spreadLimit    =   5.00;
extern string help_fixStopLoss    = "pip stop loss FISSO in macchina (0 = nessuno)";
extern double      fixStopLoss    =   0.00;
extern string help_fixTakeProfit  = "pip take profit FISSO in macchina (0 = nessuno)";
extern double      fixTakeProfit  =   0.00;
extern string help_partialTake_1  = "pip take profit partial and how many lots to close";
extern string help_partialTake_2  = "false = NON applica take parziali";
extern bool        partialTake    =  true;
extern double      partialTake1   =   7.00;
extern double      partialLots1   =   0.10;
extern double      partialTake2   =  15.00;
extern double      partialLots2   =   0.10;
extern double      partialTake3   =  20.00;
extern double      partialLots3   =   0.10;
extern double      partialTake4   =  25.00;
extern double      partialLots4   =   0.10;
extern double      partialTake5   =  00.00;
extern double      partialLots5   =   0.00;
extern string help_startPips      = "dopo quanti pip di guadagno scatta trailing stop (0 = subito)";
extern double      startPips      =   10.0;
extern string help_trailPips      = "trailing stop in pip (0 = no trailing stop)";
extern double      trailPips      =   20.0;
extern string help_signal         = "--------------------------------------------------";
extern string help_reverse        = "true per aprire gli ordini CONTRARI al TrendSignal";
extern bool        reverse        =  false;
extern string help_closeOther     = "true to close other order when new one opens";
extern bool        closeOther     =  true;
extern string help_timeframe      = "timeframe to use, fix it or 0 = open chart";
extern int         timeframe      =   0;
extern string help_signalName     = "nome indicatore nella cartella EXPERTS\INDICATORS";
extern string      signalName     = "Trendsignal (1)";
extern int         RISK           =   3;
extern int         CountBars      = 300;
extern string help_backDays_1     = "quanti giorni disegnare indietro";
extern string help_backDays_2     = "solo per controllare, NON influenza ordini";
extern int         backDays       =  20;
extern color       colorUpTrend   =  Lime;
extern color       colorDnTrend   =  Red;
extern string help_money          = "--------------------------------------------------";
extern string help_ordersTP_1     = "take profit IN SOLDI PER GLI ORDINI APERTI (0 = disattivato)";
extern string help_ordersTP_2     = "quando viene raggiunto CHIUDE TUTTI ORDINI e riparte";
extern double      ordersTP       =   0.00;
extern string help_dailyProfit    = "obiettivo IN SOLDI PER LA GIORNATA (0 = disattivato)";
extern double      dailyProfit    =   0.00;
extern string help_targetMoney_1  = "obiettivo IN SOLDI SUL CONTO (0 = disattivato)";
extern string help_targetMoney_2  = "se EQUITY raggiunge obiettivo chiude TUTTI GLI ORDINI";
extern double      targetMoney    =   0.00;
extern string help_saveMoney_1    = "soldi MINIMI da SALVARE SUL CONTO (0 = disattivato)";
extern string help_saveMoney_2    = "se EQUITY va sotto chiude TUTTI GLI ORDINI";
extern double      saveMoney      =   0.00;
extern string help_moneyTrail     = "trailing stop IN SOLDI SUL CONTO (0 = disattivato)";
extern double      moneyTrail     =   0.00;
extern string help_closePending   = "true = oltre ORDINI APERTI cancella ANCHE PENDENTI";
extern bool        closePending   =  true;

datetime firstStart = 0;
datetime lastOrder  = 0;
double   pip, iBid, iAsk, spread;

int    magic       = 100; string comment     = "";
double openPrice   = 0.0; double minPips     = 0.0;
double stopLoss    = 0.0; double lossPrice   = 0.0;
double takeProfit  = 0.0; double profitPrice = 0.0;

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

int deinit()
{

   return(0);
}

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

int trendSignal(int shift = 0)
{

   double tSigUp = iCustom(NULL, 0, signalName, RISK, CountBars, 1, shift);
   double tSigDn = iCustom(NULL, 0, signalName, RISK, CountBars, 0, shift);

   if (tSigUp != 0)
   {
      string          tSigUpName  = "TrendSignal Up " + TimeToStr(iTime(NULL, 0, shift));
      if (ObjectFind( tSigUpName) < 0)
      {
         ObjectCreate(tSigUpName, OBJ_ARROW, 0, 0, 0);
         ObjectSet(   tSigUpName, OBJPROP_BACK, false);
      }
      ObjectSet(      tSigUpName, OBJPROP_ARROWCODE, 233);
      ObjectSet(      tSigUpName, OBJPROP_COLOR,     DeepSkyBlue);
      ObjectMove(     tSigUpName, 0, iTime(NULL, Period(), shift), tSigUp);

      return(+1);
   }

   if (tSigDn != 0)
   {
      string          tSigDnName  = "TrendSignal Dn " + TimeToStr(iTime(NULL, 0, shift));
      if (ObjectFind( tSigDnName) < 0)
      {
         ObjectCreate(tSigDnName, OBJ_ARROW, 0, 0, 0);
         ObjectSet(   tSigDnName, OBJPROP_BACK, false);
      }
      ObjectSet(      tSigDnName, OBJPROP_ARROWCODE, 234);
      ObjectSet(      tSigDnName, OBJPROP_COLOR,     DeepPink);
      ObjectMove(     tSigDnName, 0, iTime(NULL, Period(), shift), tSigDn + 5*pip);

      return (-1);
   }

   return(0);
}

int print(string text, bool flashing = false)
{
   if (ObjectFind( "Check text") < 0)
   {
      ObjectCreate("Check text", OBJ_LABEL,         0, 0, 0);

      ObjectSet(   "Check text", OBJPROP_COLOR,     White);
      ObjectSet(   "Check text", OBJPROP_BACK,      false);
      ObjectSet(   "Check text", OBJPROP_CORNER,    0);
      ObjectSet(   "Check text", OBJPROP_XDISTANCE, 300);
      ObjectSet(   "Check text", OBJPROP_YDISTANCE, 50);
   }
   ObjectSetText(  "Check text", TimeToStr(iTime(NULL, PERIOD_M1, 0), TIME_MINUTES) + " " + text, 12, "Tahoma");

   if      (flashing && ObjectGet("Check text", OBJPROP_COLOR) == White) ObjectSet("Check text", OBJPROP_COLOR, Red);
   else if (flashing && ObjectGet("Check text", OBJPROP_COLOR) == Red)   ObjectSet("Check text", OBJPROP_COLOR, White);
   else                                                                  ObjectSet("Check text", OBJPROP_COLOR, White);

   return(0);
}

int checkPoint(string symbol)
{
   RefreshRates();

   double   iPoint =  MarketInfo(symbol, MODE_POINT);
   if      (iPoint == 0.01)    pip = 0.01;
   else if (iPoint == 0.001)   pip = 0.01;
   else if (iPoint == 0.0001)  pip = 0.0001;
   else if (iPoint == 0.00001) pip = 0.0001;

   iBid = MarketInfo(symbol, MODE_BID);
   iAsk = MarketInfo(symbol, MODE_ASK);

   spread = NormalizeDouble((iAsk - iBid)/pip, Digits);

   double iDigits =  MarketInfo(symbol, MODE_DIGITS);
   if (   iDigits == 3 || iDigits == 5) minPips = MarketInfo(symbol, MODE_STOPLEVEL)/10;
   else                                 minPips = MarketInfo(symbol, MODE_STOPLEVEL);

   if (symbol == Symbol())
   {
      if (ObjectFind( "Spread") < 0)
      {
         ObjectCreate("Spread", OBJ_LABEL, 0, 0, 0);
         ObjectSet(   "Spread", OBJPROP_BACK, false);
         ObjectSet(   "Spread", OBJPROP_CORNER, 3);
         ObjectSet(   "Spread", OBJPROP_XDISTANCE, 10);
         ObjectSet(   "Spread", OBJPROP_YDISTANCE, 10);
      }
      ObjectSetText(  "Spread", Symbol() + " spread " + DoubleToStr(spread, 1) + " pips", 12, "Tahoma", Red);
   }

   return(0);
}

double   moneyStop        = 0.0;
double   yesterTot        = 0.0; int yesterOrd     = 0;
double   yesterTake       = 0.0; int yesterOrdTake = 0;
double   yesterLoss       = 0.0; int yesterOrdLoss = 0;
datetime lastMoneyUpdate  =   0;

int moneyManagement()
{
   checkPoint(Symbol());

   if (moneyTrail == 0) moneyStop = 0;
   else                 moneyStop = MathMax(moneyStop, AccountEquity() - moneyTrail);

   double               printStop = MathMax(moneyStop, saveMoney);

   if (iTime(NULL, PERIOD_M1, 0) != lastMoneyUpdate)
   {
      lastMoneyUpdate = iTime(NULL, PERIOD_M1, 0);

      int handle;
      handle = FileOpen("ForexGump " + AccountNumber() + ".htm", FILE_BIN|FILE_WRITE);

      if(handle < 1)
      {
         Alert(Symbol(), " Error updating account data log file");
      }
      else
      {
         FileWrite(handle, "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"">");
         FileWrite(handle, "<html xmlns=\""><head>ForexGump<title></title></head><body>");
         FileWrite(handle, TimeToStr(iTime(NULL, PERIOD_M1, 0), TIME_DATE|TIME_SECONDS), "<br/>");
         FileWrite(handle, "Account ", AccountNumber(), "<br/>");
         FileWrite(handle, AccountName(), "<br/><br/>");

         FileWrite(handle, "Balance ", AccountBalance(), " ?<br/>");
         FileWrite(handle, "Equity ", AccountEquity(), " ?<br/>");
         FileWrite(handle, "Free margin ", DoubleToStr(AccountFreeMargin(), 2), " ?<br/>");
         FileWrite(handle, "Money stop at ", printStop, " ?<br/>");

         int pos; double orderTot = 0.0;
         FileWrite(handle, "<br/>Running orders<br/>");
         for (pos = 0; pos < OrdersTotal(); pos++)
         {
            OrderSelect(pos, SELECT_BY_POS, MODE_TRADES);
            if (OrderType() == OP_BUY || OrderType() == OP_SELL)
            {
               FileWrite(handle, OrderSymbol(), " ", OrderLots(), " ", OrderComment(), " ", OrderProfit(), " ?<br/>");
               orderTot += OrderProfit();
            }
         }
         FileWrite(handle, "<br/>Running tot ", orderTot, " ?<br/>");

         FileWrite(handle, "<br/>Waiting orders<br/>");
         for (pos = 0; pos < OrdersTotal(); pos++)
         {
            OrderSelect(pos, SELECT_BY_POS, MODE_TRADES);
            if (OrderType() == OP_BUYSTOP || OrderType() == OP_SELLSTOP)
            {
               FileWrite(handle, TimeToStr(OrderOpenTime(), TIME_DATE|TIME_MINUTES), " ", OrderSymbol(), " ", 
                                 OrderLots(), " ", OrderComment(), "<br/>");
            }
         }

         orderTot  = 0.0;           int    orderOrd     = 0;
         int    orderOrdTake = 0;   int    orderOrdLoss = 0;
         double orderTake    = 0.0; double orderLoss    = 0.0;
         FileWrite(handle, "<br/>Today closed<br/>");
         for (pos = 0; pos < OrdersHistoryTotal(); pos++)
         {
            OrderSelect(pos, SELECT_BY_POS, MODE_HISTORY);
            if ((OrderType() == OP_BUY || OrderType() == OP_SELL) &&
                TimeDayOfWeek(OrderCloseTime()) == TimeDayOfWeek(iTime(NULL, PERIOD_M5, 0)))
            {
               FileWrite(handle, OrderSymbol(), " ", OrderLots(), " ", OrderComment(), " ", OrderProfit(), " ?<br/>");
               orderTot += OrderProfit(); orderOrd += 1;
               if (OrderProfit() > 0) {orderTake += OrderProfit(); orderOrdTake += 1;}
               if (OrderProfit() < 0) {orderLoss -= OrderProfit(); orderOrdLoss += 1;}
            }
         }
         FileWrite(handle, "<br/>Today tot ", orderOrdTake, " x ", orderTake, " ? - ", 
                           orderOrdLoss, " x ", orderLoss, " ? = ", orderOrd, " x ", orderTot, " ?<br/>");

         if (yesterTot == 0 || TimeDayOfWeek(iTime(NULL, PERIOD_M5, 0)) != TimeDayOfWeek(iTime(NULL, PERIOD_M5, 1)))
         {
            yesterTot  = 0; yesterOrd     = 0;
            yesterTake = 0; yesterOrdTake = 0;
            yesterLoss = 0; yesterOrdLoss = 0;

            for (pos = 0; pos < OrdersHistoryTotal(); pos++)
            {
               OrderSelect(pos, SELECT_BY_POS, MODE_HISTORY);
               if ((OrderType() == OP_BUY || OrderType() == OP_SELL) &&
                   TimeDayOfWeek(OrderCloseTime()) == TimeDayOfWeek(iTime(NULL, PERIOD_M5, 0) - 24*60*60))
               {
                  yesterTot += OrderProfit(); yesterOrd +=1;
                  if (OrderProfit() > 0) {yesterTake += OrderProfit(); yesterOrdTake += 1;}
                  if (OrderProfit() < 0) {yesterLoss -= OrderProfit(); yesterOrdLoss += 1;}
               }
            }
         }
         FileWrite(handle, "Yestd tot ", yesterOrdTake, " x ", yesterTake, " ? - ", 
                           yesterOrdLoss, " x ", yesterLoss, " ? = ", yesterOrd, " x ", yesterTot, " ?<br/>");

         FileWrite(handle, "</body></html>");
         FileClose(handle);
      }
   }

   if (ObjectFin

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

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

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

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

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

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

Стоимость полного кода
2 554,60₽ ≈ $31.22