Точно, лонговым должен быть! :)
Обучение языку MQL4 под MetaTrader 4📌
От xbms, 13 апреля, 2013 в Уголок Программиста
Подскажите как мне сложить ордера 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);
}
Подскажите как мне сложить ордера 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))
Тут не понял ? :-/ когда там NULL бывает?
клоуз нулевого бара(текущего) конечно же будет равна NULL
Гриб на скобки обрати внимание:
if (OrderSymbol() == Symbol() && OrderMagicNumber == Magic && (OrderType() == OP_BUY || OrderType == OP_BUYSTOP))
Все спасибо скобку не заметил
Добавлено: 05-02-2016 18:55:09
Подскажите как задать date expiration time ордера - пятница 22.00?
Изменено 5 февраля, 2016 пользователем Гриб
Всем привет! Кто знает, почему не корректно работают циклы в тестере? И for и while, для нахождения минимальной или максимальной цены за n баров? Подобный советник писали во втором уроке, на реальном графике работает вроде как надо, в тестере - тупит, показывает минимум или максимум но точно не за указанные 10 (например) баров, а гораздо больше, значения экстремумов почти не меняются. Запарился уже :(( Может есть другой способ посчитать (я пока в программировании не особо шарю)?
//+------------------------------------------------------------------+
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
для мах/мин всегда использую встроенные МКЛ функции типа: iHighest ( NULL, 0, MODE_HIGH, BarCount, 0 ) ;
Парни, а функция StringFind() регистр искомой подстроки учитывает? Что-то в справке об этом ничего нету.
Всем привет. Учусь писать советники. Нужна помощь в довольно простой ситуации: закрытие последнего ордера при откате цены к уровню открытия предыдущего. Буду благодарен за помощь.
Dremuchi попробуйте ставить СЛ следующего ордера на цену открытия предыдущего - чтоб не париться с решением.
Изменено 8 февраля, 2016 пользователем AndreyGold
Добрый день!
Знающие люди, посмотрите пожалуйста скриптик..., все работает кроме ошибки нехватки средств (если средств не хватает, должна выходить ошибка - ошибки нет, просто не открывает ордер) тем самым не очень понятно, по какой причине не открывает.
Всем заранее спасибо!
В этом скрипте очень кривой расчёт лота. неужели нет другого скрипта? их-же валом везде.
Удобнее этого скрипта я пока не встречал.
Держи
На самом деле он выдавал ошибку в логах. я вместо принта поставил алерт.
где PERIOD_? отличается от текущего. Ошибка была не постоянная - то есть, то нет - геморрой... Вылечил тупым переписыванием кода под текущий ТФ.
Подскажите что не так в моем коде закрытия по времени
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");
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
AndreyGold вспомнил - был косяк с обращением к функциям с другого ТФ типа: iClose(NULL, PERIOD_D1, 1);
где PERIOD_? отличается от текущего. Ошибка была не постоянная - то есть, то нет - геморрой... Вылечил тупым переписыванием кода под текущий ТФ.
Вот и у меня подозрение что происходит такая же дребедень. А как грамотно переписать код на текущий ТФ, не могу придумать. Получается нужна цена начала недели, котрую надо брать не на недельном ТФ. При этом если например привязываться к концу или к началу недели(сканировать на предмет понедельника или пятницы) на текущем ТФ, то как обрабатывать конец года - там периодически целые дни торгов выпадают, да и торговля не всегда в одно и тоже время из-за этого же перерыва начинается.
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
По поводу :
"хм... можно отталкиваться от времени... текущий день недели(DayOfWeek или как его там), и в iOpen пихаешь нужный сдвиг и узнаешь цену открытия бара D1. а можно и ваще сразу по нулевому бару по W обратится."
В том то и дело, что при торговле например на золоте из-за периодической отмены/переноса торгов схема с вычислением сдвига, будет сбоить.
А в данный момент сбоит обращение по нулевому бару по W (по нерабочему ТФ). Такое впечатление, что нечасто ~ где-то в 5% случаев, на момент
обращения к W такого бара просто нет.
Для публикации сообщений создайте учётную запись или авторизуйтесь
Перейти к списку тем