Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
Тралить рыночные ордера нельзя было никогда, можно тралить только стоплосс и тейкпрофит рыночного ордера.)
Ну Я же выложил ссылку на кимовский советник, у него их 2 вида, один для стоповых, второй для лимиток. Суть советника проста как пять копеек, тащить за ценой ордер, точно так-же, как таскаются стопы (трейлинг) От этого и название - трал отложек.
Так-же у него когда-то был бот, который выставлял отложки по времени и сразу их тащил за ценой, при срабатывании одной отложки, противоположная удалялась, и этот советник даже зарабатывал довольно неплохо на новостях, но недолго.
Ну а вот и сами кимовские функции, если не ошибаюсь, то писал он их в 2008г. и они работают по сей день
int TrailingStepStop = 3; // Шаг трала StopOrders
int TrailingLimitOrders = 30; // Фиксированный размер трала LimitOrders
int TrailingStepLimit = 3; // Шаг трала LimitOrders
color clModifyBuyOrder = clrNONE; // Цвет значка модификации покупки
color clModifySellOrder = clrNONE; // Цвет значка модификации продажи
//===============================================================================================
//------------------------- Сопровождение Stop ордеров простым тралом --------------------------+
//===============================================================================================
void TrailingStopOrder(string symb="0",int type=-1,int mg=-1) {
double di=0, pa=0, pb=0, p=0, sl=0, tp=0;
if(symb=="0") { symb=Symbol();}
p=MarketInfo(symb,MODE_POINT);
int msl=(int)MarketInfo(symb, MODE_STOPLEVEL);
if(TrailingStopOrders<msl) {
Alert("TrailingStopOrder(): Значение меньше допустимого=",TrailingStopOrders/Sign,", Минимум=",msl/Sign);
TrailingStopOrders=msl;} else {TrailingStopOrders=TrailingStopOrders;}
for(int i=0; i<OrdersTotal(); i++) {
if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
if((OrderSymbol()==symb||symb=="")&&(type<0||OrderType()==type)&&(mg<0||OrderMagicNumber()==mg)) {
if(OrderType()==OP_BUYSTOP) {
pa=MarketInfo(symb,MODE_ASK);
if(OrderOpenPrice()-pa>(TrailingStopOrders+TrailingStepStop-1)*p) {
di=OrderOpenPrice()-pa-(TrailingStopOrders*p);
if(OrderStopLoss()>0) sl=OrderStopLoss()-di; else sl=0;
if(OrderTakeProfit()>0) tp=OrderTakeProfit()-di; else tp=0;
ModifyOrder(symb,pa+(TrailingStopOrders*p), sl, tp, clModifyBuyOrder);
}}
if(OrderType()==OP_SELLSTOP) {
pb=MarketInfo(symb,MODE_BID);
if(pb-OrderOpenPrice()>(TrailingStopOrders+TrailingStepStop-1)*p) {
di=pb-OrderOpenPrice()-(TrailingStopOrders*p);
if(OrderStopLoss()>0) sl=OrderStopLoss()+di; else sl=0;
if(OrderTakeProfit()>0) tp=OrderTakeProfit()+di; else tp=0;
ModifyOrder(symb,pb-(TrailingStopOrders*p), sl, tp, clModifySellOrder);
}}
}}}}
//===============================================================================================
//------------------------- Сопровождение Limit ордеров простым тралом -------------------------+
//===============================================================================================
void TrailingLimitOrder(string symb="0",int type=-1,int mg=-1) {
double di=0, pa=0, pb=0, p=0, sl=0, tp=0;
if(symb=="0") { symb=Symbol();}
p=MarketInfo(symb,MODE_POINT);
int msl=(int)MarketInfo(symb, MODE_STOPLEVEL);
if(TrailingLimitOrders<msl) {
Alert("TrailingLimitOrder(): Значение меньше допустимого=",TrailingLimitOrders/Sign,", Минимум=",msl/Sign);
TrailingLimitOrders=msl; } else { TrailingLimitOrders=TrailingLimitOrders; }
for(int i=0; i<OrdersTotal(); i++) {
if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
if((OrderSymbol()==symb||symb=="")&&(type<0||OrderType()==type)&&(mg<0||OrderMagicNumber()==mg)) {
if(OrderType()==OP_BUYLIMIT) {
pa=MarketInfo(symb,MODE_ASK);
if(pa-OrderOpenPrice()>(TrailingLimitOrders+TrailingStepLimit-1)*p) {
di=pa-OrderOpenPrice()-(TrailingLimitOrders*p);
if(OrderStopLoss()>0) sl=OrderStopLoss()+di; else sl=0;
if(OrderTakeProfit()>0) tp=OrderTakeProfit()+di; else tp=0;
ModifyOrder(symb,pa-(TrailingLimitOrders*p), sl, tp, clModifyBuyOrder);
}}
if(OrderType()==OP_SELLLIMIT) {
pb=MarketInfo(symb,MODE_BID);
if(OrderOpenPrice()-pb>(TrailingLimitOrders+TrailingStepLimit-1)*p) {
di=OrderOpenPrice()-pb-(TrailingLimitOrders*p);
if(OrderStopLoss()>0) sl=OrderStopLoss()-di; else sl=0;
if(OrderTakeProfit()>0) tp=OrderTakeProfit()-di; else tp=0;
ModifyOrder(symb,pb+(TrailingLimitOrders*p), sl, tp, clModifySellOrder);
}}
}}}}
Всё это утопия работающая только в тестере!
//--------------------------------------------------------------------
extern int Stoploss = 5, //Стоплосс, если 0 то не изменяется
Takeprofit = 50; //Тейкпрофит, если 0 то не изменяется
extern int TrailingStop = 3; //Длинна тралла, если 0 то нет тралла
extern int TrailingStart = 0; //Когда включать тралл, например после достижения 40 п прибыл
extern int StepTrall = 2; //Шаг тралла - перемещать стоплосс не ближе чем StepTrall
extern int NoLoss = 0, //Перевод в безубыток при заданном кол-ве пунктов прибыли, если 0 то нет перевода в безубыток
MinProfitNoLoss = 0; //Минимальная прибыль при переводе вбезубыток
extern int Magic = 1; //Идентификатор ордера эксперта
extern int Step = 10; //Расстояние от цены
extern double Risk = 1; //Процент потери депозита при срабатывании StopLoss в отрицательной зоне
extern int TimeModify = 15; //Кол-во секунд раньше которого запрещено изменять ордер
extern int slippage = 3; //Допустимое проскальзование цены
//--------------------------------------------------------------------
int STOPLEVEL,TimeBarB,TimeBarS;
//--------------------------------------------------------------------
//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
//---
if(_Digits==3 || _Digits==5)
{
Stoploss *= 10;
Takeprofit *= 10;
TrailingStop *= 10;
TrailingStart *= 10;
StepTrall *= 10;
NoLoss *= 10;
MinProfitNoLoss *= 10;
Step *= 10;
slippage *= 10;
}
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
//---
//---
}
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void OnTick()
{//-Start-
STOPLEVEL=(int)MarketInfo(Symbol(),MODE_STOPLEVEL);
double OSL,OTP,StLo,PriceB=0,PriceS=0,OOP,SL,TP;
int b=0,s=0,TicketB=0,TicketS=0,OT;
for (int i=0; i<OrdersTotal(); i++)
{
if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
{
if (OrderSymbol()==Symbol() && Magic==OrderMagicNumber())
{
OT = OrderType();
OSL = NormalizeDouble(OrderStopLoss(),Digits);
OTP = NormalizeDouble(OrderTakeProfit(),Digits);
OOP = NormalizeDouble(OrderOpenPrice(),Digits);
SL=OSL;
TP=OTP;
if (OT==OP_BUY)
{
b++;
if (OSL<OOP && NoLoss!=0)
{
StLo = NormalizeDouble(OOP+MinProfitNoLoss*Point,Digits);
if (StLo > OSL && StLo <= NormalizeDouble(Bid - STOPLEVEL * Point,Digits)) SL = StLo;
}
if (TrailingStop>=STOPLEVEL && TrailingStop!=0 && (Bid - OOP)/Point >= TrailingStart)
{
StLo = NormalizeDouble(Bid - TrailingStop*Point,Digits);
if (StLo>=OOP && StLo > OSL+StepTrall*Point) SL = StLo;
}
if (SL > OSL)
{
if (!OrderModify(OrderTicket(),OOP,SL,TP,0,clrNONE)) Print("Error ",GetLastError()," Order Modify Buy SL ",OSL,"->",SL);
else Print("Order Buy Modify SL ",OSL,"->",SL);
}
}
if (OT==OP_SELL)
{
s++;
if ((OSL>OOP || OSL==0) && NoLoss!=0)
{
StLo = NormalizeDouble(OOP-MinProfitNoLoss*Point,Digits);
if ((StLo < OSL || OSL==0) && StLo >= NormalizeDouble(Ask + STOPLEVEL * Point,Digits)) SL = StLo;
}
if (TrailingStop>=STOPLEVEL && TrailingStop!=0 && (OOP - Ask)/Point >= TrailingStart)
{
StLo = NormalizeDouble(Ask + TrailingStop*Point,Digits);
if (StLo<=OOP && (StLo < OSL-StepTrall*Point || OSL==0)) SL = StLo;
}
if ((SL < OSL || OSL==0) && SL!=0)
{
if (!OrderModify(OrderTicket(),OOP,SL,TP,0,clrNONE)) Print("Error ",GetLastError()," Order Modify Sell SL ",OSL,"->",SL);
else Print("Order Sell Modify SL ",OSL,"->",SL);
}
}
if (OT==OP_BUYSTOP) {PriceB=OOP; TicketB=OrderTicket();}
if (OT==OP_SELLSTOP) {PriceS=OOP; TicketS=OrderTicket();}
}
}
}
if (b+TicketB==0)
{
if (Stoploss>=STOPLEVEL && Stoploss!=0) SL = NormalizeDouble(Bid-Stoploss * Point,Digits); else SL=0;
if (Takeprofit>=STOPLEVEL && Takeprofit!=0) TP = NormalizeDouble(Ask+Takeprofit * Point,Digits); else TP=0;
if (OrderSend(Symbol(),OP_BUYSTOP,LotSize(Stoploss,Risk),NormalizeDouble(Ask+Step * Point,Digits),slippage,SL+Step*Point,TP+Step*Point,"",Magic,0,clrNONE)!=-1) TimeBarB=(int)TimeCurrent();
}
if (s+TicketS==0)
{
if (Stoploss>=STOPLEVEL && Stoploss!=0) SL = NormalizeDouble(Ask+Stoploss * Point,Digits); else SL=0;
if (Takeprofit>=STOPLEVEL && Takeprofit!=0) TP = NormalizeDouble(Bid-Takeprofit * Point,Digits); else TP=0;
if (OrderSend(Symbol(),OP_SELLSTOP,LotSize(Stoploss,Risk),NormalizeDouble(Bid-Step * Point,Digits),slippage,SL-Step*Point,TP-Step*Point,"",Magic,0,clrNONE)!=-1) TimeBarS=(int)TimeCurrent();
}
if (TicketB!=0)
{
if (TimeBarB<TimeCurrent()-TimeModify && MathAbs(NormalizeDouble(Ask+Step * Point,Digits)-PriceB)/Point>StepTrall)
{
if (Stoploss>=STOPLEVEL && Stoploss!=0) SL = NormalizeDouble(Bid-Stoploss * Point,Digits); else SL=0;
if (Takeprofit>=STOPLEVEL && Takeprofit!=0) TP = NormalizeDouble(Ask+Takeprofit * Point,Digits); else TP=0;
if (OrderModify(TicketB,NormalizeDouble(Ask+Step * Point,Digits),SL+Step*Point,TP+Step*Point,0,clrNONE)) TimeBarB=(int)TimeCurrent();
}
}
if (TicketS!=0)
{
if (TimeBarS<TimeCurrent()-TimeModify && MathAbs(NormalizeDouble(Bid-Step * Point,Digits)-PriceS)/Point>StepTrall)
{
if (Stoploss>=STOPLEVEL && Stoploss!=0) SL = NormalizeDouble(Ask+Stoploss * Point,Digits); else SL=0;
if (Takeprofit>=STOPLEVEL && Takeprofit!=0) TP = NormalizeDouble(Bid-Takeprofit * Point,Digits); else TP=0;
if (OrderModify(TicketS,NormalizeDouble(Bid-Step * Point,Digits),SL-Step*Point,TP-Step*Point,0,clrNONE)) TimeBarS=(int)TimeCurrent();
}
}
}
//============== Функции =============================================
//+------------------------------------------------------------------------+
//+- Расчет лота в зависимости от расстояния до StopLoss (c) BeerGod 2015 -+
//+------------------------------------------------------------------------+
double LotSize(int SL, double MR)// SL-StopLoss MR-MaxRisk
{
if (SL == 0) return(0); // исключение деления на ноль
double Free =AccountBalance();
double LotVal =MarketInfo(Symbol(),MODE_TICKVALUE);//стоимость 1 пункта 1 лота
double Min_Lot =MarketInfo(Symbol(),MODE_MINLOT);
double Max_Lot =MarketInfo(Symbol(),MODE_MAXLOT);
double LStep =MarketInfo(Symbol(),MODE_LOTSTEP);
double Lot =MathFloor((Free*MR/100)/(SL*LotVal)/LStep)*LStep;
if(Lot<Min_Lot) Lot=Min_Lot;
if(Lot>Max_Lot) Lot=Max_Lot;
return(Lot);
}
//END
На реале проскальзование на NDD счетах сведет всё в минус, на обычных счетах не даст открыть ордер на быстрых движениях рынка.
Ну Я же выложил ссылку на кимовский советник, у него их 2 вида, один для стоповых, второй для лимиток. Суть советника проста как пять копеек, тащить за ценой ордер, точно так-же, как таскаются стопы (трейлинг) От этого и название - трал отложек.
Так-же у него когда-то был бот, который выставлял отложки по времени и сразу их тащил за ценой, при срабатывании одной отложки, противоположная удалялась, и этот советник даже зарабатывал довольно неплохо на новостях, но недолго.
Ну а вот и сами кимовские функции, если не ошибаюсь, то писал он их в 2008г. и они работают по сей день
int TrailingStepStop = 3; // Шаг трала StopOrders
int TrailingLimitOrders = 30; // Фиксированный размер трала LimitOrders
int TrailingStepLimit = 3; // Шаг трала LimitOrders
color clModifyBuyOrder = clrNONE; // Цвет значка модификации покупки
color clModifySellOrder = clrNONE; // Цвет значка модификации продажи
//===============================================================================================
//------------------------- Сопровождение Stop ордеров простым тралом --------------------------+
//===============================================================================================
void TrailingStopOrder(string symb="0",int type=-1,int mg=-1) {
double di=0, pa=0, pb=0, p=0, sl=0, tp=0;
if(symb=="0") { symb=Symbol();}
p=MarketInfo(symb,MODE_POINT);
int msl=(int)MarketInfo(symb, MODE_STOPLEVEL);
if(TrailingStopOrders<msl) {
Alert("TrailingStopOrder(): Значение меньше допустимого=",TrailingStopOrders/Sign,", Минимум=",msl/Sign);
TrailingStopOrders=msl;} else {TrailingStopOrders=TrailingStopOrders;}
for(int i=0; i<OrdersTotal(); i++) {
if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
if((OrderSymbol()==symb||symb=="")&&(type<0||OrderType()==type)&&(mg<0||OrderMagicNumber()==mg)) {
if(OrderType()==OP_BUYSTOP) {
pa=MarketInfo(symb,MODE_ASK);
if(OrderOpenPrice()-pa>(TrailingStopOrders+TrailingStepStop-1)*p) {
di=OrderOpenPrice()-pa-(TrailingStopOrders*p);
if(OrderStopLoss()>0) sl=OrderStopLoss()-di; else sl=0;
if(OrderTakeProfit()>0) tp=OrderTakeProfit()-di; else tp=0;
ModifyOrder(symb,pa+(TrailingStopOrders*p), sl, tp, clModifyBuyOrder);
}}
if(OrderType()==OP_SELLSTOP) {
pb=MarketInfo(symb,MODE_BID);
if(pb-OrderOpenPrice()>(TrailingStopOrders+TrailingStepStop-1)*p) {
di=pb-OrderOpenPrice()-(TrailingStopOrders*p);
if(OrderStopLoss()>0) sl=OrderStopLoss()+di; else sl=0;
if(OrderTakeProfit()>0) tp=OrderTakeProfit()+di; else tp=0;
ModifyOrder(symb,pb-(TrailingStopOrders*p), sl, tp, clModifySellOrder);
}}
}}}}
//===============================================================================================
//------------------------- Сопровождение Limit ордеров простым тралом -------------------------+
//===============================================================================================
void TrailingLimitOrder(string symb="0",int type=-1,int mg=-1) {
double di=0, pa=0, pb=0, p=0, sl=0, tp=0;
if(symb=="0") { symb=Symbol();}
p=MarketInfo(symb,MODE_POINT);
int msl=(int)MarketInfo(symb, MODE_STOPLEVEL);
if(TrailingLimitOrders<msl) {
Alert("TrailingLimitOrder(): Значение меньше допустимого=",TrailingLimitOrders/Sign,", Минимум=",msl/Sign);
TrailingLimitOrders=msl; } else { TrailingLimitOrders=TrailingLimitOrders; }
for(int i=0; i<OrdersTotal(); i++) {
if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
if((OrderSymbol()==symb||symb=="")&&(type<0||OrderType()==type)&&(mg<0||OrderMagicNumber()==mg)) {
if(OrderType()==OP_BUYLIMIT) {
pa=MarketInfo(symb,MODE_ASK);
if(pa-OrderOpenPrice()>(TrailingLimitOrders+TrailingStepLimit-1)*p) {
di=pa-OrderOpenPrice()-(TrailingLimitOrders*p);
if(OrderStopLoss()>0) sl=OrderStopLoss()+di; else sl=0;
if(OrderTakeProfit()>0) tp=OrderTakeProfit()+di; else tp=0;
ModifyOrder(symb,pa-(TrailingLimitOrders*p), sl, tp, clModifyBuyOrder);
}}
if(OrderType()==OP_SELLLIMIT) {
pb=MarketInfo(symb,MODE_BID);
if(OrderOpenPrice()-pb>(TrailingLimitOrders+TrailingStepLimit-1)*p) {
di=OrderOpenPrice()-pb-(TrailingLimitOrders*p);
if(OrderStopLoss()>0) sl=OrderStopLoss()-di; else sl=0;
if(OrderTakeProfit()>0) tp=OrderTakeProfit()-di; else tp=0;
ModifyOrder(symb,pb+(TrailingLimitOrders*p), sl, tp, clModifySellOrder);
}}
}}}}
То что можно тралить отложки я узнал 10 лет назад.) А вот то, что "можно тралить" рыночные ордера я узнал только сегодня из этого сообщения:
Больше обратил внимание на цель
Подскажите пожалуйста... есть ли такой скрипт.который бы передвигал отложенный ордер за ценой. типо трелинг ... что позволит наилучше войти в позицию.....
А встроенный трейлинг по сути и есть такой скрипт, может ТС о нем не знает.
Встроенный трейлинг не тралит отложки только рыночные
То что можно тралить отложки я узнал 10 лет назад.) А вот то, что можно тралить рыночные ордера я узнал только сегодня из этого сообщения:
Встроенный трейлинг не тралит отложки только рыночные
Не будет столь критичны, немного опечатался Сергей. Зная его как не новичка, можно предположить только одно: на носу праздник, и ему просто некогда было до конца изложить свою мысль)
Всех с наступающим!!!
Не будет столь критичны, немного опечатался Сергей. Зная его как не новичка, можно предположить только одно: на носу праздник, и ему просто некогда было до конца изложить свою мысль)
Всех с наступающим!!!
Всё это утопия работающая только в тестере!
На реале проскальзование на NDD счетах сведет всё в минус, на обычных счетах не даст открыть ордер на быстрых движениях рынка.
а может мне надо чтоб именно в тестере хорошо работал
Забирай код, в тестере отлично работает, по поводу праздника нашел в заброшенном архиве у себя.
P.S. Коду года два, скоро будет три ))) вникать в подробности и логику небуду и не помню уже что там и зачем.
Забирай код, в тестере отлично работает, по поводу праздника нашел в заброшенном архиве у себя.
P.S. Коду года два, скоро будет три ))) вникать в подробности и логику небуду и не помню уже что там и зачем.
ничего страшного, собираю себе коллекцию, может этот куда то и пригодицца
Однозначно пригодится, когда взбредёт идея, что отложки на пробой достаточно тралить через определенное количество времени на определенном расстоянии от цены, при резком движении в одну из сторон одна сработатает, а вторая удалится и дальше только тралить прибыль) Этот код так и работает, но из за торговых условий на реале всё сводится к нулю и минусу, но в тестере прекрасно )))
С праздником !!!
ничего страшного, собираю себе коллекцию, может этот куда то и пригодицца