Ваши вопросы по языку MQL4

Ugar

Гуру форума
Спасибо за помощь. Теперь возник вопрос, как проверить упорядочены ли числа в массиве или нет?
Сам смог сделать проверку только без массива, чтобы протестировать стратегию
// Покупка
/*
if (stochF1>stochF2 && stochF2>stochF3 && stochF3>stochF4 && stochF4>stochF5 && stochF<Level_UPF)
{
r=2;
}
// Продажа
if (stochF1<stochF2 && stochF2<stochF3 && stochF3<stochF4 && stochF4<stochF5 && stochF>Level_DOWNF)
{
r=1;
}*/
Но хотелось бы все таки массивом, чтобы при изменении N не переписывать часть программы.
На ум приходит только присвоение произвольной переменной какого-нибудь значения (например 2 для покупки и 1 для продажи) и затем суммирования их внутри цикла и сравнение с требуемым значением в зависимости от количества баров N, но такой вариант будет плохим.
Что значит упорядочены или нет? В какие ячейки какие данные загнал, там они и будут, массив сам по себе не перемешивает ячейки.
Я же привёл пример как в цикле заполнить массив стохастиком.
Длинна массива = количеству проходов в цикле = N.
Так же в цикле перебери массив и проверь условия. А вообще, в цикле можно перебрать стохастик сразу проверяя условия и не записывая в массив. То есть вообще обойтись без массива. Конечно, с массивом оптимальнее, так как можно экономить вызовы индикатора. Если надо данные 2 линий стохастика, можно использовать двухмерный массив.
2 линии ячеек, длинной N.
 

_SERG_

Активный участник
Народ, кто как видит процесс или сталкивался с таким вопросом:
Как отрабатывает приход котировки функция Start() в мультивалютном советнике, если советник подключён к одному инструменту, например к EURUSD. Только когда котировка приходит по инструменту? Или ... (Ваш взгляд.)
(Первая проба пера в мультивалютниках. )
 
Последнее редактирование:

ale002

::: __,,,^._.^,,,__ :::
как проверить упорядочены ли числа в массиве или нет?
Тока перебором. Единственное, что можно оптимизировать - завершить цикл досрочно, как только найден 1й "неупорядок". Т.е. в функции сразу ставить return(false) или break. Проверка на 3 условия - упорядочено по возрастанию / убыванию / неупорядоченно:
PHP:
double
	daStoch[5], // массив
	dDiff = 0 // разница меж значениями массива
;
int
	iBar = ArraySize(da_Stoch) - 1, // счётчик цикла
	iUpOrDown = 0 // переменная - индикатор направления
;

while(iBar > 0) { // проверка упорядоченности
	dDiff = daStoch[iBar] - daStoch[iBar-1];

	if(dDiff > 0.0) { // возрастание на этом баре
		if(iUpOrDown < 0) { // а было убывание
		 	iUpOrDown = 0; // знач массив не упорядочен
		 	break; // дальше не проверяем
		} else iUpOrDown = 1; // пока - возрастание
	}

	else if(dDiff < 0.0) { // убывание на этом баре
		if(iUpOrDown > 0) { // а было возрастание
		 	iUpOrDown = 0; // знач массив не упорядочен
		 	break; // дальше не проверяем
		} else iUpOrDown = -1; // пока - убывание
	}
	
	iBar--;
}

// использование результата:
if(iUpOrDown > 0) {
	// покупка
} else if(iUpOrDown < 0) {
	// продажа
}

Что значит упорядочены или нет? В какие ячейки какие данные загнал, там они и будут, массив сам по себе не перемешивает ячейки.

Имееццо в виду упорядочены по возастанию / убыванию значений, не индексов

Как отрабатывает приход котировки функция Start() в мультивалютном советнике, если советник подключён к одному инструменту, например к EURUSD. Только когда котировка приходит по инструменту?

Стопудофф, по тику инструмента к графику которого подвешен бот. Если частота его тиков не устраивает - основной код можно сунуть в бесконечный цикл с нужной паузой между итерациями. В MT5 функция Start уже называеццо правильно - OnTick, а кроме неё есть OnTimer - можно всунуть основное тело туда или сюда. А можно OnTimer проверять пришел ли тик 2й пары и запускать основной цикл. Там OnTick и OnTimer работают параллельно
 
Последнее редактирование:

Александр К

Интересующийся
Неправ в чём? Что в операторе if() можно не использовать else? Или что условия неправильно понял? Судя по ответу спасибо всё таки у Александра К заработало всё как надо.

Спасибо написал за отзывчивость! А пропал на время потому, что все осталось по старому, но на результат траления не влияет..
 

alexshell

Элитный участник
Спасибо написал за отзывчивость! А пропал на время потому, что все осталось по старому, но на результат траления не влияет..

Ну так выложите код с описанием правильной работы трала. Всем миром поможем.
:)
 

Юрий070

Активный участник
Помогите кто-нибудь. Можно ли вставить в код советника какую-либо команду, чтобы при ошибке 130 ордер принудительно закрывался?
 

AlexeyVik

Программист mql4 mql5
Помогите кто-нибудь. Можно ли вставить в код советника какую-либо команду, чтобы при ошибке 130 ордер принудительно закрывался?
Конечно можно, но только если эта ошибка появляется НЕ во время установки ордера.
 

Юрий070

Активный участник
Так и есть. Как можно закрыть открытый ордер если он не модифицируется, какую команду нужно вставить в код, чтобы советник закрыл ордер с конкретным магиком по текущей цене?
 

AlexeyVik

Программист mql4 mql5
Так и есть. Как можно закрыть открытый ордер если он не модифицируется, какую команду нужно вставить в код, чтобы советник закрыл ордер с конкретным магиком по текущей цене?
Нужно проверить какую ошибку выдаёт попытка модифицировать ордер и соответственно поставить условие "если ошибка 130, то OrderClose(тикет, лот, цена, проскальзывание, цвет стрелки)"
 

chillm

Активный участник
Подскажите пожалуйста, как добавить открытие отложенного ордера, при условии что он должен открыться в расстоянии 10 пунктов от последнего открытого ордера(или с определенным магиком)

Пример:
У меня открылся ордер в бай. Если цена пошла вверх на 10 пунктов, устанавливается отложенный ордер бай(с установленным ТП и СЛ) на расстоянии 20 п от открытого ордера.

Подскажите пожалуйста, очень нужно!...........
 

Ugar

Гуру форума
Подскажите пожалуйста, как добавить открытие отложенного ордера, при условии что он должен открыться в расстоянии 10 пунктов от последнего открытого ордера(или с определенным магиком)

Пример:
У меня открылся ордер в бай. Если цена пошла вверх на 10 пунктов, устанавливается отложенный ордер бай(с установленным ТП и СЛ) на расстоянии 20 п от открытого ордера.

Подскажите пожалуйста, очень нужно!...........
Нужно 2 локальных флага и переменная для запоминания цены открытия бай.
Перебрать в цикле все ордера с фильтрацией по символу и маджику.
Если при переборе найден отложенный ордер, взвести флаг наличия отложенного ордера. Если найден бай, посчитать его прибыль в пунктах.
Если прибыль в пунктах достигла заданного, взвести флаг установки отложенного ордера и записать в переменную цену открытия бай.
После выхода из цикла проверить флаги. Если флаг наличия отложенного ордера не взведён (нет отложенного ордера) и взведён флаг установки отложенного ордера, установить отложенный ордер посчитав цену открытия относительно записанной в переменную цены открытия бай.
 

ale002

::: __,,,^._.^,,,__ :::
Нужно 2 локальных флага и переменная для запоминания цены открытия бай.

Зачем так много, достаточно 1 переменной с ценой, которой присвоен 0 до перебора ордеров. Если при переборе встречен рыночный ордер - переменной присваивается его цена открытия или сразу расчётная цена выставления отложки. Если встречен отложенный ордер - присваивается ноль и делается break. А после цикла - если в переменной не ноль, знач надо брать из неё значение и ставить туда отложку
 
  • Like
Реакции: Ugar

Ugar

Гуру форума
Зачем так много, достаточно 1 переменной с ценой, которой присвоен 0 до перебора ордеров. Если при переборе встречен рыночный ордер - переменной присваивается его цена открытия или сразу расчётная цена выставления отложки. Если встречен отложенный ордер - присваивается ноль и делается break. А после цикла - если в переменной не ноль, знач надо брать из неё значение и ставить туда отложку
Можно и так. Эту задачу можно решить несколькими способами. А какой способ лучше, зависит от остального кода. Например, в этом же цикле может выполняться ещё что то...
 

ale002

::: __,,,^._.^,,,__ :::
какой способ лучше, зависит от остального кода

Это да. Но чаще можно ваще не гонять перебор ордеров по каждому тику - это тормозит, например, оптимизацию. Этого цикла бывает достаточно одного - при инициализации. А дальше - вместе с выставлением ордера Buy писать в переменную Buy_Level уровень цены, по достижении которого надо выставлять BuyLimit. Потом по каждому тику проверять пересекла его цена или нет. Если да - выставлять и обнулять эту переменную, если нет - спать до след тика. Всего одна проверка (точнее - 2, для buy и sell), оч быстрый алгоритм
 

chillm

Активный участник
Это да. Но чаще можно ваще не гонять перебор ордеров по каждому тику - это тормозит, например, оптимизацию. Этого цикла бывает достаточно одного - при инициализации. А дальше - вместе с выставлением ордера Buy писать в переменную Buy_Level уровень цены, по достижении которого надо выставлять BuyLimit. Потом по каждому тику проверять пересекла его цена или нет. Если да - выставлять и обнулять эту переменную, если нет - спать до след тика. Всего одна проверка (точнее - 2, для buy и sell), оч быстрый алгоритм

Я только начинаю программировать в mql4, и не совсем понимаю как это все реализовать.
Вот весь код моего советника, он очень простой, открывает сделку по индикатору, и закрывает ее при появлении противоположного сигнала. Помогите пожалуйста добавить сюда выставление отложек:please::please::please:
extern int MagicNumber = 20130531;
extern double PosLot = 0.1;

extern int TP = 50; // если 3 или 5 знаков, то считаем что это пипсы. Иначе - это тики(поинты).
extern int SL = 200;

//переменные типа 1/0
extern int Trail = 0; // тралить ли ордер.
extern int UseSL = 0; // выставлять ли СЛ по алгоритму при открытии ордера
extern int UseTP = 0; // выставлять ли ТР

int SlippageClose = 100; // в тиках
int SlippageOpen = 10;


double Lot = 0.1;
datetime g_ZeroBar_OpenTime = 0;
//int _maxPositions = 999;
int MaxTry = 2; // количество попыток закрытия ордера...

int gi_132 = 0;

double gd_152;

double g_ibuf_0[6];
double g_ibuf_1[6];
double g_ibuf_2[6];
double g_ibuf_3[6];
double g_ibuf_4[6];
double g_ibuf_5[6];



int init() {
int ai_0;
int ai_4;
double ld_24;
double ld_16;
double ld_32;
double ld_40;
double ld_48;
double ld_56;

Lot = PosLot;
//if (СтратаСТП && СтратаБезТП) Lot = PosLot/2;


//if (СтратаСТП && СтратаБезТП) _maxPositions = MaxPositions*2;

if (Digits == 3 || Digits == 5) gd_152 = 10.0 * Point;
else gd_152 = Point;

if (MaxTry < 1) MaxTry = 1;

return (0);
}

int deinit() {
return (0);
}

int start() {

/*
updateBuffs2();
string l_CommentStr =

"\n 0: " + DoubleToStr( g_ibuf_0[0], 5) + "; " + DoubleToStr( g_ibuf_0[1], 5) + "; " + DoubleToStr( g_ibuf_0[2], 5) + "; " + DoubleToStr( g_ibuf_0[3], 5) + "; " + DoubleToStr( g_ibuf_0[4], 5) + "; "
+ "\n 1: " + DoubleToStr( g_ibuf_1[0], 5) + "; " + DoubleToStr( g_ibuf_1[1], 5) + "; " + DoubleToStr( g_ibuf_1[2], 5) + "; " + DoubleToStr( g_ibuf_1[3], 5) + "; " + DoubleToStr( g_ibuf_1[4], 5) + "; "
+ "\n 2: " + DoubleToStr( g_ibuf_2[0], 5) + "; " + DoubleToStr( g_ibuf_2[1], 5) + "; " + DoubleToStr( g_ibuf_2[2], 5) + "; " + DoubleToStr( g_ibuf_2[3], 5) + "; " + DoubleToStr( g_ibuf_2[4], 5) + "; "
+ "\n 3: " + DoubleToStr( g_ibuf_3[0], 5) + "; " + DoubleToStr( g_ibuf_3[1], 5) + "; " + DoubleToStr( g_ibuf_3[2], 5) + "; " + DoubleToStr( g_ibuf_3[3], 5) + "; " + DoubleToStr( g_ibuf_3[4], 5) + "; "
+ "\n 4: " + DoubleToStr( g_ibuf_4[0], 5) + "; " + DoubleToStr( g_ibuf_4[1], 5) + "; " + DoubleToStr( g_ibuf_4[2], 5) + "; " + DoubleToStr( g_ibuf_4[3], 5) + "; " + DoubleToStr( g_ibuf_4[4], 5) + "; "
+ "\n 5: " + DoubleToStr( g_ibuf_5[0], 5) + "; " + DoubleToStr( g_ibuf_5[1], 5) + "; " + DoubleToStr( g_ibuf_5[2], 5) + "; " + DoubleToStr( g_ibuf_5[3], 5) + "; " + DoubleToStr( g_ibuf_5[4], 5) + "; ";

Comment (l_CommentStr);
*/

if (g_ZeroBar_OpenTime != Time[0]){
g_ZeroBar_OpenTime = Time[0];



//TrailOrders();

double sl1= 0;
double tp1= 0;

if (BuySignal()){
CloseAllSellTrades();

if (UseSL)
sl1 = GetBuyStopInitial();
else
sl1 = GetTrailedBuyStop();

if (UseTP) tp1 = Ask + TP*gd_152;

OrderSend(Symbol(), OP_BUY , Lot, Ask, SlippageOpen, sl1, tp1, "BS buy", MagicNumber, 0, Blue);

if(IsTradeAllowed()) OrderSend(Symbol(), OP_BUY , Lot, Ask, SlippageOpen, sl1, tp1, "BS buy", MagicNumber, 0, Blue);

}


if (SellSignal()) {
CloseAllBuyTrades();

if (UseSL)
sl1 = GetSellStopInitial();
//else
// sl1 = GetTrailedSellStop();
if (UseTP) tp1 = Bid - TP*gd_152;
OrderSend(Symbol(), OP_SELL , Lot, Bid, SlippageOpen, sl1, tp1, "BS Sell", MagicNumber, 1, Red);

}
}
return (0);
}

int IsUpBar(int ai_0) {
if (Close[ai_0] > Open[ai_0]) return (1);
return (0);
}

int IsDownBar(int ai_0) {
if (Close[ai_0] < Open[ai_0]) return (1);
return (0);
}


//=============================
// Закрывает все бай ордера с MagicNumber по текущему инструменту
void CloseAllBuyTrades() {
for (int i = OrdersTotal() - 1; i >= 0; i--) {
OrderSelect(i, SELECT_BY_POS, MODE_TRADES);
if (OrderSymbol() == Symbol() && (OrderMagicNumber() == MagicNumber))
if (OrderType() == OP_BUY)
//OrderClose( OrderTicket(), OrderLots(), Bid, SlippageClose);
{
RefreshRates();
for(int try = 1; try <= MaxTry; try++)
if (!OrderClose( OrderTicket(), OrderLots(), Bid, SlippageClose))
{ Print("Ошибка ", GetLastError());
Print("Не удалось закрыть ордер, попытка ", try);
Sleep(1000);
RefreshRates();
}
else
break;
}
}

}

//=============================
// Закрывает все продажные ордера с MagicNumber по текущему инструменту
void CloseAllSellTrades() {
for (int i = OrdersTotal() - 1; i >= 0; i--) {
OrderSelect(i, SELECT_BY_POS, MODE_TRADES);
if (OrderSymbol() == Symbol() && (OrderMagicNumber() == MagicNumber))
if (OrderType() == OP_SELL)
// OrderClose( OrderTicket(), OrderLots(), Ask, SlippageClose);
{
RefreshRates();
for(int try = 1; try <= MaxTry; try++)
if (!OrderClose( OrderTicket(), OrderLots(), Ask, SlippageClose))
{ Print("Ошибка ", GetLastError());
Print("Не удалось закрыть ордер, попытка ", try);
Sleep(1000);
RefreshRates();
}
else
break;
}
}

}


//=============================
// Считает открытые ордера с MagicNumber по текущему инструменту, в штуках.
int CountTrades() {
int Result = 0;
for (int i = OrdersTotal() - 1; i >= 0; i--) {
OrderSelect(i, SELECT_BY_POS, MODE_TRADES);
if (OrderSymbol() == Symbol() && (OrderMagicNumber() == MagicNumber))
if (OrderType() == OP_SELL || OrderType() == OP_BUY) Result++;
}
return (Result);
}


//=============================

// Считает открытые ордера с MagicNumber по текущему инструменту, в штуках.
//void TrailOrders() {
// if (Trail)
// for (int i = OrdersTotal() - 1; i >= 0; i--) {
// OrderSelect(i, SELECT_BY_POS, MODE_TRADES);
// if (OrderSymbol() == Symbol() && (OrderMagicNumber() == MagicNumber))
// if (OrderType() == OP_SELL )
// {
// if (NormalizeDouble(OrderStopLoss(), Digits) != NormalizeDouble(GetTrailedSellStop(),Digits)){
// Print( "SELL SL =" + GetTrailedSellStop());
// OrderModify(OrderTicket(),OrderOpenPrice(),GetTrailedSellStop(),OrderTakeProfit(),0,Red);
// }
// }
// if (OrderType() == OP_BUY)
// {
// if (NormalizeDouble(OrderStopLoss(), Digits)!= NormalizeDouble(GetTrailedBuyStop(),Digits)){
// Print( "BUY SL =" + GetTrailedBuyStop());
// OrderModify(OrderTicket(),OrderOpenPrice(),GetTrailedBuyStop(),OrderTakeProfit(),0,Blue);
// }
// }
//}
//}



void updateBuffs(){
for (int i = 5; i > 0; i--) {
g_ibuf_0 = g_ibuf_0[i-1];
g_ibuf_1 = g_ibuf_1[i-1];
g_ibuf_2 = g_ibuf_2[i-1];
g_ibuf_3 = g_ibuf_3[i-1];
g_ibuf_4 = g_ibuf_4[i-1];
g_ibuf_5 = g_ibuf_5[i-1];
}
g_ibuf_0[0] = iCustom(NULL, 0, "indicator02",0,1);
g_ibuf_1[0] = iCustom(NULL, 0, "indicator02",1,1);
g_ibuf_2[0] = iCustom(NULL, 0, "indicator02",2,1);
g_ibuf_3[0] = iCustom(NULL, 0, "indicator02",3,1);
g_ibuf_4[0] = iCustom(NULL, 0, "indicator02",4,1);
g_ibuf_5[0] = iCustom(NULL, 0, "indicator02",5,1);
}


void updateBuffs2(){
for (int i = 5; i >= 0; i--) {
g_ibuf_0 = iCustom(NULL, 0, "indicator02",0,i);
g_ibuf_1 = iCustom(NULL, 0, "indicator02",1,i);
g_ibuf_2 = iCustom(NULL, 0, "indicator02",2,i);
g_ibuf_3 = iCustom(NULL, 0, "indicator02",3,i);
g_ibuf_4 = iCustom(NULL, 0, "indicator02",4,i);
g_ibuf_5= iCustom(NULL, 0, "indicator02",5,i);
}
}


//++buy sell magic ea
///////==================
int BuySignal(){
double Result = iCustom(NULL, 0, "indicator02",2,1);
if ((Result == EMPTY_VALUE)||(Result == -1))
return (0);
return (1);
//if return (Result);
}

int SellSignal(){
double Result = iCustom(NULL, 0, "indicator02",3,1);
if ((Result == EMPTY_VALUE)||(Result == -1))
return (0);
return (1);
}

double GetBuyStopInitial(){
return (NormalizeDouble(Low[2] - SL * gd_152, Digits));
}

double GetSellStopInitial(){
return (NormalizeDouble(High[2] + SL * gd_152, Digits));
}

double GetTrailedBuyStop(){
double d = iCustom(NULL, 0, "indicator02",0,1);
return (NormalizeDouble( d, Digits));
}

double GetTrailedSellStop(){
double d = iCustom(NULL, 0, "indicator02",1,1);
return (NormalizeDouble( d, Digits));
}
 

AlexeyVik

Программист mql4 mql5
Да-уж.
Начинать обучение программированию с правки декомпила, это круто...
Не проще-ли написать что-то самому? И для начала попроще...
 

chillm

Активный участник
Да-уж.
Начинать обучение программированию с правки декомпила, это круто...
Не проще-ли написать что-то самому? И для начала попроще...

Я не хочу стать программистом, а лишь немного научиться для того, чтобы в таких моментах как этот, мог бы изменить то что мне нужно. Надеюсь здесь есть добрые люди, которым точно не составит труда внести в него изменения, и возможно даже настолько добрые, что опубликуют его здесь.

Немного скажу про этот советник.. Использует индикатор бай-селл меджик, это стрелки тренда. Как только открывается стрелка в бай или сел он сразу же открывает сделку по нему, а как тренд меняется закрывает сделку, и открывает в другом направлении. У меня есть очень много идей как доработать его, я его уже скрестил с тралл-советником.
Кому интересно вот индикатор и сам советник.
 

Вложения

  • indicator02.mq4
    6,6 КБ · Просмотры: 43
  • indicator02.ex4
    8,9 КБ · Просмотры: 29
  • vBuySellSMagicEA_v1_00.mq4
    9,9 КБ · Просмотры: 45

AlexeyVik

Программист mql4 mql5
Я не хочу стать программистом,
Ты программистом можешь и не быть... Но для чтения и правки чужого кода надо этот код понимать. А понять можно только научившись программированию, ну хотя-бы на самом начальном уровне. Понимать, что открыть ордер можно командой OrderSend() и какие в неё параметры в какой последовательности вносятся. А закрыть ордер OrderClose()... Ну и остальные самые необходимые понятия, например то, что после каждой строки надо ставить точку с запятой ;

А вот что касается добрых людей, то в этом ты прав. Меня тоже можно к ним отнести. Я ведь трачу своё время на диалог с тобой совершенно бескорыстно.
Ведь дело не в нежелании помочь тебе... Дело в нежелании читать декомпилированный код и разбираться что в нём где и зачем.
В общем не взыщи.

ps: И кстати, твои слова "Он очень простой" абсолютно не совместимы с таким количеством строк кода.
Если-бы ты на начальном уровне выучил программирование, то такого не сказал-бы.
 
Последнее редактирование:

tommy27

Гуру форума
Здравствуйте, помогите решить такую проблему: хочу чтоб в одном индикаторе отображались евробакс, индекс доллара и индекс евро, ток значения у них отличаются на несколько порядков. Как привести их к значениям одного порядка? Просто множители добавить - думаю не по феншую как то...
 

Rolandoz

Почетный гражданин
... он сразу же открывает сделку по нему, а как тренд меняется закрывает сделку, и открывает в другом направлении..

зачем его тогда надо менять..??? :not-good::not-good:Могу Вас только поздравить - через месяц-два Вы станете мульенером...( и еще раз - не меняйте ничего)


П.С. извините - не смог сдержатся.:D
 
Верх