Help - Trailing Stop

 

Boa noite!

Estou criando um EA, porém estou 3 dias tentando e não consigo implementar o Trailing Stop.

Abre a operação com sl e tp e assim que o preço chega na distancia da variavel  TriggerBE ocorre o trade.PositionModify, mas o trailing nao segue o preco ele anda uma unica vez conforme valor setado na variavel   TriggerBE .


Desde já agradeço se alguem puder me ajudar!


//+------------------------------------------------------------------+

//|                                               Andre Luis Freitas |

//|                                             SES_RoboEnvelope.mq5 |

//+------------------------------------------------------------------+


#include <Trade/Trade.mqh> // biblioteca-padrão CTrade

CTrade trade;

string OpeningTime = "09:03:00"; //Opening Time

string ClosingTime = "17:45:00"; //Closing Time

MqlRates rates[];

ulong NumMagic = 2211;

double lote = 8;

double Loss=400;

double Profit=1000;

double StopLoss,TakeProfit;

double TriggerBE=150;

double StepStopLoss=10;


int OnInit(){


trade.SetExpertMagicNumber(NumMagic);


return (INIT_SUCCEEDED);


void OnTick()

{

 if(IsGoodTime())

   {

      // EA não está posicionado

      if(SemPosicao() && SemOrdem())

      {

         // Verificar estratégia e determinar compra ou venda

         int resultado_cruzamento = LogicaCompraVenda();

         

         if(resultado_cruzamento != 0)

           {

                    

         // Estratégia indicou compra

         if(resultado_cruzamento == 1)

            Compra();

            

         // Estratégia indicou venda

         if(resultado_cruzamento == -1)

            Venda();

      }}}

      //EA está posicionado

    if(!SemPosicao())

    {

         TrailingStop();

  }

}


////////////////////////////////////////////////////////////////////////


void Compra()

{

                

StopLoss = SymbolInfoDouble(_Symbol,SYMBOL_ASK) - Loss;

TakeProfit = SymbolInfoDouble(_Symbol,SYMBOL_ASK) + Profit;

 (trade.Buy(lote, _Symbol, SymbolInfoDouble(_Symbol,SYMBOL_ASK), StopLoss, TakeProfit, "Compra"));} // PrecoEntrada-400*_Point, PrecoEntrada+1000*_Point

            

void Venda()

{


StopLoss = SymbolInfoDouble(_Symbol,SYMBOL_BID) + Loss;

TakeProfit = SymbolInfoDouble(_Symbol,SYMBOL_BID) - Profit;

 (trade.Sell(lote, _Symbol, SymbolInfoDouble(_Symbol,SYMBOL_BID), StopLoss, TakeProfit, "Venda"));}    // PrecoEntrada+400*_Point, PrecoEntrada-1000*_Point


////////////////////////////////////////////////////////////////////////


bool SemPosicao()

{  

   bool resultado = !PositionSelect(_Symbol);

   return resultado;

}


////////////////////////////////////////////////////////////////////////


bool SemOrdem()

{  

   for(int i=OrdersTotal()-1; i>=0; i--)

   {

      OrderGetTicket(i);

      if(OrderGetString(ORDER_SYMBOL)==_Symbol)

         return false;

   }

   return true;

}


////////////////////////////////////////////////////////////////////////


bool isNewBar() { 

   static long lastBarCount = -1;

   long currentBarCount =  Bars(Symbol(), 0);

   if(lastBarCount != currentBarCount) {

      lastBarCount = currentBarCount;

      return true;

   } else {

      return false;

   }

}


////////////////////////////////////////////////////////////////////////


int LogicaCompraVenda ()

{

double rates1[], rates2[];

CopyRates(_Symbol, _Period, 0, 3, rates);

ArraySetAsSeries(rates, true);  

   // Compra 

if (rates[1].close > rates[2].close && isNewBar()) 

      return 1;

     // Venda 

if (rates[1].close < rates[2].close && isNewBar())

      return -1;

           return 0;

}


////////////////////////////////////////////////////////////////////////


bool IsGoodTime()

{

  if(TimeCurrent() >= StringToTime(OpeningTime) && TimeCurrent() < StringToTime(ClosingTime))

  {

    return true;

  }

  return false;

}

bool IsClosingTime()

{

  if(TimeCurrent() >= StringToTime(ClosingTime))

  {

    return true;

  }

  return false;

}


////////////////////////////////////////////////////////////////////////


void TrailingStop () {

for (int i = PositionsTotal() -1; i >=0; i--){

string symbol = PositionGetSymbol(i);

            ulong magic = PositionGetInteger(POSITION_MAGIC);

            if(symbol == _Symbol && magic==NumMagic){

ulong  PositionTicket = PositionGetInteger(POSITION_TICKET);

double PrecoEntrada = PositionGetDouble(POSITION_PRICE_OPEN);

double sl = PositionGetDouble(POSITION_SL);

double NovoSL;

if(PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_BUY){               

if(PrecoEntrada >= sl){

NovoSL = NormalizeDouble(PrecoEntrada + TriggerBE , _Digits);

trade.PositionModify(PositionTicket, NovoSL, TakeProfit); } }

if(PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_SELL){               

if(PrecoEntrada <= sl){

NovoSL = NormalizeDouble(PrecoEntrada - TriggerBE , _Digits);

trade.PositionModify(PositionTicket, NovoSL, TakeProfit);} } } } } 

 
andreluisfreitas:

Boa noite!

.....

Use Alt+S para postar o código, é ilegível dessa maneira 

 

#include <Trade/Trade.mqh> // biblioteca-padrão CTrade

CTrade trade;

string OpeningTime = "09:03:00"; //Opening Time

string ClosingTime = "17:45:00"; //Closing Time

MqlRates rates[];

ulong NumMagic = 2211;

double lote = 8;

double Loss=400;

double Profit=1000;

double StopLoss,TakeProfit;

double TriggerBE=150;

double StepStopLoss=10;



int OnInit(){



trade.SetExpertMagicNumber(NumMagic);



return (INIT_SUCCEEDED);

} 



void OnTick()

{

 if(IsGoodTime())

   {

      // EA não está posicionado

      if(SemPosicao() && SemOrdem())

      {

         // Verificar estratégia e determinar compra ou venda

         int resultado_cruzamento = LogicaCompraVenda();

         

         if(resultado_cruzamento != 0)

           {

                    

         // Estratégia indicou compra

         if(resultado_cruzamento == 1)

            Compra();

            

         // Estratégia indicou venda

         if(resultado_cruzamento == -1)

            Venda();

      }}}

      //EA está posicionado

    if(!SemPosicao())

    {

         TrailingStop();

  }

}



////////////////////////////////////////////////////////////////////////



void Compra()

{

                

StopLoss = SymbolInfoDouble(_Symbol,SYMBOL_ASK) - Loss;

TakeProfit = SymbolInfoDouble(_Symbol,SYMBOL_ASK) + Profit;

 (trade.Buy(lote, _Symbol, SymbolInfoDouble(_Symbol,SYMBOL_ASK), StopLoss, TakeProfit, "Compra"));} // PrecoEntrada-400*_Point, PrecoEntrada+1000*_Point

            

void Venda()

{



StopLoss = SymbolInfoDouble(_Symbol,SYMBOL_BID) + Loss;

TakeProfit = SymbolInfoDouble(_Symbol,SYMBOL_BID) - Profit;

 (trade.Sell(lote, _Symbol, SymbolInfoDouble(_Symbol,SYMBOL_BID), StopLoss, TakeProfit, "Venda"));}    // PrecoEntrada+400*_Point, PrecoEntrada-1000*_Point



////////////////////////////////////////////////////////////////////////



bool SemPosicao()

{  

   bool resultado = !PositionSelect(_Symbol);

   return resultado;

}



////////////////////////////////////////////////////////////////////////



bool SemOrdem()

{  

   for(int i=OrdersTotal()-1; i>=0; i--)

   {

      OrderGetTicket(i);

      if(OrderGetString(ORDER_SYMBOL)==_Symbol)

         return false;

   }

   return true;

}



////////////////////////////////////////////////////////////////////////



bool isNewBar() { 

   static long lastBarCount = -1;

   long currentBarCount =  Bars(Symbol(), 0);

   if(lastBarCount != currentBarCount) {

      lastBarCount = currentBarCount;

      return true;

   } else {

      return false;

   }

}



////////////////////////////////////////////////////////////////////////



int LogicaCompraVenda ()

{

double rates1[], rates2[];

CopyRates(_Symbol, _Period, 0, 3, rates);

ArraySetAsSeries(rates, true);  

   // Compra 

if (rates[1].close > rates[2].close && isNewBar()) 

      return 1;

     // Venda 

if (rates[1].close < rates[2].close && isNewBar())

      return -1;

           return 0;

}



////////////////////////////////////////////////////////////////////////



bool IsGoodTime()

{

  if(TimeCurrent() >= StringToTime(OpeningTime) && TimeCurrent() < StringToTime(ClosingTime))

  {

    return true;

  }

  return false;

}

bool IsClosingTime()

{

  if(TimeCurrent() >= StringToTime(ClosingTime))

  {

    return true;

  }

  return false;

}



////////////////////////////////////////////////////////////////////////



void TrailingStop () {

for (int i = PositionsTotal() -1; i >=0; i--){

string symbol = PositionGetSymbol(i);

            ulong magic = PositionGetInteger(POSITION_MAGIC);

            if(symbol == _Symbol && magic==NumMagic){

ulong  PositionTicket = PositionGetInteger(POSITION_TICKET);

double PrecoEntrada = PositionGetDouble(POSITION_PRICE_OPEN);

double sl = PositionGetDouble(POSITION_SL);

double NovoSL;

if(PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_BUY){               

if(PrecoEntrada >= sl){

NovoSL = NormalizeDouble(PrecoEntrada + TriggerBE , _Digits);

trade.PositionModify(PositionTicket, NovoSL, TakeProfit); } }

if(PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_SELL){               

if(PrecoEntrada <= sl){

NovoSL = NormalizeDouble(PrecoEntrada - TriggerBE , _Digits);

trade.PositionModify(PositionTicket, NovoSL, TakeProfit);} } } } } 

Boa tarde!

Acho que agora mandei certo o código.


Desde já agradeço!


Att

Razão: