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

simple_swing.mq4

Вы автор или правообладатель?

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

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

О программе

Программа представляет собой торгового советника для MetaTrader 4 на языке MQL4. Она обрабатывает рыночные события (OnTick), события графика (OnChartEvent) и таймерные события (OnTimer), обеспечивая автоматическое управление ордерами на счёте трейдера.

Советник позволяет открывать сделки BUY и SELL по рынку, а также выставлять отложенные ордера BUYSTOP и SELLSTOP с использованием торгового API OrderSend. В качестве стоп-лосса используется значение, рассчитанное на основе индикатора ATR (D1, период 5). Лот может задаваться фиксированным значением или рассчитываться автоматически на основе риска и уровня стоп-лосса.

Интерфейс включает три графические кнопки (BUY, SELL, CLOSE) в правой части графика и информационную панель, выводимую через Comment(), отображающую текущую прибыль, размер стоп-лосса, риск и другие торговые параметры. Доступны защита по эквити (Equity Stop), трал по банкомату и автоматическое закрытие при достижении заданного количества убыточных ордеров.

Программа включает проверку номера торгового счёта и может отключаться при обнаружении неразрешённого аккаунта. Торговая логика работает в течение дня и управляется пользователем через настройки и интерактивные кнопки на графике.

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

НастройкаОписание
Comments (comment) Комментарий — Текстовый комментарий, добавляемый к открываемым ордерам.
Magic (order_magic) Магический номер — Магический номер, идентифицирующий ордера данного советника.
Fix Lot (order_lot) Фиксированный лот — Фиксированный размер лота. Если задан как 0, лот рассчитывается автоматически на основе риска и стоп-лосса.
Risk (%) (risk) Риск (%) — Процент риска, используемый для автоматического расчёта размера лота.
Multiplicator (koef) Множитель лота — Множитель, применяемый к размеру лота при открытии дополнительных ордеров.
Close by Max Profit (%) (percent_of_profit) Закрытие по максимальному профиту (%) — Процент от максимального профита, при достижении которого происходит принудительное закрытие всех ордеров по трейлингу эквити.
Count orders for BU exit (null_close) Количество ордеров для выхода в ноль — Количество убыточных ордеров, после которого активируется попытка выхода в ноль.
Font Size (FONT_SIZE) Размер шрифта — Размер шрифта графических элементов интерфейса.
Equity Stop (level equity $) (RiskManager_Stop) Стоп эквити — Уровень эквити, при достижении которого происходит остановка торговли и закрытие всех ордеров. Если значение равно 0, функция не активируется.
Получить полный код

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

/*
2.00 19.06.2024
- обновление для новых терминалов

1.25
по умолчанию отключен режим трала по эквити
изменена логика включения банкомата и его минимальный профит должен быть равен шагу, чтобы получать наш минимальный профит
понижен базовый риск до 0.1-0.2%, чтобы с просадкой до 30% выдерживать 8 стопов подряд.

1.24
вывод размера следующего стоплосс

1.23
поправлен подсчет минимального профита

1.22
изменен принцип рассчета минимального профита
изменен расчет авториска

1.21
добавлено отображение расчетного риска в %

1.20 
понижен риск по умолчанию, снижено количество стопов после чего активируется выход в 0, для понижения просадки и быстрого выхода из неудачного входа
доработана работа трала по банкомату
корректировка расчета минимального профита
*/

#define Market_Version
long checkacc[]=
  {
   1050526,
   1050527,
   1050740,
   1053805,
   1053830,
   276070,
   277761,
   277836,
   277992,
   402502,
   8076322,
   8076323,
   460733,//s*****m*@mail.ru 
   2000260, //инвестор b****9*@mail.ru
   1048298, //мой счет 
   467526,//мой счет
   2003007, //z****1*@bk.ru
   2004251, //a**************v*@yandex.ru
   463839,//e*****o*@mail.ru
   474884, //a******t*@mail.ru, a*******v*@mail.ru
   477174, //s******f*@mail.ru
   467526,
   465871,
   463839,
   2004251,
   462183,
   2003007,
   460733,
   459956,
   2000260,
   457522,
   457521,
   447227,
   1063524,
   8091574,
   440952,
   440951,
   1059788,
   426880,
   1059784,
   1057897,
   1057822,
   415911,
   1057821,
   410405,
   8087996,
   1055481,
   1055480,
   404832,
   283903,
   1054997,
   278896,
   1054034,
   1053851,
   277992,
   1053830,
   8076323,
   277836,
   8076322,
   277761,
   1053805,
   276070,
   402502,
   1050740,
   1050527,
   1050526,

  };

#property version   "2.00"
#property description "This EA need for manual forex trading. The entry point you choose yourself on the work entrust adviser."
#property strict
#include <SovetnikovGUI\Orders.mqh>

/*
Правила торговли, торгует в течении дня пока не получит стоп. 
*/
input string  comment=""; //Comments

input int     order_magic=2017; //Magic

input double  order_lot=0; //Fix Lot

input double  risk=0.1; //Risk (%)

input double  koef=2; //Multiplicator

input double percent_of_profit=0.0; //Close by Max Profit (%)

input int     null_close=2; //Count orders for BU exit

input int     FONT_SIZE=10; //Font Size
color   text_color=clrGreen;

input double  RiskManager_Stop=0; //Equity Stop (level equity $)

int     slippage=0;

double order_sl=0,order_tp=0;

#include <Controls\Button.mqh>

#define IDENT_LEFT1 (90)
#define IDENT_TOP1 (20)
#define IDENT_TOP2 (50)
#define IDENT_TOP3 (80)
#define BUTTON_HIGHT (20)
#define BUTTON_SIZE (80)

#define COLOR_GREEN (clrLawnGreen)
#define NO_COLOR (clrGainsboro)

CButton           m_buy1,m_sell1,m_close;
double g_lot=0;
datetime tm=0;

int maxOrders=50;

class CMain: public COrders
  {

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

    void Tick(int op,bool bPress=false)
     {

      Update();

      if(m_all==0)
        {

         if(bPress)
           {

            double lot=order_lot;
            double atr=getStop();
            order_sl=atr;
            order_tp=atr;

            double drisk=risk;

            if(order_lot==0 && order_sl>0) lot=getLotBySL(drisk,order_sl); else lot=order_lot;

            if(op==1)
              {
               tm=TimeCurrent();
               OrderSend(OP_BUY,lot,-1,order_sl,0,comment,0,clrNONE,true); g_lot=lot;
               main.SaveParam("lot",lot);
               main.SaveParam("order_sl",order_sl);
               main.SaveParam("order_tp",order_tp);
               main.SaveParam("tm",tm);
              }
            if(op==-1)
              {
               tm=TimeCurrent();
               OrderSend(OP_SELL,lot,-1,order_sl,0,comment,0,clrNONE,true);  g_lot=lot;
               main.SaveParam("lot",lot);
               main.SaveParam("order_sl",order_sl);
               main.SaveParam("order_tp",order_tp);
               main.SaveParam("tm",tm);
              }
           }
        }
      else
        {

         if(orders[OP_BUY]+orders[OP_SELL]==0 && m_all>0){ OrderCloseAll(ALL,clrNONE); return;}

         ulong t=getOrderTicket(BUY|SELL);
         if(OrderSelect(t))
           {
            int type=OrderType();
            double stop=OrderStopLoss();
            double open=OrderOpenPrice();
            double lot=OrderLots();

            g_lot=main.LoadParam("lot",g_lot);
            order_sl=main.LoadParam("order_sl",order_sl);
            order_tp=main.LoadParam("order_tp",order_tp);

            if(order_sl==0 || order_tp==0)
              {
               double atr=getStop();

               order_sl=atr;
               order_tp=atr;
              }
            if(type==OP_BUY && orders[OP_SELLSTOP]==0)
              {
               if(stop==0) stop=nd(open-order_sl*p);

               if(Bid>stop)
                 {
                  Eq=0; EqMax=0;
                  OrderSend(OP_SELLSTOP,NLot(lot*koef),stop,order_sl,0,comment,0,clrNONE,true);
                 }
               else
                 {
                  Eq=0; EqMax=0;
                  OrderSend(OP_SELL,NLot(lot*koef),-1,order_sl,0,comment,0,clrNONE,true);
                  if(t>0) OrderClose(t);
                 }
              }

            if(type==OP_SELL && orders[OP_BUYSTOP]==0)
              {
               if(stop==0) stop=nd(open+order_sl*p);

               if(Ask<stop)
                 {
                  Eq=0; EqMax=0;
                  OrderSend(OP_BUYSTOP,NLot(lot*koef),stop,order_sl,0,comment,0,clrNONE,true);
                 }
               else
                 {
                  Eq=0; EqMax=0;
                  OrderSend(OP_BUY,NLot(lot*koef),-1,order_sl,0,comment,0,clrNONE,true);
                  if(t>0) OrderClose(t);
                 }
              }
           }
        }

     }

  };

CMain main();
CDraw draw;
double Eq=0,EqMax=0;

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

void OnDeinit(const int reason)
  {

   EventKillTimer();

   Destroy();
   draw.DeleteAll();

  }

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

   if(!checkAccount())
     {
      Print("Invalid account! Write number Account to m**l*@dken.ru");
      ExpertRemove();
      return;
     }

   MoveButton();

   int all=main.Update(); //получим кол-во ордеров в структуре orders

   double curr_profit=main.getProfit();
   double day_profit=main.GetProfitDay(0);
   double month_profit=main.GetProfitMonth(0);

   double summ_profit1=curr_profit+day_profit;
   double summ_profit2=curr_profit+month_profit;
   double start_balance1=AccountBalance()-summ_profit1;
   double start_balance2=AccountBalance()-summ_profit2;
   double p=main.p;
   string n=main.m_name;

   double step=main.LoadParam("order_sl",order_sl);
   if(step==0 || all==0) step=getStop();

   if(all==0){ Eq=0; E

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

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

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

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

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

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

Стоимость полного кода
1 102,30₽ ≈ $13.47