vr calculate martingale lite.mq5
Сообщите нам, если считаете, что материал размещён без разрешения.
Сообщить о материале
Обращение по товару «vr calculate martingale lite.mq5» отправится на рассмотрение. Укажите контакт для ответа и опишите причину.
О программе
Представляет собой пользовательский индикатор для MetaTrader 5, обеспечивающий интерактивный интерфейс на графике для отслеживания и анализа торговых позиций. Создаёт графические элементы — кнопки Buy и Sell, поля ввода, трендовые линии и стрелки — позволяя вручную фиксировать записи о сделках с указанием объёма и цены.
При наличии двух и более записей (покупки и/или продажи) индикатор рассчитывает средневзвешенную цену на основе сумм цен и лотов каждой позиции и отображает результат в виде визуальной линии на графике. Обновление происходит в реальном времени при взаимодействии пользователя с интерфейсом и перемещении мыши.
Все графические объекты группируются с использованием настраиваемого префикса. Продукт не выполняет реальных торговых операций и не подключается к внешним источникам данных — работа полностью внутри среды MetaTrader 5.
Настройки программы
| Настройка | Описание |
|---|---|
| iPrefix | Префикс объектов — Префикс, добавляемый к именам всех создаваемых графических объектов для их группировки |
| iLots | Объём по умолчанию — Значение объёма (лотов) по умолчанию, используемое при создании новых записей о сделках |
Поиск по коду файла
#property strict
#property version "19.101"
#property description " "
#property description " "
#property description " "
#property indicator_chart_window
#property indicator_plots 0
#property indicator_buffers 0
input string iPrefix = "^$%#";
input double iLots = 0.01;
struct str
{
protected:
string m_name_orders;
int m_type_orders;
double m_lots_orders;
double m_cena_orders;
MqlTick tick;
public:
string GetName(void) { return m_name_orders; }
int GetType(void) { return m_type_orders; }
double GetLots(void) { return m_lots_orders; }
double GetCena(void) { return m_cena_orders; }
void SetName(string aName) { m_name_orders = aName;}
void SetType(int aType) { m_type_orders = aType;}
void SetLots(double aLots) { m_lots_orders = aLots;}
void SetCena(double aCena) { m_cena_orders = aCena;}
void SetAWpr(string aName, datetime aTime, double aPrice)
{
ObjectSetInteger(0, iPrefix + "D" + aName, OBJPROP_TIME, 1, TimeCurrent() + PeriodSeconds() * 5);
ObjectSetDouble(0, iPrefix + "D" + aName, OBJPROP_PRICE, 1, aPrice);
}
bool CreateBuy(string aName)
{
if(!SymbolInfoTick(Symbol(), tick))
{
Print("SymbolInfoTick() failed, error = ", GetLastError());
return false;
}
m_name_orders = aName;
m_type_orders = 0;
m_lots_orders = iLots;
m_cena_orders = NormalizeDouble(tick.bid, Digits());
ButtonCreate(0, iPrefix + "A" + aName, 0, 0, 0, 30, 18, CORNER_LEFT_UPPER, "Buy", "Arial", 10, clrWhite, clrBlue, clrBlue, false, false, false, true, 0);
EditCreate(0, iPrefix + "B" + aName, 0, 10, 30, 36, 18, DoubleToString(m_lots_orders, 2), "Arial", 10, ALIGN_CENTER, false, CORNER_LEFT_UPPER, clrWhite, clrGray, clrBlue, false, false, true, 0);
TrendCreate(0, iPrefix + "D" + aName, 0, TimeCurrent() - PeriodSeconds() * 10, m_cena_orders, TimeCurrent() + PeriodSeconds() * 10, m_cena_orders, clrBlue, STYLE_SOLID, 1, false, false, false, false, true, 0);
ArrowCreate(0, iPrefix + "C" + aName, 0, TimeCurrent() + PeriodSeconds() * 10, m_cena_orders, clrBlue, STYLE_SOLID, 2, false, true, true, 0);
OrderDrag(aName);
return true;
}
bool CreateSel(string aName)
{
if(!SymbolInfoTick(Symbol(), tick))
{
Print("SymbolInfoTick() failed, error = ", GetLastError());
return false;
}
m_name_orders = aName;
m_type_orders = 1;
m_lots_orders = iLots;
m_cena_orders = NormalizeDouble(tick.bid, Digits());
ButtonCreate(0, iPrefix + "A" + aName, 0, 0, 0, 30, 18, CORNER_LEFT_UPPER, "Sell", "Arial", 10, clrWhite, clrTomato, clrTomato, false, false, false, true, 0);
EditCreate(0, iPrefix + "B" + aName, 0, 10, 30, 36, 18, DoubleToString(m_lots_orders, 2), "Arial", 10, ALIGN_CENTER, false, CORNER_LEFT_UPPER, clrWhite, clrGray, clrTomato, false, false, true, 0);
TrendCreate(0, iPrefix + "D" + aName, 0, TimeCurrent() - PeriodSeconds() * 10, m_cena_orders, TimeCurrent() + PeriodSeconds() * 10, m_cena_orders, clrTomato, STYLE_SOLID, 1, false, false, false, false, true, 0);
ArrowCreate(0, iPrefix + "C" + aName, 0, TimeCurrent() + PeriodSeconds() * 10, m_cena_orders, clrTomato, STYLE_SOLID, 2, false, true, true, 0);
OrderDrag(aName);
return true;
}
void OrderDrag(string aName)
{
datetime times = (datetime)ObjectGetInteger(0, iPrefix + "C" + aName, OBJPROP_TIME, 0);
double price = ObjectGetDouble(0, iPrefix + "C" + aName, OBJPROP_PRICE, 0);
string text = ObjectGetString(0, iPrefix + "B" + aName, OBJPROP_TEXT);
m_lots_orders = StringToDouble(text);
m_cena_orders = price;
int x = 0, y = 0;
if(ChartTimePriceToXY(0, 0, times, price, x, y))
{
ObjectSetInteger(0, iPrefix + "A" + aName, OBJPROP_XDISTANCE, x + 2 - 72);
ObjectSetInteger(0, iPrefix + "A" + aName, OBJPROP_YDISTANCE, y + 2 - 10);
ObjectSetInteger(0, iPrefix + "B" + aName, OBJPROP_XDISTANCE, x + 32 - 72);
ObjectSetInteger(0, iPrefix + "B" + aName, OBJPROP_YDISTANCE, y + 2 - 10);
ObjectSetInteger(0, iPrefix + "D" + aName, OBJPROP_TIME, 0, times);
ObjectSetDouble(0, iPrefix + "D" + aName, OBJPROP_PRICE, 0, price);
}
}
};
struct structura
{
protected:
public:
str orders[];
bool MenuCreate(void)
{
EditCreate(0, iPrefix + "Menu", 0, 10, 30, 64, 22, "", "Arial", 10, ALIGN_CENTER, false, CORNER_LEFT_UPPER, clrWhite, clrGray, clrNONE, false, true, true, 0);
ButtonCreate(0, iPrefix + "Buy", 0, 0, 0, 30, 18, CORNER_LEFT_UPPER, "Buy", "Arial", 10, clrWhite, clrBlue, clrBlue, false, false, false, true, 0);
ButtonCreate(0, iPrefix + "Sel", 0, 0, 0, 30, 18, CORNER_LEFT_UPPER, "Sell", "Arial", 10, clrWhite, clrTomato, clrTomato, false, false, false, true, 0);
ArrowCreate(0, iPrefix + "AW", 0, TimeCurrent() + PeriodSeconds() * 10, 0, clrGreen, STYLE_SOLID, 3, false, false, true, 0);
MenuDrag();
return true;
}
void MenuDrag(void)
{
int x = (int)ObjectGetInteger(0, iPrefix + "Menu", OBJPROP_XDISTANCE);
int y = (int)ObjectGetInteger(0, iPrefix + "Menu", OBJPROP_YDISTANCE);
ObjectSetInteger(0, iPrefix + "Buy", OBJPROP_XDISTANCE, x + 2);
ObjectSetInteger(0, iPrefix + "Buy", OBJPROP_YDISTANCE, y + 2);
ObjectSetInteger(0, iPrefix + "Sel", OBJPROP_XDISTANCE, x + 32);
ObjectSetInteger(0, iPrefix + "Sel", OBJPROP_YDISTANCE, y + +2);
}
bool GetStateBuy(void) { return (bool)ObjectGetInteger(0, iPrefix + "Buy", OBJPROP_STATE);}
void SetStateBuy(void) { ObjectSetInteger(0, iPrefix + "Buy", OBJPROP_STATE, false);}
bool GetStateSel(void) { return (bool)ObjectGetInteger(0, iPrefix + "Sel", OBJPROP_STATE);}
void SetStateSel(void) { ObjectSetInteger(0, iPrefix + "Sel", OBJPROP_STATE, false);}
};
structura st;
int OnInit()
{
// код доступен только после оплаты
}
void OnChartEvent(const int id, const long &lparam, const double &dparam, const string &sparam)
{
if(id == CHARTEVENT_OBJECT_CLICK)
{
if(st.GetStateBuy())
{
int u = ArraySize(st.orders);
ArrayResize(st.orders, u + 1, 100);
st.orders[u].CreateBuy(IntegerToString(u));
st.SetStateBuy();
}
if(st.GetStateSel())
{
int u = ArraySize(st.orders);
ArrayResize(st.orders, u + 1, 100);
st.orders[u].CreateSel(IntegerToString(u));
st.SetStateSel();
}
}
if(id == CHARTEVENT_MOUSE_MOVE || id == CHARTEVENT_OBJECT_ENDEDIT)
if(sparam == "1")
{
double buy_price = 0, sel_price = 0, buy_lot = 0, sel_lot = 0, price_aw = 0;
int t = 0;
for(int i = 0; i < ArraySize(st.orders); i++)
{
st.orders[i].OrderDrag(IntegerToString(i));
if(st.orders[i].GetType() == 0)
{
buy_price += st.orders[i].GetCena() * st.orders[i].GetLots();
buy_lot += st.orders[i].GetLots();
t++;
}
if(st.orders[i].GetType() == 1)
{
sel_price += st.orders[i].GetCena() * st.orders[i].GetLots();
sel_lot += st.orders[i].GetLots();
t++;
}
}
if(t >= 2 && (buy_lot - sel_lot) != 0)
{
price_aw = NormalizeDouble((buy_price - sel_price) / (buy_lot - sel_lot), Digits());
if(price_aw > 0)
for(int i = 0; i < ArraySize(st.orders); i++)
st.orders[i].SetAWpr(IntegerToString(i), TimeCurrent(), price_aw);
ObjectSetDouble(0, iPrefix + "AW", OBJPROP_PRICE, 0, price_aw);
ObjectSetInteger(0, iPrefix + "AW", OBJPROP_TIME, 0, TimeCurrent() + PeriodSeconds() * 5);
}
st.MenuDrag();
}
ChartRedraw();
}
int OnCalculate(const int rates_total,
const int prev_calculated,
const datetime &time[],
const double &open[],
const double &high[],
const double &low[],
const double &close[],
const long &tick_volume[],
const long &volume[],
const int &spread[]
)
{
// код доступен только после оплаты
}
void OnDeinit(const int reason)
{
ObjectsDeleteAll(0, iPrefix);
}
bool ButtonCreate(const long chart_ID = 0, // chart's ID
const string name = "Button", // button name
const int sub_window = 0, // subwindow index
const int x = 0, // X coordinate
const int y = 0, // Y coordinate
const int width = 50, // button width
Показано первые 50% кода (символов: 12549)
Открыть по тарифу
Купите тариф с пакетом открытий или войдите, если тариф уже есть. Открытый файл останется в вашем кабинете навсегда.
Разовая покупка файла
На этой странице откроется полный исходный код файла вместо ознакомительного фрагмента.
Зачем нужен email? После подтверждения оплаты файл сохранится в кабинете на этот email. Если аккаунта ещё нет, мы создадим его и пришлём ссылку для задания пароля. Если аккаунт уже есть, покупка добавится в него. Укажите адрес, к которому у вас есть доступ.
Чтобы оформить заказ, введите email и перейдите к оплате.