![MQL5 - Язык торговых стратегий для клиентского терминала MetaTrader 5](https://c.mql5.com/i/registerlandings/logo-2.png)
Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
А если мне нужен пока только новый МКЛ4, который вот-вот могут ввести в новом метаэдиторе МТ4-МТ5, где могу найти понятное объяснение перехода на "новые рельсы", основываясь только на знании МКЛ4? Или тут тоже без МКЛ5 уже не обойтись?! Ведь уже наработанное и исправно работающее сейчас, завтра окажется непригодным! И что делать?! Посоветуйте, пожалуйста, но без МКЛ5!
Так если советник делается в мастере MQL5 то больше $10 он и не стоит, так что минималка адекватная.
Другое дело что масса программистов освоив штамповку дальше этого и не идёт, берётся за любой проект, а если он оказывается сложным то просто бросает его (подумаешь одним плохим отзывом больше, в общей массе сделанного это не заметно).
То, что наработано, будет работать и там. Ну, может, внесёте минимальные доработки.
Привет, Артём! Благодарю за внимание и ответ! Правда, с вашим другим лооком не признал сразу. Так где эти "минимальные доработки" могу изучить? Ведь Ренат их только бегло перечислил, не объяснив, в чём разница?
Например, это первое же:
"Изменился приоритет логических операций И/ИЛИ. Теперь всё как в классическом C/C++."
В чём смысл изменения "приоритета"? Вдруг сработала ссылка, посмотрел, но разницы конкретной не усёк.
И тут: "Раньше в функции start можно было указывать параметры."! Теперь все параметры нужно представлять вначале между extern и int init()?
Добрый всем вечер. Помогите пож. переписать индюка с mq4 на mq5. Вот сам код:
//----------------------------------
// IND22.mq4
//----------------------------------
#property indicator_chart_window
#property indicator_buffers 3
#property indicator_color1 Magenta
#property indicator_color2 Magenta
#property indicator_color3 DodgerBlue
#property indicator_width1 0
#property indicator_width2 2
#property indicator_width3 2
extern string TimeFrame = "0";
extern int Length = 1;
extern int tprice = PRICE_LOW;
extern int barscount = 50;
bool timeOp = TRUE;
double Buf0[];
double Buf1[];
double Buf2[];
string N_Indic;
bool AdaptTF;
bool AdaptTF1;
int TF,begin;
string Mperiod[] = {"M1", "M5", "M15", "M30", "H1", "H4", "D1", "W1", "MN"};
int Tperiod[] = {1, 5, 15, 30, 60, 240, 1440, 10080, 43200};
int init() {
IndicatorDigits(Digits);
IndicatorBuffers(3);
//#define accountNum 1111
// #define expiryDate "2019.01.30"
Length = MathMax(Length, 1);
begin = 5 * Length;
SetIndexBuffer(0, Buf0);
SetIndexDrawBegin(0, begin);
SetIndexBuffer(1, Buf1);
SetIndexDrawBegin(1, begin);
SetIndexBuffer(2, Buf2);
SetIndexDrawBegin(2, begin);
IndicatorShortName("IND22");
N_Indic = WindowExpertName();
AdaptTF = TimeFrame == "calculateTma";
if (AdaptTF) return (0);
AdaptTF1 = TimeFrame == "returnBars";
if (AdaptTF1) return (0);
if (TimeFrame == "0") {
TimeFrame = "" + Period();
}
for (int K = 0; K <= 8; K++) {
if (K == 8) {return (0);
if (TimeFrame == "" + Tperiod[K]) {
TF = On_tf("" + Tperiod[K]);
break;
}
}
if (K == 2) {
if (TimeFrame == "" + Tperiod[K]) {
TF = On_tf("" + Tperiod[K + 2]);
break;
}
}
else {
if (TimeFrame == "" + Tperiod[K]) {
TF = On_tf("" + Tperiod[K+1]);
break;
}
}
}
return (0);
}
//--------------------
int deinit() {
return (0);
}
//--------------------
int start() {
//if (AccountInfoInteger(ACCOUNT_TRADE_MODE)==ACCOUNT_TRADE_MODE_DEMO) return(0);
// if(TimeCurrent() >= StringToTime(expiryDate)) {return(0);}
//if (accountNum!=AccountNumber()) {return(0);}
int cize;
double Length1;
double Length2;
int shift,limit;
int datetimeOp;
double koef;
int bcount = IndicatorCounted();
if (bcount < 0) return (-1);
if(BarChanged() || bcount==0)
{
Length1=0;
Length2=0;
limit = Bars - 1;
}
else
if (bcount > 0)
limit = Bars - bcount + begin;
limit++;
SetIndexDrawBegin(0, Bars-barscount);
SetIndexDrawBegin(1, Bars-barscount);
SetIndexDrawBegin(2, Bars-barscount);
if (AdaptTF || TF == Period()) {
for (int ii = limit; ii >= 0; ii--) {
Length1 = (Length + 1) * iMA(NULL, 0, 1, 0, MODE_SMA, tprice, ii);
Length2 = Length + 1;
cize = 1;
for (int kk = Length; cize <= Length; kk--) {
Length1 += kk * iMA(NULL, 0, 1, 0, MODE_SMA, tprice, ii + cize);
Length2 += kk;
if (cize <= ii) {
Length1 += kk * iMA(NULL, 0, 1, 0, MODE_SMA, tprice, ii - cize);
Length2 += kk;
}
cize++;
}
Buf0[ii] = Length1 / Length2;
}
return (0);
}
limit = Bars - bcount + begin;
if (limit> barscount+5) limit = barscount+5;
for (ii = limit; ii >= 0; ii--) {
shift = iBarShift(NULL, TF, Time[ii]);
Buf0[ii] = iCustom(NULL, TF, N_Indic, "calculateTma", Length, tprice, 0, shift);
if (TF <= Period() || shift == iBarShift(NULL, TF, Time[ii - 1])) continue;
if (timeOp) {
datetimeOp = iTime(NULL, TF, shift);
for (int b = 1; ii + b < Bars && Time[ii + b] >= datetimeOp; b++) {
}
koef = 1.0 / b;
for (kk = 1; kk < b; kk++) {
Buf0[ii + kk] = kk * koef * (Buf0[ii + b]) + (1.0 - kk * koef) * Buf0[ii];
}
for(int i = limit; i >= 0; i--)
{
Buf2[i] = Buf0[i];
Buf1[i] = Buf0[i];
if (Buf0[i] > Buf0[i+1])
{
Buf2[i] = EMPTY_VALUE;
Buf1[i+1] = Buf0[i+1];
}
// else //
if (Buf0[i] < Buf0[i+1])
{
Buf1[i] = EMPTY_VALUE;
Buf2[i+1] = Buf0[i+1];
}
}
}
}
RefreshRates();
return (0);
}
int On_tf(string tt) {
tt = F01(tt);
for (int bcount = ArraySize(Tperiod) - 1; bcount >= 0; bcount--)
if (tt == Mperiod[bcount] || tt == "" + Tperiod[bcount]) return (MathMax(Tperiod[bcount], Period()));
return (Period());
}
string F01(string tt) {
int kk;
string ret1 = tt;
for (int cize = StringLen(tt) - 1; cize >= 0; cize--) {
kk = StringGetChar(ret1, cize);
if ((kk > '`' && kk < '{') || (kk > 'Я' && kk < 256)) ret1 = StringSetChar(ret1, cize, kk - 32);
else
if (kk > -33 && kk < 0) ret1 = StringSetChar(ret1, cize, kk + 224);//kk + 224
}
return (ret1);
}
//-----------------------
bool BarChanged(){
static datetime dt = 0;
if (dt != Time[0])
{
dt = Time[0];
return(true);
}
return(false);
}
//------------------------------