Пробуй.
Обучение языку MQL4 под MetaTrader 4📌
От xbms, 13 апреля, 2013 в Уголок Программиста
Добрый день ув. Oll. возник вопрос...допустим я хочу сделать закрытие сделки по показаниям стороннего индикатора. У меня есть функция Closebuy
void CloseBuy()
{
for (int trade = OrdersTotal() - 1; trade >= 0; trade--)
{
OrderSelect(trade, SELECT_BY_POS, MODE_TRADES);
if (OrderSymbol() == Symbol())
{
if (OrderMagicNumber() == Magic && OrderType() == OP_BUY)
{
OrderClose(OrderTicket(), OrderLots(), Bid, Slippage, Green);
}
}
}
}
могу ли я повторно использовать эту функцию, типа???
If(a > 0 && b CloseBuy;
Даже вопрос не понял. Вы можете её использовать сколько угодно, можно сказать - затереть до дыр, лишь-бы ордера для закрытия были...могу ли я повторно использовать эту функцию, типа???
Подскажите, плиз ))) Дайте пенделя в нужном направлении :
На графике присутствует какое-то количество графических объектов.
Закончил формироваться новый бар. Как проще всего определить не коснулся ли он какого-нибудь графического объекта ?
(Что то не хочется перебирать цены всех объектов и сравнивать а нету ли диапазона цен последнего бара в каком нибудь из них)
Или другими словами - есть какой-то диапазон цен и времени как определить, есть ли в этих координатах какой-нибудь графический объект на графике (определить его название)?
AndreyGold Кроме как перебирать объекты другого пути нет. Если-бы у объектов было событие - тогда да, но их нет.
На самом деле в переборе нет ничего страшного - по сути Вы будете просматривать массив характеристик, это будет довольно быстро.
На самом деле в переборе нет ничего страшного - по сути Вы будете просматривать массив характеристик, это будет довольно быстро.
Что то врубиться не могу - ордера у меня открывает советник, который вроде как прописывает комментарии в ордер при его открытии.
В руководстве к MQL4, написано: "Последняя часть комментария может быть изменена торговым сервером." При этом в истории своего счета ( в торговом терминале) в комментах
только то, что прописывает сервер (причины, открытия/закрытия ордеров), а как увидеть у ордера свои комментарии, не могу понять ....
AndreyGold Это не тот случай (с сусликами), если коммента не видно - значит его нет. Либо не прописывается, либо затирается сервером. Лично я комменты в совах не использую совсем - опасно на них надеяться.
AndreyGold Это не тот случай (с сусликами), если коммента не видно - значит его нет. Либо не прописывается, либо затирается сервером. Лично я комменты в совах не использую совсем - опасно на них надеяться.
А если робот писать, комменты в какой-нибудь специальный текстовик тогда пихать ?
И в чем опасность можно намекнуть ?
Опасность в том, что некоторые совы пишут в коммент информацию, на которой строится в дальнейшем логика программы - это не правильно - слететь может...
А если робот писать, комменты в какой-нибудь специальный текстовик тогда пихать ?
И в чем опасность можно намекнуть ?
Первую фразу не понял...
Про первую фразу - на одном торговом счету, ордера могут открываться по разному, вручную, скриптами, торговыми роботами. Я думал, что прописав в комментах инфо, как открыт ордер, смогу
в дальнейшем быстро фильтровать/сортировать историю из терминала по этому признаку. Вот и думаю как лучше теперь сделать. Один из вариантов, чтобы те ордера, которые открываются "безконтрольно" то есть на автомате, выписывались бы в специальный текстовый файл.
AndreyGold Для ручного анализа стейтмента конечно нужны комменты, ордера удобно в ехселе отсортировать по инструменту или тому-же комменту. Надо внимательно смотреть открытие ордеров - лично мне не встречалось чтоб сервер полностью затёр коммент...
Спасибо огромное! Проверил, то что надо.
Удачи тебе!!!
Извиняюсь за занудство, а можно еще, чтобы цифры после, допустим, последних 100 свечек убирались
с графика.
Так вот и я думал потом в экселе дальнейшую обработку делать.
При открытии ордера информации об ошибках никаких нет, все ордера открываются без проблем.
Открываю вот так:
if(OrderSend(Symbol(),OP_SELLLIMIT,razmer,pOpen,2,(pStop+MarketInfo(Symbol(),MODE_SPREAD)/MathPow(10,Digits())),(pProfit+MarketInfo(Symbol(),MODE_SPREAD)/MathPow(10,Digits())),"Скальпинг.Ордер установлен из скрипта",0,0,clrRed)==-1)
Сомнений два (откроется рынок, проверю)
1 Не берется кириллица
2 Нельзя напрямую комментарий в функцию открытия ордера писать
А если все правильно открываю, то вот первый пример брокера, который полностью убивает Комментарий )))
Кстати у меня два счета у разных брокеров, нет моих комментариев в истории ни у одного из них, но оба брокера из Западной Европы.
AndreyGold Однозначно кириллица не поддерживается. И размер коммента делай поменьше, может код какой-то - потом в ехеле будет удобней работать и ограничение на длину коммента есть...
/MathPow(10,Digits()) *_Point - быстрее будет...
/MathPow(10,Digits()) *_Point - быстрее будет...
Уважаемые программисты помогите с задачей-есть советник который выдает warning (return value of 'OrderSend' should be checked 80 14) и вот эта строка-((OrderSend(Symbol(), OP_BUY, lots, NormalizeDouble(Ask,Digits), 3, Low[1]-offset*Point, Ask+TP*Point, "BUY_sidus", magic, 0, CLR_NONE)тут точка с запитой)) Что не так-то?
Эта ошибка связана с невозможностью установить стоплосс и тейкпрофит одновременно с открытием ордера, то есть необходимо сначала открыть ордер потом его модифицировать и расставить стоплосс и тейкпрофит.
SVBond Компилятор хочет, чтоб Вы контролировали (checked) возвращаемое функцией ОрдерСенд значение, т.е.:
int Ticket = OrderSend(....
int Ticket = OrderSend(....
Проблема одинаковая была в двух строках. в первой поставил - "int Ticket = OrderSend(...." - warring исчез... Но во второй строке когда это ставлю пишет- 'Ticket' - variable already defined
1 error(s), 0 warning(s) 2 1
SVBond определение переменной "int Ticket =" должно быть 1 раз, Второй раз надо писать просто "Ticket ="
Айк, а в чём собственно проблема, как именно нужно чтобы работал. Кстати, код можно бы поаккуратней писать, а то все скобки пораскиданы на разных уровнях. Возьмите к примеру правило, один уровень от другого с отступом в три пробела, так и самому понятнее будет и проще.
Добавлено: 26-01-2015 01:35:41
В блоке открытия ордеров, идёт сравнение с OrdersTotal(), соответственно как только появляется хоть один ордер, блок перестаёт работать.
По переменной Ticket вообще не понятно, изначально ей присваивается значение 0, но потом ни где не меняется и при этом участвует в сравнениях, зачем?
Трейлинг вообще ужасно выписан.
Добавлено: 26-01-2015 01:35:41
В блоке открытия ордеров, идёт сравнение с OrdersTotal(), соответственно как только появляется хоть один ордер, блок перестаёт работать.
По переменной Ticket вообще не понятно, изначально ей присваивается значение 0, но потом ни где не меняется и при этом участвует в сравнениях, зачем?
Трейлинг вообще ужасно выписан.
Изменено 26 января, 2015 пользователем chistaia-rodina
здравствуйте уважаемые программисты!хотел бы в советника добавить следующую функцию, программирование только постигаю и никак не выходит. Cоветника приложил. Яне прошу переделывать достаточно указать мне правильность прописания функции
Функция для расчета рабочего лота по следующим условиям.
lotmin - стартовый размер лота.
lotmax - верхнее ограничение на размер лота.
Если последняя сделка закрылась в +, то увеличиваем лот на величину lotstep.
Как только последняя сделка закрылась в -, возвращаемся к lotmin.
Т.е. при наступлении серии положительных сделок мы увеличиваем нагрузку на лот.
Будем использовать функцию GetLastOrderHist, описанную ниже.
Код:
// --- Параметры управления капиталом ---
extern bool uplot = true; - вкл/выкл изменение величины лота
extern int lastprofit = 1; - принимает значения -1/1.
-1 - увеличение лота после минусовой сделки до первой плюсовой.
1 - увеличение лота после плюсовой сделки до первой минусовой.
extern double lotmin = 0.1; - начальное значение
extern double lotmax = 0.5; - потолок
extern double lotstep = 0.1; - приращение лота
double GetLots() {
double lot = lotmin;
if (!uplot) return (lot);
int ticket = GetLastOrderHist();
if (ticket == -1) return (lot);
if (!OrderSelect(ticket, SELECT_BY_TICKET, MODE_HISTORY)) return (lot);
if (OrderProfit()*lastprofit
lot = MathMin(OrderLots() + lotstep, lotmax);
return (lot);
}
Получить тикет последнего закрытого ордера из истории.
Если тип ордера не указан, берется самый последний ордер любого типа.
Если ордеров, отвечающих указанным критерию не найдено, возвращает -1.
Код:
int GetLastOrderHist(int type = -1)
{
int ticket = -1;
datetime dt = 0;
int cnt = HistoryTotal();
for (int i=0; i if (!OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) continue;
//Опционально
if (OrderSymbol() != Symbol()) continue;
//Опционально
if (OrderMagicNumber() != Magic) continue;
if (type != -1 && OrderType() != type) continue;
if (OrderCloseTime() > dt) {
dt = OrderCloseTime();
ticket = OrderTicket();
}
}
return (ticket);
}
Вот код. Для закрытия всех ордеров по общему профиту.
Помогите добрые люди. Как мне закрыть все ордера не только по профиту.
А что бы закрывались все ордера при закрытии главного ордера. В том числе и отложенные.
Я представляю себе так у первого ордера индивидуальный MagicNumber=1, и при его закрытии закрываются все ордера с другим MagicNumber=2 В том числе и отложенные.
Спасибо.
//вставляем это в главную функцию
if((SummPos(1)+SummPos(0))>0) {CloseAllPos(1);CloseAllPos(0);}
//и добавляем все функции ниже (вне функции)
//суммирует результат позиций по типу
int SummPos(int type)
{//подробное описание: http://fxnow.ru/blog.php?user=Yuriy&blogentry_id=100
int i;double summ;
for( i=1; i {
if(OrderSelect(i-1,SELECT_BY_POS)==true)
{
if(OrderType()==OP_BUY && OrderSymbol()==Symbol() && type==1&& OrderMagicNumber()==MG){summ=summ+OrderProfit();}
if(OrderType()==OP_SELL && OrderSymbol()==Symbol() && type==0&& OrderMagicNumber()==MG){summ=summ+OrderProfit();}
}
}
return(summ);
}
//Закрываем все позиции по типу
int CloseAllPos(int type)
{//Описание функции: http://fxnow.ru/blog.php?user=Yuriy&blogentry_id=72
int buy=1; int sell=1;
int i,b=0;int ordertiket;
if(type==1)
{
while(buy==1)
{
buy=0;
for( i=0;i {
if(true==OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
{
if(OrderType()==OP_BUY && OrderSymbol()==Symbol() ){buy=1; OrderClose(OrderTicket(),OrderLots(),Bid,3,Violet);}
}else{buy=0;}
}
if(buy==0){return(0);}
}
}
if(type==0)
{
while(sell==1)
{
sell=0;
for( i=0;i {
if(true==OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
{
if(OrderType()==OP_SELL && OrderSymbol()==Symbol() ){sell=1;OrderClose(OrderTicket(),OrderLots(),Ask,3,Violet); }
}else{sell=0;}
}
if(sell==0){return(0);}
}
}
return(0);
}Изменено 27 января, 2015 пользователем Рerovskikh
Привет всем!
Подскажите, можно ли как-нибудь узнать результат предыдущего ордера(+/-) на одной вп, не сравнивая его результат с балансом? (когда несколько вп(валютных пар) торгуется, не правильно сравнивать так будет)
Если взять ордер оупен тайм , можно ли как-нибудь узнать значение цены в тот момент?
хотя можно во время открытия ордера, его ценовое значение в переменную статическую занести, а потом сравнить с переменной, в которую будет занесено значение цены в момент закрытия ордера...
нормально мыслю?
Изменено 27 января, 2015 пользователем oleguitar
oleguitar, да обычным перебором истории, так надёжнее будет и выключения терминала будут нипочём. Только нужно ограничить количество циклов перебора в разумных пределах, а то создаст сильную вычислительную нагрузку, особенно при тестировании. Ну а дальше, после нахождения и выбора ордера, можно брать все данные по открытию и закрытию. Можно конечно через глобал и статик, но они будут слетать при перезагрузке, всё конечно зависит от используемой системы.
Для публикации сообщений создайте учётную запись или авторизуйтесь
Перейти к списку тем