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

Rennela

Новичок форума
Нет.
Только если это помешало открыть ордер или модифицировать или закрыть то в журнале терминала пишет номер строки.

В том то и дело,что нигде записей нет:ни в журнале,ни в логах терминала,ни в логах MQL4-ордер должен модифицироваться или выставиться отложенный ордер и не выполняется,я сначала думал,что это может происходить если параллельно выполняется запрос к серверу,на одном терминале у меня висит больше 20 сов,но есть случаи когда сов.сбоит на ровном месте . Если бы это было постоянно, то это где-то неправильно код прописан,но ошибка не постоянно выскакивает, а регулярно.Все такие функции зациклены и если что в switch(GetLastError()) в строке defoult есть и Sleep(), и RefreshRates(),и continue(ошибку 4051 индивидуально не прописывал,т.к. не знаю что это), но после этой ошибки ничего не происходит даже если рыночная цена возле цены открытия на данный момент. Несколькими постами выше я потому и спрашивал, что если торговая функция зациклена,то обновление данных и повтор помогут решить эту проблему.Или обязательно перед повтором нужно сбрасывать ошибку?
 

Ugar

Гуру форума
В том то и дело,что нигде записей нет:ни в журнале,ни в логах терминала,ни в логах MQL4-ордер должен модифицироваться или выставиться отложенный ордер и не выполняется,я сначала думал,что это может происходить если параллельно выполняется запрос к серверу,на одном терминале у меня висит больше 20 сов,но есть случаи когда сов.сбоит на ровном месте . Если бы это было постоянно, то это где-то неправильно код прописан,но ошибка не постоянно выскакивает, а регулярно.Все такие функции зациклены и если что в switch(GetLastError()) в строке defoult есть и Sleep(), и RefreshRates(),и continue(ошибку 4051 индивидуально не прописывал,т.к. не знаю что это), но после этой ошибки ничего не происходит даже если рыночная цена возле цены открытия на данный момент. Несколькими постами выше я потому и спрашивал, что если торговая функция зациклена,то обновление данных и повтор помогут решить эту проблему.Или обязательно перед повтором нужно сбрасывать ошибку?
При зацикливании функции каждый раз надо сбрасывать ошибку перед вызовом функции.
При вызове торговой функции ордер отправляется на сервер. Если он отказался его выполнять, возвращает ошибку.
4051 это не из за невыполнения сервером торговой операции. Эту ошибку выдает сам терминал если что то неправильно посчитал и скормил функции в качестве аргумента. Например если вызвать iMA с отрицательным периодом или с заданным символом, которого нет в окне обзор рынка. Или если попытаться открыть ордер с 0 или отрицательным лотом. В этом случае терминал не будет отправлять на ордер с некорректным лотом, сам выдаст ошибку.
Именно по этому я и писал что такая ошибка может быть в любой функции, не обязательно в торговой, но в той где есть аргументы заданные переменной, значение которой неправильно посчитано.
 

seronn

Новичок форума
Не совсем вопрос, просто может кто прокомментирует почему так. На днях писал функцию открытия ордеров по времени. Выяснилась следующая особенность:
if (TimeHour(TimeCurrent())>=8 && TimeMunute(TimeCurrent())>=30)
{открываем ордер}
конструкция идеально работает в тестере, но не работает на графике, ордера просто не открываются. А вот такая конструкция:
int OpenHour,OpenMunute;
OpenHour=TimeHour(TimeCurrent());
OpenMinute=TimeMunute(TimeCurrent());
if (OpenHour>=8 && OpenMinute>=30)
{открываем ордер}
работает и в тестере, в на графике. Почему такая разница в работе тестера и реальной работы, в чем причина?
 
Последнее редактирование:

_SERG_

Активный участник
Не совсем вопрос, просто может кто прокомментирует почему так. На днях писал функцию открытия ордеров по времени. Выяснилась следующая особенность:
if (TimeHour(TimeCurrent())>=8 && TimeMunute(TimeCurrent())>=30)
{открываем ордер}
конструкция идеально работает в тестере, но не работает на графике, ордера просто не открываются. А вот такая конструкция:
int OpenHour,OpenMunute;
OpenHour=TimeHour(TimeCurrent());
OpenMinute=TimeMunute(TimeCurrent());
if (OpenHour>=8 && OpenMinute>=30)
{открываем ордер}
работает и в тестере, в на графике. Почему такая разница в работе тестера и реальной работы, в чем причина?

Братэлла, тестер, это как аэродинамическая труба, модели проверять, а не бабки рубить!!!:laugh::laugh::laugh::laugh::laugh::laugh::laugh::laugh::laugh::laugh:
Короче, дифференцируй.
Дифференциа́л (от лат. differentia «разность, различие»)
 
Последнее редактирование модератором:

AlexeyVik

Программист mql4 mql5
Не совсем вопрос, просто может кто прокомментирует почему так. На днях писал функцию открытия ордеров по времени. Выяснилась следующая особенность:
if (TimeHour(TimeCurrent())>=8 && TimeMunute(TimeCurrent())>=30)
{открываем ордер}
конструкция идеально работает в тестере, но не работает на графике, ордера просто не открываются. А вот такая конструкция:
int OpenHour,OpenMunute;
OpenHour=TimeHour(TimeCurrent());
OpenMinute=TimeMunute(TimeCurrent());
if (OpenHour>=8 && OpenMinute>=30)
{открываем ордер}
работает и в тестере, в на графике. Почему такая разница в работе тестера и реальной работы, в чем причина?
Просто надо потихоньку привыкать к хорошим новшествам языка и будет всё везде работать... Используй
MqlDateTime dt_struct;
TimeToStruct(TimeCurrent(), dt_struct);
Тогда условие будет
if(dt_struct.hour == 8 && dt_struct.min >= 30)
{
открываем ордер
}

-https://docs.mql4.com/ru/dateandtime/timetostruct
 

Ugar

Гуру форума
Просто надо потихоньку привыкать к хорошим новшествам языка и будет всё везде работать... Используй
MqlDateTime dt_struct;
TimeToStruct(TimeCurrent(), dt_struct);
Тогда условие будет
if(dt_struct.hour == 8 && dt_struct.min >= 30)
{
открываем ордер
}

-https://docs.mql4.com/ru/dateandtime/timetostruct
Привет! Любишь ты структуры. Казалось бы, это молодёжь должна любить всякие новинки. А получается... Поди начитавшись древнего учебника, для них, приведённый тобой кусочек кода, как китайская грамота.
 

AlexeyVik

Программист mql4 mql5
Привет! Любишь ты структуры. Казалось бы, это молодёжь должна любить всякие новинки. А получается... Поди начитавшись древнего учебника, для них, приведённый тобой кусочек кода, как китайская грамота.
Привет Андрей. Я не структуры люблю, а лёгкость программирования, понимания и удобство использования.
 
  • Like
Реакции: Ugar

_SERG_

Активный участник
Привет Андрей. Я не структуры люблю, а лёгкость программирования, понимания и удобство использования.
Алексей, любят все, не у всех получается.
Спросил в сервисдеске, когда возникает "Ассess violation read ... ", они ж писатели, ошибку предусмотрели, что бы на грабли не наступать, и шо?!!
Тишина, не ответили.
Решать пришлось по старинке, как обычно, про гланды.
Обрастать новым кодом всё это конечно будет, но детские болезни остаются без внимания, тобищь новые возможности их не исключают.

Эт, так, печенюшка к чаю. :laugh:
 

AlexeyVik

Программист mql4 mql5
Алексей, любят все, не у всех получается.
Спросил в сервисдеске, когда возникает "Ассess violation read ... ", они ж писатели, ошибку предусмотрели, что бы на грабли не наступать, и шо?!!
Тишина, не ответили.
Решать пришлось по старинке, как обычно, про гланды.
Обрастать новым кодом всё это конечно будет, но детские болезни остаются без внимания, тобищь новые возможности их не исключают.

Эт, так, печенюшка к чаю. :laugh:
Не удивлюсь если они в mql5 исправили, а в mql4 специально не стали исправлять. Но разговор был не об ошибках, а об удобстве использования того что работает без ошибок.
 

Ugar

Гуру форума
Алексей, любят все, не у всех получается.
Спросил в сервисдеске, когда возникает "Ассess violation read ... ", они ж писатели, ошибку предусмотрели, что бы на грабли не наступать, и шо?!!
Тишина, не ответили.
Я когда то неоднократно писал об ограничении количества тиков при тестировании в тестере. То же молчали. Выходили новые билды, всё повторялось.
А потом исправили не прошло и 2х лет. Так что "ждите ответа".
 

eevviill2

Местный знаток
Привет! Любишь ты структуры. Казалось бы, это молодёжь должна любить всякие новинки. А получается... Поди начитавшись древнего учебника, для них, приведённый тобой кусочек кода, как китайская грамота.
Особенно когда можно просто сделать.
PHP:
if(TimeToString(TimeCurrent(),TIME_MINUTES)>="08:30")
 

eevviill2

Местный знаток
Я когда то неоднократно писал об ограничении количества тиков при тестировании в тестере. То же молчали. Выходили новые билды, всё повторялось.
А потом исправили не прошло и 2х лет. Так что "ждите ответа".
Кому там писать? Как я и говорил там почти одни дол.... работают.
Ах да. Билдов в МТ4 уже не будет.
 

seronn

Новичок форума
Уважаемые знатоки))) Подскажите. Нужно написать функцию в советнике, которая будет открывать сетку отложек по обе стороны от текущего ордера, с разным шагом и количеством Лимит и Стоп. Делаю так:

void BuildNetSell()
{
int i;
double PrcSS,PrcSL;
double PrcS=FindOrderPriceByComment("Sell0");
bool res;
for (i = 1; i<TrendOrd; i++) {
PrcSS=PrcS-i*MartinStep1*Point;
res=OrderSend(NULL,OP_SELLSTOP,Lot(),PrcSS,Slip,0,0,"",Magic,0,Red);
}
for (i = 1; i<ContrTrendOrd; i++) {
PrcSL=PrcS+i*MartinStep2*Point;
res=OrderSend(NULL,OP_SELLLIMIT,Lot(),PrcSL,Slip,0,0,"",Magic,0,Red);
}
}

Не открывает ни в какую, USDCAD,M5: invalid price for OrderSend function
Что делаю не так?
 

eevviill2

Местный знаток
Уважаемые знатоки))) Подскажите. Нужно написать функцию в советнике, которая будет открывать сетку отложек по обе стороны от текущего ордера, с разным шагом и количеством Лимит и Стоп. Делаю так:

void BuildNetSell()
{
int i;
double PrcSS,PrcSL;
double PrcS=FindOrderPriceByComment("Sell0");
bool res;
for (i = 1; i<TrendOrd; i++) {
PrcSS=PrcS-i*MartinStep1*Point;
res=OrderSend(NULL,OP_SELLSTOP,Lot(),PrcSS,Slip,0,0,"",Magic,0,Red);
}
for (i = 1; i<ContrTrendOrd; i++) {
PrcSL=PrcS+i*MartinStep2*Point;
res=OrderSend(NULL,OP_SELLLIMIT,Lot(),PrcSL,Slip,0,0,"",Magic,0,Red);
}
}

Не открывает ни в какую, USDCAD,M5: invalid price for OrderSend function
Что делаю не так?
Я бы так сделал.
PHP:
void BuildNetSell()
{
double PrcS=FindOrderPriceByComment("Sell0");
bool res;
//stops
double PrcSS=PrcS;
for (int i = 1; i<TrendOrd; i++) 
{
PrcSS-=MartinStep1*Point;
res=OrderSend(NULL,OP_SELLSTOP,Lot(),NormalizeDouble(PrcSS,Digits),Slip,0,0,"",Magic,0,Red);
}
//limits
double PrcSL=PrcS;
for (int i = 1; i<ContrTrendOrd; i++) 
{
PrcSL+=MartinStep2*Point;
res=OrderSend(NULL,OP_SELLLIMIT,Lot(),NormalizeDouble(PrcSL,Digits),Slip,0,0,"",Magic,0,Red);
}

}

Если не помогло, то бы проверил что возвращает FindOrderPriceByComment("Sell0")
 

seronn

Новичок форума
Я бы так сделал.
PHP:
void BuildNetSell()
{
double PrcS=FindOrderPriceByComment("Sell0");
bool res;
//stops
double PrcSS=PrcS;
for (int i = 1; i<TrendOrd; i++) 
{
PrcSS-=MartinStep1*Point;
res=OrderSend(NULL,OP_SELLSTOP,Lot(),NormalizeDouble(PrcSS,Digits),Slip,0,0,"",Magic,0,Red);
}
//limits
double PrcSL=PrcS;
for (int i = 1; i<ContrTrendOrd; i++) 
{
PrcSL+=MartinStep2*Point;
res=OrderSend(NULL,OP_SELLLIMIT,Lot(),NormalizeDouble(PrcSL,Digits),Slip,0,0,"",Magic,0,Red);
}

}

Если не помогло, то бы проверил что возвращает FindOrderPriceByComment("Sell0")
Уже разобрался в чем дело) Работает на самом деле и так и так, банально в тексте перепутал места вызова функции в тексте бота... :) Всё равно спасибо)
 

procom

Новичок форума
День добрый, помогите чайнику, очень надо.

Советник работает и с таким кодом закрывает открытый ордер при условии, если Marketposition == 0 ;

Хочу изменить, если открыты 2 ордера и Marketposition стало равным 1 (Marketposition == 1) - закрыть 1 ордер, если Marketposition == 0 - закрыть все ордера.

мой код.

else if(Marketposition == 0) // Выполнено условие на закрытие одера
stop_work();

return(0);

void stop_work()
//+------------------------------------------------------------------+
{
int num;

for(int i=Appempts; i>0; i--)
{
num=0;

if(Close_ord_by_type(0)==true) num+=1;
if(Close_ord_by_type(1)==true) num+=1;

if(num==2) break;
}
}
Премного благодарен.
 

Rennela

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

vladradon

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

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

eevviill2

Местный знаток
PHP:
if(Marketposition == 0) stop_work(1);
else
if(Marketposition == 1) stop_work(2);
...
void stop_work(int clo_num)
...
if(num>=clo_num) break;
 

maximuson

Новичок форума
Помогите написать условия:

Если 2 Бара "назад" от текущего бара Период%K Стохастика был ВЫШЕ(больше) Периода%D И Период%К на текущем Баре НИЖЕ(меньше) Периода%D = сигнал sell

Я так полагаю текущий бар имеет значение=0?

for(int i=2 ; i<=Bars; i++)
{
iBars("EURUSD",PERIOD_H1));
if (iBars >…
}
Это так на уровне чайника). Синяя линия это 2 бара назад а зелёная это текущий бар.
Замудрил я для того чтоб сова ждала этого сигнала а неоткрывала ордера при пересеченых стохастиках где-то в середине после закрытия ордера после SL или TP.
 

Вложения

  • Screenshot_2016-12-10-15-03-04.png
    Screenshot_2016-12-10-15-03-04.png
    62,5 КБ · Просмотры: 16
Последнее редактирование:
Верх