![MQL5 - Язык торговых стратегий для клиентского терминала MetaTrader 5](https://c.mql5.com/i/registerlandings/logo-2.png)
Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
Спасибо mntiwana и malden. но почему я должен покупать снова? Можете ли вы отправить эти индикаторы в сообщениях
Отправьте оригинальное письмо со ссылкой, которую вы получили при покупке индикатора, на адрес support@forex-tsd.com, и, если все в порядке, вы получите обновленную версию.
Хорошо, Мланден. Но индикатор до nmc выглядит интереснее, чем после nmc. Это просто мои ощущения?
Хорошо, Мланден. Но индикатор до nmc выглядит интереснее, чем после nmc. Это просто мои ощущения?
Результаты версии "nmc" совершенно не изменились по сравнению с версией "pre-nmc". "nmc" означает "new metatrader compatible".
всего наилучшего
Почему?
Младен,
Пожалуйста, не могли бы вы объяснить мне причину, почему эта ea не работает.
//----------------------- ПАРАМЕТР EA
внешняя строка
Expert_Name = "---------- Pending Order EA v1",
Expert_Name2 = "---------- Для текущей цены установите EntryLevel = 0";
extern double
EntryLevel = 1.8600,
Distance = 100,
StopLoss = 50,
TakeProfit = 50,
TrailingStop = 50;
внешняя строка
Order_Setting = "---------- Order Setting";
extern int
NumberOfTries = 5,
Slippage = 5,
MagicNumber = 1234;
внешняя строка
MM_Parameters = "---------- Money Management";
extern double
Lots =0.01;
extern bool
MM = false, //Использовать управление капиталом или нет
AccountIsMicro = true; //Использовать микро-счет или нет
extern int
Risk = 0; //10%
строка extern
Testing_Parameters = "---------- Back Test Parameter";
extern bool
Show_Settings = true;
//----------------------- ГЛОБАЛЬНАЯ ПЕРЕМЕННАЯ
статическое значение int
TimeFrame = 0;
string
TicketComment = "PendingOrderEA v2",
LastTrade;
bool
TradeAllow = true,
EntryAllow = true;
//+------------------------------------------------------------------+
//| функция инициализации эксперта |
//+------------------------------------------------------------------+
int init()
{
//----------------------- ГЕНЕРИРУЕМ МАГИЧЕСКИЙ НОМЕР И КОММЕНТАРИЙ К БИЛЕТУ
//----------------------- ИСТОЧНИК : PENGIE
MagicNumber = subGenerateMagicNumber(MagicNumber, Symbol(), Period());
TicketComment = StringConcatenate(TicketComment, "-", Symbol(), "-", Period());
//----------------------- ОТОБРАЖЕНИЕ НАСТРОЕК EA НА ГРАФИКЕ
//----------------------- ИСТОЧНИК : CODERSGURU
if(Show_Settings) subPrintDetails();
else Comment("");
return(0);
}
//+------------------------------------------------------------------+
//| функция деинициализации эксперта | |
//+------------------------------------------------------------------+
int deinit()
{
//----------------------- ПРЕДОТВРАЩАЕТ ПОВТОРНЫЙ ПОДСЧЕТ ПРИ ИЗМЕНЕНИИ ПОЛЬЗОВАТЕЛЕМ ВРЕМЕННОГО ИНТЕРВАЛА
//----------------------- ИСТОЧНИК : CODERSGURU
TimeFrame=Period();
return(0);
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
int start()
{
double
// BuyLevel,
SellLevel;
int
cnt,
билет,
total;
//----------------------- УСТАНОВИТЬ ЦЕНУ ПОКУПКИ И ПРОДАЖИ
if(EntryLevel==0) EntryLevel = Bid;
// BuyLevel = EntryLevel + Distance*Point;
SellLevel = EntryLevel - Distance*Point;
// if((BuyLevel-Ask)<10*Point || (Bid-SellLevel)<10*Point)
// {
// Comment("Invalid Entry Price or Distance");
// return(0);
// }
//----------------------- СКОРРЕКТИРУЙТЕ ЛОТЫ, ЕСЛИ ИСПОЛЬЗУЕТЕ УПРАВЛЕНИЕ КАПИТАЛОМ
if(MM) Lots = subLotSize();
//----------------------- ENTRY
//----------------------- ОБЩИЙ ОРДЕР НА ОСНОВЕ MAGICNUMBER И СИМВОЛА
total = subTotalTrade();
//----------------------- УСТАНОВИТЕ ОРДЕР ТОЛЬКО 1 РАЗ
if(TradeAllow)
{
//----------------------- ЕСЛИ НЕТ ТОРГОВЛИ
if(total<1 && EntryAllow)
{
ticket = OrderSend(Symbol(),OP_SELLSTOP,Lots,SellLevel,Slippage,SellLevel+StopLoss*Point,SellLevel-TakeProfit*Point,TicketComment,MagicNumber,0,Red);
// ticket = OrderSend(Symbol(),OP_BUYSTOP,Lots,BuyLevel,Slippage,BuyLevel-StopLoss*Point,BuyLevel+TakeProfit*Point,TicketComment,MagicNumber,0,Green);
EntryAllow = false;
return(0);
}
if(total==1)
{
subDeleteOrder();
TradeAllow = false;
}
}
//----------------------- СЕКЦИЯ ТРЕЙЛИНГ-СТОПА
if(TrailingStop>0 && subTotalTrade()>0){
total = OrdersTotal();
for(cnt=0;cnt<total;cnt++)
{
OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
if(OrderType()<=OP_SELL &&
OrderSymbol()==Symbol() &&
OrderMagicNumber()==MagicNumber)
{
subTrailingStop(OrderType());
return(0);
}
}
}
return(0);
}
//----------------------- END PROGRAM
//+------------------------------------------------------------------+
//| ОПРЕДЕЛЕНИЯ ФУНКЦИЙ
//+------------------------------------------------------------------+
//----------------------- ФУНКЦИЯ УПРАВЛЕНИЯ ДЕНЬГАМИ
//----------------------- ИСТОЧНИК : CODERSGURU
double subLotSize()
{
double lotMM = MathCeil(AccountFreeMargin() * Risk / 1000) / 100;
if(AccountIsMicro==false) //нормальный счет
{
if(lotMM < 0.1) lotMM = Lots;
if((lotMM > 0.5) && (lotMM < 1)) lotMM = 0.5;
if(lotMM > 1.0) lotMM = MathCeil(lotMM);
if(lotMM > 100) lotMM = 100;
}
else //micro account
{
if(lotMM < 0.01) lotMM = Lots;
if(lotMM > 1.0) lotMM = MathCeil(lotMM);
if(lotMM > 100) lotMM = 100;
}
return (lotMM);
}
//----------------------- КОЛИЧЕСТВО ОРДЕРОВ НА ОСНОВЕ СИМВОЛА И ФУНКЦИИ MAGICNUMBER
int subTotalTrade()
{
int
cnt,
total = 0;
for(cnt=0;cnt<OrdersTotal();cnt++)
{
OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES);
if(OrderType()<=OP_SELL &&
OrderSymbol()==Symbol() &&
OrderMagicNumber()==MagicNumber) total++;
}
return(total);
}
//----------------------- ФУНКЦИЯ УДАЛЕНИЯ ЗАКАЗА
void subDeleteOrder()
{
int
cnt,
total = 0;
total = OrdersTotal();
for(cnt=total-1;cnt>=0;cnt--)
{
OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
if(OrderSymbol()==Symbol() &&
OrderMagicNumber()==MagicNumber)
{
switch(OrderType())
{
// case OP_BUYLIMIT :
// case OP_BUYSTOP :
// case OP_SELLLIMIT:
// case OP_SELLSTOP :
OrderDelete(OrderTicket());
}
}
}
}
//----------------------- ФУНКЦИЯ ТРЕЙЛИНГ-СТОП
//----------------------- ИСТОЧНИК : CODERSGURU
//----------------------- МОДИФИЦИРОВАНО : FIREDAVE
void subTrailingStop(int Type)
{
if(Type==OP_BUY) // открыта позиция на покупку
{
if(Bid-OrderOpenPrice()>Point*TrailingStop &&
OrderStopLoss()<Bid-Point*TrailingStop)
{
OrderModify(OrderTicket(),OrderOpenPrice(),Bid-Point*TrailingStop,OrderTakeProfit(),0,Green);
return(0);
}
}
if(Type==OP_SELL) // открыта позиция на продажу
{
if(OrderOpenPrice()-Ask>Point*TrailingStop)
{
if(OrderStopLoss()>Ask+Point*TrailingStop || OrderStopLoss()==0)
{
OrderModify(OrderTicket(),OrderOpenPrice(),Ask+Point*TrailingStop,OrderTakeProfit(),0,Red);
return(0);
}
}
}
}
//----------------------- ГЕНЕРИРУЕМ МАГИЧЕСКОЕ ЧИСЛО НА ОСНОВЕ СИМВОЛА И ФУНКЦИИ ТАЙМФРЕЙМА
//----------------------- ИСТОЧНИК : PENGIE
//----------------------- МОДИФИЦИРОВАНО : FIREDAVE
int subGenerateMagicNumber(int MagicNumber, string symbol, int timeFrame)
{
int isymbol = 0;
if (symbol == "EURUSD") isymbol = 1;
else if (symbol == "GBPUSD") isymbol = 2;
else if (symbol == "USDJPY") isymbol = 3;
else if (symbol == "AUDCAD") isymbol = 4;
else if (symbol == "AUDUSD") isymbol = 5;
else if (symbol == "USDCAD") isymbol = 6;
else if (symbol == "EURGBP") isymbol = 7;
else if (symbol == "EURJPY") isymbol = 8;
else if (symbol == "EURCHF") isymbol = 9;
else if (symbol == "EURAUD") isymbol = 10;
else if (symbol == "EURCAD") isymbol = 11;
else if (symbol == "GBPUSD") isymbol = 12;
else if (symbol == "GBPJPY") isymbol = 13;
else if (symbol == "GBPCHF") isymbol = 14;
else if (symbol == "GBPAUD") isymbol = 15;
else if (symbol == "GBPCAD") isymbol = 16;
else isymbol = 17;
if(isymbol<10) MagicNumber = MagicNumber * 10;
return (StrToInteger(StringConcatenate(MagicNumber, isymbol, timeFrame)));
}
//----------------------- ФУНКЦИЯ ПЕЧАТИ КОММЕНТАРИЯ
//----------------------- ИСТОЧНИК : CODERSGURU
void subPrintDetails()
{
string sComment = "";
string sp = "----------------------------------------\n";
string NL = "\n";
sComment = sp;
sComment = sComment + "TakeProfit=" + DoubleToStr(TakeProfit,0) + " | ";
sComment = sComment + "TrailingStop=" + DoubleToStr(TrailingStop,0) + " | ";
sComment = sComment + "StopLoss=" + DoubleToStr(StopLoss,0) + NL;
sComment = sComment + sp;
sComment = sComment + "Lots=" + DoubleToStr(Lots,2) + " | ";
sComment = sComment + "MM=" + subBoolToStr(MM) + " | ";
sComment = sComment + "Risk=" + DoubleToStr(Risk,0) + "%" + NL;
sComment = sComment + sp;
Comment(sComment);
}
//----------------------- ПРЕОБРАЗОВАНИЕ BOOLEN ПЕРЕМЕННОЙ В СТРОКОВУЮ ФУНКЦИЮ.
//----------------------- ИСТОЧНИК : CODERSGURU
string subBoolToStr ( bool value)
{
if(value) return ("True");
else return ("False");
}
//----------------------- КОНЕЦ ФУНКЦИИ
Заранее спасибо.
Jo
Младен,
надеюсь, у вас все в порядке. ниже приведены две ошибки при компиляции. будьте добры, помогите.
mladen, надеюсь, у вас все хорошо. ниже есть две ошибки при компиляции. будьте добры помочь.
candyman752
Попробуйте сейчас: rstochalert-4tf_1.mq4
Дорогой МЛАДЕН,
(мои вопросы всегда касаются помощи в ремонте, а не в кодировании)![](https://c.mql5.com/forextsd/smiles/biggrin.png)
у меня есть просьба понять..... посмотрите на 2 картинки, которые я добавил, первая с 1 ошибкой и 2 предупреждениями относительно строк 70 и 72.... как вы можете видеть на второй картинке, я заменил и 1 ошибка и 1 предупреждение удалены...... мой вопрос... правильно ли это делать таким образом.... и второй вопрос о 2-ом предупреждении, которое все еще позади в строке 80... если оставить как есть, нет проблем в функционировании?
с уважением
mntiwana
Дорогой МЛАДЕН,
(мои вопросы всегда касаются помощи в ремонте, а не в кодировании)![](https://c.mql5.com/forextsd/smiles/biggrin.png)
у меня есть просьба понять..... посмотрите на 2 картинки, которые я добавил, первая с 1 ошибкой и 2 предупреждениями относительно строк 70 и 72.... как вы можете видеть на второй картинке, я заменил и 1 ошибка и 1 предупреждение удалены...... мой вопрос... правильно ли это делать таким образом.... и второй вопрос о 2-ом предупреждении, которое все еще позади в строке 80... если оставить все как есть, нет проблем в работе?
с уважением
mntiwanamntiwana
таким образом, все в порядке. вы сделали изменения в порядке![](https://c.mql5.com/forextsd/smiles/smile.png)
mntiwana таким образом все в порядке. вы сделали изменения OK
так что большое спасибо великому боссу за поощрение любознательного студента.![](https://c.mql5.com/forextsd/smiles/party.png)
мои наилучшие пожелания
Младен,
Пожалуйста, подскажите мне причину, почему эта ea не работает.
//----------------------- EA ПАРАМЕТР
внешняя строка
Expert_Name = "---------- Pending Order EA v1",
Expert_Name2 = "---------- Для текущей цены установите EntryLevel = 0";
extern double
EntryLevel = 1.8600,
Distance = 100,
StopLoss = 50,
TakeProfit = 50,
TrailingStop = 50;
внешняя строка
Order_Setting = "---------- Order Setting";
extern int
NumberOfTries = 5,
Slippage = 5,
MagicNumber = 1234;
внешняя строка
MM_Parameters = "---------- Money Management";
extern double
Lots =0.01;
extern bool
MM = false, //Использовать управление капиталом или нет
AccountIsMicro = true; //Использовать микро-счет или нет
extern int
Risk = 0; //10%
строка extern
Testing_Parameters = "---------- Back Test Parameter";
extern bool
Show_Settings = true;
//----------------------- ГЛОБАЛЬНАЯ ПЕРЕМЕННАЯ
статическое значение int
TimeFrame = 0;
string
TicketComment = "PendingOrderEA v2",
LastTrade;
bool
TradeAllow = true,
EntryAllow = true;
//+------------------------------------------------------------------+
//| функция инициализации эксперта |
//+------------------------------------------------------------------+
int init()
{
//----------------------- ГЕНЕРИРУЕМ МАГИЧЕСКИЙ НОМЕР И КОММЕНТАРИЙ К БИЛЕТУ
//----------------------- ИСТОЧНИК : PENGIE
MagicNumber = subGenerateMagicNumber(MagicNumber, Symbol(), Period());
TicketComment = StringConcatenate(TicketComment, "-", Symbol(), "-", Period());
//----------------------- ОТОБРАЖЕНИЕ НАСТРОЕК EA НА ГРАФИКЕ
//----------------------- ИСТОЧНИК : CODERSGURU
if(Show_Settings) subPrintDetails();
else Comment("");
return(0);
}
//+------------------------------------------------------------------+
//| функция деинициализации эксперта | |
//+------------------------------------------------------------------+
int deinit()
{
//----------------------- ПРЕДОТВРАЩАЕТ ПОВТОРНЫЙ ПОДСЧЕТ ПРИ ИЗМЕНЕНИИ ПОЛЬЗОВАТЕЛЕМ ВРЕМЕННОГО ИНТЕРВАЛА
//----------------------- ИСТОЧНИК : CODERSGURU
TimeFrame=Period();
return(0);
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
int start()
{
double
// BuyLevel,
SellLevel;
int
cnt,
билет,
total;
//----------------------- УСТАНОВИТЬ ЦЕНУ ПОКУПКИ И ПРОДАЖИ
if(EntryLevel==0) EntryLevel = Bid;
// BuyLevel = EntryLevel + Distance*Point;
SellLevel = EntryLevel - Distance*Point;
// if((BuyLevel-Ask)<10*Point || (Bid-SellLevel)<10*Point)
// {
// Comment("Invalid Entry Price or Distance");
// return(0);
// }
//----------------------- СКОРРЕКТИРУЙТЕ ЛОТЫ, ЕСЛИ ИСПОЛЬЗУЕТЕ УПРАВЛЕНИЕ КАПИТАЛОМ
if(MM) Lots = subLotSize();
//----------------------- ENTRY
//----------------------- ОБЩИЙ ОРДЕР НА ОСНОВЕ MAGICNUMBER И СИМВОЛА
total = subTotalTrade();
//----------------------- УСТАНОВИТЕ ОРДЕР ТОЛЬКО 1 РАЗ
if(TradeAllow)
{
//----------------------- ЕСЛИ НЕТ ТОРГОВЛИ
if(total<1 && EntryAllow)
{
ticket = OrderSend(Symbol(),OP_SELLSTOP,Lots,SellLevel,Slippage,SellLevel+StopLoss*Point,SellLevel-TakeProfit*Point,TicketComment,MagicNumber,0,Red);
// ticket = OrderSend(Symbol(),OP_BUYSTOP,Lots,BuyLevel,Slippage,BuyLevel-StopLoss*Point,BuyLevel+TakeProfit*Point,TicketComment,MagicNumber,0,Green);
EntryAllow = false;
return(0);
}
if(total==1)
{
subDeleteOrder();
TradeAllow = false;
}
}
//----------------------- СЕКЦИЯ ТРЕЙЛИНГ-СТОПА
if(TrailingStop>0 && subTotalTrade()>0){
total = OrdersTotal();
for(cnt=0;cnt<total;cnt++)
{
OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
if(OrderType()<=OP_SELL &&
OrderSymbol()==Symbol() &&
OrderMagicNumber()==MagicNumber)
{
subTrailingStop(OrderType());
return(0);
}
}
}
return(0);
}
//----------------------- END PROGRAM
//+------------------------------------------------------------------+
//| ОПРЕДЕЛЕНИЯ ФУНКЦИЙ
//+------------------------------------------------------------------+
//----------------------- ФУНКЦИЯ УПРАВЛЕНИЯ ДЕНЬГАМИ
//----------------------- ИСТОЧНИК : CODERSGURU
double subLotSize()
{
double lotMM = MathCeil(AccountFreeMargin() * Risk / 1000) / 100;
if(AccountIsMicro==false) //нормальный счет
{
if(lotMM < 0.1) lotMM = Lots;
if((lotMM > 0.5) && (lotMM < 1)) lotMM = 0.5;
if(lotMM > 1.0) lotMM = MathCeil(lotMM);
if(lotMM > 100) lotMM = 100;
}
else //micro account
{
if(lotMM < 0.01) lotMM = Lots;
if(lotMM > 1.0) lotMM = MathCeil(lotMM);
if(lotMM > 100) lotMM = 100;
}
return (lotMM);
}
//----------------------- КОЛИЧЕСТВО ОРДЕРОВ НА ОСНОВЕ СИМВОЛА И ФУНКЦИИ MAGICNUMBER
int subTotalTrade()
{
int
cnt,
total = 0;
for(cnt=0;cnt<OrdersTotal();cnt++)
{
OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES);
if(OrderType()<=OP_SELL &&
OrderSymbol()==Symbol() &&
OrderMagicNumber()==MagicNumber) total++;
}
return(total);
}
//----------------------- ФУНКЦИЯ УДАЛЕНИЯ ЗАКАЗА
void subDeleteOrder()
{
int
cnt,
total = 0;
total = OrdersTotal();
for(cnt=total-1;cnt>=0;cnt--)
{
OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
if(OrderSymbol()==Symbol() &&
OrderMagicNumber()==MagicNumber)
{
switch(OrderType())
{
// case OP_BUYLIMIT :
// case OP_BUYSTOP :
// case OP_SELLLIMIT:
// case OP_SELLSTOP :
OrderDelete(OrderTicket());
}
}
}
}
//----------------------- ФУНКЦИЯ ТРЕЙЛИНГ-СТОП
//----------------------- ИСТОЧНИК : CODERSGURU
//----------------------- МОДИФИЦИРОВАНО : FIREDAVE
void subTrailingStop(int Type)
{
if(Type==OP_BUY) // открыта позиция на покупку
{
if(Bid-OrderOpenPrice()>Point*TrailingStop &&
OrderStopLoss()<Bid-Point*TrailingStop)
{
OrderModify(OrderTicket(),OrderOpenPrice(),Bid-Point*TrailingStop,OrderTakeProfit(),0,Green);
return(0);
}
}
if(Type==OP_SELL) // открыта позиция на продажу
{
if(OrderOpenPrice()-Ask>Point*TrailingStop)
{
if(OrderStopLoss()>Ask+Point*TrailingStop || OrderStopLoss()==0)
{
OrderModify(OrderTicket(),OrderOpenPrice(),Ask+Point*TrailingStop,OrderTakeProfit(),0,Red);
return(0);
}
}
}
}
//----------------------- ГЕНЕРИРУЕМ МАГИЧЕСКОЕ ЧИСЛО НА ОСНОВЕ СИМВОЛА И ВРЕМЕННОЙ ФУНКЦИИ
//----------------------- ИСТОЧНИК : PENGIE
//----------------------- МОДИФИЦИРОВАНО : FIREDAVE
int subGenerateMagicNumber(int MagicNumber, string symbol, int timeFrame)
{
int isymbol = 0;
if (symbol == "EURUSD") isymbol = 1;
else if (symbol == "GBPUSD") isymbol = 2;
else if (symbol == "USDJPY") isymbol = 3;
else if (symbol == "AUDCAD") isymbol = 4;
else if (symbol == "AUDUSD") isymbol = 5;
else if (symbol == "USDCAD") isymbol = 6;
else if (symbol == "EURGBP") isymbol = 7;
else if (symbol == "EURJPY") isymbol = 8;
else if (symbol == "EURCHF") isymbol = 9;
else if (symbol == "EURAUD") isymbol = 10;
else if (symbol == "EURCAD") isymbol = 11;
else if (symbol == "GBPUSD") isymbol = 12;
else if (symbol == "GBPJPY") isymbol = 13;
else if (symbol == "GBPCHF") isymbol = 14;
else if (symbol == "GBPAUD") isymbol = 15;
else if (symbol == "GBPCAD") isymbol = 16;
else isymbol = 17;
if(isymbol<10) MagicNumber = MagicNumber * 10;
return (StrToInteger(StringConcatenate(MagicNumber, isymbol, timeFrame)));
}
//----------------------- ФУНКЦИЯ ПЕЧАТИ КОММЕНТАРИЯ
//----------------------- ИСТОЧНИК : CODERSGURU
void subPrintDetails()
{
string sComment = "";
string sp = "----------------------------------------\n";
string NL = "\n";
sComment = sp;
sComment = sComment + "TakeProfit=" + DoubleToStr(TakeProfit,0) + " | ";
sComment = sComment + "TrailingStop=" + DoubleToStr(TrailingStop,0) + " | ";
sComment = sComment + "StopLoss=" + DoubleToStr(StopLoss,0) + NL;
sComment = sComment + sp;
sComment = sComment + "Lots=" + DoubleToStr(Lots,2) + " | ";
sComment = sComment + "MM=" + subBoolToStr(MM) + " | ";
sComment = sComment + "Risk=" + DoubleToStr(Risk,0) + "%" + NL;
sComment = sComment + sp;
Comment(sComment);
}
//----------------------- ПРЕОБРАЗОВАНИЕ BOOLEN ПЕРЕМЕННОЙ В СТРОКОВУЮ ФУНКЦИЮ.
//----------------------- ИСТОЧНИК : CODERSGURU
string subBoolToStr ( bool value)
{
if(value) return ("True");
else return ("False");
}
//----------------------- КОНЕЦ ФУНКЦИИ
Заранее спасибо.
ДжоJo,
Не могли бы вы приложить файл mq4? Очень трудно протестировать его таким образом.