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

MarginTrader

margintrader_v1.70.mq4
Вы автор или правообладатель?

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

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

О программе

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

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

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

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

НастройкаОписание
Close all trades on balance change? (CloseAllOnBalanceChange) Закрыть все при изменении баланса — Логический переключатель. При включении все открытые позиции закрываются при изменении баланса счёта.
Manage only own trades? (OnlyManageOwnTrades) Управлять только своими сделками — Логический переключатель. При включении советник управляет только своими сделками, определяемыми по магическому номеру, и игнорирует чужие позиции.
Disable MT4 One Click Trading panel? (DisableOneClick) Отключить панель однокликной торговли — Логический переключатель. При включении скрывается стандартная панель однокликной торговли MetaTrader 4.
Force OnTick() mode instead of OnTimer() (ForceOnTick) Принудительный режим OnTick — Логический переключатель. Принудительно переключает основной цикл советника в режим обработки события OnTick вместо стандартного таймера OnTimer.
Confirm Pending Order? (PendingConfirm) Подтверждать отложенный ордер — Логический переключатель. При включении требуется подтверждение через диалоговое окно перед размещением отложенного ордера.
Pending Mark Return Speed (PendingReturnSpeed) Скорость возврата метки отложенного ордера — Целое число, определяющее скорость анимированного возврата метки отложенного ордера на место после отпускания мыши (в миллисекундах на шаг).
Pending Stop Loss (Pips) (PendingSL) Стоп-лосс отложенного ордера (пипсы) — Числовое значение в пипсах, задающее стоп-лосс для нового отложенного ордера. Если значение меньше минимального допустимого пипса, стоп-лосс не устанавливается.
Pending Take Profit (Pips) (PendingTP) Тейк-профит отложенного ордера (пипсы) — Числовое значение в пипсах, задающее тейк-профит для нового отложенного ордера. Если значение меньше минимального допустимого пипса, тейк-профит не устанавливается.
Magic number (MagicNumber) Магический номер — Целочисленный идентификатор, используемый для фильтрации управляемых сделок. При включении фильтрации управляются только позиции с совпадающим магическим номером.
Получить полный код

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

#property version "1.704"

#property icon "\\Images\\icon.ico"
#property description "A simple tool for margin level based trading."
#property strict

#resource      "\\Images\\mt.bmp"
#resource      "\\Images\\dragon.bmp"
#resource      "\\Images\\thinline.bmp"
#resource      "\\Images\\h_mlimit.bmp"
#resource      "\\Images\\h_mlevel.bmp"
#resource      "\\Images\\h_manage.bmp"
#resource      "\\Images\\h_trades.bmp"
#resource      "\\Images\\h_account.bmp"
#resource      "\\Images\\h_spread.bmp"
#resource      "\\Images\\close_dis.bmp"
#resource      "\\Images\\close_on.bmp"
#resource      "\\Images\\close_off.bmp"
#resource      "\\Images\\tpsl_dis.bmp"
#resource      "\\Images\\sl_on.bmp"
#resource      "\\Images\\sl_off.bmp"
#resource      "\\Images\\tp_on.bmp"
#resource      "\\Images\\tp_off.bmp"
#resource      "\\Images\\speaker_on.bmp"
#resource      "\\Images\\speaker_off.bmp"
#resource      "\\Images\\buy_on.bmp"
#resource      "\\Images\\buy_off.bmp"
#resource      "\\Images\\buy_dis.bmp"
#resource      "\\Images\\sell_on.bmp"
#resource      "\\Images\\sell_off.bmp"
#resource      "\\Images\\sell_dis.bmp"
#resource      "\\Images\\buying.bmp"
#resource      "\\Images\\selling.bmp"
#resource      "\\Images\\chkbox_on.bmp"
#resource      "\\Images\\chkbox_off.bmp"
#resource      "\\Images\\arrup_on.bmp"
#resource      "\\Images\\arrup_off.bmp"
#resource      "\\Images\\arrup_dis.bmp"
#resource      "\\Images\\arrdn_on.bmp"
#resource      "\\Images\\arrdn_off.bmp"
#resource      "\\Images\\arrdn_dis.bmp"
#resource      "\\Images\\pend_on.bmp"
#resource      "\\Images\\pend_off.bmp"

#resource      "\\Sounds\\button.wav"
#resource      "\\Sounds\\click.wav"
#resource      "\\Sounds\\closing.wav"
#resource      "\\Sounds\\coin.wav"
#resource      "\\Sounds\\counting.wav"
#resource      "\\Sounds\\stops_set.wav"
#resource      "\\Sounds\\targets_set.wav"

enum yesno
{
   NO = 0,
   YES = 1
};

#define HOOK_NONE 0
#define HOOK_BUY  1
#define HOOK_SELL 2

#include  <MT_functions.mqh>

#define INPUT input

INPUT yesno     CloseAllOnBalanceChange       = NO;     // Close all trades on balance change?
INPUT yesno     OnlyManageOwnTrades           = NO;     // Manage only own trades?
INPUT yesno     DisableOneClick               = YES;    // Disable MT4 One Click Trading panel?
INPUT yesno     ForceOnTick                   = NO;     // Force OnTick() mode instead of OnTimer()
INPUT yesno     PendingConfirm                = YES;    // Confirm Pending Order?
INPUT int       PendingReturnSpeed            = 32;     // Pending Mark Return Speed
INPUT double    PendingSL                     = 0.0;    // Pending Stop Loss (Pips)
INPUT double    PendingTP                     = 0.0;    // Pending Take Profit (Pips)
INPUT int       MagicNumber                   = 32768;  // Magic number

int            Second, OldSecond, Total, MarginLimit, Lp,
               MaxMarginLimit = 9900,
               TradeMode = TRADE_NONE,
               LineMode  = LINE_INVALID,
               Error     = ERR_NO_MESSAGE_YET,
               PriceLineWidth = 2,
               PriceLineStyle = STYLE_SOLID,
               hook = HOOK_NONE;  // Mic v1.702 for Pending routine

char           fs;

double         MLPadding = 2.0,
               Pt, tickvalue, Spread, Fmp, Stop, Target, AvailLots, AddLots, Sl, Tp, PnL, Sym, MinPip,
               StopAddingPips, SpreadAverage, SpreadHistory[100];

string         _A, _F, _gSbalance, _gSoundsOn, _gAutoAdd, _gMarginLimit, _gIsTrading, _gErrorCode, _gErrorTime;

long           CID, SpreadHistoryCount;

bool           FirstRun, OldSoundsOn, OldAutoAdd, MousePressed, MouseClick, MouseRelease;

color          BackgroundColor               = C'25,24,24';
color          NeutralColor                  = C'240,240,240';
color          PositiveColor                 = clrLime;
color          NegativeColor                 = clrOrangeRed;
color          LabelColor                    = clrDarkGray;
color          PendingColorSell              = clrRed;              // Mic v1.703
color          PendingColorBuy               = C'0,150,220';      // Mic v1.703

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

void           OnDeinit                   (const int Reason) {

   ObjectsDeleteAll(CID, _ID);
   EventKillTimer();
   Comment("");
}

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

void           OnTimer                    () {

   if(!IsTesting() && !ForceOnTick) Run();   
}

void           OnChartEvent               (const int id,         
                                           const long& lparam,   
                                           const double& dparam, 
                                           const string& sparam) {
   static bool MouseOld = false;
   static int x=0;

   if(id == CHARTEVENT_MOUSE_MOVE) {

      if(uint(sparam) == 1) MousePressed = true;
      else MousePressed = false;

      int curX = (int)ObjectGetInteger(0,_LAB61,OBJPROP_XDISTANCE);
      int curY = (int)ObjectGetInteger(0,_LAB61,OBJPROP_YDISTANCE);
      int bx = 80, by = 111, bl = 146, bw = 20;  // Started cordinate for PendingLabel (center of object)
      double price=0;
      static string strade = "";
      datetime tm; // not used
      int sw; // not used
      if(ChartXYToTimePrice(0, curX, curY+2, sw, tm, price))
         price = NormalizeDouble(price, Digits);
      int al = (int)ChartGetInteger(0, CHART_WIDTH_IN_PIXELS);

      if(TradeMode == TRADE_BUY || TradeMode == TRADE_SELL) {
         if(ChartGetInteger(CID, CHART_DRAG_TRADE_LEVELS))
            ChartSetInteger(CID, CHART_DRAG_TRADE_LEVELS, false);
      }
      else {
         if(lparam >= (al - 160)) { // On MT panel
            if(ChartGetInteger(CID, CHART_DRAG_TRADE_LEVELS))
               ChartSetInteger(CID, CHART_DRAG_TRADE_LEVELS, false);
         }
         else { // left from MT panel
            if(!ChartGetInteger(CID, CHART_DRAG_TRADE_LEVELS))
               ChartSetInteger(CID, CHART_DRAG_TRADE_LEVELS, true);  // Moving pending stops and targets
         }
      }

      if(MousePressed && !MouseOld) {  // first mouse press

         int hl = bl/2;
         int cxb = al - bx - hl;
         int cxs = cxb + hl;
         int cy = by - bw/2;

         if((lparam >= cxb && lparam <= cxb+hl) && ((int)dparam >= cy && (int)dparam <= cy+bw)) { // if click inside button sell region
            hook = HOOK_SELL; strade = "SELL";
            ObjectSetInteger(CID, _PENDING, OBJPROP_STATE, true);
            ObjectSetInteger(CID,_LAB61, OBJPROP_COLOR, PendingColorSell);
            Click();
         }
         else if((lparam >= cxs && lparam <= cxs+hl) && ((int)dparam >= cy && (int)dparam <= cy+bw)) { // if click inside button buy region
            hook = HOOK_BUY; strade = "BUY";
            ObjectSetInteger(0, _PENDING, OBJPROP_STATE, true);
            ObjectSetInteger(CID,_LAB61, OBJPROP_COLOR, PendingColorBuy);
            Click();
         }
      }
      else if(!MousePressed && MouseOld) {  // first mouse release

         if(hook == HOOK_BUY || hook == HOOK_SELL) {
            if(curX > bx+bl/2 && (price > Ask+Pt || price < Bid-Pt)) { // If mooved left from button and price not inside spread
               string warn = "";
               bool is_warn = false;

               ObjectSetInteger(0, _PENDING, OBJPROP_STATE, true);
               ObjectSetInteger(CID, _LAB61, OBJPROP_SELECTABLE, false); 
               ObjectSetInteger(CID, _LAB61, OBJPROP_SELECTED, false); 

               if((TradeMode == TRADE_BUY && hook == HOOK_SELL) || (TradeMode == TRADE_SELL && hook == HOOK_BUY)) {
                  if(SoundsOn()) PlaySound("alert2.wav");
                  warn = "WARNING! HEDGE TRADING!\nYou tried to place a "+strade+" pending order!\n\n";
                  is_warn = true;
               }
               else {
                  if(SoundsOn()) PlaySound("::Sounds\\button.wav");
               }

               if((!PendingConfirm && !is_warn) || MessageBox(warn+"Are you sure you want to place a "+strade+" pending order?", "Pending Order", MB_YESNO) == IDYES) {

                  bool trade = true;
                  int ticket;
                  double slp = 0.0;
                  double tpp = 0.0;
                  double volume = MarketInfo(_Symbol, MODE_MINLOT);

                  if(TradeMode != TRADE_BUY && TradeMode != TRADE_SELL) {
                     volume = MathMax(AvailLots, volume); // if no trades, size = AvailLots else size = MINLOT
                     trade = false;
                  }

                  if(hook == HOOK_BUY) {
                     if(!trade) {   // if no open trades, set sl/tp
                        if(PendingSL>=MinPip) slp = NormalizeDouble(price - PendingSL * Pt, Digits);
                        if(PendingTP>=MinPip) tpp = NormalizeDouble(price + PendingTP * Pt, Digits);
                     }

                     if(price > Ask) {
                        ticket = OrderSendReliable(_Symbol, OP_BUYSTOP, volume, price, 0, slp, tpp, NULL, MagicNumber);
                        if(SoundsOn()) {if (ticket > 0) PlaySound("ok.wav"); else PlaySound("timeout.wav");}
                     }
                     else if(price < Bid) {
                        ticket = OrderSendReliable(_Symbol, OP_BUYLIMIT, volume, price, 0, slp, tpp, NULL, MagicNumber);
                        if(SoundsOn()) {if (ticket > 0) PlaySound("ok.wav"); else PlaySound("timeout.wav");}
                     }
                  }
                  else if(hook == HOOK_SELL) {
                     if(!trade) {   // if no open trades, set sl/tp
                        if(PendingSL>=MinPip) slp = NormalizeDouble(price + PendingSL * Pt, Digits);
                        if(PendingTP>=MinPip) tpp = NormalizeDouble(price - PendingTP * Pt, Digits);
                     }

                     if(price > Ask) {
                        ticket = OrderSendReliable(_Symbol, OP_SELLLIMIT, volume, price, 0, slp, tpp, NULL, MagicNumber);
                        if(SoundsOn()) {if (ticket > 0) PlaySound("ok.wav"); else PlaySound("timeout.wav");}
                     }
                     else if(price < Bid) {
                        ticket = OrderSendReliable(_Symbol, OP_SELLSTOP, volume, price, 0, slp, tpp, NULL, MagicNumber);
                        if(SoundsOn()) {if (ticket > 0) PlaySound("ok.wav"); else PlaySound("timeout.wav");}
                     }
                  }
               }
            }

            ReturnMove(bx, by, 1, PendingReturnSpeed); // Speed ms, pixel step
            ObjectSetInteger(CID,_LAB61, OBJPROP_COLOR, clrGray);
            ObjectSetString(CID,_LAB61,OBJPROP_TEXT,"–––––– Pending ––––––"); // this string must be dimension like pending button
            ChartRedraw();

         }  // end if hook
         hook = HOOK_NONE;
         strade = "";
      }  // end mouse release

      if(hook == HOOK_BUY) {
         if(price > Ask+Pt)
            ObjectSetString(CID,_LAB61,OBJPROP_TEXT,"––––––––––––– Buy   Stop –––––––––––––");
         else if(price < Bid-Pt)
            ObjectSetString(CID,_LAB61,OBJPROP_TEXT,"––––––––––––– Buy   Limit ––––––––––––");
         else
            ObjectSetString(CID,_LAB61,OBJPROP_TEXT,"–––––– NO ORDER ––––––");

         ChartRedraw();
      }
      else if(hook == HOOK_SELL) {
         if(price > Ask+Pt)
            ObjectSetString(CID,_LAB61,OBJPROP_TEXT,"––––––––––––– Sell   Limit ––––––––––––");
         else if(price < Bid-Pt)
            ObjectSetString(CID,_LAB61,OBJPROP_TEXT,"––––––––––––– Sell   Stop –––––––––––––");
         else
            ObjectSetString(CID,_LAB61,OBJPROP_TEXT,"–––––– NO ORDER ––––––");

         ChartRedraw();
      }
      else { // in some situation like double click, label deselect and button state is change, we correct that here.

         if(ObjectGetInteger(CID, _PENDING, OBJPROP_STATE)) {
            ObjectSetInteger(CID, _PENDING, OBJPROP_STATE, false);
            ObjectSetInteger(CID, _LAB61, OBJPROP_SELECTABLE, true); 
            ObjectSetInteger(CID, _LAB61, OBJPROP_SELECTED, true); 
         }
         else if(by != (int)ObjectGetInteger(0,_LAB61,OBJPROP_YDISTANCE)) {

            ObjectSetInteger(CID, _LAB61, OBJPROP_COLOR, clrNONE); 
            ObjectSetInteger(CID, _LAB61, OBJPROP_SELECTED, false); 
            ObjectDelete(CID, _LAB61);
         }
      }

      MouseOld = MousePressed;      
   }

   else if(id == CHARTEVENT_OBJECT_ENDEDIT) {
      if(sparam == _VAL06E) { // Edit Object Name

         string text = ObjectGetString(0,_VAL06E,OBJPROP_TEXT);
         int num = (int)StringToInteger(text);

         if(num >= 100 && num <= MaxMarginLimit) {
            MarginLimit = num;
            GlobalVariableSet(_gMarginLimit, MarginLimit);
            Click();
         }
         else {
            if(SoundsOn())
               PlaySound("timeout.wav");
         }

      }
   } //-- Mic end Margin Limit edit field

}

bool ReturnMove(int bx, int by, int speed = 5, int mult = 5)
{
   int curX = (int)ObjectGetInteger(0,_LAB61,OBJPROP_XDISTANCE);
   int curY = (int)ObjectGetInteger(0,_LAB61,OBJPROP_YDISTANCE);

   int lX = MathAbs(bx - curX);
   int lY = MathAbs(by - curY);
   double mx = curX;
   double my = curY;

   int steps = MathMax(lX, lY);
   double addX = Divide(lX, steps) * mult;
   double addY = Divide(lY, steps) * mult;

   mult = MathMax(mult, 1);
   mult = MathMin(mult, steps);

   for(int a=0;a<steps;a+=mult) {
      if(bx > mx) {
         mx += addX;
         if(mx > bx)
            mx = bx;
      }
      else if(bx < mx) {
         mx -= addX;
         if(mx < bx)
            mx = bx;
      }

      if(by > my) {
         my += addY;
         if(my > by)
            my = by;
      }
      else if(by < my) {
         my -= addY;
         if(my < by)
            my = by;
      }

      ObjectSetInteger(CID,_LAB61,OBJPROP_XDISTANCE,(int)MathRound(mx));
      ObjectSetInteger(CID,_LAB61,OBJPROP_YDISTANCE,(int)MathRound(my));
      if(a + 250 > steps) {
         ObjectSetString(0,_LAB61,OBJPROP_TEXT,"–––––– Pending ––––––");
         ObjectSetInteger(CID,_LAB61, OBJPROP_COLOR, clrGray);
      }      
      ChartRedraw();

      Sleep(speed);
   }

return(false);
} 

void           Run                        () {

   int            i, ttype, count = 0; //, tt[]; Mic v1.67
   double         Balance;
   bool           result;
   static double  McBalance = AccountBalance();

   if(FirstRun) {

      FirstRun = false;

      if(DisableOneClick) ChartSetInteger(CID, CHART_SHOW_ONE_CLICK, false);
      else ChartSetInteger(CID, CHART_SHOW_ONE_CLICK, true);

      ChartSetInteger(CID, CHART_FOREGROUND, false);

      ChartSetInteger(CID, CHART_SHIFT, true);

      ChartSetInteger(CID, CHART_SHOW_OBJECT_DESCR, true);

      Panel(_BKG, CORNER_RIGHT_UPPER, BORDER_FLAT, 160, 0, 160, 5000, BackgroundColor);

      Bitmap(_PFGT,    CORNER_RIGHT_UPPER,  33,   4,  77,  40, _BMP_FGT);
      Bitmap(_PDRAGON, CORNER_RIGHT_UPPER, 114,   4,  42,  42, _BMP_DRAGON);

      Bitmap(_PTHL01,  CORNER_RIGHT_UPPER,   4,  73, 152,   5, _BMP_THIN);
      Bitmap(_PTHL04,  CORNER_RIGHT_LOWER,   4,  55, 152,   5, _BMP_THIN);
      Bitmap(_PTHL05,  CORNER_RIGHT_LOWER,   4, 129, 152,   5, _BMP_THIN);

      Bitmap(_PMLM,    CORNER_RIGHT_UPPER,   4, 159, 146,  18, _BMP_MLM);
      Bitmap(_PMNG,    CORNER_RIGHT_UPPER,   4, 234, 146,  18, _BMP_MNG);
      Bitmap(_PTRD,    CORNER_RIGHT_UPPER,   4, 312, 146,  18, _BMP_TRD);

      Bitmap(_PACC,    CORNER_RIGHT_LOWER,   4, 185, 146,  18, _BMP_ACC);
      Bitmap(_PMLV,    CORNER_RIGHT_LOWER,   4, 100, 146,  18, _BMP_MLV);
      Bitmap(_PSPT,    CORNER_RIGHT_LOWER,   4,  26, 146,  18, _BMP_SPT);

      BmpButton(_SPK,  CORNER_RIGHT_UPPER,   6,  15,  20,  20, _BMP_SPK_ON, _BMP_SPK_OFF);
      ObjectSetInteger(CID, _SPK, OBJPROP_STATE, SoundsOn());
      OldSoundsOn = SoundsOn();

      Label(_LAB01, CORNER_RIGHT_UPPER, 120, 147, "Add automatically", 10, White, _MFONT, ANCHOR_LEFT_LOWER);
      BmpButton(_ADD,   CORNER_RIGHT_UPPER, 121, 128, 22,  19, _BMP_CHK_ON, _BMP_CHK_OFF);      
      ObjectSetInteger(CID, _ADD, OBJPROP_STATE, AutoAdd());
      OldAutoAdd = AutoAdd();

      MarginLimit = int(GlobalVariableGet(_gMarginLimit));

      Bitmap(_PPLUS,  CORNER_RIGHT_UPPER, 115, 185,  38,  38, _BMP_AUP_DIS);
      Bitmap(_PMINUS, CORNER_RIGHT_UPPER,   7, 185,  38,  38, _BMP_ADN_DIS);
      Bitmap(_PBUY,   CORNER_RIGHT_UPPER,   5,  57,  74,  40, _BMP_BUY_DIS);
      Bitmap(_PSELL,  CORNER_RIGHT_UPPER,  81,  57,  74,  40, _BMP_SELL_DIS);
      Bitmap(_PCLOSE, CORNER_RIGHT_UPPER,   5, 261,  74,  40, _BMP_CLOSE);
      Bitmap(_PTPSL,  CORNER_RIGHT_UPPER,  81, 261,  74,  40, _BMP_TPSL);

      Button(_ID + "Reset", CORNER_RIGHT_LOWER, 49, 205, 43, 14, "RESET", 7, Black, Silver, Black, "Consolas");

      PendingLabel(_LAB61, CORNER_RIGHT_UPPER, 80, 111, "–––––– Pending ––––––", 10, clrGray, "Arial Bold", ANCHOR_CENTER);
      BmpButton(_PENDING, CORNER_RIGHT_UPPER, 7,  102, 146, 20, _BMP_PEND_ON, _BMP_PEND_OFF);
      ObjectSetString(CID, _PENDING, OBJPROP_TOOLTIP, "Click, Drag and Drop");

      ChartSetInteger(CID, CHART_EVENT_MOUSE_MOVE, true);

   } else {

      RefreshRates();
      tickvalue = (MarketInfo(_Symbol, MODE_TICKVALUE) / MarketInfo(_Symbol, MODE_TICKSIZE)) * _Point;

      SessionReset();
      SelectLine();
      MakeStats();
      MakeLabels();
      ShowSpread();
      CandleTime();
      MakeValues();

      StopAddingPips = 3.0 * SpreadAverage * Pt;

      Sl = 0.0; 
      Tp = 0.0;
      PnL = 0.0;

      bool SoundsOn = ObjectGetInteger(CID, _SPK, OBJPROP_STATE);
      if(SoundsOn != OldSoundsOn) {
         OldSoundsOn = SoundsOn;
         GlobalVariableSet(_gSoundsOn, SoundsOn);
         PlaySound("::Sounds\\button.wav");
      }

      bool AutoAdd = ObjectGetInteger(CID, _ADD, OBJPROP_STATE);
      if(AutoAdd != OldAutoAdd) {
         OldAutoAdd = AutoAdd;
         GlobalVariableSet(_gAutoAdd, AutoAdd);
         if(SoundsOn()) Click();
      }

      Fmp = 100.0 * Divide(AccountEquity(), AccountMargin());

      AvailLots = (Divide(AccountEquity(), (MarginLimit + MLPadding) / 100.0) - AccountMargin()) / MarketInfo(_Symbol, MODE_MARGINREQUIRED);
      AvailLots = NormalizeDouble(MathMax(AvailLots, 0.0), Lp);

      AddLots   = NormalizeDouble(MathMax(MarketInfo(_Symbol, MODE_MINLOT), (AccountLeverage() * AccountEquity() / 5000000.0)), Lp);

      Total = OrdersTotal();

      if(AccountBalance() != McBalance) {

         ObjectSetInteger(CID, _BUY, OBJPROP_STATE, false);
         ObjectSetInteger(CID, _SELL, OBJPROP_STATE, false);
         if(CloseAllOnBalanceChange) CloseAllTrades();
         McBalance = AccountBalance();
         return;
      }

      TradeMode = TRADE_NONE;
      int first_type = -1;

      for(i = 0; i < Total; i++) {
         result = OrderSelect(i, SELECT_BY_POS, MODE_TRADES);
         ttype = OrderType();
         if(OrderSymbol() == _Symbol && (ttype == OP_BUY || ttype == OP_SELL) && (!OnlyManageOwnTrades || OrderMagicNumber() == MagicNumber)) {    // All trades on current symbol
            if(first_type == -1) {
               first_type = ttype;
               if(ttype == OP_BUY)
                  TradeMode = TRADE_BUY;
               else
                  TradeMode = TRADE_SELL;
            }
            if(first_type != ttype) {  // If hedge
               TradeMode = TRADE_MISMATCH;
               break;
            }
            Sl = OrderStopLoss();
            Tp = OrderTakeProfit();
            PnL += OrderProfit() + OrderCommission() + OrderSwap();
            count++;
         }
         else if(ttype == OP_BUY || ttype == OP_SELL) {  // Trade on other symbol or manual
            if(OrderSymbol() == _Symbol)
               TradeMode = TRADE_MANUAL;
            else
               TradeMode = TRADE_OTHER;
            break;
         }
      }

      if(MarginLimit > 100 && MarginLimit < MaxMarginLimit) {

         BmpButton(_PLUS,  CORNER_RIGHT_UPPER, 115, 185, 38, 38, _BMP_AUP_ON, _BMP_AUP_OFF);
         BmpButton(_MINUS, CORNER_RIGHT_UPPER,   7, 185, 38, 38, _BMP_ADN_ON, _BMP_ADN_OFF);

      } else if(MarginLimit == 100) {

         if(ObjectFind(CID, _MINUS) != -1) ObjectDelete(CID, _MINUS);
         BmpButton(_PLUS,  CORNER_RIGHT_UPPER, 115, 185, 38, 38, _BMP_AUP_ON, _BMP_AUP_OFF);

      } else {

         if(ObjectFind(CID, _PLUS) != -1) ObjectDelete(CID, _PLUS);
         BmpButton(_MINUS, CORNER_RIGHT_UPPER,   7, 185, 38, 38, _BMP_ADN_ON, _BMP_ADN_OFF);
      }

      switch(TradeMode) {  // pos #441

         case TRADE_BUY:         if(ObjectFind(CID, _SELL) != -1) ObjectDelete(CID, _SELL);
                                 if(AutoAdd()) {
                                    if(ObjectFind(CID, _BUY) != -1) ObjectDelete(CID, _BUY);
                                    BmpButton(_BUYING,   CORNER_RIGHT_UPPER,  5,  57, 151, 40, _BMP_BUYING, _BMP_BUYING);
                                 } else {
                                    if(ObjectFind(CID, _BUYING) != -1) ObjectDelete(CID, _BUYING);
                                    BmpButton(_BUY,      CORNER_RIGHT_UPPER,  5,  57, 74, 40, _BMP_BUY_ON, _BMP_BUY_OFF);
                                 }
                                 BmpButton(_CLOSE, CORNER_RIGHT_UPPER,  5,  261, 74, 40, _BMP_CLOSE_ON, _BMP_CLOSE_OFF);
                                 MakePriceLine();
                                 GlobalVariableSet(_gIsTrading, Sym);
                                 break;

         case TRADE_SELL:        if(ObjectFind(CID, _BUY) != -1)  ObjectDelete(CID, _BUY);
                                 if(AutoAdd()) {
                                    if(ObjectFind(CID, _SELL) != -1) ObjectDelete(CID, _SELL);
                                    BmpButton(_SELLING,  CORNER_RIGHT_UPPER,  5,  57, 151, 40, _BMP_SELLING, _BMP_SELLING);
                                 } else {
                                    if(ObjectFind(CID, _SELLING) != -1) ObjectDelete(CID, _SELLING);
                                    BmpButton(_SELL,     CORNER_RIGHT_UPPER,  81,  57, 74, 40, _BMP_SELL_ON, _BMP_SELL_OFF);
                                 }
                                 BmpButton(_CLOSE, CORNER_RIGHT_UPPER,  5,  261, 74, 40, _BMP_CLOSE_ON, _BMP_CLOSE_OFF);
                                 MakePriceLine();
                                 GlobalVariableSet(_gIsTrading, Sym);
                                 break;

         case TRADE_MISMATCH:    if(ObjectFind(CID, _SELL) != -1) ObjectDelete(CID, _SELL);
                                 if(ObjectFind(CID, _SELLING) != -1) ObjectDelete(CID, _SELLING);
                                 if(ObjectFind(CID, _BUY) != -1)  ObjectDelete(CID, _BUY);
                                 if(ObjectFind(CID, _BUYING) != -1) ObjectDelete(CID, _BUYING);
                                 if(ObjectFind(CID, _CLOSE) != -1) ObjectDelete(CID, _CLOSE);
                                 ObjectDelete(_PLINE);
                                 LineMode = LINE_INVALID;
                                 GlobalVariableSet(_gIsTrading, 0.0);
                                 break;

         case TRADE_MANUAL:      // Mic v1.69 add TRADE_MANUAL
         case TRADE_OTHER:       if(ObjectFind(CID, _SELL) != -1) ObjectDelete(CID, _SELL);
                                 if(ObjectFind(CID, _SELLING) != -1) ObjectDelete(CID, _SELLING);
                                 if(ObjectFind(CID, _BUY) != -1)  ObjectDelete(CID, _BUY);
                                 if(ObjectFind(CID, _BUYING) != -1) ObjectDelete(CID, _BUYING);
                                 if(ObjectFind(CID, _CLOSE) != -1) ObjectDelete(CID, _CLOSE);
                                 ObjectDelete(_PLINE);
                                 LineMode = LINE_INVALID;
                                 break;

         default:                if(ObjectFind(CID, _BUYING) != -1) ObjectDelete(CID, _BUYING);
                                 if(ObjectFind(CID, _SELLING) != -1) ObjectDelete(CID, _SELLING);
                                 if(ObjectFind(CID, _CLOSE) != -1) ObjectDelete(CID, _CLOSE);
                                 BmpButton(_BUY,   CORNER_RIGHT_UPPER,   5,  57, 74, 40, _BMP_BUY_ON,  _BMP_BUY_OFF);
                                 BmpButton(_SELL,  CORNER_RIGHT_UPPER,  81,  57, 74, 40, _BMP_SELL_ON, _BMP_SELL_OFF);   
                                 ObjectDelete(_PLINE);
                                 LineMode = LINE_INVALID;
                                 GlobalVariableSet(_gIsTrading, 0.0);
                                 break;
      }

      switch(LineMode) {

         case LINE_INVALID:      if(ObjectFind(CID, _STOP) != -1) ObjectDelete(CID, _STOP);
                                 if(ObjectFind(CID, _TAKE) != -1) ObjectDelete(CID, _TAKE);
                                 break;

         case LINE_SL:           if(ObjectFind(CID, _TAKE) != -1)  ObjectDelete(CID, _TAKE);
                                 BmpButton(_STOP, CORNER_RIGHT_UPPER,  81,  261, 74, 40, _BMP_SL_ON, _BMP_SL_OFF);
                                 break;

         case LINE_TP:           if(ObjectFind(CID, _STOP) != -1)  ObjectDelete(CID, _STOP);
                                 BmpButton(_TAKE, CORNER_RIGHT_UPPER,  81,  261, 74, 40, _BMP_TP_ON, _BMP_TP_OFF);
                                 break;
      }

      if(ObjectFind(CID, _LAB61) == -1) { // if pending label deleted, pending button must be recreated to be over pending label
         if(ObjectFind(CID, _PENDING) != -1) ObjectDelete(CID, _PENDING);
         PendingLabel(_LAB61, CORNER_RIGHT_UPPER, 80, 111, "–––––– Pending ––––––", 10, clrGray, "Arial Bold", ANCHOR_CENTER);
         BmpButton(_PENDING, CORNER_RIGHT_UPPER, 7,  102, 146, 20, _BMP_PEND_ON, _BMP_PEND_OFF);
         ObjectSetString(CID, _PENDING, OBJPROP_TOOLTIP, "Click, Drag and Drop");
      }

      if(TradeMode == TRADE_BUY || TradeMode == TRADE_NONE) {  // Mic v1.68 new mode TRADE_MANUAL

         if(ObjectGetInteger(CID, _BUY, OBJPROP_STATE)) {

            Buyer(true);
            ObjectSetInteger(CID, _BUY, OBJPROP_STATE, false);
         }
      }

      if(TradeMode == TRADE_SELL || TradeMode == TRADE_NONE) { // Mic 1.68 new mode TRADE_MANUAL

         if(ObjectGetInteger(CID, _SELL, OBJPROP_STATE)) {

            Seller(true);
            ObjectSetInteger(CID, _SELL, OBJPROP_STATE, false);
         }
      }

      if(ObjectGetInteger(CID, _CLOSE, OBJPROP_STATE)) {

         Balance = AccountBalance();
         if(SoundsOn() && AccountProfit() > 0.0 && count >= 3) PlaySound("::Sounds\\counting.wav"); 
         if(SoundsOn() && AccountProfit() <= 0.0) PlaySound("ok.wav"); 

         CloseAllTrades();

         Fmp = 100.0 * Divide(AccountEquity(), AccountMargin());         
         MakeValues();

         ObjectSetInteger(CID, _CLOSE, OBJPROP_STATE, false);
         if(SoundsOn()) Pl

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

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

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

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

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

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

Стоимость полного кода
3 767,90₽ ≈ $46.05