Трал тралин назад, помогите найтти ошибку.

 

Собственно проблема в том что трал может позволить себе изменить стоп в противоположную сторону. Посмотрите пожалуйсто почему не выполняется условие OrderStopLoss()>SL1 для селл и SL0>OrderStopLoss() для бай, где сл1 и сл0 новые стоплосы.

void TRAL()
{
if(TRAL==1)
{
for(int i=1; i<=OrdersTotal(); i++)                   
{ 
if(OrderSelect(i-1,SELECT_BY_POS)==true)             
{
if(OrderMagicNumber()!=magic) continue;             
int Tip=OrderType();
switch(Tip)
{
case 0:                               // тип ордера (0-buy,1-sell,4-buy stop,5-sell stop)                                         
CASE0();
case 1:
CASE1();
}
}
}
}
}

//------------------------------------------------------------------------------------------------------------

int CASE1()
{TralSell();}

int CASE0()
{TralBuy();}

//------------------------------------------------------------------------------------------------------------


void TralSell()
{
double SL1=iSAR(NULL,TFT,XT,YT,0)+Spread*Point;
if(Bars>=GlobalVariableGet(BarSell)+BarMax && OrderOpenPrice()-Ask<=Dist*Point && OrderOpenPrice()-Ask>6*Point)
{
bool Ans12=OrderModify(OrderTicket(),OrderOpenPrice(),NormalizeDouble(OrderOpenPrice()-1*Point,Digits),NormalizeDouble(OrderTakeProfit(),Digits),0);
if(Ans12!=false)
{GlobalVariableSet(BarSell,Bars+100);}
}
if(LastBar1!=iTime(NULL,TFT,0) && OrderStopLoss()>SL1)
{                                                                                                                                                                                    
bool Ans1;                                              
Ans1=OrderModify(OrderTicket(),OrderOpenPrice(),NormalizeDouble(SL1,Digits),NormalizeDouble(OrderTakeProfit(),Digits),0); 
LastBar1=iTime(NULL,TFT,0); 
if(Ans1==false)                                        
{ Alert("Case1,Ордер ",OrderTicket()," не модифицирован");}      
}
}


//------------------------------------------------------------------------------------------------------------

void TralBuy()
{
double SL0=iSAR(NULL,TFT,XT,YT,0)-Spread*Point;
if(Bars>=GlobalVariableGet(BarBuy)+BarMax && Bid-OrderOpenPrice()<=Dist*Point && Bid-OrderOpenPrice()>6*Point)
{
bool Ans02=OrderModify(OrderTicket(),OrderOpenPrice(),NormalizeDouble(OrderOpenPrice()+1*Point,Digits),NormalizeDouble(OrderTakeProfit(),Digits),0);
if(Ans02!=false)
{GlobalVariableSet(BarBuy,Bars+100);}
}

if(LastBar1!=iTime(NULL,TFT,0) && SL0>OrderStopLoss())
{                                                                                                                                                                                 
bool Ans0;                                              
Ans0=OrderModify(OrderTicket(),OrderOpenPrice(),NormalizeDouble(SL0,Digits),NormalizeDouble(OrderTakeProfit(),Digits),0); 
LastBar1=iTime(NULL,TFT,0); 
if(Ans0==false)                                        
{ Alert("Case1,Ордер ",OrderTicket()," не модифицирован");}      
}
}

п.с. если кто то найдёт по их мнению ошибки другого рода, которые не влияют на данную проблему, то можно их не указывать. Заранее всем благодарен.

 
shumaher9:

Собственно проблема в том что трал может позволить себе изменить стоп в противоположную сторону. Посмотрите пожалуйсто почему не выполняется условие OrderStopLoss()>SL1 для селл и SL0>OrderStopLoss() для бай, где сл1 и сл0 новые стоплосы.

п.с. если кто то найдёт по их мнению ошибки другого рода, которые не влияют на данную проблему, то можно их не указывать. Заранее всем благодарен.

1)

bool Ans12=OrderModify(OrderTicket(),OrderOpenPrice(),NormalizeDouble(OrderOpenPrice()-1*Point,Digits),NormalizeDouble(OrderTakeProfit(),Digits),0);

это условие выполняется независимо от SL ордера и может его таскать туда-сюда


2)

case 0:                               // тип ордера (0-buy,1-sell,4-buy stop,5-sell stop)                                         
CASE0();
case 1:
CASE1();

для buy-ордеров выполняется оба трейлинга

 
ilunga:

2)

для buy-ордеров выполняется оба трейлинга


И не только для Buy, но и для всех типов отложенных ордеров, если такие попадутся.
 
ilunga:

1)

это условие выполняется независимо от SL ордера и может его таскать туда-сюда


2)

для buy-ордеров выполняется оба трейлинга


1) да это так и должно быть, идея в том что если по прошествии опр. количества баров цена не ушла в профит более чем на опр. количество пунктов, то стоп выводиться в +1. После этого дальше тралю по сару, но стоп должен меняться только когда он станет больше установленного, то есть больше чем стоп в +1.

2) ставил брэйки после обоих кейсов то есть так:

void TRAL()
{
if(TRAL==1)
{
for(int i=1; i<=OrdersTotal(); i++)                   
{ 
if(OrderSelect(i-1,SELECT_BY_POS)==true)             
{
if(OrderMagicNumber()!=magic) continue;             
int Tip=OrderType();
switch(Tip)
{
case 0:                               // тип ордера (0-buy,1-sell,4-buy stop,5-sell stop)                                         
CASE0();
break;
case 1:
CASE1();
break;
}
}
}
}
}

как то проблему не решило. Да и если у меня открыто несколько ордеров и их надо вместе тралить, то если ставить брейк я так понимаю трал до следующего ордера и не доберёться, так как будет выходить из функции TRAL(), и когда он следующий раз запустит эту функцию он снова начнёт с того же ордера...... ????

 
shumaher9:


1) да это так и должно быть, идея в том что если по прошествии опр. количества баров цена не ушла в профит более чем на опр. количество пунктов, то стоп выводиться в +1. После этого дальше тралю по сару, но стоп должен меняться только когда он станет больше установленного, то есть больше чем стоп в +1.

2) ставил брэйки после обоих кейсов то есть так:

как то проблему не решило. Да и если у меня открыто несколько ордеров и их надо вместе тралить, то если ставить брейк я так понимаю трал до следующего ордера и не доберёться, так как будет выходить из функции TRAL(), и когда он следующий раз запустит эту функцию он снова начнёт с того же ордера...... ????

1) после чего на каждом новом баре будет срабатывать данное условие и переносить SL в позицию +1.


2) нет, эти break выводят из switch

 
shumaher9:


2) ставил брэйки после обоих кейсов то есть так:

как то проблему не решило. Да и если у меня открыто несколько ордеров и их надо вместе тралить, то если ставить брейк я так понимаю трал до следующего ордера и не доберёться, так как будет выходить из функции TRAL(), и когда он следующий раз запустит эту функцию он снова начнёт с того же ордера...... ????


Да прочтите Вы в конце концов в документации описание switch()
 
PapaYozh:

Да прочтите Вы в конце концов в документации описание switch()

Прочёл, понял, извеняюсь.
ilunga:

1) после чего на каждом новом баре будет срабатывать данное условие и переносить SL в позицию +1.


2) нет, эти break выводят из switch


1) нет не будет, так как после того как он первый раз выставит в +1, он так же изменит глобальную переменную BarSell, сделает её на 100 баров больше, то есть следующий раз когда он захочит переставить стоп в +1 будет через 100 баров. В противном случае это было бы дыже не на каждом баре а на каждом тике.
 

Поставил брейки после каждого кейса, там их и оставлю! Только проблемы не рещило:(((((((

 
shumaher9:

1) нет не будет, так как после того как он первый раз выставит в +1, он так же изменит глобальную переменную BarSell, сделает её на 100 баров больше, то есть следующий раз когда он захочит переставить стоп в +1 будет через 100 баров. В противном случае это было бы дыже не на каждом баре а на каждом тике.

значит вы где-то еще эту глобальную переменную меняете.

А если у вас 20 buy-ордеров, то после изменения первого глобальная переменная будет изменена и все, для остальных 19 SL не сдвинется по этому условию

 
ilunga:

значит вы где-то еще эту глобальную переменную меняете.

А если у вас 20 buy-ордеров, то после изменения первого глобальная переменная будет изменена и все, для остальных 19 SL не сдвинется по этому условию


НЕ меняю, вы правы, после первого ордера все остальные останутся не с чем. Буду думать выход из ситуации. Благодарю.

П.С. главная проблема всё та же;)

 
ilunga:

значит вы где-то еще эту глобальную переменную меняете.

А если у вас 20 buy-ордеров, то после изменения первого глобальная переменная будет изменена и все, для остальных 19 SL не сдвинется по этому условию


Слушай так у меня получается аналогичная ситуация с переменной LastBar1, которая тоже меняется после того как стоп ордера изменится по сару, и является временем открытия нулевого бара. ....??
Причина обращения: