Помогите добавить функцию trailingStop и выйдет неплохой советник

 
//+------------------------------------------------------------------+
//| Stochastic
//|
//| http:
//+------------------------------------------------------------------+
#property copyright ".ru"
#property link "ru"

#define magic 2342002

//---- input parameters
extern double lots=0.01;
extern double need_level = 13;
extern double entry_level = 17;

extern int Kperiod = 25;
extern int Dperiod = 7;
extern int slowing = 13;
extern int method = 0;
extern int price_field = 1;
extern int take_profit=0;
extern int stop_loss=13;

//+------------------------------------------------------------------+
//| expert initialization function |
//+------------------------------------------------------------------+
bool can_buy = false, can_sell = false;

int init()
{
//----

//----
return(0);
}
//+------------------------------------------------------------------+
//| expert deinitialization function |
//+------------------------------------------------------------------+
int deinit()
{
//----

//----
return(0);
}
//+------------------------------------------------------------------+
//| expert start function |
//+------------------------------------------------------------------+
int start()
{
//----

double stoc_prev = iStochastic(NULL, 0, Kperiod, Dperiod, slowing, method, price_field, 0, 2);
double stoc_next = iStochastic(NULL, 0, Kperiod, Dperiod, slowing, method, price_field, 0, 1);

//----
int i;
int err;

//Значения должны быть в интервале 0 - 100
if (entry_level<0 || entry_level>100 || need_level<0 || need_level > 100)
{
entry_level = 17;
need_level = 13;
}


//Условия закрытия SELL
if (stoc_prev > entry_level && stoc_next <= entry_level)
{
for(i=0;i<OrdersTotal();i++)
{

if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true)
if ( OrderSymbol()==Symbol() && OrderType()==OP_SELL && OrderMagicNumber()==magic)
if (OrderClose(OrderTicket(),OrderLots(),Ask,0,Red)==false)
{
//если не получилось закрыть
err=GetLastError();
Print("OrderSend failed with error #",err);
}
}
}
//Условия закрытия BUY
if (stoc_prev < (100-entry_level) && stoc_next >= (100-entry_level))
{
for(i=0;i<OrdersTotal();i++)
{
if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true)
if ( OrderSymbol()==Symbol() && OrderType()==OP_BUY && OrderMagicNumber()==magic)
if (OrderClose(OrderTicket(),OrderLots(),Bid,0,Red)==false)
{
//если не получилось закрыть
err=GetLastError();
Print("OrderSend failed with error #",err);
}
}
}

//Стохастик должен пробить уровень need_level
if (stoc_next > (100-need_level))
can_sell = true;
if (stoc_next < need_level)
can_buy = true;

//Условие покупки
if (stoc_prev <= entry_level && stoc_next > entry_level && can_buy)
{
//создаем buy
if (ChekForOrders(OP_BUY) ==0)
OrderSendFunc(OP_BUY);
can_buy = false;
}

//Условия продажи
if (stoc_prev >= (100-entry_level) && stoc_next < (100-entry_level) && can_sell)
{
//создаем SELL
if (ChekForOrders(OP_SELL) ==0)
OrderSendFunc(OP_SELL);
can_sell = false;
}


return(0);
}
//+------------------------------------------------------------------+


//Отправляет запрос типа cmd
int OrderSendFunc(int cmd)
{
if (cmd==OP_BUY) double Price=Ask;
else Price=Bid;
int ticket=OrderSend(Symbol(),cmd,lots,Price,0,GetSL(cmd),GetTP(cmd),NULL,magic,0,Blue);
if(ticket<0)
{
int err=GetLastError();
if (err==135)
{
//если ошибка "цены изменились" то делаем вторую попытку
RefreshRates();
ticket=OrderSend(Symbol(),cmd,lots,Price,0,GetSL(cmd),GetTP(cmd),NULL,magic,0,Blue);
if (ticket<0)
{
err=GetLastError();
Print("OrderSend failed with error #",err);
}
else Print("OrderSend failed with error #",err);
return(-1);
}
}
return(ticket);
}


// Функция возвращает значение цены с учетом StopLoss.
//Для Buy Order: cmd=OP_BUY, для Sell: cmd=OP_SELL
double GetSL(int cmd)
{
if (stop_loss==0) return(0);
else
if (cmd==OP_BUY) return(Bid-stop_loss*Point);
else return(Ask+stop_loss*Point);
}

// Функция возвращает значение цены с учетом TakeProfit.
//Для Buy Order: cmd=OP_BUY, для Sell: cmd=OP_SELL
double GetTP(int cmd)
{
if (take_profit==0) return(0);
else
if (cmd==OP_BUY) return(Ask+take_profit*Point);
else return(Bid-take_profit*Point);
}


//*Функция определяет количество позиций типа cmd*
int ChekForOrders(int cmd)
{
int count=0;
for(int i=0;i<OrdersTotal();i++)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true)
if (OrderSymbol()==Symbol() && OrderType()==cmd && OrderMagicNumber()==magic)
count++;
}
return(count);
}
 
Откуда такая уверенность, что трал сможет превратить плохой советник в хороший?
 
khorosh:
Откуда такая уверенность, что трал сможет превратить плохой советник в хороший?



Знаю, сам видел

 

Я прикрутил к коду эту функцию.. Надеюсь, что верно. Нужно что бы вы проверили в тестере. Могу выложить здесь или стукните в личку.

 
спасибо. напишите тут. вам сообщу о результатах. вы занимаетесь этим? а то у меня тут есть мысли кое какие
 
bikrus13:
спасибо. напишите тут. вам сообщу о результатах. вы занимаетесь этим? а то у меня тут есть мысли кое какие


Я занимаюсь всем! Так что пишите. :)

 
в личку напишу позже и подробно!!!
 
Ктто нибудь поможет?
Причина обращения: