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

Você está perdendo oportunidades de negociação:
- Aplicativos de negociação gratuitos
- 8 000+ sinais para cópia
- Notícias econômicas para análise dos mercados financeiros
Registro
Login
Você concorda com a política do site e com os termos de uso
Se você não tem uma conta, por favor registre-se
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);} } } } }