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

AlexeyVik

Программист mql4 mql5
Да он балуется, не парься. :laugh:
К чему это баловство, если чётко написано, что если во время выполнения события OnTick() наступит время выполнения события OnTimer(), то оно выполнено не будет и наоборот, если во время выполнения события OnTimer() поступит новый тик, то он будет пропущен.
 

sega111

Заблокирован
как сделать чтобы не открывались ордера по тем же ценам по которым уже открыты бай на бае селл на селле, напишите код пожалуйста
 

_SERG_

Активный участник
К чему это баловство, если чётко написано, что если во время выполнения события OnTick() наступит время выполнения события OnTimer(), то оно выполнено не будет и наоборот, если во время выполнения события OnTimer() поступит новый тик, то он будет пропущен.


Доку ща персмотрю.

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

Elvis Burunduk

Элитный участник
как сделать чтобы не открывались ордера по тем же ценам по которым уже открыты бай на бае селл на селле, напишите код пожалуйста

Ты слишком общо написал. как тебе надо, чтоб не открывал лишние ордера? Я так понимаю ты советник пишешь?
Как чтобы он не открывал?
На той же свече или на том же уровне цены??? Или еще как???
Есть много функций уже написанных. На всякие случаи жизни. И чтоб на той же свече не открывал, и чтоб на том же уровне цены +-10, 20, 50пп.(сам задаешь какой размер) не открывал добавочный ордер.
 
Последнее редактирование:

sega111

Заблокирован
Ты слишком общо написал. как тебе надо, чтоб не открывал лишние ордера? Я так понимаю ты советник пишешь?
Как чтобы он не открывал?
На той же свече или на том же уровне цены??? Или еще как???
Есть много функций уже написанных. На всякие случаи жизни. И чтоб на той же свече не открывал, и чтоб на том же уровне цены +-10, 20, 50пп.(сам задаешь какой размер) не открывал добавочный ордер.[/QUмне нужно чтобы сов не открывал ордера по ценам по которым уже открыты ордера,допусти открыт ордер бай по этой цене может октрыться только селл противоположный ордер,а баевский ордер не может открыться так как уже на этой цене есть ордер в бай
 

sega111

Заблокирован
Ты слишком общо написал. как тебе надо, чтоб не открывал лишние ордера? Я так понимаю ты советник пишешь?
Как чтобы он не открывал?
На той же свече или на том же уровне цены??? Или еще как???
Есть много функций уже написанных. На всякие случаи жизни. И чтоб на той же свече не открывал, и чтоб на том же уровне цены +-10, 20, 50пп.(сам задаешь какой размер) не открывал добавочный ордер.

мне нужно чтобы сов не открывал ордера по ценам по которым уже открыты ордера,допусти открыт ордер бай по этой цене может октрыться только селл противоположный ордер,а баевский ордер не может открыться так как уже на этой цене есть ордер в бай
 

Elvis Burunduk

Элитный участник
мне нужно чтобы сов не открывал ордера по ценам по которым уже открыты ордера,допусти открыт ордер бай по этой цене может октрыться только селл противоположный ордер,а баевский ордер не может открыться так как уже на этой цене есть ордер в бай

А, ну понятно, короче тебе нужно чтобы баи или селлы не плодились на одном уровне.
Типа если есть уже бай тут - то второго не надо, но можно селл.
И наоборот если есть селл, то второго не надо, но можно бай.
Я тебя правильно понял?
 
Последнее редактирование:

sega111

Заблокирован
А, ну понятно, короче тебе нужно чтобы баи или селлы не плодились на одном уровне.
Типа если есть уже бай тут - то второго не надо, но можно селл.
И наоборот если есть селл, то второго не надо, но можно бай.
Я тебя правильно понял?

ага все правильно именно так
 

Elvis Burunduk

Элитный участник
ага все правильно именно так

Ща найду кусок кода. Не все так быстро.

Там, если вкратце объяснить --- перебираешь уже открытые ордера этого направления(или бай или селл), и если они есть в близком месте - то не открываем текущий, а игнорируем, ждем когда цена убежит за границу дозволенного диапазона.
Тогда можно и повторно открыть.
Наработок много - можно запутаться.
 

sega111

Заблокирован
Ща найду кусок кода. Не все так быстро.

Там, если вкратце объяснить --- перебираешь уже открытые ордера этого направления(или бай или селл), и если они есть в близком месте - то не открываем текущий, а игнорируем, ждем когда цена убежит за границу дозволенного диапазона.
Тогда можно и повторно открыть.
Наработок много - можно запутаться.

да я знаю что надо перебирать, вот и надо мне код чтобы вставить в сов
 

Elvis Burunduk

Элитный участник
Кароче,
объявляешь в начале совы

extern int Diapazon=50; // или сколько тебе надо... 20-50-100-1000 и т.д.



Перед тем где надо открыть ордер бай , вставляешь это, для проверки.

if (Check_Last_Order_Price(0)<MathAbs(Ask+Diapazon*Points)) return;

это не даст открыть ордер бай рядом.

А вот это не даст открыть селл ордер рядом с уже существующим. Это нужно вставить перед тем, где думаешь открыть селл.

if (Check_Last_Order_Price(1)<MathAbs(Bid+Diapazon*Points)) return;


Ну и сама функция. Ее нужно вставить куда нибудь в код совы.
Обычно нужен именно последний ордер бай или селл, чтоб не плодить много ордеров на одном уровне.
Я думаю - ты сам понимаешь что старые ордера(на прошлой неделе, у меня и такие есть если чё) можно не учитывать, ведь условия для входа поменялись на этой неделе.

//+------------------------------------------------------------------+
// Функция для определения цены открытия последнего ордера |
//+------------------------------------------------------------------+

double Check_Last_Order_Price(int op)
{
datetime last =0;
double price =-1;

int ordtot=OrdersTotal()-1;
for (int i=ordtot; i>=0; i--)
{
if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
{
if (OrderSymbol()==Symbol() && OrderType()==op && OrderMagicNumber()==MagicNumber)
{
if (OrderOpenTime()<last) continue;
last = OrderOpenTime();
price=OrderOpenPrice();
}
continue;
}
}
return(price);
}
 
Последнее редактирование:

sega111

Заблокирован
Кароче,
объявляешь в начале совы

extern int Diapazon=50; // или сколько тебе надо... 20-50-100-1000 и т.д.



Перед тем где надо открыть ордер бай , вставляешь это, для проверки.

if (Check_Last_Order_Price(0)<MathAbs(Ask+Diapazon*Points)) return;

это не даст открыть ордер бай рядом.

А вот это не даст открыть селл ордер рядом с уже существующим. Это нужно вставить перед тем, где думаешь открыть селл.

if (Check_Last_Order_Price(1)<MathAbs(Bid+Diapazon*Points)) return;


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

//+------------------------------------------------------------------+
// Функция для определения цены открытия последнего ордера |
//+------------------------------------------------------------------+

double Check_Last_Order_Price(int op)
{
datetime last =0;
double price =-1;

int ordtot=OrdersTotal()-1;
for (int i=ordtot; i>=0; i--)
{
if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
{
if (OrderSymbol()==Symbol() && OrderType()==op && OrderMagicNumber()==MagicNumber)
{
if (OrderOpenTime()<last) continue;
last = OrderOpenTime();
price=OrderOpenPrice();
}
continue;
}
}
return(price);
}

спс большое за код, будем пробовать
 

Кушмурунец

Прохожий
Здравствуйте нужна ваша помощь есть индикатор для бо нужно туда прикрутить счетчик сигналов с соотношением винрейта с заданной экспирацией но что бы экспирацию можно было самому указывать и еще что бы он начинал считать со следующей свечи после сигнальной
 

1Игорь1

Интересующийся
Добрый день.
Давно не пользовался старым советником, поднял оптимизировал, поставил на график, 2-а дня работал, а потом открепился от окна и не прикрепляется, при компиляции выдает выдает ошибки. Не могу понять как такое может быть, сначала работал, затем перестал, помогите пжл поправить, как надо прописать, чтобы ошибка убралась? Вот в двух местах:
1-е место, где пишет ошибку
ошибка '(' - name expected 190 13
ошибка 'int' - name expected 190 20
ошибка '0' - name expected 191 34
ошибка '18' - name expected 191 37
ошибка '*' - semicolon expectede 191 59
ошибка 'return' - expressions are not allowed on a global scope 193 3
ошибка '}' - expressions are not allowed on a global scope 194 1
187 // Показания индикаторов, должны быть в диапазоне от 0 до 1
188 // p - период индикатора
189 // shift - смещение вглубь истории в периодах индикатора
190 double input(int p, int shift) {
191 double result = iRSI(Symbol(), 0, 18, PRICE_OPEN, shift * p) / 100.0;
192 //
193 return (result);
194 }

2-е место, где пишет ошибку
ошибка return value of 'OrderSelect' should be checked 57 7
53 // Количество открытых поз
54 int total = OrdersTotal();
55 // Перебираем открытые позиции
56 for(int i = total - 1; i >= 0; i--) { // Выделяем открытую позицию
57 OrderSelect(i, SELECT_BY_POS, MODE_TRADES);
58 // Проверяем на соответствие символу инструмента и магическому номеру
59 if ((OrderSymbol() == Symbol()) && (OrderMagicNumber() == mn)) {
60 // Есть открытая позиция, выходим
61
62 return(0);
63 }
64 }
 

Walle2323

Активный участник
Добрый день.
Давно не пользовался старым советником, поднял оптимизировал, поставил на график, 2-а дня работал, а потом открепился от окна и не прикрепляется, при компиляции выдает выдает ошибки. Не могу понять как такое может быть, сначала работал, затем перестал, помогите пжл поправить, как надо прописать, чтобы ошибка убралась? Вот в двух местах:
1-е место, где пишет ошибку
ошибка '(' - name expected 190 13
ошибка 'int' - name expected 190 20
ошибка '0' - name expected 191 34
ошибка '18' - name expected 191 37
ошибка '*' - semicolon expectede 191 59
ошибка 'return' - expressions are not allowed on a global scope 193 3
ошибка '}' - expressions are not allowed on a global scope 194 1
187 // Показания индикаторов, должны быть в диапазоне от 0 до 1
188 // p - период индикатора
189 // shift - смещение вглубь истории в периодах индикатора
190 double input(int p, int shift) {
191 double result = iRSI(Symbol(), 0, 18, PRICE_OPEN, shift * p) / 100.0;
192 //
193 return (result);
194 }

2-е место, где пишет ошибку
ошибка return value of 'OrderSelect' should be checked 57 7
53 // Количество открытых поз
54 int total = OrdersTotal();
55 // Перебираем открытые позиции
56 for(int i = total - 1; i >= 0; i--) { // Выделяем открытую позицию
57 OrderSelect(i, SELECT_BY_POS, MODE_TRADES);
58 // Проверяем на соответствие символу инструмента и магическому номеру
59 if ((OrderSymbol() == Symbol()) && (OrderMagicNumber() == mn)) {
60 // Есть открытая позиция, выходим
61
62 return(0);
63 }
64 }

Проверьте

Код:
double input_Funk(int p, int shift) { // Изменить имя вызова функции  !!!!!
 double result = iRSI(Symbol(), 0, 18, PRICE_OPEN, shift * p) / 100.0;
 //
 return (result);
 }

Код:
// Перебираем открытые позиции
 for(int i = OrdersTotal() - 1; i >= 0; i--) { // Выделяем открытую позицию
  if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) // Проверка - Возвращает true при успешном завершении функции или false в случае ошибки
 // Проверяем на соответствие символу инструмента и магическому номеру
   if ((OrderSymbol() == Symbol()) && (OrderMagicNumber() == mn)) {
 // Есть открытая позиция, выходим
 return(0);
 }
 }
 

1Игорь1

Интересующийся
Спасибо большое, уважаемый Walle2323. А как до этого работало? что такое случилось?
И подскажите, пжл, где надо "Изменить имя вызова функции!!!" и на какое имя, чтобы заработало?
Выдает еще 2-е ошибки, одна подобная, как их поправить?:

ошибка input' - unexpected token 117 16
ошибка ',' - unexpected token 117 23
ошибка 'input' - unexpected token 118 29
ошибка ',' - unexpected token 118 36
ошибка 'input' - unexpected token 119 29
ошибка ',' - unexpected token 119 36
113 // Преобразует вероятность в торговый сигнал
114
115 double tradesSingal() {
116 // Считываем показания индикаторов
117 double a1 = input(9, 0);
118 double a2 = sigmoid(a1 - input(9, 1));
119 double a3 = sigmoid(a1 - input(9, 2));
120
121 // Вычисляем вероятность торгового сигнала для короткой позиции
122 double result = getProbability(a1, a2, a3);
123

ошибка return value of 'OrderSelect' should be checked 211 7
208 else {
209 int total = OrdersHistoryTotal();
210 for (int i = 0; i < total; i++) {
211 OrderSelect(i, SELECT_BY_POS, MODE_HISTORY);
212 if ((OrderSymbol() == Symbol()) && (OrderMagicNumber() == mn)) {
213 if (OrderCloseTime() > lasttime) {profit = OrderProfit();}
214 else {result = lots;}
215 }
 

1Игорь1

Интересующийся
Посмотрите, пжл, может у меня не правильно написан Мартин, иногда он почему-то делает лот больше, чем выставленный коэфициент. Вот он весь, и ошибка в нем же:
201 // Размер лота для мартингейла
202 double getLots(double sp) {
203 int lasttime = 0;
204 double profit = 0;
205 double result = 0;
206
207 if (mart < 1) {result = lots;}
208 else {
209 int total = OrdersHistoryTotal();
210 for (int i = 0; i < total; i++) {
211 OrderSelect(i, SELECT_BY_POS, MODE_HISTORY);
212 if ((OrderSymbol() == Symbol()) && (OrderMagicNumber() == mn)) {
213 if (OrderCloseTime() > lasttime) {profit = OrderProfit();}
214 else {result = lots;}
215 }
216 }
217 if ((profit >= 0.0) || (total == 0)) {result = lots;}
218 else {result = OrderLots() * Kmart;}
219 }
220 result = NormalizeDouble(result, 2);
221 return(result);
222 }
 
Верх