Tudo sobre Programação, com código fonte exemplo - página 8

 

Fórum de negociação, sistemas de negociação automatizados e testes de estratégias de negociação

Encerramento de operações após X minutos da abertura - erro

bool_el, 2019.06.30 16:34

Fala pessoal, tudo certo?

Estou desenvolvendo um código para encerramento de todas posições após 30 minutos da abertura, mas está dando erro...

Já li as bibliotecas, mas não consegui corrigir.

Se alguém puder me ajudar, agradeço muito!!!



void OnTick()
  {
    
   datetime horario_controle;
   datetime horario_abertura;
   horario_controle=TimeCurrent();
   horario_abertura=PositionGetInteger(POSITION_TIME);
  
   if(horario_controle>=horario_abertura+1800)
      {
        CloseAllPositions();
      }
   }



        
void CloseAllPositions()
  {
   for(int i=PositionsTotal()-1;i>=0;i--) 
      if(m_position.SelectByIndex(i))  
         m_trade.PositionClose(m_position.Ticket()); 
  }

 

Fórum de negociação, sistemas de negociação automatizados e testes de estratégias de negociação

take profit na média móvel

forgottenn, 2019.06.30 15:33

Olá


Estou tentando programar um take profit na média móvel e estou tentando usar a função trade.PositionModify porém sem sucesso até o momento. Criei uma funçao void para isso e usei NormalizeDouble e usei um array para armazenar os dados. 

Estou dando os primeiros passos em programação MQL se alguém puder me ajudar e me mostrar se estou no caminho certo. 


void TrailingTake(double preco)
   {
      for(int i = PositionsTotal()-1; i>=0; i--)
         {
            string symbol = PositionGetSymbol(i);
            ulong magic = PositionGetInteger(POSITION_MAGIC);
            if(symbol == _Symbol && magic==magicNum)
               {
                  ulong PositionTicket = PositionGetInteger(POSITION_TICKET);
                  double PrecoEntrada = PositionGetDouble(POSITION_PRICE_OPEN);
                  double StopLossCorrente = PositionGetDouble(POSITION_SL);
                  double TakeProfitCorrente = PositionGetDouble(POSITION_TP);
                  if(PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_BUY)
                     {
                        if(preco <= (TakeProfitCorrente) )
                           {
                              double novoTP = NormalizeDouble(PrecoEntrada +(smaArray[0] - PrecoEntrada), _Digits);
                              if(trade.PositionModify(PositionTicket, StopLossCorrente, novoTP))
                                 {
                                    Print("TrailingTake - sem falha. ResultRetcode: ", trade.ResultRetcode(), ", RetcodeDescription: ", trade.ResultRetcodeDescription());
                                 }
                              else
                                 {
                                    Print("TrailingTake - com falha. ResultRetcode: ", trade.ResultRetcode(), ", RetcodeDescription: ", trade.ResultRetcodeDescription());
                                 }
                           }
                     }
                  else if(PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_SELL)
                     {
                        if(preco >= (TakeProfitCorrente) )
                           {
                              double novoTP = NormalizeDouble(PrecoEntrada -(smaArray[0] - PrecoEntrada), _Digits);
                              if(trade.PositionModify(PositionTicket, StopLossCorrente, novoTP))
                                 {
                                    Print("TrailingTake - sem falha. ResultRetcode: ", trade.ResultRetcode(), ", RetcodeDescription: ", trade.ResultRetcodeDescription());
                                 }
                              else
                                 {
                                    Print("TrailingTake - com falha. ResultRetcode: ", trade.ResultRetcode(), ", RetcodeDescription: ", trade.ResultRetcodeDescription());
                                 }
                           }
                     }
               }
         }
   }
//---

 

Fórum de negociação, sistemas de negociação automatizados e testes de estratégias de negociação

Conversão de indicador MQL4 para MQL5

Igor Martins, 2019.06.26 12:51

Preciso converter o código abaixo para MQL5. A compilação apresenta muitos erros! Alguém pode me ajudar?


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

//|                                      Currency Strength Meter.mq4 |

//|                              Copyright 2018, Besarion Turmanauli |

//|                             https://www.mql5.com/en/users/dos.ge |

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

#property copyright "Copyright 2018, Besarion Turmanauli"

#property link      "https://www.mql5.com/en/users/dos.ge"

#property version   "1.00"

#property strict

#property indicator_separate_window

#property indicator_minimum 0

#property indicator_maximum 100

#property indicator_buffers 4

#property indicator_plots   4

//--- plot Label1

//#property indicator_label1  "Label1"

#property indicator_type1   DRAW_LINE

#property indicator_color1  clrRed

#property indicator_style1  STYLE_SOLID

#property indicator_width1  1

//--- plot Label2

//#property indicator_label2  "Label2"

#property indicator_type2   DRAW_LINE

#property indicator_color2  clrViolet

#property indicator_style2  STYLE_SOLID

#property indicator_width2  1

//--- plot Label3

//#property indicator_label3  "Label3"

#property indicator_type3   DRAW_LINE

#property indicator_color3  clrGreen

#property indicator_style3  STYLE_SOLID

#property indicator_width3  1

//--- plot Label4

//#property indicator_label4  "Label4"

#property indicator_type4   DRAW_LINE

#property indicator_color4  clrBlue

#property indicator_style4  STYLE_SOLID

#property indicator_width4  1

//--- indicator buffers

double         Label1Buffer[];

double         Label2Buffer[];

double         Label3Buffer[];

double         Label4Buffer[];


#define ISN "Currency Strength Meter"

int initial_limit=0;


extern string instrOne = "EURUSD"; //Instrument 1

extern string instrTwo = "AUDUSD"; //Instrument 2

extern string instrThree= "NZDUSD"; //Instrument 3

extern string instrFour = "USDJPY"; //Instrument 4

extern color colorOne=clrRed; //Instrument 1 Color

extern color colorTwo=clrViolet; //Instrument 2 Color

extern color colorThree=clrGreen; //Instrument 3 Color

extern color colorFour= clrBlue; //Instrument 4 Color

extern int indicatorPeriod = 14; //Indicator Period

extern ENUM_APPLIED_PRICE appliedPrice=PRICE_CLOSE; //Indicator Applied Price 

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

//| Custom indicator initialization function                         |

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

int OnInit()

  {


   if(!LabelCreate(0,instrOne,1,5,20,CORNER_LEFT_LOWER,instrOne,"Arial",10,colorOne))

     {

      return (0);

     }


   if(!LabelCreate(0,instrTwo,1,75,20,CORNER_LEFT_LOWER,instrTwo,"Arial",10,colorTwo))

     {

      return (0);

     }


   if(!LabelCreate(0,instrThree,1,145,20,CORNER_LEFT_LOWER,instrThree,"Arial",10,colorThree))

     {

      return (0);

     }


   if(!LabelCreate(0,instrFour,1,215,20,CORNER_LEFT_LOWER,instrFour,"Arial",10,colorFour))

     {

      return (0);

     }


   SetLevelValue(0,80.0);

   SetLevelValue(1,50.0);

   SetLevelValue(2,20.0);

//--- indicator buffers mapping

   SetIndexBuffer(0,Label1Buffer);

   SetIndexLabel(0,instrOne);

   SetIndexStyle(0,0,0,1,colorOne);

   SetIndexBuffer(1,Label2Buffer);

   SetIndexLabel(1,instrTwo);

   SetIndexStyle(1,0,0,1,colorTwo);

   SetIndexBuffer(2,Label3Buffer);

   SetIndexLabel(2,instrThree);

   SetIndexStyle(2,0,0,1,colorThree);

   SetIndexBuffer(3,Label4Buffer);

   SetIndexLabel(3,instrFour);

   SetIndexStyle(3,0,0,1,colorFour);


//---

   return(INIT_SUCCEEDED);

  }

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

//| Custom indicator iteration function                              |

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

int start()

  {

   int i,// Bar index

   Counted_bars;                // Number of counted bars


   Counted_bars=IndicatorCounted(); // Number of counted bars

   i=Bars-Counted_bars-1;           // Index of the first uncounted

   if(initial_limit==0){initial_limit=i;}


   while(i>0)

     {//start iteration


      //getting initial values

      double open=Open[i];

      double high=High[i];

      double low=Low[i];

      double close=Close[i];


      Label1Buffer[i]=iRSI(instrOne,Period(),indicatorPeriod,PRICE_CLOSE,i);

      Label2Buffer[i]=iRSI(instrTwo,Period(),indicatorPeriod,PRICE_CLOSE,i);

      Label3Buffer[i]=iRSI(instrThree,Period(),indicatorPeriod,PRICE_CLOSE,i);

      Label4Buffer[i]=iRSI(instrFour,Period(),indicatorPeriod,PRICE_CLOSE,i);


      i--;

     }//end iteration


   return (0);

  }

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

//|                                                                  |

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

int deinit()

  {

   LabelDelete(0,instrOne);

   LabelDelete(0,instrTwo);

   LabelDelete(0,instrThree);

   LabelDelete(0,instrFour);

   return(0);

  }

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


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

//| Create a text label                                              |

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

bool LabelCreate(const long              chart_ID=0,               // chart's ID

                 const string            name="Label",             // label name

                 const int               sub_window=0,             // subwindow index

                 const int               x=0,                      // X coordinate

                 const int               y=0,                      // Y coordinate

                 const ENUM_BASE_CORNER  corner=CORNER_LEFT_UPPER, // chart corner for anchoring

                 const string            text="Label",             // text

                 const string            font="Arial",             // font

                 const int               font_size=10,             // font size

                 const color             clr=clrRed,               // color

                 const double            angle=0.0,                // text slope

                 const ENUM_ANCHOR_POINT anchor=ANCHOR_LEFT_UPPER, // anchor type

                 const bool              back=false,               // in the background

                 const bool              selection=false,          // highlight to move

                 const bool              hidden=true,              // hidden in the object list

                 const long              z_order=0)                // priority for mouse click

  {

//--- reset the error value

   ResetLastError();

//--- create a text label

   if(!ObjectCreate(chart_ID,name,OBJ_LABEL,sub_window,0,0))

     {

      Print(__FUNCTION__,

            ": failed to create text label! Error code = ",GetLastError());

      return(false);

     }

//--- set label coordinates

   ObjectSetInteger(chart_ID,name,OBJPROP_XDISTANCE,x);

   ObjectSetInteger(chart_ID,name,OBJPROP_YDISTANCE,y);

//--- set the chart's corner, relative to which point coordinates are defined

   ObjectSetInteger(chart_ID,name,OBJPROP_CORNER,corner);

//--- set the text

   ObjectSetString(chart_ID,name,OBJPROP_TEXT,text);

//--- set text font

   ObjectSetString(chart_ID,name,OBJPROP_FONT,font);

//--- set font size

   ObjectSetInteger(chart_ID,name,OBJPROP_FONTSIZE,font_size);

//--- set the slope angle of the text

   ObjectSetDouble(chart_ID,name,OBJPROP_ANGLE,angle);

//--- set anchor type

   ObjectSetInteger(chart_ID,name,OBJPROP_ANCHOR,anchor);

//--- set color

   ObjectSetInteger(chart_ID,name,OBJPROP_COLOR,clr);

//--- display in the foreground (false) or background (true)

   ObjectSetInteger(chart_ID,name,OBJPROP_BACK,back);

//--- enable (true) or disable (false) the mode of moving the label by mouse

   ObjectSetInteger(chart_ID,name,OBJPROP_SELECTABLE,selection);

   ObjectSetInteger(chart_ID,name,OBJPROP_SELECTED,selection);

//--- hide (true) or display (false) graphical object name in the object list

   ObjectSetInteger(chart_ID,name,OBJPROP_HIDDEN,hidden);

//--- set the priority for receiving the event of a mouse click in the chart

   ObjectSetInteger(chart_ID,name,OBJPROP_ZORDER,z_order);

//--- successful execution

   return(true);

  }

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

//| Delete a text label                                              |

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

bool LabelDelete(const long   chart_ID=0,   // chart's ID

                 const string name="Label") // label name

  {

//--- reset the error value

   ResetLastError();

//--- delete the label

   if(!ObjectDelete(chart_ID,name))

     {

      Print(__FUNCTION__,

            ": failed to delete a text label! Error code = ",GetLastError());

      return(false);

     }

//--- successful execution

   return(true);

  }

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


 

Fórum de negociação, sistemas de negociação automatizados e testes de estratégias de negociação

Como enviar ordens pendentes?

Edilson Domingos, 2019.07.01 18:47

Estou desenvolvendo um EA e não estou conseguindo criar uma ordem pendente!

O que está de errado?

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
 #include <Trade\Trade.mqh>
CTrade trade;

void OnTick()
  {
        double preco = SymbolInfoDouble(_Symbol,SYMBOL_LAST);
        if(!trade.OrderOpen(_Symbol,ORDER_TYPE_BUY,1,preco,preco,preco-(100*_Point),preco + (100*_Point),ORDER_TIME_GTC,0,"Compra"))
        {
         Print("Erro: ",GetLastError());
        }
  }
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
 #include <Trade\Trade.mqh>
CTrade trade;

void OnTick()
  {
        double preco = SymbolInfoDouble(_Symbol,SYMBOL_LAST);
        if(!trade.OrderOpen(_Symbol,ORDER_TYPE_BUY,1,preco,preco,preco-(100*_Point),preco + (100*_Point),ORDER_TIME_GTC,0,"Compra"))
        {
         Print("Erro: ",GetLastError());
        }
  }

 

Fórum de negociação, sistemas de negociação automatizados e testes de estratégias de negociação

Como colocar uma string no eixo X de um gráfico em MQL5

brfink, 2019.07.02 01:10

Olá,

Eu gostaria de editar os valores que aparecer no eixo X do seguinte gráfico:

Grafico atual


Eu gostaria de adicionar a legenda no eixo X mas usando uma string, como por exemplo:

desejado


Segue o código fonte atual:

#include <Canvas\Charts\LineChart.mqh>
MqlRates acao1[];
double yArray[];
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int OnInit()
  {
   CLineChart chart;
   chart.CreateBitmapLabel("Sample",10,10,600,450);

   chart.VScaleParams(10,0,0.1);
   chart.ShowScaleTop(false);
   chart.ShowScaleRight(false);
   chart.ShowScaleBottom();
   chart.ShowLegend();
   chart.ShowValue(true);

   ArraySetAsSeries(acao1,true);
   int DataAcao1=CopyRates(Symbol(),Period(),0,Period(),acao1);

   double arr[10];
   for(int i=0;i<ArraySize(arr);i++)
     {
      arr[i]=acao1[i].close;
     }
   chart.SeriesAdd(arr,"Item");

   return(INIT_SUCCEEDED);
  }
Obrigado!

 

Fórum de negociação, sistemas de negociação automatizados e testes de estratégias de negociação

Informações sobre mais de um ativo

jdmaster, 2019.07.02 02:33

Boa noite amigo, estou usando o código abaixo para receber as informações do mini índice, porém, meu robô tb abre posições no índice cheio...então pergunto, como posso receber informações do índice cheio tb? ou seja, quero receber informações de ambos os ativos.


void GetPositionProperties()
  {
   pos_symbol     =PositionGetString(POSITION_SYMBOL);
   pos_comment    =PositionGetString(POSITION_COMMENT);
   pos_magic      =PositionGetInteger(POSITION_MAGIC);
   pos_price      =PositionGetDouble(POSITION_PRICE_OPEN);
   pos_cprice     =PositionGetDouble(POSITION_PRICE_CURRENT);
   pos_sl         =PositionGetDouble(POSITION_SL);
   pos_tp         =PositionGetDouble(POSITION_TP);
   pos_type       =(ENUM_POSITION_TYPE)PositionGetInteger(POSITION_TYPE);
   pos_volume     =PositionGetDouble(POSITION_VOLUME);
   pos_commission =PositionGetDouble(POSITION_COMMISSION);
   pos_swap       =PositionGetDouble(POSITION_SWAP);
   pos_profit     =PositionGetDouble(POSITION_PROFIT);
   pos_time       =(datetime)PositionGetInteger(POSITION_TIME);
   pos_id         =PositionGetInteger(POSITION_IDENTIFIER);
  }


Agradeço sua ajuda.


 

Fórum de negociação, sistemas de negociação automatizados e testes de estratégias de negociação

Erro ao copiar DIDI index em um EA.

Rogerio Giannetti Torres, 2019.07.02 19:53

Boa tarde,

1) Use o ALT-S para postar códigos.

2) Você copiou sem procurar entender minha sugestão, entao:

2.1) O HANDLE dos indicadores  devem ser criados somente uma vez de prefêrencia no OnInit(), então retire a criação do HANDLE dentro do OnTick().  (*)

2.2) Teste o retorno da criação do HANDLE dos três.


3) Bom dia Rogerio, obrigado pela ajuda, mas ainda ha algo errado, me parece ser algo relacionado a inserção do indicador DIDI e a janela de visualização.

Se você acha que é isso por que não testou, ainda?

  if(!ChartIndicatorAdd(0,subwindow,indicator_handle))
     {
      PrintFormat("Falha para adicionar indicador MACD na janela do gráfico %d. Código de erro %d",
                  subwindow,GetLastError());
     }


3) Feito as alterações, compile e plugue o programa na janela gráfica e veja o resultado na aba EXPERTS.


(*) Nas situações que precisar criar o mesmo handle com novos operadores o handle corrente deve ser liberado usando o comando IndicatorRelease( handle );


 

Fórum de negociação, sistemas de negociação automatizados e testes de estratégias de negociação

MqlTick.flags zerado

Trader_Patinhas, 2019.07.03 05:08

dvd, isso está acontecendo porque vc está tratando o campo "flags" como um único número inteiro, em vez de verificar cada flag isoladamente. 

Para resolver o seu problema, basta ignorar esses flags extras não documentados (que estão variando de um ativo pro outro, gerando o problema que você relata).

Uma forma simples de fazer isso é fazer flags &= 0x07F (ou flags %= 128, se preferir, dá no mesmo), daí vc vai poder comparar o campo "flags" como se fosse 1 único número inteiro, pois assim vc estará pegando somente os flags de 0 a 6 (documentados) e zerando os flags 7 e 8 (não documentados) e todos os demais flags (9, 10, etc.) que possam vir a aparecer no futuro.

Se preferir uma solução menos "nerd" e mais profissional, faça um "bitwise-and" entre o campo "flags" e o(s) flag(s) específico(s) que for(em) de interesse na lógica de processamento que estiver implementando.

Exemplos:

if ( flags & TICK_FLAG_BUY ) ... 

if ( flags & ( TICK_FLAG_BID | TICK_FLAG_ASK) ) ... 

etc

Dessa forma, quaisquer flags alienígenas não-documentados que vierem acesos ocasionalmente não interferirão mais na sua lógica de processamento.


 

Fórum de negociação, sistemas de negociação automatizados e testes de estratégias de negociação

Informações sobre mais de um ativo

Rogerio Giannetti Torres, 2019.07.02 04:14

Bom, acredito que você queira trabalhar concomitantemente com os dois ativos, então:


//-- 

struct PositionPropertie
{
   string            pos_symbol;
   string            pos_comment;;
   ulong             pos_magic;
}

PositionProperties GEN,WIN,IND;

//--- Supondo que as duas posições estão abertas

PositionSelect( "WINQ19" );
GetPositionProperties();
WIN=GEN;
}

PositionSelect( "INDQ19" );
GetPositionProperties();
IND=GEN;

//--- Pronto você tem a informação das duas posições ao mesmo tempo
Print(WIN.pos_symbol," ",IND.pos_symbol);

void GetPositionProperties()
  {
   GEN.pos_symbol     =PositionGetString(POSITION_SYMBOL);
   GEN.pos_comment    =PositionGetString(POSITION_COMMENT);
   GEN.pos_magic      =PositionGetInteger(POSITION_MAGIC);
  }

 

Fórum de negociação, sistemas de negociação automatizados e testes de estratégias de negociação

[INVALID STOPS] Ordens não abrem

Henrique Araújo, 2019.07.04 17:38

Estou desenvolvendo um EA de cruzamento de medias, não dá erros de compilação, mas as ordens não abrem, ele da erro.

2019.07.04 12:35:20.732 2019.06.03 01:16:35   failed market buy 5.00 EURUSD sl: -28.88274 tp: 31.11726 [Invalid stops]
2019.07.04 12:35:20.732 2019.06.03 01:16:35   CTrade::OrderSend: market buy 5.00 EURUSD sl: -28.88274 tp: 31.11726 [invalid stops]
2019.07.04 12:35:20.732 2019.06.03 01:16:36   failed market buy 5.00 EURUSD sl: -28.88275 tp: 31.11725 [Invalid stops]
2019.07.04 12:35:20.732 2019.06.03 01:16:36   CTrade::OrderSend: market buy 5.00 EURUSD sl: -28.88275 tp: 31.11725 [invalid stops]
2019.07.04 12:35:20.733 2019.06.03 01:16:38   failed market buy 5.00 EURUSD sl: -28.88274 tp: 31.11726 [Invalid stops]
2019.07.04 12:35:20.733 2019.06.03 01:16:38   CTrade::OrderSend: market buy 5.00 EURUSD sl: -28.88274 tp: 31.11726 [invalid stops]
2019.07.04 12:35:20.737 2019.06.03 01:16:39   failed market buy 5.00 EURUSD sl: -28.88275 tp: 31.11725 [Invalid stops]
2019.07.04 12:35:20.737 2019.06.03 01:16:39   CTrade::OrderSend: market buy 5.00 EURUSD sl: -28.88275 tp: 31.11725 [invalid stops]
2019.07.04 12:35:20.737 2019.06.03 01:16:40   failed market buy 5.00 EURUSD sl: -28.88274 tp: 31.11726 [Invalid stops]
2019.07.04 12:35:20.737 2019.06.03 01:16:40   CTrade::OrderSend: market buy 5.00 EURUSD sl: -28.88274 tp: 31.11726 [invalid stops]
2019.07.04 12:35:20.738 2019.06.03 01:16:42   failed market buy 5.00 EURUSD sl: -28.88275 tp: 31.11725 [Invalid stops]
2019.07.04 12:35:20.738 2019.06.03 01:16:42   CTrade::OrderSend: market buy 5.00 EURUSD sl: -28.88275 tp: 31.11725 [invalid stops]

Aqui está o codigo:


//+------------------------------------------------------------------+
//|                                                   Cruzamento.mq5 |
//|                                                  Henrique Araújo |
//|                                              araujo_br@yahoo.com |
//+------------------------------------------------------------------+
#property copyright "Henrique Araújo"
#property link      "araujo_br@yahoo.com"
#property version   "1.00"
#include <Trade/Trade.mqh>
CTrade       trade;

input int media_curta;
input int media_longa;
input int lotes;
input int stop_loss;
input int take_profit;
string sinal="";
double last_price;
double smaArray[];
int smaHandle;
double ask, bid;
void OnTick()
  { 
   
    Comment("SINAL: ", sinal);
    ask = SymbolInfoDouble(_Symbol,SYMBOL_ASK);
    bid = SymbolInfoDouble(_Symbol,SYMBOL_BID);
    last_price = SymbolInfoDouble(_Symbol,SYMBOL_LAST);
    smaHandle = iMA(_Symbol,_Period,media_curta,0,MODE_SMA,PRICE_CLOSE);
    ArraySetAsSeries(smaArray, true);
    CopyBuffer(smaHandle, 0, 0, 3, smaArray);
    
    if(last_price>smaArray[0])
    {
    sinal="COMPRA";
    trade.Buy(lotes,_Symbol,ask,ask-stop_loss,ask+take_profit,"");
    }
    
    else if (last_price<smaArray[0])
    {
    sinal="VENDA";
    }
    
    
  }

EDIT

O problema é o take profit e o stop loss, removendo ele o EA funciona perfeitamente.


Razão: