khorosh: Тралить рыночные ордера нельзя было никогда, можно тралить только стоплосс и тейкпрофит рыночного ордера.)
Ну Я же выложил ссылку на кимовский советник, у него их 2 вида, один для стоповых, второй для лимиток. Суть советника проста как пять копеек, тащить за ценой ордер, точно так-же, как таскаются стопы (трейлинг) От этого и название - трал отложек.
Так-же у него когда-то был бот, который выставлял отложки по времени и сразу их тащил за ценой, при срабатывании одной отложки, противоположная удалялась, и этот советник даже зарабатывал довольно неплохо на новостях, но недолго.
Ну а вот и сами кимовские функции, если не ошибаюсь, то писал он их в 2008г. и они работают по сей день
Ну Я же выложил ссылку на кимовский советник, у него их 2 вида, один для стоповых, второй для лимиток. Суть советника проста как пять копеек, тащить за ценой ордер, точно так-же, как таскаются стопы (трейлинг) От этого и название - трал отложек.
Так-же у него когда-то был бот, который выставлял отложки по времени и сразу их тащил за ценой, при срабатывании одной отложки, противоположная удалялась, и этот советник даже зарабатывал довольно неплохо на новостях, но недолго.
Ну а вот и сами кимовские функции, если не ошибаюсь, то писал он их в 2008г. и они работают по сей день
Подскажите пожалуйста... есть ли такой скрипт.который бы передвигал отложенный ордер за ценой. типо трелинг ... что позволит наилучше войти в позицию.....
А встроенный трейлинг по сути и есть такой скрипт, может ТС о нем не знает.
Встроенный трейлинг не тралит отложки только рыночные
Встроенный трейлинг не тралит отложки только рыночные
Не будет столь критичны, немного опечатался Сергей. Зная его как не новичка, можно предположить только одно: на носу праздник, и ему просто некогда было до конца изложить свою мысль)
Не будет столь критичны, немного опечатался Сергей. Зная его как не новичка, можно предположить только одно: на носу праздник, и ему просто некогда было до конца изложить свою мысль)
trader781: ничего страшного, собираю себе коллекцию, может этот куда то и пригодицца
Однозначно пригодится, когда взбредёт идея, что отложки на пробой достаточно тралить через определенное количество времени на определенном расстоянии от цены, при резком движении в одну из сторон одна сработатает, а вторая удалится и дальше только тралить прибыль) Этот код так и работает, но из за торговых условий на реале всё сводится к нулю и минусу, но в тестере прекрасно )))
Тралить рыночные ордера нельзя было никогда, можно тралить только стоплосс и тейкпрофит рыночного ордера.)
Ну Я же выложил ссылку на кимовский советник, у него их 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. Коду года два, скоро будет три ))) вникать в подробности и логику небуду и не помню уже что там и зачем.
ничего страшного, собираю себе коллекцию, может этот куда то и пригодицца
Однозначно пригодится, когда взбредёт идея, что отложки на пробой достаточно тралить через определенное количество времени на определенном расстоянии от цены, при резком движении в одну из сторон одна сработатает, а вторая удалится и дальше только тралить прибыль) Этот код так и работает, но из за торговых условий на реале всё сводится к нулю и минусу, но в тестере прекрасно )))
С праздником !!!
ничего страшного, собираю себе коллекцию, может этот куда то и пригодицца