помогите добавить TrailingStop в эксперта

 
Есть эксперт сгенерированный другой программой, "Gordago Stock Optimizer" его работа вполне приемлима но можно было-бы добиться лучших результатов добавив возможность устанавливать Trailing Stop на открытые ордера.

//*********************************************************************************
//+------------------------------------------------------------------+
//| Copyright 2005, Gordago Software Corp. |
//| http://www.gordago.com/ |
//+------------------------------------------------------------------+

#property copyright "Copyright 2005, Gordago Software Corp."
#property link "http://www.gordago.com"



extern double lStopLoss = 12;
extern double sStopLoss = 12;
extern double lTakeProfit = 500;
extern double sTakeProfit = 500;
extern color clOpenBuy = Blue;
extern color clCloseBuy = Aqua;
extern color clOpenSell = Red;
extern color clCloseSell = Violet;
extern color clModiBuy = Blue;
extern color clModiSell = Red;
extern string Name_Expert = "Generate from Gordago";
extern int Slippage = 0;
extern bool UseSound = False;
extern string NameFileSound = "alert.wav";
extern int PauseTrade = 0; // Пауза между торгами в минутах
extern double Lots = 0.1;
extern double Leverage = 500;
extern double TrailingStop = 20;

int prevTimeTrade;

void deinit() {
Comment("");
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
int start(){
if(Bars<100){
Print("bars less than 100");
return(0);
}
if(lStopLoss<10){
Print("StopLoss less than 10");
return(0);
}
if(lTakeProfit<10){
Print("TakeProfit less than 10");
return(0);
}
if(sStopLoss<10){
Print("StopLoss less than 10");
return(0);
}
if(sTakeProfit<10){
Print("TakeProfit less than 10");
return(0);
}

double diRSI0=iRSI(NULL,1440,14,PRICE_CLOSE,0);
double diRSI1=iRSI(NULL,1440,14,PRICE_CLOSE,1);
double diRSI2=iRSI(NULL,1440,14,PRICE_CLOSE,0);
double diRSI3=iRSI(NULL,1440,14,PRICE_CLOSE,1);
double diRSI4=iRSI(NULL,1440,14,PRICE_CLOSE,0);
double diRSI5=iRSI(NULL,1440,14,PRICE_CLOSE,1);
double diRSI6=iRSI(NULL,1440,14,PRICE_CLOSE,0);
double diRSI7=iRSI(NULL,1440,14,PRICE_CLOSE,1);
double diRSI8=iRSI(NULL,1440,14,PRICE_CLOSE,0);
double diRSI9=iRSI(NULL,1440,14,PRICE_CLOSE,1);
double diRSI10=iRSI(NULL,1440,14,PRICE_CLOSE,0);
double diRSI11=iRSI(NULL,1440,14,PRICE_CLOSE,1);
double diRSI12=iRSI(NULL,1440,14,PRICE_CLOSE,0);
double diRSI13=iRSI(NULL,1440,14,PRICE_CLOSE,1);
double diRSI14=iRSI(NULL,1440,14,PRICE_CLOSE,0);
double diRSI15=iRSI(NULL,1440,14,PRICE_CLOSE,1);
double diRSI16=iRSI(NULL,1440,14,PRICE_CLOSE,0);
double diRSI17=iRSI(NULL,1440,14,PRICE_CLOSE,1);
double diRSI18=iRSI(NULL,1440,14,PRICE_CLOSE,0);
double diRSI19=iRSI(NULL,1440,14,PRICE_CLOSE,1);
double diRSI20=iRSI(NULL,1440,14,PRICE_CLOSE,0);
double diRSI21=iRSI(NULL,1440,14,PRICE_CLOSE,1);
double diRSI22=iRSI(NULL,1440,14,PRICE_CLOSE,0);
double diRSI23=iRSI(NULL,1440,14,PRICE_CLOSE,1);

if(AccountFreeMargin()<(Leverage*Lots)){
Print("We have no money. Free Margin = ", AccountFreeMargin());
return(0);
}
if (!ExistPositions()){

if ((diRSI0>30 && diRSI1<30) || (diRSI2>50 && diRSI3<50) || (diRSI4>70 && diRSI5<70)){
if (isCompletOfPause()) OpenBuy();
return(0);
}

if ((diRSI6<70 && diRSI7>70) || (diRSI8<50 && diRSI9>50) || (diRSI10<30 && diRSI11>30)){
if (isCompletOfPause()) OpenSell();
return(0);
}
}
if (ExistPositions()){
if(OrderType()==OP_BUY){

if ((diRSI12<30 && diRSI13>30) || (diRSI14<50 && diRSI15>50) || (diRSI16<70 && diRSI17>70)){
CloseBuy();
return(0);
}
}
if(OrderType()==OP_SELL){

if ((diRSI18>70 && diRSI19<70) || (diRSI20>50 && diRSI21<50) || (diRSI22>30 && diRSI23<30)){
CloseSell();
return(0);
}
}
}
return (0);
}

//+------------------------------------------------------------------+
//| Возвращает флаг окончания паузы в торговле |
//+------------------------------------------------------------------+
bool isCompletOfPause() {
if (CurTime()-prevTimeTrade>=60*PauseTrade) return(True);
else return(False);
}

bool ExistPositions() {
for (int i=0; i<OrdersTotal(); i++) {
if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
if (OrderSymbol()==Symbol()) {
return(True);
}
}
}
return(false);
}
void ModifyStopLoss(double ldStopLoss) {
bool fm;
fm = OrderModify(OrderTicket(),OrderOpenPrice(),ldStopLoss,OrderTakeProfit(),0,CLR_NONE);
if (fm && UseSound) PlaySound(NameFileSound);
}

void CloseBuy() {
bool fc;
fc=OrderClose(OrderTicket(), OrderLots(), Bid, Slippage, clCloseBuy);
if (fc) prevTimeTrade=CurTime();
if (fc && UseSound) PlaySound(NameFileSound);
}
void CloseSell() {
bool fc;
fc=OrderClose(OrderTicket(), OrderLots(), Ask, Slippage, clCloseSell);
if (fc) prevTimeTrade=CurTime();
if (fc && UseSound) PlaySound(NameFileSound);
}
void OpenBuy() {
double ldLot, ldStop, ldTake,ticket;
string lsComm;
ldLot = GetSizeLot();
ldStop = GetStopLossBuy();
ldTake = GetTakeProfitBuy();
lsComm = GetCommentForOrder();
ticket=OrderSend(Symbol(),OP_BUY,ldLot,Ask,Slippage,ldStop,ldTake,lsComm,0,0,clOpenBuy);
if (ticket>0) prevTimeTrade=CurTime();
if (UseSound) PlaySound(NameFileSound);
}
void OpenSell() {
double ldLot, ldStop, ldTake,ticket;
string lsComm;

ldLot = GetSizeLot();
ldStop = GetStopLossSell();
ldTake = GetTakeProfitSell();
lsComm = GetCommentForOrder();
ticket=OrderSend(Symbol(),OP_SELL,ldLot,Bid,Slippage,ldStop,ldTake,lsComm,0,0,clOpenSell);
if (ticket>0) prevTimeTrade=CurTime();
if (UseSound) PlaySound(NameFileSound);
}
string GetCommentForOrder() { return(Name_Expert); }
double GetSizeLot() { return(Lots); }
double GetStopLossBuy() { return (Bid-lStopLoss*Point);}
double GetStopLossSell() { return(Ask+sStopLoss*Point); }
double GetTakeProfitBuy() { return(Ask+lTakeProfit*Point); }
double GetTakeProfitSell() { return(Bid-sTakeProfit*Point); }

//********************************************************************************
//Этот вариант работает без установки TrailingStop

А в том что пониже я пытался перетащить установку TrailingStop из другого эксперта но по-моему ничего не вышло. :((

//********************************************************************************
//+------------------------------------------------------------------+
//| Copyright 2005, Gorgago Software Corp. |
//| http://www.gorgago.com/ |
//+------------------------------------------------------------------+

#property copyright "Copyright 2005, Gorgago Software Corp."
#property link "http://www.gorgago.com"



extern double lStopLoss = 12;
extern double sStopLoss = 12;
extern double lTakeProfit = 500;
extern double sTakeProfit = 500;
extern color clOpenBuy = Blue;
extern color clCloseBuy = Aqua;
extern color clOpenSell = Red;
extern color clCloseSell = Violet;
extern color clModiBuy = Blue;
extern color clModiSell = Red;
extern string Name_Expert = "Generate from Gordago";
extern int Slippage = 0;
extern bool UseSound = False;
extern string NameFileSound = "alert.wav";
extern int PauseTrade = 0; // Пауза между торгами в минутах
extern double Lots = 0.1;
extern double Leverage = 500;
extern double TrailingStop = 20;

int prevTimeTrade;

void deinit() {
Comment("");
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
int start(){
if(Bars<100){
Print("bars less than 100");
return(0);
}
if(lStopLoss<10){
Print("StopLoss less than 10");
return(0);
}
if(lTakeProfit<10){
Print("TakeProfit less than 10");
return(0);
}
if(sStopLoss<10){
Print("StopLoss less than 10");
return(0);
}
if(sTakeProfit<10){
Print("TakeProfit less than 10");
return(0);
}

double diRSI0=iRSI(NULL,1440,14,PRICE_CLOSE,0);
double diRSI1=iRSI(NULL,1440,14,PRICE_CLOSE,1);
double diRSI2=iRSI(NULL,1440,14,PRICE_CLOSE,0);
double diRSI3=iRSI(NULL,1440,14,PRICE_CLOSE,1);
double diRSI4=iRSI(NULL,1440,14,PRICE_CLOSE,0);
double diRSI5=iRSI(NULL,1440,14,PRICE_CLOSE,1);
double diRSI6=iRSI(NULL,1440,14,PRICE_CLOSE,0);
double diRSI7=iRSI(NULL,1440,14,PRICE_CLOSE,1);
double diRSI8=iRSI(NULL,1440,14,PRICE_CLOSE,0);
double diRSI9=iRSI(NULL,1440,14,PRICE_CLOSE,1);
double diRSI10=iRSI(NULL,1440,14,PRICE_CLOSE,0);
double diRSI11=iRSI(NULL,1440,14,PRICE_CLOSE,1);
double diRSI12=iRSI(NULL,1440,14,PRICE_CLOSE,0);
double diRSI13=iRSI(NULL,1440,14,PRICE_CLOSE,1);
double diRSI14=iRSI(NULL,1440,14,PRICE_CLOSE,0);
double diRSI15=iRSI(NULL,1440,14,PRICE_CLOSE,1);
double diRSI16=iRSI(NULL,1440,14,PRICE_CLOSE,0);
double diRSI17=iRSI(NULL,1440,14,PRICE_CLOSE,1);
double diRSI18=iRSI(NULL,1440,14,PRICE_CLOSE,0);
double diRSI19=iRSI(NULL,1440,14,PRICE_CLOSE,1);
double diRSI20=iRSI(NULL,1440,14,PRICE_CLOSE,0);
double diRSI21=iRSI(NULL,1440,14,PRICE_CLOSE,1);
double diRSI22=iRSI(NULL,1440,14,PRICE_CLOSE,0);
double diRSI23=iRSI(NULL,1440,14,PRICE_CLOSE,1);

if(AccountFreeMargin()<(Leverage*Lots)){
Print("We have no money. Free Margin = ", AccountFreeMargin());
return(0);
}
if (!ExistPositions()){
if ((diRSI0>30 && diRSI1<30) || (diRSI2>50 && diRSI3<50) || (diRSI4>70 && diRSI5<70)){
if (isCompletOfPause()) OpenBuy();
return(0);
}

if ((diRSI6<70 && diRSI7>70) || (diRSI8<50 && diRSI9>50) || (diRSI10<30 && diRSI11>30)){
if (isCompletOfPause()) OpenSell();
return(0);
}
}
if (ExistPositions()){
//check for trailing stop
if(TrailingStop>0)
{
if(Bid-OrderOpenPrice()>Point*TrailingStop)
{
if(OrderStopLoss()<Bid-Point*TrailingStop)
{
OrderModify(OrderTicket(),OrderOpenPrice(),Bid-Point*TrailingStop,OrderTakeProfit(),0,Green);
return(0);
}
}
}

if(OrderType()==OP_BUY){

if ((diRSI12<30 && diRSI13>30) || (diRSI14<50 && diRSI15>50) || (diRSI16<70 && diRSI17>70)){
CloseBuy();
return(0);
}
}
if(OrderType()==OP_SELL){
//check for trailing stop
if(TrailingStop>0)
{
if(Bid-OrderOpenPrice()>Point*TrailingStop)
{
if(OrderStopLoss()<Bid-Point*TrailingStop)
{
OrderModify(OrderTicket(),OrderOpenPrice(),Bid-Point*TrailingStop,OrderTakeProfit(),0,Green);
return(0);
}
}
}

if ((diRSI18>70 && diRSI19<70) || (diRSI20>50 && diRSI21<50) || (diRSI22>30 && diRSI23<30)){
CloseSell();
return(0);
}
}
}
return (0);
}

//+------------------------------------------------------------------+
//| Возвращает флаг окончания паузы в торговле |
//+------------------------------------------------------------------+
bool isCompletOfPause() {
if (CurTime()-prevTimeTrade>=60*PauseTrade) return(True);
else return(False);
}

bool ExistPositions() {
for (int i=0; i<OrdersTotal(); i++) {
if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
if (OrderSymbol()==Symbol()) {
return(True);
}
}
}
return(false);
}
void ModifyStopLoss(double ldStopLoss) {
bool fm;
fm = OrderModify(OrderTicket(),OrderOpenPrice(),ldStopLoss,OrderTakeProfit(),0,CLR_NONE);
if (fm && UseSound) PlaySound(NameFileSound);
}

void CloseBuy() {
bool fc;
fc=OrderClose(OrderTicket(), OrderLots(), Bid, Slippage, clCloseBuy);
if (fc) prevTimeTrade=CurTime();
if (fc && UseSound) PlaySound(NameFileSound);
}

void CloseSell() {
bool fc;
fc=OrderClose(OrderTicket(), OrderLots(), Ask, Slippage, clCloseSell);
if (fc) prevTimeTrade=CurTime();
if (fc && UseSound) PlaySound(NameFileSound);
}

void OpenBuy() {
double ldLot, ldStop, ldTake,ticket;
string lsComm;
ldLot = GetSizeLot();
ldStop = GetStopLossBuy();
ldTake = GetTakeProfitBuy();
lsComm = GetCommentForOrder();
ticket=OrderSend(Symbol(),OP_BUY,ldLot,Ask,Slippage,ldStop,ldTake,lsComm,0,0,clOpenBuy);
if (ticket>0) prevTimeTrade=CurTime();
if (UseSound) PlaySound(NameFileSound);
}
void OpenSell() {
double ldLot, ldStop, ldTake,ticket;
string lsComm;

ldLot = GetSizeLot();
ldStop = GetStopLossSell();
ldTake = GetTakeProfitSell();
lsComm = GetCommentForOrder();
ticket=OrderSend(Symbol(),OP_SELL,ldLot,Bid,Slippage,ldStop,ldTake,lsComm,0,0,clOpenSell);
if (ticket>0) prevTimeTrade=CurTime();
if (UseSound) PlaySound(NameFileSound);
}
string GetCommentForOrder() { return(Name_Expert); }
double GetSizeLot() { return(Lots); }
double GetStopLossBuy() { return (Bid-lStopLoss*Point);}
double GetStopLossSell() { return(Ask+sStopLoss*Point); }
double GetTakeProfitBuy() { return(Ask+lTakeProfit*Point); }
double GetTakeProfitSell() { return(Bid-sTakeProfit*Point); }

//*******************************************************************************

помогите пжалста начинающему разобраться с этим вопросом, буду очень благодарен если оставите хорошие комментарии в измененном коде.
Спасибо ;)
Причина обращения: