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

MarginTrader

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

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

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

О программе

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

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

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

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

НастройкаОписание
CloseAllOnBalanceChange Если включено, при изменении баланса счёта советник закрывает все сделки.
OnlyManageOwnTrades Если включено, советник управляет только сделками с указанным магическим номером.
DisableOneClick Если включено, панель быстрой торговли MetaTrader 4 скрывается на графике.
ForceOnTick Если включено, советник обрабатывает события по тикам вместо таймера.
MagicNumber Магический номер, используемый для идентификации сделок советника.
Получить полный код

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

#property version "1.6"

#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      "\\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  <MT_functions.mqh>

#define INPUT input

INPUT bool     CloseAllOnBalanceChange       = false;    // Close all trades on balance change?
INPUT bool     OnlyManageOwnTrades           = true;     // Manage only own trades?
INPUT bool     DisableOneClick               = true;     // Disable MT4 One Click Trading panel?
INPUT bool     ForceOnTick                   = false;    // Force OnTick() mode instead of OnTimer()
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;

char           fs;

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

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

long           CID, SpreadHistoryCount;

bool           FirstRun, OldSoundsOn, OldAutoAdd, MousePressed;

color          BackgroundColor               = C'25,24,24';
color          NeutralColor                  = C'240,240,240';
color          PositiveColor                 = Lime;
color          NegativeColor                 = OrangeRed;
color          LabelColor                    = DarkGray;

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

void           OnDeinit                   (const int Reason) {

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

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

void           OnTimer                    () {

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

void           OnChartEvent               (const int id,         
                                           const long& lparam,   
                                           const double& dparam, 
                                           const string& sparam) {

   if(id == CHARTEVENT_MOUSE_MOVE) {

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

void           Run                        () {

   int            i, ttype, count = 0, tt[];
   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_DRAG_TRADE_LEVELS, false);

      ChartSetInteger(CID, CHART_FOREGROUND, false);

      ChartSetInteger(CID, CHART_SHIFT, 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,  48, 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, 134, 146,  18, _BMP_MLM);
      Bitmap(_PMNG,    CORNER_RIGHT_UPPER,   4, 209, 146,  18, _BMP_MNG);
      Bitmap(_PTRD,    CORNER_RIGHT_UPPER,   4, 287, 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, 122, "Add automatically", 10, White, _MFONT, ANCHOR_LEFT_LOWER);
      BmpButton(_ADD,   CORNER_RIGHT_UPPER, 121, 103, 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, 160,  38,  38, _BMP_AUP_DIS);
      Bitmap(_PMINUS, CORNER_RIGHT_UPPER,   7, 160,  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, 236,  74,  40, _BMP_CLOSE);
      Bitmap(_PTPSL,  CORNER_RIGHT_UPPER,  81, 236,  74,  40, _BMP_TPSL);

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

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

      ArrayResize(tt, Total);

      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)) {
            tt[i] = ttype;
            Sl = OrderStopLoss();
            Tp = OrderTakeProfit();
            PnL += OrderProfit() + OrderCommission() + OrderSwap();
            count++;
         }
      }

      if(AccountBalance() != McBalance) {

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

      if(count == 0) {

         TradeMode = TRADE_NONE;
         GlobalVariableSet(_gIsTrading, 0.0);

      } else {

         ttype = tt[0];
         for(i = 0; i < Total; i++) {

            if(tt[i] != ttype) {

               TradeMode = TRADE_MISMATCH; 
               Tp = 0.0;
               break;

            } else {

               switch(ttype) {
                  case OP_BUY:   TradeMode = TRADE_BUY;  break;
                  case OP_SELL:  TradeMode = TRADE_SELL; break;
               }
            }   
         }
      }

      if(GlobalVariableGet(_gIsTrading) != 0.0 && GlobalVariableGet(_gIsTrading) != Sym) TradeMode = TRADE_OTHER;

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

         BmpButton(_PLUS,  CORNER_RIGHT_UPPER, 115, 160, 38, 38, _BMP_AUP_ON, _BMP_AUP_OFF);
         BmpButton(_MINUS, CORNER_RIGHT_UPPER,   7, 160, 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, 160, 38, 38, _BMP_AUP_ON, _BMP_AUP_OFF);

      } else {

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

      switch(TradeMode) {

         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,  236, 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,  236, 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_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,  236, 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,  236, 74, 40, _BMP_TP_ON, _BMP_TP_OFF);
                                 break;
      }

      if(TradeMode != TRADE_SELL && TradeMode != TRADE_MISMATCH && TradeMode != TRADE_OTHER) {

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

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

      if(TradeMode != TRADE_BUY && TradeMode != TRADE_MISMATCH && TradeMode != TRADE_OTHER) {

         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()) PlaySound("::Sounds\\closing.wav");
      }

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

         Target = NormalizeDouble(ObjectGet(_PLINE, OBJPROP_PRICE1), Digits);

         for(i = Total - 1; i >= 0; i--) {

            result = OrderSelect(i, SELECT_BY_POS);
            ttype  = OrderType();

            if(ttype == OP_BUY || ttype == OP_SELL) {
               if(OrderSymbol() == _Symbol && (!OnlyManageOwnTrades || OrderMagicNumber() == MagicNumber))
                  result = OrderModifyReliable(OrderTicket(), 0, OrderStopLoss(), Target, 0, CLR_NONE);
            }
         }

         ObjectSetInteger(CID, _TAKE, OBJPROP_STATE, false);
         if(SoundsOn()) PlaySound("::Sounds\\targets_set.wav");
      }

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

         Stop = NormalizeDouble(ObjectGet(_PLINE, OBJPROP_PRICE1), Digits);

         for(i = Total - 1; i >= 0; i--) {

            result = OrderSelect(i, SELECT_BY_POS);
            ttype  = OrderType();

            if(ttype == OP_BUY || ttype == OP_SELL) {
               if(OrderSymbol() == _Symbol && (!OnlyManageOwnTrades || OrderMagicNumber() == MagicNumber))
                  result = OrderModifyReliable(OrderTicket(), 0, Stop, OrderTakeProfit(), 0, CLR_NONE);
            }
         }

         ObjectSetInteger(CID, _STOP, OBJPROP_STATE, false);
         if(SoundsOn()) PlaySound("::Sounds\\stops_set.wav");
      }

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

         if(MarginLimit >= 1000) {
            MarginLimit += 100;
            MarginLimit = (MarginLimit / 100) * 100;
         } else {
            MarginLimit += 10;
            MarginLimit = (MarginLimit / 10) * 10;
         }

         MarginLimit = MathMin(MarginLimit, MaxMarginLimit);
         GlobalVariableSet(_gMarginLimit, MarginLimit);
         Click();
         ObjectSetInteger(CID, _PLUS, OBJPROP_STATE, false);
      }

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

         if(MarginLimit >= 1000) {
            MarginLimit -= 100;
            MarginLimit = (MarginLimit / 100) * 100;
         } else {
            MarginLimit -= 10;
            MarginLimit = (MarginLimit / 10) * 10;
         }

         MarginLimit = MathMax(MarginLimit, 100);
         GlobalVariableSet(_gMarginLimit, MarginLimit);
         Click();
         ObjectSetInteger(CID, _MINUS, OBJPROP_STATE, false);
      }

      Buyer();
      Seller();
   }
}

void           Buyer                      (bool BuyClick = false) {

   int ticket;

   if(AvailLots < MarketInfo(_Symbol, MODE_MINLOT)) return;
   if(AddLots  < MarketInfo(_Symbol, MODE_MINLOT)) return;

   if(BuyClick && (TradeMode == TRADE_NONE || TradeMode == TRADE_BUY)) {

      if(AccountFreeMarginCheck(_Symbol, OP_BUY, AvailLots) <= 0 || GetLastError() == 134) {

         AvailLots -= MarketInfo(_Symbol, MODE_MINLOT);

         if(AvailLots < MarketInfo(_Symbol, MODE_MINLOT)) return;
      }

      ticket = OrderSendReliable(_Symbol, OP_BUY, AvailLots, Ask, 0, Sl, Tp, NULL, MagicNumber, 0, CLR_NONE);
      if(SoundsOn()) {if (ticket > 0) PlaySound("ok.wav"); else PlaySound("timeout.wav");}

   } else if(TradeMode == TRADE_BUY && AutoAdd()) {

      if(AccountFreeMarginCheck(_Symbol, OP_BUY, AddLots) <= 0 || GetLastError() == 134) {

         AddLots -= MarketInfo(_Symbol, MODE_MINLOT);

         if(AddLots < MarketInfo(_Symbol, MODE_MINLOT)) return;
      }

      if(Ask < Tp - StopAddingPips || Tp == 0.0) {
         ticket = OrderSendReliable(_Symbol, OP_BUY, AddLots, Ask, 0, Sl, Tp, NULL, MagicNumber, 0, CLR_NONE);
         if(SoundsOn() && ticket > 0) PlaySound("::Sounds\\coin.wav");
      }
   }
}

void           Seller                     (bool SellClick = false) {

   int ticket;

   if(AvailLots < MarketInfo(_Symbol, MODE_MINLOT)) return;
   if(AddLots  < MarketInfo(_Symbol, MODE_MINLOT)) return;

   if(SellClick && (TradeMode == TRADE_NONE || TradeMode == TRADE_SELL)) {

      if(AccountFreeMarginCheck(_Symbol, OP_SELL, AvailLots) <= 0 || GetLastError() == 134) {

         AvailLots -= MarketInfo(_Symbol, MODE_MINLOT);

         if(AvailLots < MarketInfo(_Symbol, MODE_MINLOT)) return;
      }

      ticket = OrderSendReliable(_Symbol, OP_SELL, AvailLots, Bid, 0, Sl, Tp, NULL, MagicNumber, 0, CLR_NONE);
      if(SoundsOn()) {if (ticket > 0) PlaySound("ok.wav"); else PlaySound("timeout.wav");}

   } else if(TradeMode == TRADE_SELL && AutoAdd()) {

      if(AccountFreeMarginCheck(_Symbol, OP_SELL, AddLots) <= 0 || GetLastError() == 134) {

         AddLots -= MarketInfo(_Symbol, MODE_MINLOT);

         if(AddLots < MarketInfo(_Symbol, MODE_MINLOT)) return;
      }

      if(Bid > Tp + StopAddingPips || Tp == 0.0) {
         ticket = OrderSendReliable(_Symbol, OP_SELL, AddLots, Bid, 0, Sl, Tp, NULL, MagicNumber, 0, CLR_NONE);
         if(SoundsOn() && ticket > 0) PlaySound("::Sounds\\coin.wav");
      }
   }
}

void           CloseAllTrades             () {

   for(int i 

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

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

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

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

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

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

Стоимость полного кода
2 936₽ ≈ $35.88