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