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

MarginTrader

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

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

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

О программе

MarginTrader — советник для MetaTrader 5, предназначенный для торговли на основе уровня маржи. В исходнике указано описание: инструмент для торговли в зависимости от уровня маржи с поддержкой торговли на нескольких символах и общим балансом. Советник отображает панель на графике с кнопками и индикаторами.

Советник обрабатывает события OnTick и OnTimer, а также графические события мыши для взаимодействия с пользовательским интерфейсом. Поддерживается размещение отложенных ордеров через перетаскивание элемента на графике, управление открытыми позициями (открытие, закрытие, частичное закрытие, модификация SL/TP) с использованием торговых API MetaTrader.

Реализованы несколько методов обработки стоп-аута по марже (smart, fair, all), функция автоматического добавления позиций (пиррамидинг), отслеживание спреда, отображение времени до закрытия свечи и расчёт доступного объёма. Торговля ограничена определёнными валютными парами и золотом. Настройки хранятся в глобальных переменных MetaTrader.

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

НастройкаОписание
Balance Share (0 Disable, -1 No Share) (BalanceShare) Balance Share — Баланс для совместного использования между символами (0 — отключить, -1 — без разделения)
Stop Out Margin Call Method (MarginCall) Stop Out Margin Call Method — Метод обработки стоп-аута по марже
Disable MT5 One Click Trading panel? (DisableOneClick) Disable One Click — Отключение панели однократной торговли MT5
Force OnTick() mode instead of OnTimer() (ForceOnTick) Force OnTick — Принудительный режим OnTick() вместо OnTimer()
Confirm Pending Order? (PendingConfirm) Confirm Pending Order — Подтверждение размещения отложенного ордера
Pending Mark Return Speed (PendingReturnSpeed) Pending Mark Return Speed — Скорость возврата маркера отложенного ордера
Pending Stop Loss (Pips) (PendingSL) Pending Stop Loss — Стоп-лосс для отложенных ордеров (в пипсах)
Pending Take Profit (Pips) (PendingTP) Pending Take Profit — Тейк-профит для отложенных ордеров (в пипсах)
Magic number (MagicNumber) Magic Number — Магический номер для идентификации сделок
Получить полный код

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

#property version "1.820"
const string _ver = "1.820";

#property icon "\\Images\\icon.ico"
#property description "A simple tool for margin level based trading."
#property description "Multi symbol trading version with shared balance."
#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      "\\Images\\greenbarline.bmp"  // Mic v1.813

#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"

#include <Trade\\Trade.mqh>

CTrade Trade;
CPositionInfo Pos;
CSymbolInfo SymInfo;

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

enum mc
{
   MC_smart = 0,  // Smart Stop Out (partial close)
   MC_fair = 1,   // Fair Stop Out (close one by one)
   MC_all = 2     // All Stop Out (close all trade)
};

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

#define START_DELAY 10

#include  <MT_margin_calc.mqh>
#include  <MT_functions.mqh>

#define INPUT input

INPUT int       BalanceShare                  = 10;         // Balance Share (0 Disable, -1 No Share)
INPUT mc        MarginCall                    = MC_smart;   // Stop Out Margin Call Method
INPUT yesno     DisableOneClick               = YES;        // Disable MT5 One Click Trading panel?
INPUT yesno     ForceOnTick                   = NO;         // Force OnTick() mode instead of OnTimer()
INPUT yesno     PendingConfirm                = YES;        // Confirm Pending Order?
INPUT int       PendingReturnSpeed            = 16;         // Pending Mark Return Speed
INPUT double    PendingSL                     = 0.0;        // Pending Stop Loss (Pips)
INPUT double    PendingTP                     = 0.0;        // Pending Take Profit (Pips)
INPUT ulong     MagicNumber                   = 32768;      // Magic number

int            Second, OldSecond, MarginLimit, Lp, Total,
               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
               start_timer;

char           fs;

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

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

long           CID, SpreadHistoryCount;

bool           debug=false, FirstRun, OldSoundsOn, OldAutoAdd, MousePressed, MouseClick, MouseRelease, init_error, gvar_error, MultiSymbol, NoShare, edit_lock=false;

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               = clrDeepSkyBlue; // C'0,150,220';      // Mic v1.703

const string   ControlPairs       = "GU,UF,EU,UJ,UC,NU,AU,AN,AC,AF,AJ,CJ,FJ,EG,EA,EF,EJ,EN,EC,GF,GA,GC,GJ,GN,NJ,NC,CF,NF,XU";

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

void           OnDeinit                   (const int Reason) {

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

   if(!gvar_error)
      GlobalVariableDel(TempGlobal);

   if(Reason == REASON_ACCOUNT) { // Automatic Add is OFF when account is changed
      GlobalVariableSet(_gAutoAdd, false);
   }
}

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

void           OnTimer                    () {

   if(!MQLInfoInteger(MQL_TESTER) && !ForceOnTick) Run();

}

void           OnChartEvent               (const int id,         
                                           const long& lparam,   
                                           const double& dparam, 
                                           const string& sparam) {
   if(init_error) return;
   static bool MouseOld = false;
   static int x=0;
   int bx = 80, by = 111, bl = 146, bw = 20;  // Started cordinate for PendingLabel (center of object)

   double Ask = SymbolInfoDouble(_Symbol, SYMBOL_ASK);
   double Bid = SymbolInfoDouble(_Symbol, SYMBOL_BID);

   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);
      double price = 0;
      static string strade = "";
      datetime tm; // not used
      int sw; // not used
      if(ChartXYToTimePrice(0, curX, curY+2, sw, tm, price))
         price = NormalizePrice(price);   // On pending orders we must use diferent normalization for price. See NormalizePrice() in MT_function.mqh
      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)) {
            if(ChartGetInteger(CID, CHART_DRAG_TRADE_LEVELS))
               ChartSetInteger(CID, CHART_DRAG_TRADE_LEVELS, false);
         }
         else {
            if(!ChartGetInteger(CID, CHART_DRAG_TRADE_LEVELS))
               ChartSetInteger(CID, CHART_DRAG_TRADE_LEVELS, true); // For mooving 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) {
            ObjectSetInteger(0, _PENDING, OBJPROP_STATE, true);
            ObjectSetInteger(CID, _LAB61, OBJPROP_SELECTABLE, false); 
            ObjectSetInteger(CID, _LAB61, OBJPROP_SELECTED, false); 
            ChartRedraw();

            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;

               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;
                  double slp = 0.0;
                  double tpp = 0.0;
                  double volume = SymbolInfoDouble(_Symbol,SYMBOL_VOLUME_MIN); // We don't know what situation will be when trade will be open, set minimum and MT will add if needed

                  trade = (TradeMode == TRADE_BUY || TradeMode == TRADE_SELL);

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

                     if(price > Ask) {
                        Trade.BuyStop(volume, price, _Symbol, slp, tpp);
                        StoreErrorData(Trade.ResultRetcode(), TimeLocal());
                        if(SoundsOn()) {if (Trade.ResultOrder() > 0) PlaySound("ok.wav"); else PlaySound("timeout.wav");}
                     }
                     else if(price < Bid) {
                        Trade.BuyLimit(volume, price, _Symbol, slp, tpp);
                        StoreErrorData(Trade.ResultRetcode(), TimeLocal());
                        if(SoundsOn()) {if (Trade.ResultOrder() > 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 = NormalizePrice(price + PendingSL * Pt);
                        if(PendingTP>=MinPip) tpp = NormalizePrice(price - PendingTP * Pt);
                     }

                     if(price > Ask) {
                        Trade.SellLimit(volume, price, _Symbol, slp, tpp);
                        StoreErrorData(Trade.ResultRetcode(), TimeLocal());
                        if(SoundsOn()) {if (Trade.ResultOrder() > 0) PlaySound("ok.wav"); else PlaySound("timeout.wav");}
                     }
                     else if(price < Bid) {
                        Trade.SellStop(volume, price, _Symbol, slp, tpp);
                        StoreErrorData(Trade.ResultRetcode(), TimeLocal());
                        if(SoundsOn()) {if (Trade.ResultOrder() > 0) PlaySound("ok.wav"); else PlaySound("timeout.wav");}
                     }
                  }
               }
            }

            if(curX > bx*2) {
               ReturnMove(bx+220, by, 4, PendingReturnSpeed); // Speed ms, pixel step
               ReturnMove(bx-20, by, 4, PendingReturnSpeed/4); // Speed ms, pixel step
            }
            else
               ReturnMove(bx-20, by, 4, PendingReturnSpeed); // Speed ms, pixel step
            ObjectSetString(CID,_LAB61,OBJPROP_TEXT,"–––––– Pending ––––––"); // this string must be dimension like pending button
            ObjectSetInteger(CID,_LAB61, OBJPROP_COLOR, clrNONE); // Invisible
            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 { 
         int hl = bl/2;
         int cxb = al - bx - hl;
         int cxs = cxb + hl;
         int cy = by - bw/2;
         int oy = (int)ObjectGetInteger(0,_LAB61,OBJPROP_YDISTANCE);

         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(oy < cy || oy > cy+bw) {

            ObjectDelete(CID, _LAB61);
         }

         if((lparam > cxb+1 && lparam < cxb+bl-1) && ((int)dparam > cy+2 && (int)dparam < cy+bw-1)) {
            ObjectSetInteger(CID, _LAB61, OBJPROP_XDISTANCE, al-lparam);
            ObjectSetInteger(CID, _LAB61, OBJPROP_YDISTANCE, (int)dparam);
         }
         else {   // return to ceneter of button
            if(ObjectGetInteger(CID, _LAB61, OBJPROP_XDISTANCE) != bx)
               ObjectSetInteger(CID, _LAB61, OBJPROP_XDISTANCE, bx);
            if(ObjectGetInteger(CID, _LAB61, OBJPROP_XDISTANCE) != by)
               ObjectSetInteger(CID, _LAB61, OBJPROP_YDISTANCE, by);

         }
      }

      MouseOld = MousePressed;      
   }

   else if(id == CHARTEVENT_OBJECT_ENDEDIT) {
      if(sparam == _VAL06E) { // Edit Object Name
         edit_lock = true;
         string text = ObjectGetString(0, _VAL06E, OBJPROP_TEXT);
         int num = (int)StringToInteger(text);

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

         if(debug) Print("ML Edit value: '", text, "'  Num: ", IntegerToString(num));
         edit_lock = false;
      }
   } //-- Mic end Margin Limit edit field

   else if(id == CHARTEVENT_OBJECT_DRAG) {
      if(sparam == _PLINE) {

         pline_mem = -99.0;
      }
   }

}

void ReturnMove(int bx, int by, int speed = 4, int mult = 16)
{
   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;

   mult = MathMax(mult, 1);

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

   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));
      ChartRedraw();

      Sleep(speed);
   }

} 

void           Run                        () {

   int            i, ttype, count = 0; //, tt[]; Mic v1.67

   static double  McBalance = 0.0;
   string c = "";  // Comment var

   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);

      Label(_ID+"VER", CORNER_RIGHT_UPPER, 6, 47, _ver, 7, clrGray, _MFONT, ANCHOR_RIGHT_LOWER);

      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, clrNONE, "Arial Bold", ANCHOR_CENTER);
      BmpButton(_PENDING, CORNER_RIGHT_UPPER, 7,  102, 146, 20, _BMP_PEND_ON, _BMP_PEND_OFF);
      ObjectSetString(CID, _LAB61, OBJPROP_TOOLTIP, "Click, Drag and Drop");

      ChartSetInteger(CID, CHART_EVENT_MOUSE_MOVE, true);

      start_timer = START_DELAY;

   } else {

      if(init_error) return;

      int share = 0;  //, shareN = 0;

      if(NoShare || BalanceShare < 0) {
         MultiSymbol = false;
         share = -9;
      }
      else {
         int TGlen = StringLen(TGfind);
         for(i=0;i<GlobalVariablesTotal();i++) {
            string gname = GlobalVariableName(i);
            if(StringLeft(gname, TGlen) == TGfind) {
               int sval = (int)GlobalVariableGet(gname);
               if(sval < 0) { // if anyone has BalanceShare -1, all MT force single symbol mode
                  share = -99;
                  break;
               }
               else
                  share += sval;
            }
         }
         MultiSymbol = (share >= 0);
      }      

      if(MultiSymbol)
         LocalBalance = NormalizeDouble(Divide(AccountInfoDouble(ACCOUNT_BALANCE)+AccountInfoDouble(ACCOUNT_CREDIT), share) * BalanceShare, 2);
      else
         LocalBalance = AccountInfoDouble(ACCOUNT_BALANCE);

      if(McBalance != LocalBalance) {
         start_timer = START_DELAY;
         McBalance = LocalBalance;
      }

      if(debug) c += "\nShareTotal: " + IntegerToString(share);

      double margin_required, local_volume = 0.0, p = 0.0, local_cost = 0.0;
      LocalProfit = 0.0;
      Total = PositionsTotal();

      for(i=0;i<Total;i++) {
         if(!Pos.SelectByIndex(i))
            continue;
         if(Pos.Symbol() == _Symbol) {    // All open trades on current symbol
            LocalProfit += Pos.Profit() + Pos.Commission() + Pos.Swap();
            local_volume += Pos.Volume();
            local_cost += Pos.Commission() + Pos.Swap();
            p += Pos.Volume() * Pos.PriceOpen();
         }
      }

      double local_price = NormalizeDouble(Divide(p, local_volume), _Digits); // average price
      if(debug) c += "\nlocal_price: " + DoubleToString(local_price, _Digits);

      if(MultiSymbol)
         LocalEquity = LocalBalance + LocalProfit;
      else
         LocalEquity = AccountInfoDouble(ACCOUNT_EQUITY);

      MyOrderCalcMargin(ORDER_TYPE_BUY, _Symbol, 1.0, 0.0, margin_required);   // MT_margin_calc.mqh

      if(MultiSymbol)
         LocalMargin = margin_required * local_volume;
      else
         LocalMargin = AccountInfoDouble(ACCOUNT_MARGIN);

      SymInfo.RefreshRates();
      tickvalue = (SymbolInfoDouble(_Symbol,SYMBOL_TRADE_TICK_VALUE) / SymbolInfoDouble(_Symbol,SYMBOL_TRADE_TICK_SIZE)) * _Point;

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

      if(start_timer == 1) {
         string bal_tt;
         if(share > 0 && BalanceShare >= 0)
            bal_tt = "Balance Share " + IntegerToString(BalanceShare) + "/" + IntegerToString(share);
         else
            bal_tt = "Full Balance, Single Trade";

         ObjectSetString(CID, _LAB22, OBJPROP_TOOLTIP, bal_tt);
         ObjectSetString(CID, _VAL22, OBJPROP_TOOLTIP, bal_tt);
      }

      StopAddingPips = 3.0 * SpreadAverage * Pt;

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

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

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

      Fmp = 100.0 * Divide(LocalEquity, LocalMargin); // Divide(AccountInfoDouble(ACCOUNT_EQUITY), AccountInfoDouble(ACCOUNT_MARGIN));

      if(MultiSymbol) {

         if(Fmp && Fmp <= AccountInfoDouble(ACCOUNT_MARGIN_SO_SO)) {  // Local Margin Call
            if(MarginCall == MC_smart)
               SmartStopOut(Fmp);
            else if(MarginCall == MC_fair)
               CloseOneTrade();
            else
               CloseAllTrades();
            return;
         }
      }

      AvailLots = (Divide(LocalEquity, double(MarginLimit + MLPadding) / 100.0) - LocalMargin) / margin_required;
      double availxx = NormalizeDouble(AvailLots, 5); // for debug
      AvailLots = NormalizeDouble(MathMax(AvailLots, 0.0), Lp);
      if(AvailLots > 0.0) AvailLots = VerifyVolume(_Symbol, AvailLots);

      AddLots   = NormalizeDouble(MathMax(SymbolInfoDouble(_Symbol,SYMBOL_VOLUME_MIN), (AccountInfoInteger(ACCOUNT_LEVERAGE) * LocalEquity / 5000000.0)), Lp);
      if(AddLots > 0.0) AddLots = VerifyVolume(_Symbol, AddLots);

      if(debug) {
         c += "\nMultiSymbol: " + (MultiSymbol?"YES":"NO");
         c += "\ncontract: " + DoubleToString(SymbolInfoDouble(_Symbol, SYMBOL_TRADE_CONTRACT_SIZE), 0);
         c += "\nLocalMargin: " + DoubleToString(LocalMargin, 5);
         c += "\nleverage: " + IntegerToString(AccountInfoInteger(ACCOUNT_LEVERAGE));
         c += "\nmargin_req: " + DoubleToString( NormalizeDouble(margin_required, 2), 2);
         c += "\nAddLots: " + DoubleToString(AddLots, 2);
         c += "\nAvailLots: " + DoubleToString(availxx, 5);
      }

      TradeMode = TRADE_NONE;
      int first_type = -1;

      Total = PositionsTotal();

      for(i=0;i<Total;i++) {    // Position object select only open trades, Orders object select only pendings
         if(!Pos.SelectByIndex(i))
            continue;
         ttype = Pos.PositionType();
         if(Pos.Symbol() == _Symbol) {    // All open trades on current symbol
            if(first_type == -1) {
               first_type = ttype;
               if(ttype == POSITION_TYPE_BUY)
                  TradeMode = TRADE_BUY;
               else
                  TradeMode = TRADE_SELL;
            }
            if(first_type != ttype) {  // If hedge
               TradeMode = TRADE_MISMATCH;
               break;
            }
            Sl = Pos.StopLoss();
            Tp = Pos.TakeProfit();
            PnL += Pos.Profit() + Pos.Commission() + Pos.Swap();
            count++;
         }
         else if(!MultiSymbol) {
               TradeMode = TRADE_OTHER;   // Trade on other symbol
               break;
         }
      }

      if(count == 0 && BalanceShare == 0)
         TradeMode = TRADE_DISABLE;

      if(AutoAdd() && (TradeMode == TRADE_BUY || TradeMode == TRADE_SELL) && local_volume > 0.0) {
         double next_margin = LocalMargin + margin_required * AddLots / 2.0;
         double next_equity = next_margin * double(MarginLimit + MLPadding) / 100.0;
         double next_profit = next_equity - LocalBalance;

         int next_point = int(next_profit / SymbolInfoDouble(_Symbol,SYMBOL_TRADE_TICK_VALUE) / local_volume);
         double next_price = 0.0;

         if(debug) {
            c += "\n\nnext_margin: " + DoubleToString(next_margin, 2);
            c += "\nnext_equity: " + DoubleToString(next_equity, 2);
            c += "\nnext_profit: " + DoubleToString(next_profit, 2);

            c += "\ntick_value: " + DoubleToString(SymbolInfoDouble(_Symbol,SYMBOL_TRADE_TICK_VALUE), _Digits+2);
            c += "\n_Point: " + DoubleToString(_Point, _Digits);
            c += "\nEntryMaginLevel: " + DoubleToString(NormalizeDouble(Divide(next_equity, LocalMargin) * 100.0, 2), 2) + "%";
         }

         if(TradeMode == TRADE_BUY) {
            next_price = local_price + (next_profit+local_cost) / SymbolInfoDouble(_Symbol,SYMBOL_TRADE_TICK_VALUE) / local_volume * _Point;
            if(debug) c += "\nnext_price: " + DoubleToString(next_price, _Digits) + "  ("+IntegerToString(next_point)+")";
         }
         else if(TradeMode == TRADE_SELL) {
            next_price = local_price - (next_profit-local_cost) / SymbolInfoDouble(_Symbol,SYMBOL_TRADE_TICK_VALUE) / local_volume * _Point;
            if(debug) c += "\nnext_price: " + DoubleToString(next_price, _Digits) + "  ("+IntegerToString(next_point)+")";
         }
         datetime d;
         int wx;
         double px;
         long width = ChartGetInteger(CID, CHART_WIDTH_IN_PIXELS);
         ChartXYToTimePrice(CID, int(width - 170), 20, wx, d, px);

         Mark2(_BMARK, ANCHOR_CENTER, d, next_price, 10, clrDarkOrange, 
            "Add Next Position: " + DoubleToString(AddLots, Lp) + " @ " + DoubleToString(next_price, _Digits) + 
            "\nMarginLevel: " + DoubleToString(Divide(next_equity, LocalMargin) * 100.0, 1) + "%");

         Bitmap(_PBAR, CORNER_RIGHT_UPPER, 0, 327, 46,   4, _BMP_GBAR);
         double min_v = SymbolInfoDouble(_Symbol, SYMBOL_VOLUME_MIN);
         int bar = (int)MathMin(MathMax(MathRound(146.0 * Divide(availxx+min_v/2.0, min_v)), 0.0), 146.0);
         if(debug) c += "\nBar: " + DoubleToString(bar/146.0*100,1) + "%\n";

         if(ObjectGetInteger(CID, _PBAR, OBJPROP_XSIZE) != bar)
            ObjectSetInteger(CID, _PBAR, OBJPROP_XSIZE, bar);
      }
      else {
         if(ObjectFind(CID, _PBAR) != -1) ObjectDelete(CID, _PBAR);
         if(ObjectFind(CID, _BMARK) != -1) ObjectDelete(CID, _BMARK);
      }

      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);
                                 if(ObjectFind(CID, _PLINE) != -1) ObjectDelete(CID, _PLINE);
                                 LineMode = LINE_INVALID;
                                 GlobalVariableSet(_gIsTrading, 0.0);
                                 break;

         case TRADE_DISABLE:      // Mic v1.816 add TRADE_DISABLE remove 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);
                                 if(ObjectFind(CID, _PLINE) != -1) ObjectDelete(CID, _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);   
                                 if(ObjectFind(CID, _PLINE) != -1) ObjectDelete(CID, _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)  

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

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

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

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

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

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

Стоимость полного кода
5 096,10₽ ≈ $62.28