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

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

#1827

Добрый день ув. 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;

#1828

могу ли я повторно использовать эту функцию, типа???

Даже вопрос не понял. Вы можете её использовать сколько угодно, можно сказать - затереть до дыр, лишь-бы ордера для закрытия были...
#1829

Подскажите, плиз ))) Дайте пенделя в нужном направлении :

На графике присутствует какое-то количество графических объектов.

Закончил формироваться новый бар. Как проще всего определить не коснулся ли он какого-нибудь графического объекта ?

(Что то не хочется перебирать цены всех объектов и сравнивать а нету ли диапазона цен последнего бара в каком нибудь из них)

Или другими словами - есть какой-то диапазон цен и времени как определить, есть ли в этих координатах какой-нибудь графический объект на графике (определить его название)?

#1830
AndreyGold Кроме как перебирать объекты другого пути нет. Если-бы у объектов было событие - тогда да, но их нет.
На самом деле в переборе нет ничего страшного - по сути Вы будете просматривать массив характеристик, это будет довольно быстро.
#1831

Что то врубиться не могу - ордера у меня открывает советник, который вроде как прописывает комментарии в ордер при его открытии.
В руководстве к MQL4, написано: "Последняя часть комментария может быть изменена торговым сервером." При этом в истории своего счета ( в торговом терминале) в комментах
только то, что прописывает сервер (причины, открытия/закрытия ордеров), а как увидеть у ордера свои комментарии, не могу понять ....

#1832
AndreyGold Это не тот случай (с сусликами), если коммента не видно - значит его нет. Либо не прописывается, либо затирается сервером. Лично я комменты в совах не использую совсем - опасно на них надеяться.
#1833


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



А если робот писать, комменты в какой-нибудь специальный текстовик тогда пихать ?
И в чем опасность можно намекнуть ?
#1834


А если робот писать, комменты в какой-нибудь специальный текстовик тогда пихать ?
И в чем опасность можно намекнуть ?

Опасность в том, что некоторые совы пишут в коммент информацию, на которой строится в дальнейшем логика программы - это не правильно - слететь может...
Первую фразу не понял...
#1835

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

#1836
AndreyGold Для ручного анализа стейтмента конечно нужны комменты, ордера удобно в ехселе отсортировать по инструменту или тому-же комменту. Надо внимательно смотреть открытие ордеров - лично мне не встречалось чтоб сервер полностью затёр коммент...
#1837

Спасибо огромное! Проверил, то что надо.
Удачи тебе!!!
Извиняюсь за занудство, а можно еще, чтобы цифры после, допустим, последних 100 свечек убирались
с графика.

#1838

Так вот и я думал потом в экселе дальнейшую обработку делать.
При открытии ордера информации об ошибках никаких нет, все ордера открываются без проблем.
Открываю вот так:

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 Нельзя напрямую комментарий в функцию открытия ордера писать

А если все правильно открываю, то вот первый пример брокера, который полностью убивает Комментарий )))
Кстати у меня два счета у разных брокеров, нет моих комментариев в истории ни у одного из них, но оба брокера из Западной Европы.

#1839
AndreyGold Однозначно кириллица не поддерживается. И размер коммента делай поменьше, может код какой-то - потом в ехеле будет удобней работать и ограничение на длину коммента есть...
/MathPow(10,Digits()) *_Point - быстрее будет...
#1840

Уважаемые программисты помогите с задачей-есть советник который выдает 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)тут точка с запитой)) Что не так-то?

#1841

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

#1842
SVBond Компилятор хочет, чтоб Вы контролировали (checked) возвращаемое функцией ОрдерСенд значение, т.е.:
int Ticket = OrderSend(....
#1843

Проблема одинаковая была в двух строках. в первой поставил - "int Ticket = OrderSend(...." - warring исчез... Но во второй строке когда это ставлю пишет- 'Ticket' - variable already defined
1 error(s), 0 warning(s) 2 1

#1844
SVBond определение переменной "int Ticket =" должно быть 1 раз, Второй раз надо писать просто "Ticket ="
#1845

Здравствуйте всем.
Очередной "затык" 8-}
Бот при прогоне в тестере открывает один ордер-и все.
Компилятор ошибок не выдает.

Bot-1.mq47 скач.

#1846
Айк, а в чём собственно проблема, как именно нужно чтобы работал. Кстати, код можно бы поаккуратней писать, а то все скобки пораскиданы на разных уровнях. Возьмите к примеру правило, один уровень от другого с отступом в три пробела, так и самому понятнее будет и проще.

Добавлено: 26-01-2015 01:35:41

В блоке открытия ордеров, идёт сравнение с OrdersTotal(), соответственно как только появляется хоть один ордер, блок перестаёт работать.

По переменной Ticket вообще не понятно, изначально ей присваивается значение 0, но потом ни где не меняется и при этом участвует в сравнениях, зачем?

Трейлинг вообще ужасно выписан.

Изменено 26 января, 2015 пользователем chistaia-rodina

#1847

здравствуйте уважаемые программисты!хотел бы в советника добавить следующую функцию, программирование только постигаю и никак не выходит. 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);
}

1.mq48 скач.

#1848

Вот код. Для закрытия всех ордеров по общему профиту.

Помогите добрые люди. Как мне закрыть все ордера не только по профиту.
А что бы закрывались все ордера при закрытии главного ордера. В том числе и отложенные.

Я представляю себе так у первого ордера индивидуальный 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

#1849

Привет всем!
Подскажите, можно ли как-нибудь узнать результат предыдущего ордера(+/-) на одной вп, не сравнивая его результат с балансом? (когда несколько вп(валютных пар) торгуется, не правильно сравнивать так будет)
Если взять ордер оупен тайм , можно ли как-нибудь узнать значение цены в тот момент?
хотя можно во время открытия ордера, его ценовое значение в переменную статическую занести, а потом сравнить с переменной, в которую будет занесено значение цены в момент закрытия ордера...
нормально мыслю?

Изменено 27 января, 2015 пользователем oleguitar

#1850
oleguitar, да обычным перебором истории, так надёжнее будет и выключения терминала будут нипочём. Только нужно ограничить количество циклов перебора в разумных пределах, а то создаст сильную вычислительную нагрузку, особенно при тестировании. Ну а дальше, после нахождения и выбора ордера, можно брать все данные по открытию и закрытию. Можно конечно через глобал и статик, но они будут слетать при перезагрузке, всё конечно зависит от используемой системы.

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

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