Traling Stop шалит!

 

Traling Stop встроен в код программы и реализован так:

//------- Проверка дистанции преследования на допустимость -----

double TrSt=Tral_Stop; //где Tral_Stop Дистанция отставания Traling Stop
int Min_Dist=MarketInfo(Symbol(),MODE_STOPLEVEL);
if(Min_Dist>TrSt)
TrSt=Min_Dist;
//--------------------------------------------------------------

..................................................

//------ Проверка на необходимость модификации ордера BUY --------------
if(OrderSelect(tic,SELECT_BY_TICKET)==true)
{

int Ticket=OrderTicket();
double SL=OrderStopLoss();
double TP=OrderTakeProfit();
double Price=OrderOpenPrice();
if((NormalizeDouble(Bid,Digits)-NormalizeDouble(SL*Point,Digits))>=TrSt*Point)
{
SL=NormalizeDouble(Bid-StopLoss*Point,Digits);
string Text="BUY ";
MODIFY_ORDER(Text,Ticket,Price,SL,TP);
}
}
else
{
Print("OrderSelect() вернул ошибку - ",GetLastError(),"ticket=",Ticket);
}

Для SELL аналогино.
........................................................................................................


//+-----------Функция модификации ордера----------------------------------------------------+

void MODIFY_ORDER(string TEXT,int TICKET,double PRICE,double StLo,double TaPr)
{
if(OrderCloseTime()>0)
return;
else
{
Alert("Модификация ",TEXT,TICKET,". Ждем ответ..");
bool Ans=OrderModify(TICKET,PRICE,StLo,TaPr,0);
if(Ans==true)
Alert("Ордер ",TEXT,TICKET," модифицирован");
else
{
Print("OrderModify() вернул ошибку - ",GetLastError(),"ticket=",TICKET,"price=",PRICE,"Stop Loss=",StLo,"Take Profit=",TaPr);
}
}
return;
}

При тестировании Traling Stop долго мучает один ордер изменяя Stop Loss на один пункт то вперед то назад, пока не перейде к следующему. и с ним то же самое. Что не так подскажите.



 

double SL=OrderStopLoss();

if((NormalizeDouble(Bid,Digits)-NormalizeDouble(SL*Point,Digits))>=TrSt*Point)


сейчас EURUSD в районе 1.33, пусть у вас 5-знак, Point = 0.00001

тогда SL*Point даст 0.00001 или 0.00002 в лучшем случае. Естественно условие верно и ордер будет модифицирован

 
ilunga:

double SL=OrderStopLoss();

if((NormalizeDouble(Bid,Digits)-NormalizeDouble(SL*Point,Digits))>=TrSt*Point)


сейчас EURUSD в районе 1.33, пусть у вас 5-знак, Point = 0.00001

тогда SL*Point даст 0.00001 или 0.00002 в лучшем случае. Естественно условие верно и ордер будет модифицирован


Если я правильно понял то более верный спооб будет :

if((NormalizeDouble(Bid,Digits)-NormalizeDouble(SL,Digits))>=NormalizeDouble(TrSt*Point,Digits))

К сожелению нет возможности сразу проверить(

Причина обращения: