. . . E se quiser incluir a opção de encerrar (stop) por tempo e pela contagem de candles, acho que o código abaixo pode ajudar:
input int inpBarsClose = 12; // Bars To Close Positions (0 = Off) // . . . ulong MAGICNUM = 123; // . . . ulong TICKET; int Cnt; //--- Checks positions for(Cnt = PositionsTotal() - 1; Cnt >= 0; Cnt--) { TICKET = PositionGetTicket(Cnt); if(TICKET > 0) { if(PositionGetString(POSITION_SYMBOL) == _Symbol && PositionGetInteger(POSITION_MAGIC) == MAGICNUM) { if(PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_BUY) { //--- Checks if close positions if(inpBarsClose > 0 && inpBarsClose <= (iTime(_Symbol, PERIOD_CURRENT, 0) - PositionGetInteger(POSITION_TIME)) / PeriodSeconds(PERIOD_CURRENT)) { //--- encerra posição compra } } else if(PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_SELL) { //--- Checks if close positions if(inpBarsClose > 0 && inpBarsClose <= (iTime(_Symbol, PERIOD_CURRENT, 0) - PositionGetInteger(POSITION_TIME)) / PeriodSeconds(PERIOD_CURRENT)) { //--- encerra posição venda } } } } }
double MinPrice = iLow (_Symbol, PERIOD_CURRENT,2);
E na sequência testa a condição:
if(MinPrice<iLow(_Symbol,PERIOD_CURRENT,2))
A condição acima nunca vai ocorrer. É o mesmo que testar:
if(MinPrice < MinPrice)
. . . E se quiser incluir a opção de encerrar (stop) por tempo e pela contagem de candles, acho que o código abaixo pode ajudar:
. . . Se quiser usar iBarShift(), no exemplo acima, onde tem:
//--- Checks if close positions if(inpBarsClose > 0 && inpBarsClose <= (iTime(_Symbol, PERIOD_CURRENT, 0) - PositionGetInteger(POSITION_TIME)) / PeriodSeconds(PERIOD_CURRENT))
. . . Substituir por:
//--- Checks if close positions if(inpBarsClose > 0 && inpBarsClose <= iBarShift(_Symbol, PERIOD_CURRENT, PositionGetInteger(POSITION_TIME), false))
A diferença entre os dois modos surge no caso de paralisação do mercado: no primeiro, o tempo decorrido desde a abertura continua sendo considerado para o encerramento da posição; no segundo, é considerado somente o número de barras desde a abertura da posição.
. . . Se quiser usar iBarShift(), no exemplo acima, onde tem:
. . . Substituir por:
A diferença entre os dois modos surge no caso de paralisação do mercado: no primeiro, o tempo decorrido desde a abertura continua sendo considerado para o encerramento da posição; no segundo, é considerado somente o número de barras desde a abertura da posição.
Cara, agradeço muito, me deu um norte excelente, agradeço sua interação.
Beleza! Bom estudo!
- Aplicativos de negociação gratuitos
- 8 000+ sinais para cópia
- Notícias econômicas para análise dos mercados financeiros
Você concorda com a política do site e com os termos de uso
Olá,
Gostaria de por o STOP no tempo, poderia ser feito pela contagem de candles, poderiam me ajudar?
Sou iniciante, então caso vejam coisas abisurdas, peço paciência, vou acertando pouco a pouco, o objetivo é por o Take Profit na máxima dos ultimos 2 candles e/ou o Stop em um paramentro.
//+------------------------------------------------------------------+
//| Primeiro Robo.mq5 |
//| Copyright 2021, MetaQuotes Ltd. |
//| https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2021, MetaQuotes Ltd."
#property link "https://www.mql5.com"
#property version "1.00"
//+------------------------------------------------------------------+
//| Includes
//+------------------------------------------------------------------+
#include <trade/trade.mqh>
//+------------------------------------------------------------------+
//| Inputs |
//+------------------------------------------------------------------+
input int lote = 100;
CTrade trade ;
//+------------------------------------------------------------------+
//| Funções |
//+------------------------------------------------------------------+
int OnInit()
{
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
}
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void OnTick()
{
if(isNewBar())
{
// Tratamento dos dados
double MaxPrice = iHigh(_Symbol,PERIOD_CURRENT,2);
double MinPrice = iLow (_Symbol, PERIOD_CURRENT,2);
bool sinalcompra = false;
bool comprado = false;
if(MinPrice<iLow(_Symbol,PERIOD_CURRENT,2))
{
sinalcompra = true ;
}
if(PositionSelect(_Symbol))
{
//--- se a posição for comprada
if( PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_BUY )
{
comprado = true;
}
}
//+------------------------------------------------------------------+
//| LÓGICA DE ROTEAMENTO |
//+------------------------------------------------------------------+
if( !comprado )
{
//--- sinal de compra
if( sinalcompra )
{
trade.Buy(lote,_Symbol,0,0,0,"Compra a mercado");
}
}
}
}
//+------------------------------------------------------------------
bool isNewBar() // Função que faz o robo calcular apenas uma vez por candle
{
//--- memorize the time of opening of the last bar in the static variable
static datetime last_time=0;
//--- current time
datetime lastbar_time=(datetime)SeriesInfoInteger(Symbol(),Period(),SERIES_LASTBAR_DATE);
//--- if it is the first call of the function
if(last_time==0)
{
//--- set the time and exit
last_time=lastbar_time;
return(false);
}
//--- if the time differs
if(last_time!=lastbar_time)
{
//--- memorize the time and return true
last_time=lastbar_time;
return(true);
}
//--- if we passed to this line, then the bar is not new; return false
return(false);
}