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

locomotive v1.01 (21).mq4

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

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

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

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

О программе

Locomotive — советник для MetaTrader 4, который анализирует накопленный профит за определённый период и на его основе закрывает длинные убыточные позиции. Советник также реализует систему увеличения объёмов с настраиваемыми множителями и шагами, а также поддержку трейлинг-стопа.

В советнике реализованы два независимых направления торговли — покупка и продажа, каждое со своим магическим номером. Это позволяет управлять позициями в обе стороны раздельно. Имеется функция закрытия всех позиций при достижении суммарного профита, а также функция закрытия далеко от текущей цены позиций при выполнении условий по накопленному профиту.

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

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

НастройкаОписание
buy Покупка — Включает или отключает открытие покупок.
sell Продажа — Включает или отключает открытие продаж.
AllOrders Все ордера — При активации закрывает все позиции при достижении суммарного профита в размере CloseProfit.
CloseProfit Профит для закрытия всех — Порог суммарного профита для автоматического закрытия всех позиций.
take_profit Тейк-профит (торговля) — Параметр тейк-профита, используемый при модификации ордеров в торговых функциях.
lot Объём лота — Начальный объём лота для первого ордера.
lot_factor_1 Множитель лота (этап 1) — Множитель увеличения объёма лота на первом этапе наращивания.
step_1 Шаг (этап 1) — Шаг в пунктах для первого этапа наращивания.
set_2 Переключатель объёма (этап) — Пороговый номер уровня, после которого применяется второй множитель объёма и шаг.
lot_factor_2 Множитель лота (этап 2) — Множитель увеличения объёма лота на втором этапе наращивания.
step_2 Шаг (этап 2) — Шаг в пунктах для второго этапа наращивания.
set_3 Уровень хеджирования — Уровень, при достижении которого открывается хеджирующий ордер.
hedje_factor Коэффициент хеджирования — Базовый коэффициент для расчёта объёма хеджирующего ордера.
hedje_plus Дополнительный коэффициент хеджирования — Дополнительный коэффициент для расчёта объёма хеджирующего ордера в зависимости от количества уровней.
menucomment02 Разделитель параметров — Текстовый разделитель для группировки настроек на панели.
magic Магический номер покупок — Магический номер для ордеров направления покупки.
magic2 Магический номер продаж — Магический номер для ордеров направления продажи.
TryToTrade Попыток торговли — Максимальное количество попыток повторной отправки торгового запроса.
WaitTime Время ожидания — Время ожидания в миллисекундах между повторными попытками торговых запросов.
CommetSize Размер комментария — Количество строк в истории событий, отображаемых в комментарии на графике.
Стоп-лосс (Stoploss) Стоп-лосс — Стоп-лосс в пунктах для ручного закрытия позиций по уровню.
Тейк-профит (Takeprofit) Тейк-профит — Параметр тейк-профита, используемый при модификации ордеров в торговых функциях.
Длина трала (TrailingStop) Длина трала — Длина трейлинг-стопа в пунктах.
Минимальная прибыль для старта (TrailingStart) Минимальная прибыль для старта — Минимальная прибыль в пунктах для активации трейлинг-стопа.
Шаг трала (TrailingStep) Шаг трала — Шаг трейлинг-стопа в пунктах.
AllSymbol Все символы — При активации советник работает со всеми символами, а не только с текущим.
Magic (-1 all) (Magic) Магический номер — Магический номер для фильтрации ордеров. Значение -1 означает все магические номера.
за какое кол-во дней считать накопленный профит (DayProfit) за какое кол-во дней считать накопленный профит — Количество дней, за которые считается накопленный профит для функции закрытия далёких позиций.
неснижаемый накопленный профит (ProfitMin) неснижаемый накопленный профит — Неснижаемый накопленный профит — минимальная сумма профита, при которой возможно закрытие далёких позиций.
минимальный убыток сделки подлежащей закрытию (пункт) (MinLoss) минимальный убыток сделки подлежащей закрытию (пункт) — Минимальный убыток сделки в пунктах, при котором позиция считается далёкой и подлежит анализу на закрытие.
Font Шрифт панели — Шрифт текста на панели информации графика.
Width Толщина шрифта — Толщина шрифта текста на панели информации.
X Позиция X панели — Горизонтальное смещение панели информации от левого верхнего угла графика.
Y Позиция Y панели — Вертикальное смещение панели информации от левого верхнего угла графика.
CloseFar Закрытие далёких позиций — Переключатель для закрытия позиций, находящихся далеко от текущей цены, при выполнении условий по накопленному профиту.
StartingLots Начальный объём — Начальный объём лота для расчёта размеров позиций.
TakeProfit Тейк-профит — Тейк-профит в пунктах для ручного закрытия позиций по уровню.
Layer_multiplier Множитель лота — Множитель лота, выбираемый из перечисленных вариантов от x1 до x2.
PipStep Шаг в пунктах — Шаг в пунктах для определения момента открытия новых сделок.
Identifier Идентификатор — Настройка идентификатора, определяющая вариант расчёта объёмов (от 1 до 4).
Получить полный код

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

#include <stdlib.mqh>

input bool    buy            = true;
input bool    sell           = true;
input bool    AllOrders      = false;
input double  CloseProfit    = 25;
input double  take_profit    = 15;
input double  lot            = 0.01;
input double  lot_factor_1   = 1.6;
input double  step_1         = 25;
input double  set_2          = 4;
input double  lot_factor_2   = 1.7;
input double  step_2         = 35;
input double  set_3          = 8;
input double  hedje_factor   = 0.5;
input double  hedje_plus     = 0.05;
input string  menucomment02  = "||||||||||||||||||||||||||||||||||||||||||||| Прочие параметры |||||||||||||||||||||||||||||||||||||||||||||";
input int     magic          = 1543;
input int     magic2         = 1544;
double  Sensitivity    = 1;
input int     TryToTrade     = 20;
input int     WaitTime       = 1500;
input int     CommetSize     = 7;

input int     Stoploss      = 0;    // Стоп-лосс
input int     Takeprofit    = 0;    // Тейк-профит
input int     TrailingStop  = 5;    // Длина трала
input int     TrailingStart = 5;    // Минимальная прибыль для старта
input int     TrailingStep  = 1;    // Шаг трала

 int     _X                 = 0;     //смещение панели по горизонтали
 int     _Y                 = 25;    //смещение панели по вертикали

#property description "The EA analyzes the profit for a certain time and closes long-term losing positions due to this profit."
extern bool    AllSymbol   = false;
extern int     Magic       = -1;    //Magic (-1 all)
extern int     DayProfit   = 1;//за какое кол-во дней считать накопленный профит
extern double  ProfitMin   = 1.00;//неснижаемый накопленный профит
extern int     MinLoss     = 100;//минимальный убыток сделки подлежащей закрытию (пункт)
extern string Font      = "Times New Roman";
extern int    Width     = 10;
extern long   X=30;
extern long   Y=30;
extern bool   CloseFar   = false;
bool LANGUAGE;
double STOPLEVEL;
string AC;

string Default   = "Default set All Pair";
string Timeframe = "TimeFrame M5";
enum M
  {
   a, //x2
   B, //x1.9
   c, //x1.8
   d, //x1.7
   e, //x1.6
   f, //x1.5
   g, //x1.4
   h, //x1.3
   I, //x1.2(Default)
   j, //x1.1
   k  //x1
  };
enum N
  {
   l, //1
   m, //2
   n, //3
   o, //4
  };

double stoploss = 5000.0;
double TrailStart = 100.0;
double TrailStop = 100.0;

extern double StartingLots = 0.01;
extern double TakeProfit = 58.0;
double Multiplier;
input M Layer_multiplier = I;
extern double PipStep = 48.0;
bool AutoCompound = false;
int MagicNumber = 0;
double slip = 30.0;
int MaxTrades = 99999;
int identifier = 2;
input N Identifier = l;

string MoneyManagement = "AutoLot";
bool AutoMoneyManagement = false;
double PercentToRisk = 0.02;
double TahananModal = 10000.0;

bool UseEquityStop = false;
double TotalEquityRisk = 20.0;
bool UseTrailingStop = false;
bool UseTimeOut = false;
double MaxTradeOpenHours = 48.0;

double PriceTarget, StartEquity, BuyTarget, SellTarget ;
double AveragePrice, SellLimit, BuyLimit ;
double LastBuyPrice, LastSellPrice, Spread;
bool flag;

int timeprev = 0, expiration;
int NumOfTrades = 0;
double iLots;
int cnt = 0, total;
double Stopper = 0.0;
bool TradeNow = false, LongTrade = false, ShortTrade = false;
int ticket;
bool NewOrdersPlaced = false;
double AccountEquityHighAmt, PrevEquity;

double    TrallB        = 0;
double    TrallS        = 0;
int       slippage      =30;

int  i,Ticket, DG, LastError, TimeB, TimeS;
bool TickeT, Work=true;
double  Pp, Mnoj, Mnoj2;
string Symb,CommentBox[],cm2;
double lt[30],lt_h[30],step[30];

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

void OnTimer()
  {
   Info();
   if(Work==false)
      return;
   if(buy&&ObjectGetInteger(0,"B",OBJPROP_STATE)==false)
      buyf();
   if(sell&&ObjectGetInteger(0,"S",OBJPROP_STATE)==false)
      sellf();
   if(OrdersTotal()>0 && ObjectGetInteger(0,"C",OBJPROP_STATE)==1)
     {
      CloseAll();
      ObjectSetInteger(0,"C",OBJPROP_STATE,false);
     }
   if(AllOrders)
     {
      if(GetProfitOpenPosInCurrency("",-1,-1)>CloseProfit)
         CloseAll();
     }
   else
     {
      if(GetProfitOpenPosInCurrency("",0,-1)>CloseProfit)
         CloseAll(0);
      if(GetProfitOpenPosInCurrency("",1,-1)>CloseProfit)
         CloseAll(1);
        {
         double OOP,SL;
         int b=0,s=0,tip,TicketB=0,TicketS=0;
         for(i=0; i<OrdersTotal()-1; i++)
           {
            if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
              {
               if(OrderSymbol()==Symbol())
                 {
                  tip = OrderType();
                  OOP = NormalizeDouble(OrderOpenPrice(),Digits);
                  if(tip==OP_BUY)
                    {
                     b++;
                     TicketB=OrderTicket();
                     if(Stoploss!=0   && Bid<=OOP - Stoploss   * Point)
                       {
                        if(OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(Bid,Digits),slippage,clrNONE))
                           continue;
                       }
                     if(Takeprofit!=0 && Bid>=OOP + Takeprofit * Point)
                       {
                        if(OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(Bid,Digits),slippage,clrNONE))
                           continue;
                       }
                     if(TrailingStop>0)
                       {
                        SL=NormalizeDouble(Bid-TrailingStop*Point,Digits);
                        if(SL>=OOP+TrailingStart*Point && (TrallB==0 || TrallB+TrailingStep*Point<SL))
                           TrallB=SL;
                       }
                    }
                  if(tip==OP_SELL)
                    {
                     s++;
                     if(Stoploss!=0   && Ask>=OOP + Stoploss   * Point)
                       {
                        if(OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(Ask,Digits),slippage,clrNONE))
                           continue;
                       }
                     if(Takeprofit!=0 && Ask<=OOP - Takeprofit * Point)
                       {
                        if(OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(Ask,Digits),slippage,clrNONE))
                           continue;
                       }
                     TicketS=OrderTicket();
                     if(TrailingStop>0)
                       {
                        SL=NormalizeDouble(Ask+TrailingStop*Point,Digits);
                        if(SL<=OOP-TrailingStart*Point && (TrallS==0 || TrallS-TrailingStep*Point>SL))
                           TrallS=SL;
                       }
                    }
                 }
              }
           }
        }
      if(b!=0)
        {
         if(b>0)

            if(TrallB!=0)
              {
               Print("Тралим ордер ",TicketB);
               DrawHline("SL Buy",TrallB,clrBlue,0);
               if(Bid<=TrallB)
                 {
                  if(OrderSelect(TicketB,SELECT_BY_TICKET))
                     if(OrderProfit()>0)
                        if(!OrderClose(TicketB,OrderLots(),NormalizeDouble(Ask,Digits),slippage,clrRed))
                           Print("Ошибка закрытия ордера ",GetLastError());
                 }
              }
        }
      else
        {
         TrallB=0;
         ObjectDelete("SL Buy");
        }

      if(s!=0)
        {
         if(s>0)

            if(TrallS!=0)
              {
               Print("Тралим ордер ",TicketS);
               DrawHline("SL Sell",TrallS,clrRed,0);
               if(Ask>=TrallS)
                 {
                  if(OrderSelect(TicketS,SELECT_BY_TICKET))
                     if(OrderProfit()>0)
                        if(!OrderClose(TicketS,OrderLots(),NormalizeDouble(Ask,Digits),slippage,clrRed))
                           Print("Ошибка закрытия ордера ",GetLastError());
                 }
              }
        }
      else
        {
         TrallS=0;
         ObjectDelete("SL Sell");
        }

      /* int err;
       if(IsTesting() && OrdersTotal()==0)
         {
          double Lot=0.02;
          err=OrderSend(Symbol(),OP_BUY,Lot,NormalizeDouble(Ask,Digits),slippage,0,0,"тест",0);
          err=OrderSend(Symbol(),OP_SELL,Lot,NormalizeDouble(Bid,Digits),slippage,0,0,"тест",0);

         }*/

     }

     {
      AC=" "+AccountCurrency();
      EventSetTimer(1);

     }

     {
      if(ObjectFind("cm_FAR")==0)
        {
         ObjectGetInteger(0,"cm_FAR",OBJPROP_XDISTANCE,0,X);
         ObjectGetInteger(0,"cm_FAR",OBJPROP_YDISTANCE,0,Y);
        }
      else
        {
         RectLabelCreate(0,"cm_FAR",0,X,Y,200,105,clrWhite,clrBlack,STYLE_SOLID,3,false,true,true,0);
        }
      RectLabelCreate(0,"cm__fon1",0,X+1,Y+1,198,103,clrLemonChiffon,clrLightGray,STYLE_SOLID,1,false,false,true,0);
      RectLabelCreate(0,"cm__0_",0,X+1,Y+1,198,18,clrBlue,clrLightGray,STYLE_SOLID,1,false,false,true,0);
      RectLabelCreate(0,"cm__fon2",0,X+3,Y+40,194,39,clrWhite,clrLightGray,STYLE_SOLID,1,false,false,true,0);

      LabelCreate(0,"cm__00",0,X+10,Y+10,CORNER_LEFT_UPPER,"ea Close Far",Font,Width+0,clrWhite,0,ANCHOR_LEFT,false,false,true,0);
      LabelCreate(0,"cm__01",0,X+10,Y+30,CORNER_LEFT_UPPER,StringConcatenate("Profit ",!AllSymbol?Symbol():"all symbols"),Font,Width+0,clrBlack,0,ANCHOR_LEFT,false,false,true,0);

      ButtonCreate(0,"cm__kn 01",0,X+3,Y+82,97,18,"All Symbols",Font,Width,clrBlack,clrLightGray,AllSymbol);
      ButtonCreate(0,"cm__kn 02",0,X+100,Y+82,97,18,"Close FAR",Font,Width,clrBlack,clrLightGray,CloseFar);

      AllSymbol = ObjectGetInteger(0,"cm__kn 01",OBJPROP_STATE);
      CloseFar  = ObjectGetInteger(0,"cm__kn 02",OBJPROP_STATE);

      RefreshRates();

      STOPLEVEL=MarketInfo(Symbol(),MODE_STOPLEVEL);
      double PriceFar=0,LossFar=0,LotFar=0;
      int TicketFar=0;
      int TicketLoss=0;
      double Loss=0,LotLoss=0,ProfitLoss=0;

      double Profit=0;
      string symb=NULL;
      for(i=0; i<OrdersTotal(); i++)
        {
         if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
           {
            if(OrderSymbol()!=Symbol()   && !AllSymbol)
               continue;
            if(Magic!=OrderMagicNumber() && Magic!=-1)
               continue;
            Profit=OrderProfit()+OrderCommission()+OrderSwap();
            if(Loss>Profit)
              {
               Loss=Profit;
               TicketLoss=OrderTicket();
               LotLoss = OrderLots();
              }
            OOP=OrderOpenPrice();
            if(MathAbs(OOP-(Ask+Bid)/2)>PriceFar && MathAbs(OOP-(Ask+Bid)/2)/Point >=MinLoss && Profit<0)
              {
               LossFar=Profit;
               TicketFar=OrderTicket();
               PriceFar=MathAbs(OOP-(Ask+Bid)/2);
               LotFar = OrderLots();
               symb = OrderSymbol();
              }
           }
        }

      LabelCreate(0,"cm__05",0,X+10,Y+50,CORNER_LEFT_UPPER,StringConcatenate("Far ",TicketFar),Font,Width+0,clrBlack,0,ANCHOR_LEFT,false,false,true,0);
      LabelCreate(0,"cm__06",0,X+190,Y+50,CORNER_LEFT_UPPER,StringConcatenate(DoubleToString(LossFar,2),AC),Font,Width+0,clrBlack,0,ANCHOR_RIGHT,false,false,true,0);
      LabelCreate(0,"cm__07",0,X+10,Y+70,CORNER_LEFT_UPPER,StringConcatenate(DoubleToString(LotFar,2),"  ",symb),Font,Width+0,clrBlack,0,ANCHOR_LEFT,false,false,true,0);

      Profit=0;
      for(i=OrdersHistoryTotal()-1; i>=0; i--)
        {
         if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY))
           {
            if(OrderSymbol()!=Symbol()   && !AllSymbol)
               continue;
            if(Magic!=OrderMagicNumber() && Magic!=-1)
               continue;
            if(OrderCloseTime()>=iTime(NULL,1440,DayProfit))
               Profit+=OrderProfit()+OrderSwap()+OrderCommission();
           }
        }
      LabelCreate(0,"cm__02",0,X+190,Y+30,CORNER_LEFT_UPPER,StringConcatenate(DoubleToString(Profit,2),AC),Font,Width+0,clrBlack,0,ANCHOR_RIGHT,false,false,true,0);

      if(CloseFar && Profit>ProfitMin)
        {
         if(LossFar+Profit-ProfitMin>0)
           {
            if(OrderSelect(TicketFar,SELECT_BY_TICKET))
              {
               tip = OrderType();
               int DIGITS = (int)MarketInfo(OrderSymbol(),MODE_DIGITS);
               if(tip==OP_BUY)
                 {
                  if(OrderClose(TicketFar,OrderLots(),NormalizeDouble(MarketInfo(OrderSymbol(),MODE_BID),DIGITS),100,clrNONE))
                     Alert("ea Close Far Order <<",TicketFar,">> ",OrderSymbol(),"  Loss=",DoubleToString(OrderProfit()+OrderSwap()+OrderCommission(),2),AC);
                 }
               if(tip==OP_SELL)
                 {
                  if(OrderClose(TicketFar,OrderLots(),NormalizeDouble(MarketInfo(OrderSymbol(),MODE_ASK),DIGITS),100,clrNONE))
                     Alert("ea Close Far Order <<",TicketFar,">> ",OrderSymbol(),"  Loss=",DoubleToString(OrderProfit()+OrderSwap()+OrderCommission(),2),AC);
                 }
              }
           }
        }/*
     }

   {
   Spread = MarketInfo(Symbol(), MODE_SPREAD) * Point;
   Comment("",
           "\n Copyright ? 2017, BuBat's Tradings ",
           "\n EA - Budak Ubat v1.51 ",
           "\n Equity     = ", AccountEquity(),
           "\n Starting Lot =", StartingLots);
   return (0);
   }

 int deinit()
   {
   return (0);
   }*/

      /* string expire_date = ea_times_up; //<-- hard coded datetime
       datetime e_d = StrToTime(expire_date);
       if(CurTime() >= e_d)
         {
          Alert("Trial EA Finished!!! Contact: ");
          return(0);
         }
       string NEA = "EA - Budak Ubat v1.51";
       if(NEA != WindowExpertName())
         {
          Comment(" \nEXPERT NAME WAS RENAMED/CHANGED! \nTRADE IS STOPED/NOT ALLOWED!");
          Print("Trade STOPED! RENAMED NAME EA, WITHOUT PERMIT! update your license to owner...");
          return (0);*/
     }

   Info();

   Info();
   double Lots = MarketInfo(Symbol(),MODE_MINLOT);
   switch(Layer_multiplier)
     {
      case a:
         Multiplier = 2;
         break;
      case B:
         Multiplier = 1.9;
         break;
      case c:
         Multiplier = 1.8;
         break;
      case d:
         Multiplier = 1.7;
         break;
      case e:
         Multiplier = 1.6;
         break;
      case f:
         Multiplier = 1.5;
         break;
      case g:
         Multiplier = 1.4;
         break;
      case h:
         Multiplier = 1.3;
         break;
      case I:
         Multiplier = 1.2;
         break;
      case j:
         Multiplier = 1.1;
         break;
      case k:
         Multiplier = 1;
         break;
     }

   switch(identifier)
     {
      case l:
         identifier = 1;
         break;
      case m:
         identifier = 2;
         break;
      case n:
         identifier = 3;
         break;
      case o:
         identifier = 4;
         break;
     }
   double Ld_40 = PercentToRisk / TahananModal;
   if(AutoCompound==true)
      StartingLots = NormalizeDouble(AccountBalance() * Ld_40 / MarketInfo(Symbol(), MODE_TICKVALUE), 2);

   double PrevCl;
   double CurrCl;
   if(UseTrailingStop)
      TrailingAlls(TrailStart, TrailStop, AveragePrice);
   if(UseTimeOut)
     {
      if(TimeCurrent() >= expiration)
        {
         CloseThisSymbolAll();
         Print("Closed All due to TimeOut");
        }
     }
   if(timeprev == Time[0])
      return;
   timeprev = Time[0];
   double CurrentPairProfit = CalculateProfit();
   if(UseEquityStop)
     {
      if(CurrentPairProfit < 0.0 && MathAbs(CurrentPairProfit) > TotalEquityRisk / 100.0 * AccountEquityHigh())
        {
         CloseThisSymbolAll();
         Print("Closed All due to Stop Out");
         NewOrdersPlaced = false;
        }
     }
   total = CountTrades();
   if(total == 0)
      flag = false;
   for(cnt = OrdersTotal() - 1; cnt >= 0; cnt--)
     {
      (int)OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
      if(OrderSymbol() != Symbol() || OrderMagicNumber() != magic)
         continue;
      if(OrderSymbol() == Symbol() && OrderMagicNumber() == magic)
        {
         if(OrderType() == OP_BUY)
           {
            LongTrade = true;
            ShortTrade = false;
            break;
           }
        }
      if(OrderSymbol() == Symbol() && OrderMagicNumber() == magic)
        {
         if(OrderType() == OP_SELL)
           {
            LongTrade = false;
            ShortTrade = true;
            break;
           }
        }
     }
   if(total > 0 && total <= MaxTrades)
     {
      RefreshRates();
      LastBuyPrice = FindLastBuyPrice();
      LastSellPrice = FindLastSellPrice();
      if(LongTrade && LastBuyPrice - Ask >= PipStep * Point)
         TradeNow = true;
      if(ShortTrade && Bid - LastSellPrice >= PipStep * Point)
         TradeNow = true;
     }
   if(total < 1)
     {
      ShortTrade = false;
      LongTrade = false;
      TradeNow = true;
      StartEquity = AccountEquity();
     }
   if(TradeNow)
     {
      LastBuyPrice = FindLastBuyPrice();
      LastSellPrice = FindLastSellPrice();
      if(ShortTrade)
        {
         NumOfTrades = total;
         iLots = NormalizeDouble(StartingLots * MathPow(Multiplier, NumOfTrades), identifier);
         RefreshRates();
         ticket = OpenPendingOrder(1, iLots, Bid, slip, Ask, 0, 0, NumOfTrades, magic, 0, HotPink);
         if(ticket < 0)
           {
            Print("Error: ", GetLastError());
            return;
           }
         LastSellPrice = FindLastSellPrice();
         TradeNow = false;
         NewOrdersPlaced = true;
        }
      else
        {
         if(LongTrade)
           {
            NumOfTrades = total;
            iLots = NormalizeDouble(StartingLots * MathPow(Multiplier, NumOfTrades), identifier);
            ticket = OpenPendingOrder(0, iLots, Ask, slip, Bid, 0, 0, NumOfTrades, magic, 0, Lime);
            if(ticket < 0)
              {
               Print("Error: ", GetLastError());
               return;
              }
            LastBuyPrice = FindLastBuyPrice();
            TradeNow = false;
            NewOrdersPlaced = true;
           }
        }
     }
   if(TradeNow && total < 1)
     {
      PrevCl = iClose(Symbol(), 0, 2);
      CurrCl = iClose(Symbol(), 0, 1);
      SellLimit = Bid;
      BuyLimit = Ask;
      if(!ShortTrade && !LongTrade)
        {
         NumOfTrades = total;
         iLots = NormalizeDouble(StartingLots * MathPow(Multiplier, NumOfTrades), identifier);
         if(PrevCl > CurrCl)
           {
            if(iRSI(NULL, PERIOD_M5, 5, PRICE_CLOSE, 1) > 56.0)    //??????  >
              {
               ticket = OpenPendingOrder(1, iLots, SellLimit, slip, SellLimit, 0, 0, NumOfTrades, magic, 0, HotPink);
               if(ticket < 0)
                 {
                  Print("Error: ", GetLastError());
                  return;
                 }
               LastBuyPrice = FindLastBuyPrice();
               NewOrdersPlaced = true;
              }
           }
         else
           {
            if(iRSI(NULL, PERIOD_M5, 5, PRICE_CLOSE, 1) < 36.0)    // ??????  <
              {
               ticket = OpenPendingOrder(0, iLots, BuyLimit, slip, BuyLimit, 0, 0, NumOfTrades, magic, 0, Lime);
               if(ticket < 0)
                 {
                  Print("Error: ", GetLastError());
                  return;
                 }
               LastSellPrice = FindLastSellPrice();
               NewOrdersPlaced = true;
              }
           }
         if(ticket > 0)
            expiration = TimeCurrent() + 60.0 * (60.0 * MaxTradeOpenHours);
         TradeNow = false;
        }
     }
   total = CountTrades();
   AveragePrice = 0;
   double Count = 0;
   for(cnt = OrdersTotal() - 1; cnt >= 0; cnt--)
     {
      (int)OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
      if(OrderSymbol() != Symbol() || OrderMagicNumber() != magic)
         continue;
      if(OrderSymbol() == Symbol() && OrderMagicNumber() == magic)
        {
         if(OrderType() == OP_BUY || OrderType() == OP_SELL)
           {
            AveragePrice += OrderOpenPrice() * OrderLots();
            Count += OrderLots();
           }
        }
     }
   if(total > 0)
      AveragePrice = NormalizeDouble(AveragePrice / Count, Digits);
   if(NewOrdersPlaced)
     {
      for(cnt = OrdersTotal() - 1; cnt >= 0; cnt--)
        {
         (int)OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
         if(OrderSymbol() != Symbol() || OrderMagicNumber() != magic)
            continue;
         if(OrderSymbol() == Symbol() && OrderMagicNumber() == magic)
           {
            if(OrderType() == OP_BUY)
              {
               PriceTarget = AveragePrice + TakeProfit * Point;
               BuyTarget = PriceTarget;
               Stopper = AveragePrice - stoploss * Point;
               flag = true;
              }
           }
         if(OrderSymbol() == Symbol() && OrderMagicNumber() == magic)
           {
            if(OrderType() == OP_SELL)
              {
               PriceTarget = AveragePrice - TakeProfit * Point;
               SellTarget = PriceTarget;
               Stopper = AveragePrice + stoploss * Point;
               flag = true;
              }
           }
        }
     }
   if(NewOrdersPlaced)
     {
      if(flag == true)
        {
         for(cnt = OrdersTotal() - 1; cnt >= 0; cnt--)
           {
            (int)OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
            if(OrderSymbol() != Symbol() || OrderMagicNumber() != magic)
               continue;
            if(OrderSymbol() == Symbol() && OrderMagicNumber() == magic)
               (int)OrderModify(OrderTicket(), AveragePrice, OrderStopLoss(), PriceTarget, 0, Yellow);
            NewOrdersPlaced = false;
           }
        }
     }
   return;
  }

bool ButtonCreate(const long              chart_ID=0,               // ID графика
                  const string            name="Button",            // имя кнопки
                  const int               sub_window=0,             // номер подокна
                  const long               _x=0,                      // координата по оси X
                  const long               _y=0,                      // координата по оси Y
                  const int               width=50,                 // ширина кнопки
                  const int               height=18,                // высота кнопки
                  const string            text="Button",            // текст
                  const string            font="Arial",             // шрифт
                  const int               font_size=8,// размер шрифта
                  const color             clr=clrBlack,// цвет текста
                  const color             clrON=clrLightGray,// цвет фона
                  const color             clrOFF=clrLightGray,// цвет фона
                  const color             border_clr=clrNONE,// цвет границы
                  const bool              state=false,       //
                  const ENUM_BASE_CORNER  CORNER=CORNER_RIGHT_UPPER)
  {
   if(ObjectFind(chart_ID,name)==-1)
     {
      ObjectCreate(chart_ID,name,OBJ_BUTTON,sub_window,0,0);
      ObjectSetInteger(chart_ID,name,OBJPROP_XSIZE,width);
      ObjectSetInteger(chart_ID,name,OBJPROP_YSIZE,height);
      ObjectSetInteger(chart_ID,name,OBJPROP_CORNER,CORNER);
      ObjectSetString(chart_ID,name,OBJPROP_FONT,font);
      ObjectSetInteger(chart_ID,name,OBJPROP_FONTSIZE,font_size);
      ObjectSetInteger(chart_ID,name,OBJPROP_BACK,0);
      ObjectSetInteger(chart_ID,name,OBJPROP_SELECTABLE,0);
      ObjectSetInteger(chart_ID,name,OBJPROP_SELECTED,0);
      ObjectSetInteger(chart_ID,name,OBJPROP_HIDDEN,1);
      ObjectSetInteger(chart_ID,name,OBJPROP_ZORDER,1);
      ObjectSetInteger(chart_ID,name,OBJPROP_STATE,state);
     }
   ObjectSetInteger(chart_ID,name,OBJPROP_BORDER_COLOR,border_clr);
   color back_clr;
   if(ObjectGetInteger(chart_ID,name,OBJPROP_STATE))
      back_clr=clrON;
   else
      back_clr=clrOFF;
   ObjectSetInteger(chart_ID,name,OBJPROP_BGCOLOR,back_clr);
   ObjectSetInteger(chart_ID,name,OBJPROP_COLOR,clr);
   ObjectSetString(chart_ID,name,OBJPROP_TEXT,text);
   ObjectSetInteger(chart_ID,name,OBJPROP_XDISTANCE,_x+_X);
   ObjectSetInteger(chart_ID,name,OBJPROP_YDISTANCE,_y+_Y);
   return(true);
  }

void OnDeinit(const int reason)
  {
   if(reason==REASON_REMOVE)
      ObjectsDeleteAll(0,"cm_FAR");
   ObjectsDeleteAll(0,"cm__");
     {
      ObjectsDeleteAll(0,"");
     }
   Comment("");
   EventKillTimer();
  }

void buyf()
  {
   int market,lock;
   double lastprice;
   double price,slot;
   double del_price, del_slot;
   for(i=OrdersTotal()-1; i>=0; i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES) && OrderSymbol()==Symb && OrderMagicNumber()==magic)
        {
         if(OrderType()==0)
           {
            market++;                                                         //счётчик buy
            if(OrderOpenPrice()<lastprice || lastprice==0)
               lastprice=OrderOpenPrice();          //обновление lastprice по цене последнего открытого ордера buy
           }
         else
           {
            lock++;                                                           //счётчик sell
           }
        }
     }
   if(market!=0 || lock!=0)
     {
      for(i=OrdersHistoryTotal()-1; i>=0; i--)
        {
         if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY) && OrderSymbol()==Symb && OrderMagicNumber()==magic && OrderCloseTime()>TimeB)
           {
            del_price=OrderOpenPrice();
            del_slot=OrderLots();

            for(i=OrdersTotal()-1; i>=0; i--)
              {
               if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES) && OrderSymbol()==Symb && OrderMagicNumber()==magic)
                 {
                  if(OrderType()==0)
                     slot+=OrderLots();
                  else
                     slot-=OrderLots();
                 }
              }
            slot =slot-del_slot;
            for(i=OrdersTotal()-1; i>=0; i--)
              {
               if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES) && OrderSymbol()==Symb && OrderMagicNumber()==magic&& slot>0)
                 {
                  if(OrderType()==0)
                     price+=OrderOpenPrice()*(OrderLots()/slot);
                  else
                     price-=OrderOpenPrice()*(OrderLots()/slot);
                 }
              }
            price = price - del_price;
            price=NormalizeDouble(price+take_profit*Pp,Digits);
            /*  for(i=OrdersTotal()-1; i>=0; i--)
                {
                 if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES) && OrderSymbol()==Symb && OrderMagicNumber()==magic)
                   {
                    if(OrderType()==0)
                       ModifyOrder(OrderTicket(),-1,1,price);
                    else
                       ModifyOrder(OrderTicket(),-1,price+(Ask-Bid),1);
                   }
                }*/

            TimeB=TimeCurrent();                               //обновление TimeB по нынешнему времени

            return;
           }
        }
     }
   if(market==0)
     {
      TimeB=TimeCurrent();
      SendOrder(0,lt[0],-1,1,0,1,take_profit,magic);                    //открытие ордера на покупку если нет открытых buy
     }
   if(market>0 && Ask<lastprice-step[market-1]*Pp)                      //если есть ордер на покупку и цена ask меньше чем последняя цена по buy с учётом уставки и шага
     {
      SendOrder(0,lt[market],-1,1,0,1,0,magic);
      if(market>=set_3-1)
         SendOrder(1,lt_h[market],-1,1,0,1,0,magic);   //открытие хеджирующего ордера при достижении отметки на set_3
      for(i=OrdersTotal()-1; i>=0; i--)
        {
         if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES) && OrderSymbol()==Symb && OrderMagicNumber()==magic)
           {
            if(OrderType()==0)
               slot+=OrderLots();
            else
               slot-=OrderLots();
           }
        }
      for(i=OrdersTotal()-1; i>=0 ; i--)
        {
         if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES) && OrderSymbol()==Symb && OrderMagicNumber()==magic&& slot>0)
           {
            if(OrderType()==0)
               price+=OrderOpenPrice()*(OrderLots()/slot);
            else
               price-=OrderOpenPrice()*(OrderLots()/slot);
           }
        }
      price=NormalizeDouble(price+take_profit*Pp,Digits);
      /*for(i=OrdersTotal()-1; i>=0 ; i--)
        {
         if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES) && OrderSymbol()==Symb && OrderMagicNumber()==magic)
           {
            if(OrderType()==0)
               ModifyOrder(OrderTicket(),-1,-1,price);
            else
               ModifyOrder(OrderTicket(),-1,price+(Ask-Bid),-1);
           }
        }*/
     }
  }

void sellf()
  {
   int market,lock;
   double lastprice;
   double price,slot;
   double del_price, del_slot;
   for(i=OrdersTotal()-1; i>=0; i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES) && OrderSymbol()==Symb && OrderMagicNumber()==magic2)
        {
         if(OrderType()==1)
           {
            market++;
            if(OrderOpenPrice()>lastprice)
               lastprice=OrderOpenPrice();
           }
         else
           {
            lock++;
           }
        }
     }
   if(market!=0 || lock!=0)
     {
      for(i=OrdersHistoryTotal()-1; i>=0; i--)
        {
         if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY) && OrderSymbol()==Symb && OrderMagicNumber()==magic2 && OrderCloseTime()>TimeS)
           {

            for(i=OrdersTotal()-1; i>=0; i--)
              {
               if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES) && OrderSymbol()==Symb && OrderMagicNumber()==magic2)
                 {
                  if(OrderType()==0)
                     slot+=OrderLots();
                  else
                     slot-=OrderLots();
                 }
              }
            slot =slot-del_slot;
            for(i=OrdersTotal()-1; i>=0; i--)
              {
               if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES) && OrderSymbol()==Symb && OrderMagicNumber()==magic2&& slot>0)
                 {
                  if(OrderType()==0)
                     price+=OrderOpenPrice()*(OrderLots()/slot);
                  else
                     price-=OrderOpenPrice()*(OrderLots()/slot);
                 }
              }
            price = price - del_price;
            price=NormalizeDouble(price-take_profit*Pp,Digits);
            /* for(i=OrdersTotal()-1; i>=0; i--)
               {
                if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES) && OrderSymbol()==Symb && OrderMagicNumber()==magic2)
                  {
                   if(OrderType()==0)
                      ModifyOrder(OrderTicket(),-1,-1,price);
                   else
                      ModifyOrder(OrderTicket(),-1,price-(Ask-Bid),-1);
                  }
               }*/

            TimeS=TimeCurrent();
            return;
           }
        }
     }
   if(market==0)
     {
      TimeS=TimeCurrent();
      SendOrder(1,lt[0],-1,1,0,1,take_profit,magic2);
     }
   if(market>0 && Bid>lastprice+step[market-1]*Pp)
     {
      SendOrder(1,lt[market],-1,1,0,1,0,magic2);
      if(market>=set_3-1)
         SendOrder(0,lt_h[market],-1,1,0,1,0,magic2);

      for(i=OrdersTotal()-1; i>=0; i--)
        {
         if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES) && OrderSymbol()==Symb && OrderMagicNumber()==magic2)
           {
            if(OrderType()==1)
               slot+=OrderLots();
            else
               slot-=OrderLots();
           }
        

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

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

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

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

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

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

Стоимость полного кода
4 161,80₽ ≈ $50.87