rim 1.2.mq4
Сообщите нам, если считаете, что материал размещён без разрешения.
Сообщить о материале
Обращение по товару «rim 1.2.mq4» отправится на рассмотрение. Укажите контакт для ответа и опишите причину.
О программе
Данный продукт представляет собой торговый советник для платформы MetaTrader 4, написанный на языке MQL4. Советник использует индикатор AJ ARROW для формирования сигналов на покупку и продажу, а также поддерживает дополнительный фильтр GoldenFilter для ограничения ложных сигналов.
Советник оснащён временными ограничениями торговли — можно задать разрешённый интервал торговли и два периода запрета сделок. Для управления рисками реализована функция усреднения убыточных позиций с настраиваемым количеством попыток и множителями лотов.
В продукт интегрированы уведомления через Telegram-бот, а также визуальные стрелки на графике и информационная панель с кнопками переключения между автоматическим и ручным режимами торговли. Советник проверяет допустимость торгового счёта и наличие срока действия при инициализации.
Настройки программы
| Настройка | Описание |
|---|---|
| |-----------------> (_1) | Группа настроек торговли: параметры лота, экспирации и раннего входа. |
| Ставка (lotIn) | Начальный размер торгового лота для открытия позиций. |
| Комментарий, мин (expirationIn) | Время экспирации позиции в минутах — после истечения указанного времени советник оценивает результат сделки. |
| Ранний вход, сек (secondsPre) | Количество секунд до окончания бара, за которые допускается ранний вход в сделку. |
| |-----------------> (_2) | Группа настроек индикатора AJ ARROW: параметры чувствительности сигналов. |
| SignalGAP | Целочисленный параметр, задающий параметр GAP для индикатора AJ ARROW, влияющий на чувствительность формирования торговых сигналов. |
| |-----------------> (_3) | Группа настроек фильтра GoldenFilter: включение и параметры фильтрации сигналов. |
| Использовать индикатор GoldenFilter как фильтр? (GFilter) | Переключатель использования индикатора GoldenFilter в качестве фильтра для торговых сигналов. При активации сигналы генерируются только при совпадении условий AJ ARROW и GoldenFilter. |
| |-----------------> (_4) | Группа настроек времени: торговые часы и периоды запрета сделок. |
| Торговля по времени (useTime) | Переключатель торговли по времени — при активации сделки открываются только в разрешённом временном интервале. |
| Час начала (hourStart) | Час начала разрешённого торгового интервала. |
| Час окончания (hourEnd) | Час окончания разрешённого торгового интервала. |
| Запрет 1 (useTimeNoTrade1) | Переключатель первого периода запрета торговли — в указанный интервал сделки не открываются. |
| Час начала (hourStart1) | Час начала первого периода запрета торговли. |
| Час окончания (hourEnd1) | Час окончания первого периода запрета торговли. |
| Запрет 2 (useTimeNoTrade2) | Переключатель второго периода запрета торговли — в указанный интервал сделки не открываются. |
| Час начала (hourStart2) | Час начала второго периода запрета торговли. |
| Час окончания (hourEnd2) | Час окончания второго периода запрета торговли. |
| |-----------------> (_5) | Группа настроек отбития убытков: множитель лота и количество сделок для усреднения. |
| К умн 2 (lotK2) | Множитель лота для отбития убытков — применяется при определённом количестве сделок. |
| Кол. сделок (countK2) | Количество сделок для отбития убытков с увеличенным лотом перед возвратом к стандартному лоту. |
| |-----------------> (_6) | Группа настроек усреднения: включение, количество усреднений и параметры задержки. |
| Включение (useAvg) | Переключатель включения/отключения функции усреднения убыточных позиций. |
| Количество усреднений (avgMax) | Максимальное количество усреднений убыточной позиции, после которого усреднение прекращается. |
| К умн (lotK) | Множитель лота для усреднения убыточных позиций. |
| Время в сек. между попытками (Slp) | Время в секундах между попытками повторного открытия ордера при усреднении. |
| Количество попыток открытия ордера (error_reset) | Количество попыток повторного открытия ордера при возникновении ошибки при усреднении. |
| Задержка входа в сек от момента оценки сделки (slp) | Задержка в секундах от момента оценки сделки перед выполнением операции усреднения. |
| |-----------------> (_9) | Группа настроек алертов и сигналов: отображение стрелок, уведомления и Telegram. |
| Показать стрелки (showArrows) | Переключатель отображения стрелок Buy и Sell на графике в местах открытия сигналов. |
| Включить алерт ручной (useAlertHandle) | Переключатель ручных звуковых уведомлений (алертов), активируемых при работе в ручном режиме. |
| Включить алерт авто (useAlertAuto) | Переключатель автоматических звуковых уведомлений (алертов) при появлении торговых сигналов. |
| Send telegram (sendTLG) | Переключатель отправки уведомлений о торговых событиях через Telegram-бот. |
| Название советника для ТГ Бота (TLGComment) | Название советника, используемое в сообщениях Telegram-бота для идентификации. |
| Chat ID (chat_id) | Идентификатор чата Telegram-бота для отправки уведомлений о торговых событиях. |
| > (_10) | Группа общих настроек: идентификатор ордеров, параметры панели и отображения. |
| идентификатор ордеров (magic) | Идентификатор ордеров (magic number), позволяющий отличить ордера данного советника от других. |
| координата X панели (X0) | Координата по оси X для размещения информационной панели на графике. |
| координата Y панели (Y0) | Координата по оси Y для размещения информационной панели на графике. |
| Размер шрифта панели (fontSizePanel) | Размер шрифта элементов информационной панели. |
| Показ инфо (showInfo) | Переключатель отображения информационных надписей на графике (прибыль за день, месяц и т.д.). |
| Цвет инфо (clrInfo) | Цвет информационных надписей на графике. |
| Размер шрифта инфо (fontSizeInfo) | Размер шрифта информационных надписей на графике. |
| Показ таймера (showTime) | Переключатель отображения таймера на графике. |
| Цвет таймера (clrTime) | Цвет отображения таймера на графике. |
| Размер шрифта таймера (fontSizeTime) | Размер шрифта таймера на графике. |
Поиск по коду файла
const long nAllowedAccounts[] = {0 }; // для работы на любом счёте: { 0 };
const datetime dtExpiredDate = D'10.10.2026';
#property version "1.00"
#property strict
#include <Controls\Edit.mqh>
extern string _1 = "Настройки торговли"; //|----------------->
extern double lotIn = 1.0; //Ставка
extern uint expirationIn = 3; //Комментарий, мин
extern uint secondsPre = 2; //Ранний вход, сек
extern string _2 = "Настройки индикатора AJ ARROW "; //|----------------->
extern int SignalGAP =10;
extern string _3 = "Настройки индикатора GoldenFilter "; //|----------------->
extern bool GFilter = true; // Использовать индикатор GoldenFilter как фильтр?
extern string _4 = "Настройка времени"; //|----------------->
extern bool useTime = false; //Торговля по времени
extern uint hourStart = 10; //Час начала
extern uint hourEnd = 20; //Час окончания
extern bool useTimeNoTrade1 = false; //Запрет 1
extern uint hourStart1 = 11; //Час начала
extern uint hourEnd1 = 13; //Час окончания
extern bool useTimeNoTrade2 = false; //Запрет 2
extern uint hourStart2 = 15; //Час начала
extern uint hourEnd2 = 17; //Час окончания
extern string _5 = "Настройка отбития убытков"; //|----------------->
extern double lotK2 = 1.0; //К умн 2
extern uint countK2 = 2; //Кол. сделок
extern string _6 = "Настройки усреднения"; //|----------------->
extern bool useAvg = true; //Включение
extern int avgMax = 2; //Количество усреднений
extern double lotK = 1.5; //К умн
extern int Slp = 1; //Время в сек. между попытками
extern int error_reset = 10; //Количество попыток открытия ордера
extern int slp = 1 ; //Задержка входа в сек от момента оценки сделки
extern string _9 = "Алерты и сигналы на графике"; //|----------------->
extern bool showArrows = true; //Показать стрелки
extern bool useAlertHandle = false; //Включить алерт ручной
extern bool useAlertAuto = false; //Включить алерт авто
input bool sendTLG = false; //Send telegram
extern string TLGComment = "МИР"; //Название советника для ТГ Бота
extern string api_token = ""; //API token
extern string chat_id = ""; //Chat ID
extern string _10 = "Общие настройки"; //----------->
extern int magic = 29072024; //идентификатор ордеров
extern int X0 = 20; //координата X панели
extern int Y0 = 30; //координата Y панели
extern int fontSizePanel = 11; //Размер шрифта панели
extern bool showInfo = false; //Показ инфо
extern color clrInfo = clrChocolate; //Цвет инфо
extern int fontSizeInfo = 11; //Размер шрифта инфо
extern bool showTime = true; //Показ таймера
extern color clrTime = clrDodgerBlue; //Цвет таймера
extern int fontSizeTime = 11; //Размер шрифта таймера
color clBG = clrWhite; // Цвет фона
color clOpenBuy = clrLime; // Цвет значка открытия покупки
color clOpenSell = clrHotPink; // Цвет значка открытия продажи
int slip = 10;
int countLoss = 0;
string GVnLoss, GVstopping, GVhandle, GVcountK2, GVtimeBarCloseLoss, GVlossInRow;
int countHistLoss, countHistProfit;
bool testing = false;
string expertName = "Tank_";
string nameOBJ = "Tank_";
datetime timeCurrent, timeOpenPos = 0, timeLastWork;
int nBuy = 0, nSell = 0;
int nBuyPre = 0, nSellPre = 0;
int widthW = 150;
color frame_clr;
CEdit commEdit, volumeEdit;
uint expiration = expirationIn;
double lotW = lotIn, lotOpenPos;
int profitOpenPos;
string serv;
int OnInit()
{
// код доступен только после оплаты
}
void DrawPanel(int x, int y)
{
clBG = (color)ChartGetInteger(0, CHART_COLOR_BACKGROUND);
frame_clr = (color)(0xFFFFFF - clBG);
int highW = 75;
if (GlobalVariableGet(GVhandle) == 1) highW = 160;
RectLabelCreate(0, nameOBJ + "Head_BG", 0, x, y, widthW, highW, clBG, frame_clr, STYLE_SOLID, 1, false, false, false, true, 0);
ObjectSetString(0, nameOBJ + "Head_BG", OBJPROP_TOOLTIP, " ");
ObjectSetInteger(0, nameOBJ + "Head_BG", OBJPROP_SELECTABLE, false);
if (GlobalVariableGet(GVhandle) == 1) {
ButtonCreate(0, nameOBJ + "Auto", 0, CORNER_LEFT_UPPER, x + 5, y + 5, 140, 30, "Ручной", "Tahoma", 11, clrBlack, clrAliceBlue, clrAliceBlue, true);
ButtonCreate(0, nameOBJ + "BTN_UP", 0, CORNER_LEFT_UPPER, x + 5, y + 40, 140, 30, "Выше", "Tahoma", 11, clrWhite, clrBlue, clrBlue, false);
ButtonCreate(0, nameOBJ + "BTN_DN", 0, CORNER_LEFT_UPPER, x + 5, y + 75, 140, 30, "Ниже", "Tahoma", 11, clrWhite, clrTomato, clrTomato, false);
CreateFieldComment(x + 110, y + 110);
CreateFieldVolume(x + 110, y + 135);
ObjectDelete(0, nameOBJ + "STOP");
}
if (GlobalVariableGet(GVhandle) == 0) {
ButtonCreate(0, nameOBJ + "Auto", 0, CORNER_LEFT_UPPER, x + 5, y + 5, 140, 30, "Авто", "Tahoma", 11, clrBlack, clrPowderBlue, clrPowderBlue, false);
if (GlobalVariableGet(GVstopping) == 0)
ButtonCreate(0, nameOBJ + "STOP", 0, CORNER_LEFT_UPPER, x + 5, y + 40, 140, 30, "Остановить", "Tahoma", 11, clrBlack, clrLightSalmon, clrLightSalmon, false);
if (GlobalVariableGet(GVstopping) == 1)
ButtonCreate(0, nameOBJ + "STOP", 0, CORNER_LEFT_UPPER, x + 5, y + 40, 140, 30, "Возобновить", "Tahoma", 11, clrBlack, clrLightGreen, clrLightGreen, true);
ObjectDelete(0, nameOBJ + "BTN_UP");
ObjectDelete(0, nameOBJ + "BTN_DN");
ObjectsDeleteAll(0, nameOBJ + "comm");
ObjectsDeleteAll(0, nameOBJ + "volume");
lotW = lotIn;
expiration = expirationIn;
}
ChartRedraw(0);
}
void OnDeinit(const int reason)
{
ObjectsDeleteAll(0, expertName);
ObjectsDeleteAll(0, nameOBJ);
Comment("");
if (testing) {
GlobalVariablesDeleteAll(expertName);
}
HideTestIndicators(false);
EventKillTimer();
}
void OnTick()
{
// код доступен только после оплаты
}
void OnTimer()
{
int periodMinutes = _Period;
timeCurrent = TimeCurrent();
int localTime = (int)TimeLocal();
int barTime = (int)Time[0];
int diff = (int)MathMax(round((timeCurrent - localTime) / 3600.0) * 3600, -24 * 3600);
int timeFor = barTime + periodMinutes * 60 - localTime - diff;
string time = GetTime(timeFor);
time = (TerminalInfoInteger(TERMINAL_CONNECTED)) ? time : time + " x";
if (ObjectFind(0, nameOBJ + "Timer") >= 0)
ObjectSetString(0, nameOBJ + "Timer", OBJPROP_TEXT, time);
bool tradeTime = true;
if (useTime && (timeCurrent < StrToTime(IntegerToString(hourStart) + ":00:00") || timeCurrent >= StrToTime(IntegerToString(hourEnd) + ":00:00"))) tradeTime = false;
if (useTimeNoTrade1 && (timeCurrent >= StrToTime(IntegerToString(hourStart1) + ":00:00") && timeCurrent < StrToTime(IntegerToString(hourEnd1) + ":00:00"))) tradeTime = false;
if (useTimeNoTrade2 && (timeCurrent >= StrToTime(IntegerToString(hourStart2) + ":00:00") && timeCurrent < StrToTime(IntegerToString(hourEnd2) + ":00:00"))) tradeTime = false;
CountTrades();
if (nBuy + nSell == 1) {
if (useAvg) {
if (GlobalVariableGet(GVstopping) != 1 && tradeTime) {
if (timeCurrent >= timeOpenPos + expiration * 60 - secondsPre - 2)
Print("timeOpenPos=", TimeToString(timeOpenPos, TIME_SECONDS), " Profit=", profitOpenPos);
if (profitOpenPos <= 0 && timeCurrent >= timeOpenPos + expiration * 60 - secondsPre-2) {
int nLoss = (int)GlobalVariableGet(GVnLoss);
nLoss++;
GlobalVariableSet(GVnLoss, nLoss);
if (nLoss <= avgMax) {
double lot = NormLots(lotOpenPos * lotK);
if (lot > 0) {
if (nBuy > 0) {
Sleep (slp*1000);
Print("Усреднение BUY ", nLoss, " Profit=", profitOpenPos);
int ticket=OpenPosition(_Symbol, OP_BUY, lot, 0, 0, magic, IntegerToString(expiration)); // приказ на открытие усреднения
int kod_error=GetLastError(); // узнаем код ошибки, 0 если не ошибки
Print(kod_error); // выводим в принт номер ошибки
if ((kod_error != 0)&&( ticket<=0)) // если сделка не открылась
{
for (int i=1; i<=error_reset; i++) // ЦИКЛ , будем делать то что внизу, N количество раз
{
Sleep(Slp*1000); RefreshRates(); // Отдыхаем, сколько прописано в настройках секунд
ticket=OpenPosition(_Symbol, OP_BUY, lot, 0, 0, magic, IntegerToString(expiration)); //приказ на открытие усреднения
Print (GetLastError()); //выводим в принт номер ошибки, в любом случае даже если сделка открылась, будет тогда 0
if ( ticket>0) {Print("Усреднение BUY успешно"); break;} //Если сделка открылась, цикл больше не повторяем, иначе возвращаемся вначало и повторяем попытки
}
}
if (ticket<=0) Print("Усреднение BUY не открылось за отведенное количество попыток", GetLastError());// Если так ничего и не вышло, Принт и номер ошибки
return;
}
if (nSell > 0) {
Sleep (slp*1000);
Print("Усреднение SELL ", nLoss, " Profit=", profitOpenPos);
int ticket_S=OpenPosition(_Symbol, OP_SELL, lot, 0, 0, magic, IntegerToString(expiration));
int kod_error=GetLastError();
Print(kod_error);
if ((kod_error != 0)&&( ticket_S<=0))
{
for (int i=1; i<=error_reset; i++)
{
Sleep(Slp*1000); RefreshRates();
ticket_S=OpenPosition(_Symbol, OP_SELL, lot, 0, 0, magic, IntegerToString(expiration));
Print (GetLastError());
if ( ticket_S>0) {Print("Усреднение BUY успешно"); break;}
}
}
if (ticket_S<=0) Print("Усреднение BUY не открылось за отведенное количество попыток", GetLastError());
return;
}
}
}
}
}
}
}
if (nBuy == 0 && nBuyPre > 0) { //Закрылся BUY
double lotOpen = 0;
datetime timeBarOpen = 0;
double profitPos = ProfitLastPos(OP_BUY, magic, lotOpen, timeBarOpen);
if (profitPos != EMPTY_VALUE) {
if (profitPos > 0) {
Print("Закрылся BUY в профит ", DoubleToStr(profitPos, 2));
GlobalVariableSet(GVcountK2, 0);
GlobalVariableDel(GVtimeBarCloseLoss);
GlobalVariableSet(GVlossInRow, 0);
GlobalVariableSet(GVnLoss, 0);
if (sendTLG) {
int res = 0;
string sendMess = "chat_id=" + chat_id + "&text=" + TLGComment + " " + "Закрылся BUY в профит " + _Symbol + " " + StringSubstr(EnumToString((ENUM_TIMEFRAMES)Period()), 7);
res = SendMessage(sendMess);
}
}
else {
Print("Закрылся BUY в убыток ", DoubleToStr(profitPos, 2));
GlobalVariableSet(GVtimeBarCloseLoss, timeBarOpen);
int count = (int)GlobalVariableGet(GVlossInRow);
count++;
GlobalVariableSet(GVlossInRow, count);
}
}
else
Print("Неизвестный результат закрытия");
}
if (nSell == 0 && nSellPre > 0) { //Закрылся SELL
double lotOpen = 0;
datetime timeBarOpen = 0;
double profitPos = ProfitLastPos(OP_SELL, magic, lotOpen, timeBarOpen);
if (profitPos != EMPTY_VALUE) {
if (profitPos > 0) {
Print("Закрылся SELL в профит ", DoubleToStr(profitPos, 2));
GlobalVariableSet(GVcountK2, 0);
GlobalVariableDel(GVtimeBarCloseLoss);
GlobalVariableSet(GVlossInRow, 0);
GlobalVariableSet(GVnLoss, 0);
if (sendTLG) {
int res = 0;
string sendMess = "chat_id=" + chat_id + "&text=" + TLGComment + " " + "Закрылся SELL в профит " + _Symbol + " " + StringSubstr(EnumToString((ENUM_TIMEFRAMES)Period()), 7);
res = SendMessage(sendMess);
}
}
else {
Print("Закрылся SELL в убыток ", DoubleToStr(profitPos, 2));
GlobalVariableSet(GVtimeBarCloseLoss, timeBarOpen);
int count = (int)GlobalVariableGet(GVlossInRow);
count++;
GlobalVariableSet(GVlossInRow, count);
}
}
else
Print("Неизвестный результат закрытия");
}
if ( Volume[0]<10 ) { // timeFor <= (int)secondsPre && timeCurrent >= timeLastWork + PeriodSeconds()
timeLastWork = timeCurrent;
Work(tradeTime);
}
nBuyPre = nBuy;
nSellPre = nSell;
}
void Work(bool tradeTime)
{
if (showInfo && (IsVisualMode() || !testing)) {
DrawStats();
}
if (GlobalVariableGet(GVstopping) == 1 || !tradeTime) return;
int signal = GetSignal();
if (showArrows) {
if (signal == 1) {
ArrowBuyCreate(0, "BUY_" + IntegerToString(Time[1]), 0, Time[1], Open[1], clrBlue, 0, 1, false, false, true, 0);
if (GlobalVariableGet(GVhandle) == 1)
if (useAlertHandle) Alert("BUY " + _Symbol + " " + StringSubstr(EnumToString((ENUM_TIMEFRAMES)Period()), 7));
else if (useAlertAuto) Alert("BUY " + _Symbol + " " + StringSubstr(EnumToString((ENUM_TIMEFRAMES)Period()), 7));
}
if (signal == -1) {
ArrowSellCreate(0, "SELL_" + IntegerToString(Time[1]), 0, Time[1], Open[1], clrRed, 0, 1, false, false, true, 0);
if (GlobalVariableGet(GVhandle) == 1)
if (useAlertHandle) Alert("SELL " + _Symbol + " " + StringSubstr(EnumToString((ENUM_TIMEFRAMES)Period()), 7));
else if (useAlertAuto) Alert("SELL " + _Symbol + " " + StringSubstr(EnumToString((ENUM_TIMEFRAMES)Period()), 7));
}
}
if (GlobalVariableGet(GVhandle) == 0 && nBuy + nSell == 0) {
double tp = 0, sl = 0, lot = NormLots(lotW);
double lotOpen = 0;
datetime timeBarOpen = 0;
double profitPos = ProfitLastPos(-1, magic, lotOpen, timeBarOpen);
bool useK2 = false;
if (profitPos != EMPTY_VALUE) {
if (profitPos < 0) {
lot = NormLots(lotOpen * lotK2);
useK2 = true;
}
if (profitPos == 0) lot = NormLots(lotOpen);
if (profitPos > 0) {
lot = NormLots(lotW);
if (countK2 > 0) GlobalVariableDel(GVcountK2);
}
}
if (signal == 1) { //сигнал в BUY
if (countK2 > 0 && (uint)GlobalVariableGet(GVcountK2) >= countK2) {
lot = NormLots(lotW);
useK2 = false;
GlobalVariableDel(GVcountK2);
}
if (lot > 0) {
if (useK2) Print("Кум 2 ", lot);
else Print("Начальный BUY ", lot);
OpenPosition(_Symbol, OP_BUY, lot, 0, 0, magic, IntegerToString(expiration));
GlobalVariableSet(GVnLoss, 0);
if (sendTLG) {
int res = 0;
string sendMess = "chat_id=" + chat_id + "&text=" + TLGComment + " " + "BUY " + _Symbol + " " + StringSubstr(EnumToString((ENUM_TIMEFRAMES)Period()), 7);
res = SendMessage(sendMess);
}
return;
}
}
if (signal == -1) { //сигнал в SELL
if (countK2 > 0 && (uint)GlobalVariableGet(GVcountK2) >= countK2) {
lot = NormLots(lotW);
useK2 = false;
GlobalVariableDel(GVcountK2);
}
if (lot > 0) {
if (useK2) Print("Кум 2 ", lot);
else Print("Начальный SELL ", lot);
OpenPosition(_Symbol, OP_SELL, lot, 0, 0, magic, IntegerToString(expiration));
GlobalVariableSet(GVnLoss, 0);
if (sendTLG) {
int res = 0;
string sendMess = "chat_id=" + chat_id + "&text=" + TLGComment + " " + "SELL " + _Symbol + " " + StringSubstr(EnumToString((ENUM_TIMEFRAMES)Period()), 7);
res = SendMessage(sendMess);
}
return;
}
}
}
}
int GetSignal()
{
double IndArrowBUY = iCustom (NULL,0,"AJ ARROW",SignalGAP,1,1);
double IndArrowSELL = iCustom (NULL,0,"AJ ARROW",SignalGAP,0,1);
double IndArrowBUY1 = iCustom (NULL,0,"AJ ARROW",SignalGAP,1,2);
double IndArrowSELL1 = iCustom (NULL,0,"AJ ARROW",SignalGAP,0,2);
double IndGoldenFilterSELL = iCustom (NULL,0,"GoldenFilter",1,1);
double IndGoldenFilterBUY = iCustom (NULL,0,"GoldenFilter",0,1);
Comment ("");
if (IndGoldenFilterSELL >0 && IndGoldenFilterSELL <1 && IndGoldenFilterBUY ==EMPTY_VALUE) Comment ("Красный Голден Фильтр");
if (IndGoldenFilterBUY >0 && IndGoldenFilterBUY <1 && IndGoldenFilterSELL ==EMPTY_VALUE) Comment ("Синий Голден Фильтр");
if (IndGoldenFilterSELL >0 && IndGoldenFilterSELL <1 && IndGoldenFilterBUY >0 && IndGoldenFilterBUY <1) Comment ("Красный и синий Голден Фильтр");
int sign = 0;
if ( IndArrowBUY <100000 && IndArrowBUY>0 && (!GFilter || (GFilter && IndGoldenFilterBUY >0 && IndGoldenFilterBUY <1 )))
{
sign = 1; // Покупка
}
if ( IndArrowSELL <100000 && IndArrowSELL>0 && (!GFilter || (GFilter && IndGoldenFilterSELL >0 && IndGoldenFilterSELL <1 )) )
{
sign = -1; // Продажа
}
return sign;
}
void CloseAll()
{
for (int i = OrdersTotal() - 1; i >= 0; i--) {
if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
if (OrderSymbol() == _Symbol && (OrderType() == OP_BUY || OrderType() == OP_SELL) && OrderMagicNumber() == magic) {
ClosePosBySelect();
}
}
}
void ClosePosBySelect()
{
bool fc;
double ll, pa, pb, pp;
if (OrderType() == OP_BUY || OrderType() == OP_SELL) {
for (int it = 1; it <= 5; it++) {
if (!IsTesting() && (!IsExpertEnabled() || IsStopped())) break;
while (!IsTradeAllowed()) Sleep(5000);
RefreshRates();
pa = MarketInfo(OrderSymbol(), MODE_ASK);
pb = MarketInfo(OrderSymbol(), MODE_BID);
if (OrderType() == OP_BUY) {
pp = pb;
}
else {
pp = pa;
}
ll = OrderLots();
fc = OrderClose(OrderTicket(), ll, pp, slip, clrYellow);
if (fc) {
break;
}
else {
int err = GetLastError();
Print("Error(", err, ") close position: ", Error(err), ", try ", it);
}
}
}
else Print("Incorrect trade operation. Close ", GetNameOP(OrderType()));
}
int OpenPosition(string sy, int op, double ll, double slO = 0, double tpO = 0, int mn = 0, string lsComm = "")
{
color clOpen;
datetime ot;
double pp, pa, pb;
int dg, err, it, ticket = 0;
if (sy == "" || sy == "0") sy = Symbol();
if (op == OP_BUY) clOpen = clOpenBuy;
else clOpen = clOpenSell;
for (it = 1; it <= 1; it++) {
if (!IsTesting() && (!IsExpertEnabled() || IsStopped())) {
Print("OpenPosition(): Остановка работы функции");
break;
}
while (!IsTradeAllowed()) Sleep(5000);
RefreshRates();
dg = (int)MarketInfo(sy, MODE_DIGITS);
pa = MarketInfo(sy, MODE_ASK);
pb = MarketInfo(sy, MODE_BID);
if (op == OP_BUY) pp = pa;
else pp = pb;
pp = NormalizeDouble(pp, dg);
ot = TimeCurrent();
ticket = OrderSend(sy, op, ll, pp, slip, slO, tpO, lsComm, mn, 0, clOpen);
if (ticket > 0) {
break;
}
else {
err = GetLastError();
if (pa == 0 && pb == 0) Print("NOT Symbol " + sy);
Print("Error(", err, ") opening position: ", Error(err), ", try ", it);
Print("Ask=", pa, " Bid=", pb, " sy=", sy, " ll=", ll, " op=", GetNameOP(op),
" pp=", pp, " sl=", slO, " tp=", tpO, " mn=", mn);
}
}
return(ticket);
}
bool ExistPositions(string sy = "", int op = -1, int mn = -1, datetime ot = 0)
{
if (sy == "0") sy = Symbol();
for (int i = 0; i < OrdersTotal(); i++) {
if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
if (OrderSymbol() == sy || sy == "") {
if (OrderType() == OP_BUY || OrderType() == OP_SELL) {
if (op < 0 || OrderType() == op) {
if (mn < 0 || OrderMagicNumber() == mn) {
if (ot <= OrderOpenTime()) return true;
}
}
}
}
}
}
return false;
}
void CountTrades()
{
nBuy = 0;
nSell = 0;
profitOpenPos = 0;
lotOpenPos = 0;
timeOpenPos = 0;
for (int i = OrdersTotal() - 1; i >= 0; i--)
if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
if (OrderSymbol() == Symbol() && OrderMagicNumber() == magic) {
if (OrderType() == OP_BUY) {
nBuy++;
timeOpenPos = OrderOpenTime();
profitOpenPos = (int)((Close[0] - OrderOpenPrice()) / _Point);
lotOpenPos = OrderLots();
}
if (OrderType() == OP_SELL) {
nSell++;
timeOpenPos = OrderOpenTime();
profitOpenPos = (int)((OrderOpenPrice() - Close[0]) / _Point);
lotOpenPos = OrderLots();
}
}
}
}
double NormLots(double lot)
{
int lotdigits = 0;
double maxLot = MarketInfo(_Symbol, MODE_MAXLOT);
double minLot = MarketInfo(_Symbol, MODE_MINLOT);
double lotstep = MarketInfo(_Symbol, MODE_LOTSTEP);
if (lotstep == 0.01) lotdigits = 2;
if (lotstep == 0.1) lotdigits = 1;
if (lotstep == 1) lotdigits = 0;
double tradeLot = NormalizeDouble(lot, lotdigits);
if(tradeLot > maxLot) tradeLot = maxLot;
if(tradeLot < minLot) tradeLot = minLot;
return tradeLot;
}
double ProfitLastPos(int op, int mn, double & lot, datetime & timeBarOpen)
{
if (OrdersHistoryTotal() == 0) {
return EMPTY_VALUE;
}
datetime t = 0;
int j = -1;
for (int i = OrdersHistoryTotal() - 1; i >= 0; i--) {
if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) {
if (OrderSymbol() == _Symbol) {
if (OrderType() == OP_BUY || OrderType() == OP_SELL) {
if (op < 0 || OrderType() == op) {
if (mn < 0 || OrderMagicNumber() == mn) {
if (t < OrderCloseTime()) {
t = OrderCloseTime();
j = i;
}
}
}
}
}
}
}
if (OrderSelect(j, SELECT_BY_POS, MODE_HISTORY)) {
double profit = 0; //OrderProfit();
{
if (OrderType() == OP_BUY) {
profit = (OrderClosePrice() - OrderOpenPrice()) / _Point;
}
if (OrderType() == OP_SELL) {
profit = (OrderOpenPrice() - OrderClosePrice()) / _Point;
}
}
lot = OrderLots();
timeBarOpen = Time[iBarShift(_Symbol, PERIOD_CURRENT, OrderOpenTime())];
return profit;
}
return EMPTY_VALUE;
}
string GetNameOP(int op)
{
switch (op) {
case OP_BUY :
return("Buy");
case OP_SELL :
return("Sell");
case OP_BUYLIMIT :
return("BuyLimit");
case OP_SELLLIMIT:
return("SellLimit");
case OP_BUYSTOP :
return("BuyStop");
case OP_SELLSTOP :
return("SellStop");
default :
return("Unknown Operation");
}
}
double ND(double d)
{
return (NormalizeDouble(d, Digits));
}
void DrawStats()
{
double balance = AccountBalance();
double dayProfit = GetProfitForDay(0);
string expName = expertName + "1";
if (ObjectFind(expName) == -1) {
ObjectCreate(expName, OBJ_LABEL, 0, 0, 0);
ObjectSet(expName, OBJPROP_CORNER, 1);
ObjectSet(expName, OBJPROP_XDISTANCE, 10);
ObjectSet(expName, OBJPROP_YDISTANCE, 15);
}
ObjectSetText(expName, "Заработок сегодня: " + DoubleToStr(dayProfit, 2) + "/" + DoubleToStr(dayProfit * 100.0 / balance, 1), fontSizeInfo, "Tahoma", clrInfo);
dayProfit = GetProfitForDay(1);
expName = expertName + "2";
if (ObjectFind(expName) == -1) {
ObjectCreate(expName, OBJ_LABEL, 0, 0, 0);
ObjectSet(expName, OBJPROP_CORNER, 1);
ObjectSet(expName, OBJPROP_XDISTANCE, 10);
ObjectSet(expName, OBJPROP_YDISTANCE, 30);
}
ObjectSetText(expName, "Заработок вчера: " + DoubleToStr(dayProfit, 2) + "/" + DoubleToStr(dayProfit * 100.0 / balance, 1), fontSizeInfo, "Tahoma", clrInfo);
double profit = GetProfitForMonth();
expName = expertName + "3";
if (ObjectFind(expName) == -1) {
ObjectCreate(expName, OBJ_LABEL, 0, 0, 0);
ObjectSet(expName, OBJPROP_CORNER, 1);
ObjectSet(expName, OBJPROP_XDISTANCE, 10);
ObjectSet(expName, OBJPROP_YDISTANCE, 45);
}
ObjectSetText(expName, "Прибыль за месяц: " + DoubleToStr(profit, 2) + "/" + DoubleToStr(profit * 100.0 / balance, 1), fontSizeInfo, "Tahoma", clrInfo);
expName = expertName + "4";
if (ObjectFind(expName) == -1) {
ObjectCreate(expName, OBJ_LABEL, 0, 0, 0);
ObjectSet(expName, OBJPROP_CORNER, 1);
ObjectSet(expName, OBJPROP_XDISTANCE, 10);
ObjectSet(expName, OBJPROP_YDISTANCE, 60);
}
ObjectSetText(expName, "Убыточных подряд: " + DoubleToString(GlobalVariableGet(GVlossInRow), 0), fontSizeInfo, "Tahoma", clrInfo);
expName = expertName + "5";
Показано первые 50% кода (символов: 39523)
Открыть по тарифу
Купите тариф с пакетом открытий или войдите, если тариф уже есть. Открытый файл останется в вашем кабинете навсегда.
Разовая покупка файла
На этой странице откроется полный исходный код файла вместо ознакомительного фрагмента.
Зачем нужен email? После подтверждения оплаты файл сохранится в кабинете на этот email. Если аккаунта ещё нет, мы создадим его и пришлём ссылку для задания пароля. Если аккаунт уже есть, покупка добавится в него. Укажите адрес, к которому у вас есть доступ.
Чтобы оформить заказ, введите email и перейдите к оплате.