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? После подтверждения оплаты файл сохранится в кабинете на этот email. Если аккаунта ещё нет, мы создадим его и пришлём ссылку для задания пароля. Если аккаунт уже есть, покупка добавится в него. Укажите адрес, к которому у вас есть доступ.
Чтобы оформить заказ, введите email и перейдите к оплате.