Обучение языку MQL4 под MetaTrader 4📌

От xbms, 13 апреля, 2013 в Уголок Программиста

#3076

Точно, лонговым должен быть! :)

#3077

Подскажите как мне сложить ордера buy и buystop ?
Что не так в моем коде?

int BuyCount()

{
int count = 0;

for (int buy = OrdersTotal()-1; buy>=0; buy--)
{
if(OrderSelect(buy,SELECT_BY_POS,MODE_TRADES))
{
if (OrderSymbol() == Symbol() && OrderMagicNumber == Magic && OrderType() == OP_BUY || OrderType() == OP_BUYSTOP)
count++;
}
}
return(count);
}

#3078


Подскажите как мне сложить ордера buy и buystop ?
Что не так в моем коде?

int BuyCount()

{
int count = 0;

for (int buy = OrdersTotal()-1; buy>=0; buy--)
{
if(OrderSelect(buy,SELECT_BY_POS,MODE_TRADES))
{
if (OrderSymbol() == Symbol() && OrderMagicNumber == Magic && OrderType() == OP_BUY || OrderType() == OP_BUYSTOP)
count++;
}
}
return(count);
}



Вся суть в скобках:
if (OrderSymbol() == Symbol() && OrderMagicNumber == Magic && (OrderType() == OP_BUY || OrderType() == OP_BUYSTOP))
#3079


клоуз нулевого бара(текущего) конечно же будет равна NULL

Тут не понял ? :-/ когда там NULL бывает?

Гриб на скобки обрати внимание:
if (OrderSymbol() == Symbol() && OrderMagicNumber == Magic && (OrderType() == OP_BUY || OrderType == OP_BUYSTOP))
#3080

Все спасибо скобку не заметил


Добавлено: 05-02-2016 18:55:09

Подскажите как задать date expiration time ордера - пятница 22.00?

Изменено 5 февраля, 2016 пользователем Гриб

#3081

Всем привет! Кто знает, почему не корректно работают циклы в тестере? И for и while, для нахождения минимальной или максимальной цены за n баров? Подобный советник писали во втором уроке, на реальном графике работает вроде как надо, в тестере - тупит, показывает минимум или максимум но точно не за указанные 10 (например) баров, а гораздо больше, значения экстремумов почти не меняются. Запарился уже :(( Может есть другой способ посчитать (я пока в программировании не особо шарю)?

#3082
M1ckey M0u5e, в учебнике по MQL есть изящный код:
//+------------------------------------------------------------------+
extern int Quant_Bars =19; // Количество баров
// Определяем Макс и Мин цены
int i; //Номер бара
double Maximum=Bid; //Максимальная цена
double Minimum=Bid; //Минимальная цена

for(i=0; i {
if(High>Maximum)
Maximum=High;

if(Low Minimum=Low;
}
Alert("За последние ", Quant_Bars, " баров Мах = ",Maximum,", Мin = ", Minimum);

Изменено 6 февраля, 2016 пользователем Sergey Forex

#3083

для мах/мин всегда использую встроенные МКЛ функции типа: iHighest ( NULL, 0, MODE_HIGH, BarCount, 0 ) ;

#3084

Парни, а функция StringFind() регистр искомой подстроки учитывает? Что-то в справке об этом ничего нету.

#3085

Всем привет. Учусь писать советники. Нужна помощь в довольно простой ситуации: закрытие последнего ордера при откате цены к уровню открытия предыдущего. Буду благодарен за помощь.

#3086
JR не проверял, но всегда можно перед сравнением строк приводить их к верхнему регистру.

Dremuchi попробуйте ставить СЛ следующего ордера на цену открытия предыдущего - чтоб не париться с решением.
#3087
0ll Подскажите, пожалуйста такой вопрос - у Вас при написании советника по ТС Ва-Банк, вроде была как-то проблема "несвоевременной подкачки котировок другого таймфрейма или другой пары", из-за чего сова некорректно отрабатывала. У меня похоже таже проблема, подскажите как грамотно справиться с этим вопросом ?

Изменено 8 февраля, 2016 пользователем AndreyGold

#3088

Добрый день!
Знающие люди, посмотрите пожалуйста скриптик..., все работает кроме ошибки нехватки средств (если средств не хватает, должна выходить ошибка - ошибки нет, просто не открывает ордер) тем самым не очень понятно, по какой причине не открывает.
Всем заранее спасибо!

VisualOpenOrderWithMM.mq49 скач.

#3089

В этом скрипте очень кривой расчёт лота. неужели нет другого скрипта? их-же валом везде.

#3090
AndreyGold в мт4 из-за экономии ресурсов этот момент очень кривой, решения есть,но не простые и я ими не пользовался - просто интересовался. мультивалютные вещи желательно на мт5 делать. кстати в сове "Ва-банк" проблем нет - она моновалютная, проблема была в скрипте - поэтому его запускать надо 2 раза...
#3091
0ll, уже проверил - влияет, StringFind() регистрозависимая функция, так что будьте внимательны или используйте как сказал Oll приведения к одному регистру аргументов.
#3092

Удобнее этого скрипта я пока не встречал.

#3093

Держи
На самом деле он выдавал ошибку в логах. я вместо принта поставил алерт.

VisualOpenOrderWithMM.mq421 скач.

#3094
dermitay, спасибо огромное, работает отлично )
#3095
AndreyGold вспомнил - был косяк с обращением к функциям с другого ТФ типа: iClose(NULL, PERIOD_D1, 1);
где PERIOD_? отличается от текущего. Ошибка была не постоянная - то есть, то нет - геморрой... Вылечил тупым переписыванием кода под текущий ТФ.
#3096

Подскажите что не так в моем коде закрытия по времени

extern int HourStop = 22

......................................................

if(DayOfWeek() == 5 && TimeHour(TimeCurrent()) == HourStop &&
OrderSelect(OrderTicket(),SELECT_BY_POS,MODE_TRADES) &&
OrderType() == OP_BUY && OrderMagicNumber()==Magic)
{
if(OrderClose(ticket,Lots,Bid,5,Green))
Print("Ошибка закрытия ордера на покупку!");
}
//------------Удаление отложки--------------
if(DayOfWeek() == 5 && TimeHour(TimeCurrent()) == HourStop)
{
if(OrderDelete(OrderTicket(),Green))
Print("Ошибка закрытия ордера BuyStop");

#3097
Гриб, у вас ошибок так много что... лень расписывать всё. вы умудрились в слове из 4 букв сделать 10 ошибок :d >:d1. ордера перебираются в цикле
2. ордера выбираются в цикле, причем у OrderSelect есть два разных типа перебора(ну на самом деле 4 если быть более точным), вы выбрали тип SELECT_BY_POS - это метод перебора по номеру ордера в списке терминала, то есть по сути по i-тому номеру в цикле, вы же зачем-то применяете этот метод используете OrderTicket() - метод совсем другой(SELECT_BY_TICKET)
3. если у вас закроется оредр - то после этого в логах будет прописана ошибка - вы же сами так и написали:"если ордер закрылся - то написать в логах"ошибка закрытия...""

Далее про отложку, а как вы собсно узнаете какой тикет у текущего ордера? вы переключатель OrderSelect оставили в некорректном блоке работы с активными ордерами, и теперь этот же ордер хотите опять удалить как отложный?

Вобщем... Должно это выглдятеть приблизительно так:
extern int HourStop = 22

......................................................

if(DayOfWeek() == 5 && TimeHour(TimeCurrent()) == HourStop)
for (int i=OrdersTotal()-1; i>=0; i--) // главный цикл перебора всех активных ордеров
{
if (!OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) continue;
if (OrderMagicNumber()!=Magic) continue;
if (OrderType() == OP_BUY )
{
if(!OrderClose(OrderTicket(),OrderLots(),Bid,5,Green)) Print("Ошибка закрытия ордера на покупку!");
}
if (OrderType() == OP_SELL )
{
if(!OrderClose(OrderTicket(),OrderLots(),Ask,5,Green)) Print("Ошибка закрытия ордера на продажу!");
}
if (OrderType() > 1) // тип ордеров можно задавать не только по типу OP_BUY но еще и цифрами, читай документацию
if ( !OrderDelete(OrderTicket()) Print("Ошибка удаления отложенного ордера(бай/селл/стоп/лимит)!");
}



я не стал заморачиваться над выводимыми сообщениями, надеюсь мысль ясна.

прим:
1. в OrderSelect необязательно всегда прописывать MODE_TRADES, для OrderSelect() по типу SELECT_BY_POS всегда по умолчанию подставляется MODE_TRADES если не выбрано иное(MODE_HISTORY) 2. чтобы не плодить сущности обычно цену закрытия(Bid/Ask ) перед блоком закрытия объявляют в дабловую переменную по типу ордера. и далее удаление идёт одной строкой с передачей в цену закрытия этой переменной.
3. Когда ты научишься писать мартины с переменным лотом то лучше не заморачиваться на вычислением какой там сейчас по счету лот у этого закрываемого ордера, лучше взять системную OrderLots() и вобще не париться.
4. Slippage все-таки лучше брать хотя бы больше 10 а лучше еще больше, так как рынок он живой а пинг до сервера не всегда хорош - при малом значении можно нарваться на реквоты и последующее незакрытие ордера.
5. перебирать ордера ВСЕГДА нужно с конца. запомни это как заповедь и беспрекословно выполняй так и никак иначе. при переборе с нуля ты можешь нарваться на пропуск ордеров если в момент перебора один/более ордеров будут удалены(неважно, кодом или по внешним причинам)

Изменено 8 февраля, 2016 пользователем dermitay

#3098


AndreyGold вспомнил - был косяк с обращением к функциям с другого ТФ типа: iClose(NULL, PERIOD_D1, 1);
где PERIOD_? отличается от текущего. Ошибка была не постоянная - то есть, то нет - геморрой... Вылечил тупым переписыванием кода под текущий ТФ.


Вот и у меня подозрение что происходит такая же дребедень. А как грамотно переписать код на текущий ТФ, не могу придумать. Получается нужна цена начала недели, котрую надо брать не на недельном ТФ. При этом если например привязываться к концу или к началу недели(сканировать на предмет понедельника или пятницы) на текущем ТФ, то как обрабатывать конец года - там периодически целые дни торгов выпадают, да и торговля не всегда в одно и тоже время из-за этого же перерыва начинается.
#3099



AndreyGold вспомнил - был косяк с обращением к функциям с другого ТФ типа: iClose(NULL, PERIOD_D1, 1);
где PERIOD_? отличается от текущего. Ошибка была не постоянная - то есть, то нет - геморрой... Вылечил тупым переписыванием кода под текущий ТФ.


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


хм... можно отталкиваться от времени... текущий день недели(DayOfWeek или как его там), и в iOpen пихаешь нужный сдвиг и узнаешь цену открытия бара D1. а можно и ваще сразу по нулевому бару по W обратится.

в чем прелесть - данные берутся напрямую с сервера брокера а не из истории мт4 насколько я знаю.
минус- данный подход(по-крайней мере так было очень давно в дремучие времена) - могут быть глюки в тестере

кстати, у метаквотовцев ошибка в описании :d :))
https://docs.mql4.com/ru/series/iopen
Возвращаемое значение
Значение минимальной цены бара (указанного параметром shift) соответствующего графика или 0 в случае ошибки. Для получения дополнительной информации об ошибке необходимо вызвать функцию GetLastError().

Изменено 8 февраля, 2016 пользователем dermitay

#3100
dermitay
По поводу :
"хм... можно отталкиваться от времени... текущий день недели(DayOfWeek или как его там), и в iOpen пихаешь нужный сдвиг и узнаешь цену открытия бара D1. а можно и ваще сразу по нулевому бару по W обратится."

В том то и дело, что при торговле например на золоте из-за периодической отмены/переноса торгов схема с вычислением сдвига, будет сбоить.
А в данный момент сбоит обращение по нулевому бару по W (по нерабочему ТФ). Такое впечатление, что нечасто ~ где-то в 5% случаев, на момент
обращения к W такого бара просто нет.

Для публикации сообщений создайте учётную запись или авторизуйтесь

Перейти к списку тем
Форум · 2.0.20260627.0025