И так до бесконечности пока на ЛЮБОМ баре не сработает SL.
А зачем тогда ТР ставить?
Посмотри, как работает трейлинг стоп и запускай его только в начале бара с параметрами от предыдущего.
А зачем тогда ТР ставить?
Посмотри, как работает трейлинг стоп и запускай его только в начале бара с параметрами от предыдущего.
Можете подробней написать? Или скинуть ссылку на похожую тему? Чтоб я разобрался
Библиотека трейлингстопа.
https://www.mql5.com/ru/code/7108
khorosh спасибо.
Я понял что реализации данного условия нужен Трейлинг по теням N последних баров.
Подскажите как сделать так чтоб при открытии ордера, запускался сам трал???
TrailingByShadows я вставил в самый конец индикатора.
extern int NumberOfTry = 5; // Количество торговых попыток bool UseSound = True; // Использовать звуковой сигнал string NameFileSound = "expert.wav"; // Наименование звукового файла extern int Lots=1; //объём торгов extern int Target=15; //тейк профит int MagicNumber = 89354658; string MagicName = "DojiTrader"; int eDirection = 0; //условие int SigP = 0; //условие int OpenTime=1; extern int iTicket; // уникальный номер (тикет) открытой позиции extern int iTmfrm; // период, по барам которого следует тралить (1, 5, 15, 30, 60, 240, 1440, 10080, 43200) extern int iBars_n = 3; // кол-во баров, по которым следует тралить extern int iIndent = 3; // отступ от тени бара, на котором размещается стоплосс extern bool bTrlinloss = false; // следует ли тралить на участке лоссов (между курсом стоплосса и открытия) ///////////////////////////////////////////////////////////////////////////////////////////// int start() { int orders = 0; int i = 0; for(i = 0; i < OrdersTotal(); i++ ) { OrderSelect(i,SELECT_BY_POS); if( OrderMagicNumber() == MagicNumber && OrderSymbol() == Symbol()) { orders ++; //если нет не 1го открытого ордера то разрешается открытие ордера +1 break; } } ///////////////////////////////////////////////////////////////////////////////////////////// for(i = 1; i < OrdersTotal(); i++ ) //количество открытых ордеров на 1 больше { OrderSelect(i,SELECT_BY_POS); if( OrderMagicNumber() == MagicNumber && OrderSymbol() == Symbol()) { orders ++; break; } } /////////////////////////////////////////////////////////////////////////////////////////////// if(orders < 1 ) { for(i = 1; i < Bars; i++ ) { //Бычье поглащение if ((Open[i]>Close[i]) && (High[i+1]>High[i]) && Low[i+1]>Low[i]) { eDirection = 1; break; } } //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// if(i < 4 && i > 0) { if(SigP == 0) { if(High[i] < Ask) { SigP = 1; } } } else { SigP = 0; } ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //Покупка double res; if (eDirection==1 && SigP ==1 && iBarShift(NULL,0,OpenTime) != 0) { res = OrderSend(Symbol(),OP_BUY,Lots,Ask,0,Low[i]-3*Point,High[i]+20*Point ,MagicName,MagicNumber,0,Green); OpenTime = iTime(NULL,0,0); } } } void TrailingByShadows(int ticket,int tmfrm,int bars_n, int indent,bool trlinloss) { int i; // counter double new_extremum; // проверяем переданные значения if ((bars_n<1) || (indent<0) || (ticket==0) || ((tmfrm!=1) && (tmfrm!=5) && (tmfrm!=15) && (tmfrm!=30) && (tmfrm!=60) && (tmfrm!=240) && (tmfrm!=1440) && (tmfrm!=10080) && (tmfrm!=43200)) || (!OrderSelect(ticket,SELECT_BY_TICKET))) { Print("Трейлинг функцией TrailingByShadows() невозможен из-за некорректности значений переданных ей аргументов."); return(0); } // если длинная позиция (OP_BUY), находим минимум bars_n свечей if (OrderType()==OP_BUY) { for(i=1;i<=bars_n;i++) { if (i==1) new_extremum = iLow(Symbol(),tmfrm,i); else if (new_extremum>iLow(Symbol(),tmfrm,i)) new_extremum = iLow(Symbol(),tmfrm,i); } // если тралим и в зоне убытков if (trlinloss==true) { // если найденное значение "лучше" текущего стоплосса позиции, переносим if ((((new_extremum - indent*Point)>OrderStopLoss()) || (OrderStopLoss()==0)) && (new_extremum - indent*Point<Bid-MarketInfo(Symbol(),MODE_STOPLEVEL)*Point)) if (!OrderModify(ticket,OrderOpenPrice(),new_extremum - indent*Point,OrderTakeProfit(),OrderExpiration())) Print("Не удалось модифицировать ордер №",OrderTicket(),". Ошибка: ",GetLastError()); } else { // если новый стоплосс не только лучше предыдущего, но и курса открытия позиции if ((((new_extremum - indent*Point)>OrderStopLoss()) || (OrderStopLoss()==0)) && ((new_extremum - indent*Point)>OrderOpenPrice()) && (new_extremum - indent*Point<Bid-MarketInfo(Symbol(),MODE_STOPLEVEL)*Point)) if (!OrderModify(ticket,OrderOpenPrice(),new_extremum-indent*Point,OrderTakeProfit(),OrderExpiration())) Print("Не удалось модифицировать ордер №",OrderTicket(),". Ошибка: ",GetLastError()); } } // если короткая позиция (OP_SELL), находим минимум bars_n свечей if (OrderType()==OP_SELL) { for(i=1;i<=bars_n;i++) { if (i==1) new_extremum = iHigh(Symbol(),tmfrm,i); else if (new_extremum<iHigh(Symbol(),tmfrm,i)) new_extremum = iHigh(Symbol(),tmfrm,i); } // если тралим и в зоне убытков if (trlinloss==true) { // если найденное значение "лучше" текущего стоплосса позиции, переносим if ((((new_extremum + (indent + MarketInfo(Symbol(),MODE_SPREAD))*Point)<OrderStopLoss()) || (OrderStopLoss()==0)) && (new_extremum + (indent + MarketInfo(Symbol(),MODE_SPREAD))*Point>Ask+MarketInfo(Symbol(),MODE_STOPLEVEL)*Point)) if (!OrderModify(ticket,OrderOpenPrice(),new_extremum + (indent + MarketInfo(Symbol(),MODE_SPREAD))*Point,OrderTakeProfit(),OrderExpiration())) Print("Не удалось модифицировать ордер №",OrderTicket(),". Ошибка: ",GetLastError()); } else { // если новый стоплосс не только лучше предыдущего, но и курса открытия позиции if ((((new_extremum + (indent + MarketInfo(Symbol(),MODE_SPREAD))*Point)<OrderStopLoss()) || (OrderStopLoss()==0)) && ((new_extremum + (indent + MarketInfo(Symbol(),MODE_SPREAD))*Point)<OrderOpenPrice()) && (new_extremum + (indent + MarketInfo(Symbol(),MODE_SPREAD))*Point>Ask+MarketInfo(Symbol(),MODE_STOPLEVEL)*Point)) if (!OrderModify(ticket,OrderOpenPrice(),new_extremum + (indent + MarketInfo(Symbol(),MODE_SPREAD))*Point,OrderTakeProfit(),OrderExpiration())) Print("Не удалось модифицировать ордер №",OrderTicket(),". Ошибка: ",GetLastError()); } } }
Хотя это и так советник. Вставьте вызов трейлинга вот сюда:
for(i = 0; i < OrdersTotal(); i++ ) { OrderSelect(i,SELECT_BY_POS); if( OrderMagicNumber() == MagicNumber && OrderSymbol() == Symbol()) { ---Сюда--- orders ++; //если нет не 1го открытого ордера то разрешается открытие ордера +1 break; } }
Хотя это и так советник. Вставьте вызов трейлинга вот сюда:
Всё равно SL не переносится на Low нового бара (допустим при покупке).
Что делать?((((
// https://book.mql4.com/ru/trading/ordersend - OrderSend extern int NumberOfTry = 5; // Количество торговых попыток bool UseSound = True; // Использовать звуковой сигнал string NameFileSound = "expert.wav"; // Наименование звукового файла extern int Lots=1; //объём торгов extern int Target=15; //тейк профит int MagicNumber = 89354658; string MagicName = "DojiTrader"; int eDirection = 0; //условие int SigP = 0; //условие int OpenTime=1; extern int iTicket; // уникальный номер (тикет) открытой позиции extern int iTmfrm; // период, по барам которого следует тралить (1, 5, 15, 30, 60, 240, 1440, 10080, 43200) extern int iBars_n = 3; // кол-во баров, по которым следует тралить extern int iIndent = 3; // отступ от тени бара, на котором размещается стоплосс extern bool bTrlinloss = false; // следует ли тралить на участке лоссов (между курсом стоплосса и открытия) ///////////////////////////////////////////////////////////////////////////////////////////// int start() { int orders = 0; int i = 0; for(i = 0; i < OrdersTotal(); i++ ) { OrderSelect(i,SELECT_BY_POS); if( OrderMagicNumber() == MagicNumber && OrderSymbol() == Symbol()) { TrailingByShadows(OrderTicket(),iTmfrm,iBars_n,iIndent,bTrlinloss); orders ++; //если нет не 1го открытого ордера то разрешается открытие ордера +1 break; } } ///////////////////////////////////////////////////////////////////////////////////////////// for(i = 1; i < OrdersTotal(); i++ ) //количество открытых ордеров на 1 больше { OrderSelect(i,SELECT_BY_POS); if( OrderMagicNumber() == MagicNumber && OrderSymbol() == Symbol()) { orders ++; break; } } /////////////////////////////////////////////////////////////////////////////////////////////// if(orders < 1 ) { for(i = 1; i < Bars; i++ ) { //Бычье поглащение if ((Open[i]>Close[i]) && (High[i+1]>High[i]) && Low[i+1]>Low[i]) { eDirection = 1; break; } } //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// if(i < 4 && i > 0) { if(SigP == 0) { if(High[i] < Ask) { SigP = 1; } } } else { SigP = 0; } ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //Покупка double res; if (eDirection==1 && SigP ==1 && iBarShift(NULL,0,OpenTime) != 0) { res = OrderSend(Symbol(),OP_BUY,Lots,Ask,0,Low[i]-3*Point,High[i]+20*Point ,MagicName,MagicNumber,0,Green); OpenTime = iTime(NULL,0,0); } } } void TrailingByShadows(int ticket,int tmfrm,int bars_n, int indent,bool trlinloss) { int i; // counter double new_extremum; // проверяем переданные значения if ((bars_n<1) || (indent<0) || (ticket==0) || ((tmfrm!=1) && (tmfrm!=5) && (tmfrm!=15) && (tmfrm!=30) && (tmfrm!=60) && (tmfrm!=240) && (tmfrm!=1440) && (tmfrm!=10080) && (tmfrm!=43200)) || (!OrderSelect(ticket,SELECT_BY_TICKET))) { Print("Трейлинг функцией TrailingByShadows() невозможен из-за некорректности значений переданных ей аргументов."); return(0); } // если длинная позиция (OP_BUY), находим минимум bars_n свечей if (OrderType()==OP_BUY) { for(i=1;i<=bars_n;i++) { if (i==1) new_extremum = iLow(Symbol(),tmfrm,i); else if (new_extremum>iLow(Symbol(),tmfrm,i)) new_extremum = iLow(Symbol(),tmfrm,i); } // если тралим и в зоне убытков if (trlinloss==true) { // если найденное значение "лучше" текущего стоплосса позиции, переносим if ((((new_extremum - indent*Point)>OrderStopLoss()) || (OrderStopLoss()==0)) && (new_extremum - indent*Point<Bid-MarketInfo(Symbol(),MODE_STOPLEVEL)*Point)) if (!OrderModify(ticket,OrderOpenPrice(),new_extremum - indent*Point,OrderTakeProfit(),OrderExpiration())) Print("Не удалось модифицировать ордер №",OrderTicket(),". Ошибка: ",GetLastError()); } else { // если новый стоплосс не только лучше предыдущего, но и курса открытия позиции if ((((new_extremum - indent*Point)>OrderStopLoss()) || (OrderStopLoss()==0)) && ((new_extremum - indent*Point)>OrderOpenPrice()) && (new_extremum - indent*Point<Bid-MarketInfo(Symbol(),MODE_STOPLEVEL)*Point)) if (!OrderModify(ticket,OrderOpenPrice(),new_extremum-indent*Point,OrderTakeProfit(),OrderExpiration())) Print("Не удалось модифицировать ордер №",OrderTicket(),". Ошибка: ",GetLastError()); } } // если короткая позиция (OP_SELL), находим минимум bars_n свечей if (OrderType()==OP_SELL) { for(i=1;i<=bars_n;i++) { if (i==1) new_extremum = iHigh(Symbol(),tmfrm,i); else if (new_extremum<iHigh(Symbol(),tmfrm,i)) new_extremum = iHigh(Symbol(),tmfrm,i); } // если тралим и в зоне убытков if (trlinloss==true) { // если найденное значение "лучше" текущего стоплосса позиции, переносим if ((((new_extremum + (indent + MarketInfo(Symbol(),MODE_SPREAD))*Point)<OrderStopLoss()) || (OrderStopLoss()==0)) && (new_extremum + (indent + MarketInfo(Symbol(),MODE_SPREAD))*Point>Ask+MarketInfo(Symbol(),MODE_STOPLEVEL)*Point)) if (!OrderModify(ticket,OrderOpenPrice(),new_extremum + (indent + MarketInfo(Symbol(),MODE_SPREAD))*Point,OrderTakeProfit(),OrderExpiration())) Print("Не удалось модифицировать ордер №",OrderTicket(),". Ошибка: ",GetLastError()); } else { // если новый стоплосс не только лучше предыдущего, но и курса открытия позиции if ((((new_extremum + (indent + MarketInfo(Symbol(),MODE_SPREAD))*Point)<OrderStopLoss()) || (OrderStopLoss()==0)) && ((new_extremum + (indent + MarketInfo(Symbol(),MODE_SPREAD))*Point)<OrderOpenPrice()) && (new_extremum + (indent + MarketInfo(Symbol(),MODE_SPREAD))*Point>Ask+MarketInfo(Symbol(),MODE_STOPLEVEL)*Point)) if (!OrderModify(ticket,OrderOpenPrice(),new_extremum + (indent + MarketInfo(Symbol(),MODE_SPREAD))*Point,OrderTakeProfit(),OrderExpiration())) Print("Не удалось модифицировать ордер №",OrderTicket(),". Ошибка: ",GetLastError()); } } }
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Здравствуйте.
Помогите модернизировать ордер.
1. Возможно ли такое реализовать?2. Встречали ли Вы в каком то советнике такой способ модернизации ордера? если да то можете дать на него ссылку или скинуть его, возможно Вы встречали на форуме похожую тему?
Образовался БАР 1.
Открылся БАР 2, как только цена стала больше high БАРА 1 открывается ордер на покупку, стом лос (SL) устанавливается на Low БАРА 1, тэйк профит (ТР) допустим на +1000 пунктов от High бара 1.
Открылся БАР 3. SL перемещается с Low БАРА 1 на Low БАРА 2. ТР перемещатся на +1000 пунктов от бара 2.
И так до бесконечности пока на ЛЮБОМ баре не сработает SL.