Сожалею, что в таком неприглядном виде - пришлось по памяти писать т.к код не работал и я его удалил. Но Вам, как профессионалу, должно быть понятно(я надеюсь).
Вы мне льстите :)) Я такой же начинающий, как и вы...
extremumprice.mq4
// Предназначен для использования в качестве примера в учебнике MQL4.//--------------------------------------------------------------------externint Quant_Bars =30; // Количество баровbool OpnBuy =false,
OpnSell =false;
//--------------------------------------------------------------------int start() // Спец. функция start
{
int i; // Номер бара double Minimum=Bid, // Минимальная цена
Maximum=Bid; // Максимальная ценаfor(i=0;i<=Quant_Bars-1;i++) // От нуля (!) до..
{ // ..Quant_Bars-1 (!)if (Low[i]< Minimum) // Если < известного
Minimum=Low[i]; // то оно и будет минif (High[i]> Maximum) // Если > известного
Maximum=High[i]; // то оно и будет макс
}
//--------------------------------------------------------------------if (iOpen(NULL,0,1)>Maximum)
{
OpnBuy =true:
OpnSell=false;
}
if (iOpen(NULL,0,1)<Minimum)
{
OpnSell=true;
OpnBuy =false:
}
//-------------------------------------------------------------------// А тут код открытия позиций. if (OpnBuy) {открываем Бай};// if (OpnSell) {открываем Селл};// Но обязательно нужно сделать проверку на существование уже открытой позиции,// иначе они будут открываться на каждом тике пока присутствует сигнал...return; // Выход из start()
}
//--------------------------------------------------------------------
Где-то так. Не проверял, так, от балды, на коленке написал...
1. устанавливаете отложенный ордер с магиком, допустим 101 и сбрасываем флаг преобразования ордера в позицию, ну допустим ConvOrd=false;
2. проверяем появилась ли позиция с магиком 101, если да, устанавливаем флаг преобразования ConvOrd=true;
3. проверяем ConvOrd на истинность и если ConvOrd==true, проверяем существование позиции с магиком 101 и если её нет - значит она уже закрыта
{сбрасываем флаг ConvOrd=false; устанавливаем новый отложенный;}
Думаю, можно и без флагов обойтись...
Логика мне понятна, а вот как реализовать её в коде не знаю. Я перепробовал много вариантов но результата так и не добился. Думаю, что "чайник". Поэтому я и написал сюда. На стр.663 я показал свой код. Если есть желание - доделайте его или хотя бы конкретнее расскажите как мне его доделать. Спасибо.
artmedia70, Roger спасибо за помощь. Кажется разобрался, действительно цена на 0-ом баре не может быть ниже и выше минимума и максимума, это я не подумал, и добавил Ask, как значение переменной Min, теперь вроде работает. artmedia70, по сравнению со мной, большинство профессионалы))). Ещё раз спасибо.
dimon74: Логика мне понятна, а вот как реализовать её в коде не знаю. Я перепробовал много вариантов но результата так и не добился. Думаю, что "чайник". Поэтому я и написал сюда. На стр.663 я показал свой код. Если есть желание - доделайте его или хотя бы конкретнее расскажите как мне его доделать. Спасибо.
Попробуйте проще, когда выставляете СеллСтоп ордер, запомните значение Тейкпрофита и, если Бид опустится ниже этой цены, выставляйте на Бай.
Чёт-то не пойму никак, почему выставляются сразу две локирующие позиции. Логика такова:
При достижении эквити определённого кол-ва процентов прибыли от её прошлого значения, закрываем все позиции... Это работает как надо... Далее...
При снижении эквити на определённое кол-во процентов от её прошлого значения ищем позицию с самым большим убытком, определяем кто она... ну там Бай или Селл
и открываем локирующую позицию в противоположном направлении удвоенным лотом. Далее смотрим их суммарный профит (лосевой и локирующей) и, как только он становится больше,
ну допустим 10 пунктов, закрываем их нафиг...
По логике вещей на следующем тике должна сначала провериться эквити и, если там стало всё ОК, то далее продолжаем работать-с... Ежели опять всё бяка, значит ищем следующего сохатого...
Но вот чё-то он открывает у меня сразу два локирующих ... и Бай и Селл, причём, если лот был 0.1, то первый локирующий открывается удвоенным лотом = 0.2,
а второй опять его удваивает и уже открывается лотом 0.4 ... Соответственно, какой тут нафиг лок, если они друг с дружкой теперь воюют за место под Солнцем ... :(
Код прилагаю, мож кто ткнёт меня мо... пальцем.
//----------------- Закрытие позиций если эквити выросло на N процентов ---------------------------if (Equ_NEW>=Equ_OLD+EquPerc) // Новое эквити больше старого на процент прибыли..
{
// ClosePosBySizeLossInCurrency(NULL, -1, -1, 0); // Закрытие всех убыточных позиций
ClosePosFirstProfit(NULL, -1, -1); // Закрываем все позиции, сначала прибыльные
DeleteOrders(NULL, -1, -1); // Удаляем ордера
Equ_NEW=AccountEquity(); // Запоминаем новое значение эквити
Equ_OLD=Equ_NEW; // и вписываем его в "старое"
CountClsEQU++; // Увеличиваем счётчик кол-ва закрытий для ф-ции вывода информации
LockBuy51 =true; // Разрешаем открытие локирующих
LockSell51=true; // позиций Buy и Sell
OpnBuy51 =true; // и вообще разрешаем открываться
OpnSell51 =true; // в любую сторону...
}
//------------- Включение вывода убыточных позиций в ноль, если эквити упало на N процентов -----------------------if (Equ_NEW<=Equ_OLD-EquPerc/2) // Новое эквити меньше старого на столько-то процентов...
{
Trade=false; // Запрещаем торговлю//-------------- Закрытие двух позиций, если ранее был установлен лок на убыточную ------------- if (OrderSelect(TicketLoss, SELECT_BY_POS, MODE_TRADES)) // Выбираем убыточную позицию (если её тикет
{ // ранее был сохранён в TicketLoss)double prloss=OrderProfit()+OrderSwap(); // Размер профита убыточной позицииint typeloss =OrderType(); // Тип убыточной позицииint mnloss =OrderMagicNumber(); // Magic убыточной позиции
}
if (OrderSelect(TicketLock, SELECT_BY_POS, MODE_TRADES)) // Выбираем локирующую позицию (если её тикет
{ // ранее был сохранён в TicketLock)double prlock=OrderProfit()+OrderSwap(); // Размер профита локирующей позицииint typelock =OrderType(); // Тип локирующей позиции
}
if (prloss+prlock>=10*Point) // Если их суммарный профит больше 10 пунктов
{
ClosePositions(NULL, typelock, 5100); // Закрываем локирующую позицию
ClosePositions(NULL, typeloss, mnloss); // Закрываем убыточную позицию
}
//--------------- Поиск убыточной позиции и установка локирующей ------------------------- double Loss=0; // Последнее значение убыткаint i, k=OrdersTotal(), OrdTicket=-1;
for (i=k-1; i>=0; i--) { // Цикл по всем ордерам терминалаif (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
if ((OrderProfit()+OrderSwap()<0)) { // Если профит позиции меньше 0if (Loss>OrderProfit()+OrderSwap()) { // Если последнее значение убытка больше убытка позиции
Loss=OrderProfit()+OrderSwap(); // Значит тут убыток больше, запоминаем как последнее
OrdTicket=i; // Запоминаем номер убыточной позиции
}
}
}
}
if (OrdTicket>=0) {
if (OrderSelect(OrdTicket, SELECT_BY_POS, MODE_TRADES)) { // Выбираем позицию по тикету
TicketLoss=OrdTicket; // Запоминаем как тикет убыточной позыif (OrderType()==OP_BUY) // Если её тип Бай
{
Magic=5100; // Задаём магик...
New_Comm="Sell_M5_Стратегия_1_Локирующая позиция"; // Задаём комментарий для позиции
Lots_New=NormalizeLot(OrderLots()*2, False, NULL); // Увеличим лот в два разаif (!ExistPositions(NULL, OP_SELL, 5100, 0)){ // Если нет локирующего Sell
OpenPosition(NULL,OP_SELL,Lots_New,0,pb-tp*100*po,Magic,New_Comm);} // Открываем локирующий...if (ExistPositions(NULL, OP_SELL, 5100, 0)) // Проверяем, заодно и выбираем её
{TicketLock=OrderTicket();} // Сохраняем тикет локирующего Sell
}
if (OrderType()==OP_SELL)
{
Magic=5100; // Задаём магик...
New_Comm="Buy_M5_Стратегия_1_Локирующая позиция"; // Задаём комментарий для позиции
Lots_New=NormalizeLot(OrderLots()*2, False, NULL); // Увеличим лот в два разаif (!ExistPositions(NULL, OP_BUY, 5100, 0)){ // Если нет локирующего Buy
OpenPosition(NULL,OP_BUY,Lots_New,0,pa+tp*100*po,Magic,New_Comm);} // Открываем локирующий...if (ExistPositions(NULL, OP_BUY, 5100, 0)) // Проверяем, заодно и выбираем её
{TicketLock=OrderTicket();} // Сохраняем тикет локирующего Buy
}
}
}
}
Начиная с
//------------- Включение вывода убыточных позиций в ноль, если эквити упало на N процентов -----------------------
Считайте хаи и лоу не с нулевого бара, а с первого, на нулевом баре не может быть Бид меньше Мин.
double
Min=Bid, объявление переменных
Max=Bid,
____________________________________________________________________________________________
for (i=0;i<=20-1;i++) критерии открытия
{if (Low[i]<Min) Min=Low[i]:
if (High[i]>Max) Max=High[i];
}
if (................. &&Ask>Max)
{
Opn_B=true; // открытие Buy
}
if (................ &&Bid<Min)
{
Opn_S=true; // открытие Sell
}
___________________________________________________________________________________________
Сожалею, что в таком неприглядном виде - пришлось по памяти писать т.к код не работал и я его удалил. Но Вам, как профессионалу, должно быть понятно(я надеюсь).
____________________________________________________________________________________________
Вы мне льстите :)) Я такой же начинающий, как и вы...
Где-то так. Не проверял, так, от балды, на коленке написал...Ну так вот логика:
1. устанавливаете отложенный ордер с магиком, допустим 101 и сбрасываем флаг преобразования ордера в позицию, ну допустим ConvOrd=false;
2. проверяем появилась ли позиция с магиком 101, если да, устанавливаем флаг преобразования ConvOrd=true;
3. проверяем ConvOrd на истинность и если ConvOrd==true,
проверяем существование позиции с магиком 101 и если её нет -
значит она уже закрыта
{сбрасываем флаг ConvOrd=false; устанавливаем новый отложенный;}
Думаю, можно и без флагов обойтись...
Логика мне понятна, а вот как реализовать её в коде не знаю. Я перепробовал много вариантов но результата так и не добился. Думаю, что "чайник". Поэтому я и написал сюда. На стр.663 я показал свой код. Если есть желание - доделайте его или хотя бы конкретнее расскажите как мне его доделать. Спасибо.
Попробуйте проще, когда выставляете СеллСтоп ордер, запомните значение Тейкпрофита и, если Бид опустится ниже этой цены, выставляйте на Бай.
Попробуйте проще, когда выставляете СеллСтоп ордер, запомните значение Тейкпрофита и, если Бид опустится ниже этой цены, выставляйте на Бай.
Спасибо за совет! Я этот вариант уже пробовал но для реализации моей стратегии он не подходит.
Чёт-то не пойму никак, почему выставляются сразу две локирующие позиции. Логика такова:
При достижении эквити определённого кол-ва процентов прибыли от её прошлого значения, закрываем все позиции... Это работает как надо... Далее...
При снижении эквити на определённое кол-во процентов от её прошлого значения ищем позицию с самым большим убытком, определяем кто она... ну там Бай или Селл
и открываем локирующую позицию в противоположном направлении удвоенным лотом. Далее смотрим их суммарный профит (лосевой и локирующей) и, как только он становится больше,
ну допустим 10 пунктов, закрываем их нафиг...
По логике вещей на следующем тике должна сначала провериться эквити и, если там стало всё ОК, то далее продолжаем работать-с... Ежели опять всё бяка, значит ищем следующего сохатого...
Но вот чё-то он открывает у меня сразу два локирующих ... и Бай и Селл, причём, если лот был 0.1, то первый локирующий открывается удвоенным лотом = 0.2,
а второй опять его удваивает и уже открывается лотом 0.4 ... Соответственно, какой тут нафиг лок, если они друг с дружкой теперь воюют за место под Солнцем ... :(
Код прилагаю, мож кто ткнёт меня мо... пальцем.
Начиная с
//------------- Включение вывода убыточных позиций в ноль, если эквити упало на N процентов -----------------------где-то косяк живёт...
СТРАНИЦА НОМЕР "666" :-)