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