[Invalid S/L or T/P]

 

Тестирую своего советника на демо. Всё было бы хорошо, но из за постоянных ошибок типа:

при трейлигне

2008.02.06 21:41:15 '781884': modification of order #20008316 sell 0.10 #ISRG at 306.93 sl: 307.12 tp: 301.97 -> sl: 306.58 tp: 0.00 failed [Invalid S/L or T/P]

2008.02.06 21:41:14 '781884': modify order #20008316 sell 0.10 #ISRG at 306.93 sl: 307.12 tp: 301.97 -> sl: 306.58 tp: 0.00

2008.02.06 21:41:12 '781884': modification of order #20008316 sell 0.10 #ISRG at 306.93 sl: 307.12 tp: 301.97 -> sl: 306.58 tp: 0.00 failed [Invalid S/L or T/P]

2008.02.06 21:41:12 '781884': modify order #20008316 sell 0.10 #ISRG at 306.93 sl: 307.12 tp: 301.97 -> sl: 306.58 tp: 0.00

и при открытии позиций

2008.02.06 21:48:44 '782581': order sell 0.25 #ISRG opening at 309.50 sl: 309.65 tp: 304.50 failed [Invalid S/L or T/P]

2008.02.06 21:48:44 '782581': instant order sell 0.25 #ISRG at 309.50 sl: 309.65 tp: 304.50

2008.02.06 21:43:25 '782581': order buy 0.25 #ISRG opening at 307.77 sl: 307.62 tp: 312.77 failed [Invalid S/L or T/P]

2008.02.06 21:43:23 '782581': instant order buy 0.25 #ISRG at 307.77 sl: 307.62 tp: 312.77

весь результат тестирования сводится на нет. Почему возникают такие ошибки? Как от них избавиться или хотя бы значительно сократить?

Трейлинг стоп взят у KimIV'a.

Вот функция открытия позиции:

//---- Покупаем
void OpenBuy() { 
   double ldLot, ldStop, ldTake; 
   string lsComm; 
   ldLot = GetSizeLot();
   RefreshRates();
   ldStop = NormalizeDouble(Bid-Point*stopLoss*Pip, Digits); 
   ldTake = NormalizeDouble(GetTakeProfitBuy(),Digits); 
   lsComm = "1.0"; 
   OrderSend(Symbol(),OP_BUY,ldLot,NormalizeDouble(Ask,Digits),Slippage,ldStop,ldTake,lsComm,Magic,0,clOpenBuy); 
 
   n=iBars(NULL,0);
   if (UseSound) PlaySound(NameFileSound);   }
 
//---- Продаем 
void OpenSell() { 
   double ldLot, ldStop, ldTake; 
   string lsComm; 
   ldLot = GetSizeLot(); 
   RefreshRates();
   ldStop = NormalizeDouble(Ask+Point*stopLoss*Pip, Digits); 
   ldTake = NormalizeDouble(GetTakeProfitSell(),Digits); 
   lsComm = "1.0"; 
   OrderSend(Symbol(),OP_SELL,ldLot,NormalizeDouble(Bid,Digits),Slippage,ldStop,ldTake,lsComm,Magic,0,clOpenSell); 
  /* Alert(GetLastError());
   Alert("SELL: ",Bid," STOP: ",ldStop, " TAKE: ",ldTake);*/
   n=iBars(NULL,0);
   if (UseSound) PlaySound(NameFileSound);   }
 
double GetSizeLot() { return(Lots); } 
double GetTakeProfitBuy() { RefreshRates(); return(Ask+lTakeProfit*Point*Pip); } 
double GetTakeProfitSell() { RefreshRates(); return(Bid-sTakeProfit*Point*Pip); }
S/L = 10 (минимальный на инструменте).
 
Обычно так "[Invalid S/L or T/P] " бывает, если стопы заданы меньшего размера, чем это допускаюп правила ДЦ.
 
Вопрос снят, вроде. Спасибо, Rosh. Помог его скрипт:
//+------------------------------------------------------------------+
//| 130Research.mq4 |
//| Copyright © 2005, MetaQuotes Software Corp. |
//| http://www.metatrader4.com/ru/forum/7293/ |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2005, MetaQuotes Software Corp."
#property link "http://www.metatrader4.com/ru/forum/7293/"

//+------------------------------------------------------------------+
//| script program start function |
//+------------------------------------------------------------------+
int start()
{
bool TestFinished=false;
int tries=5;
int i,ticket;
int StopL=MarketInfo(Symbol(),MODE_STOPLEVEL);
int Spread=MarketInfo(Symbol(),MODE_SPREAD);
double StopLoss;
string Comm;
//----
if (tries<=Spread) tries=Spread+1;
Print("Начинаем проверку на ",Symbol());
Print("Спред=",Spread," StopLevel=",StopL);
while(!IsStopped()&&!TestFinished)
{
RefreshRates();
Comm=DoubleToStr(i,0)+" пункт";
StopLoss=NormalizeDouble(Ask-(StopL+i)*Point,Digits);
Print("Попытка покупки со стопом StopLevel+",i,"пунктов");
ticket=OrderSend(Symbol(),OP_BUY,0.1,Ask,3,StopLoss,0,Comm,0,0,Blue);
if (ticket<0)
{
Print("Неудача с ошибкой номер ",GetLastError());
}
else
{
Print("Ордер в покупку вроде открыт со стопом StopLevel+",i,"пунктов, ошибка=",GetLastError());
TestFinished=true;
}
i++;
if (i>=tries) TestFinished=true;
Sleep(5000);
}
Print("Проверка покупок завершена");
i=0;
TestFinished=false;
while(!IsStopped()&&!TestFinished)
{
RefreshRates();
Comm=DoubleToStr(i,0)+" пункт";
StopLoss=NormalizeDouble(Bid+(StopL+i)*Point,Digits);
Print("Попытка продажи со стопом StopLevel+",i,"пунктов");
ticket=OrderSend(Symbol(),OP_SELL,0.1,Bid,3,StopLoss,0,Comm,0,0,Red);
if (ticket<0)
{
Print("Неудача с ошибкой номер ",GetLastError());
}
else
{
Print("Ордер в продажу вроде открыт со стопом StopLevel+",i,"пунктов, ошибка=",GetLastError());
TestFinished=true;
}
i++;
if (i>=tries) TestFinished=true;
Sleep(5000);
}
Print("Проверка продаж завершена");

//----
return(0);
}
//+------------------------------------------------------------------+
Причина обращения: