Discussão do artigo "Operações de negócios no MQL5 - São fáceis" - página 3

 

Você pode me dizer se é possível implementar essa construção a partir da MQL4 usando m_Trade.PositionModify (m_Trade é um membro da classe CTrade)?

...
if(TrendUp==true) 
   for(int i=0; i<10; i++)
      {
        ticket = OrderSend(Symbol(),OP_BUY,Lots,Ask,30,0,0);
        if(ticket>0 && i<9) OrderModify(ticket,0,0,Ask+SPS*take_koef[i],0);
      };
...

O objetivo do script é abrir uma compra no mercado com um determinado número de lotes e, em seguida, definir um take profit em 10 partes. Fiquei preso no fato de que, sem definir um stop loss, o PositionModify dá o erro 10016(Incorrect stops in the request). E não há nenhuma tarefa para definir um stop :). Na ajuda, está escrito que é possível não especificar um valor:

Параметры

symbol

[in]  Наименование торгового инструмента, по которому предполагается модифицировать позицию.

sl

[in]  Новая цена, по которой сработает Stop Loss (либо, если изменение не нужно, предыдущее значение).

tp

[in]  Новая цена, по которой сработает Take Profit (либо, если изменение не нужно, предыдущее значение).

Tentei passar o valor obtido na solicitação de compra anterior (há zero, é claro), bem, o mesmo rake apenas no perfil. Aqui está meu código:

...
         m_Trade.Buy(Lots);// comprar todo o volume no mercado
         if(m_Trade.ResultRetcode()==10008)//se a compra for bem-sucedida, altere a posição definindo os take-outs
           {
            S="Pedido atendido. Número do pedido: "+IntegerToString(m_Trade.RequestOrder());
            Comment(S);
            sl=m_Trade.RequestSL();// obter o stop loss da última solicitação
            for(int i=0;i<=10;i++)
              {
               if(m_Trade.PositionModify(symbol,sl,Ask+SPS*take_koef[i]))
                 {
                  S+="Snap Takedown: "+IntegerToString(i);
                  Comment(S);
                 }
               else
                 {
                  S+="Erro de alteração de SnPosition com código: "+IntegerToString(m_Trade.ResultRetcode());
                  Comment(S);
                  return(4);
                 };
              };
...

Agradeço antecipadamente por sua ajuda.

[Excluído]  
Essa é uma grande ajuda para iniciar sua programação de EA.
 

Boa introdução à programação orientada a objetos em MQL5.

Com o MT5 build 1347, o primeiro exemplo de código não consegue compilar com o erro "illegal switch expression type".

Tive que adicionar a conversão para int nas declarações de switch no AccountInfo.mqh para fazê-lo funcionar, como:

switch((int)MarginMode())

 
Николай Осипов:

Olá,
Ao usar a função BuyStop no código para negociar futuros de RTS-3.13 (RIH3), continua ocorrendo um erro:
10022 TRADE_RETCODE_INVALID_EXPIRATION - Data de expiração da ordem inválida


Nicholas, saudações. Por acaso você já resolveu esse problema? Estou enfrentando as mesmas dificuldades no RTS-6.17 e não sei como resolvê-lo.
 
Rashid Zeynalov:
Problema semelhante no RTS-3.13 Opening-demo, tentei de tudo (enquanto as ordens de limite são definidas como ORDER_TIME_SPECIFIED_DAY, conforme escrito no perfil do símbolo) !!!!. Enquanto a ordem buy-stop está perfeitamente aberta no mercado manualmente. Essa é uma falha no terminal, você deve escrever para os desenvolvedores
Rashid, olá. Por acaso você já resolveu esse problema? Estou enfrentando as mesmas dificuldades no Open real no RTS-6.17.

 
sgtkachev:
Rashid, olá. Por acaso você já resolveu esse problema? Estou enfrentando as mesmas dificuldades no Open real no RTS-6.17.

Desculpe, não percebi a pergunta. Tente substituir esse arquivo e informe o resultado, por favor.
Arquivos anexados:
Trade.mqh  68 kb
 

Olá

Em algumas corretoras (FoxPro, por exemplo), ao tentar abrir uma posição, ocorre o erro 10030. Descrição do código: preenchimento inválido. Em outras corretoras (por exemplo, a Alpari) funciona sem essas linhas

No bloco de inicialização do Expert Advisor, escrevi valores diferentes no código:

trade.SetTypeFilling(SYMBOL_FILLING_FOK);

или
trade.SetTypeFilling(SYMBOL_FILLING_IOC);

или

trade.SetTypeFilling(ORDER_FILLING_RETURN);

Não ajuda. Como resolver o problema? Ou essa classe CTrade está desatualizada e não corresponde às atualizações mais recentes do terminal e eu preciso escrever operações de negociação de acordo com o esquema padrão por meio da estrutura?


UPD: Rashid postou um arquivo de biblioteca acima, que resolveu meu problema. É triste que a biblioteca padrão tenha um erro. Agora vou estudar a comparação para ver se é possível fazer algumas alterações diretamente no EA sem substituir a biblioteca para que tudo funcione

Автоматическое обновление - Для продвинутых пользователей - Начало работы - Справка по MetaTrader 5
Автоматическое обновление - Для продвинутых пользователей - Начало работы - Справка по MetaTrader 5
  • www.metatrader5.com
В платформу встроена система автоматического обновления. Она позволяет своевременно получать и устанавливать новые версии программы. Эту систему...
 
Bom
 
makk:

Boa introdução à programação orientada a objetos em MQL5.

Com o MT5 build 1347, o primeiro exemplo de código não consegue compilar com o erro "illegal switch expression type".

Tive que adicionar a conversão para int nas declarações de switch no AccountInfo.mqh para fazê-lo funcionar, como:

switch((int)MarginMode())

 

Olá, obrigado por essa postagem muito útil e, por favor, ajude-me a resolver esse problema. Sou novo no MT5 e estou aprendendo a criar EAs, então copiei o código de exemplo para executar o Ctrade.Buy, mas o backtest falhou. Aqui estão mais informações:


1) Conta: É uma conta real com a moeda base como NZD

2) Configurações do MetaEditor para o backtest:

Opções


3) Código: Copiado de https://www.mql5.com/pt/articles/481:


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

//|                                                         demo.mq5 |

//|                        Copyright 2017, MetaQuotes Software Corp. |

//|                                             https://www.mql5.com |

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

#property copyright "Copyright 2017, MetaQuotes Software Corp."

#property link      "https://www.mql5.com"

#property version   "1.00"

#include<Trade\Trade.mqh>


//--- object for performing trade operations

CTrade  trade;

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

//| Expert initialization function                                   |

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

int OnInit()

  {

   //--- set MagicNumber for your orders identification

   int MagicNumber=123456;

   trade.SetExpertMagicNumber(MagicNumber);

   //--- set available slippage in points when buying/selling

   int deviation=10;

   trade.SetDeviationInPoints(deviation);

   //--- order execution mode

   trade.SetTypeFilling(ORDER_FILLING_RETURN);

   //--- logging mode: it would be better not to declare this method at all, the class will set the best mode on its own

   trade.LogLevel(1);

   //--- what function is to be used for trading: true - OrderSendAsync(), false - OrderSend()

   trade.SetAsyncMode(true);

   //---

   return(0);

  }

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

//| Expert deinitialization function                                 |

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

void OnDeinit(const int reason)

  {

//---

   

  }

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

//| Expert tick function                                             |

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

void OnTick()

  {

   BuySample1();

  }


//--- Buy sample  

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

//|  Buying a specified volume at the current symbol                 |

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

void BuySample1()

  {

//--- 1. example of buying at the current symbol

   if(!trade.Buy(0.1))

     {

      //--- failure message

      Print("Buy() method failed. Return code=",trade.ResultRetcode(),

            ". Code description: ",trade.ResultRetcodeDescription());

     }

   else

     {

      Print("Buy() method executed successfully. Return code=",trade.ResultRetcode(),

            " (",trade.ResultRetcodeDescription(),")");

     }

//---

  }

4) Registro de erros (observe que estou testando apenas em EUR/USD):

GJ 0 19:36:44.410 127.0.0.1 login (build 1730)

HH 0 19:36:44.420 Rede 38520 bytes de informações da conta carregadas

JO 0 19:36:44.420 Rede 1482 bytes de parâmetros do testador carregados

QE 0 19:36:44.420 Rede 188 bytes de parâmetros de entrada carregados

FR 0 19:36:44.421 Rede 443 bytes de lista de símbolos carregados

IF 0 19:36:44.421 Arquivo de especialista do testador adicionado: Experts\demo.ex5. 46684 bytes carregados

QH 0 19:36:44.433 Depósito inicial do testador 10000.00 NZD, alavancagem 1:100

JN 0 19:36:44.437 Testador inicializado com sucesso

ES 0 19:36:44.437 Rede 46 Kb de dados totais de inicialização recebidos

PP 0 19:36:44.437 Testador Intel Core i7-4510U @ 2.00GHz, 8103 MB

RJ 0 19:36:44.799 Símbolos EURUSD: símbolo a ser sincronizado

HR 0 19:36:44.800 Símbolos EURUSD: símbolo sincronizado, 3624 bytes de informações de símbolo recebidas

NJ 0 19:36:44.800 Histórico EURUSD: sincronização do histórico iniciada

GO 0 19:36:44.856 Histórico EURUSD: carregar 27 bytes de dados do histórico para sincronizar em 0:00:00.000

RQ 0 19:36:44.856 Histórico EURUSD: histórico sincronizado de 2012.01.01 a 2017.11.15

EF 0 19:36:44.993 Histórico EURUSD,Daily: cache do histórico alocado para 1010 barras e contém 312 barras de 2014.01.01 00:00 a 2014.12.31 00:00

ND 0 19:36:44.993 Histórico EURUSD,Diário: histórico começa a partir de 2014.01.01 00:00

OL 0 19:36:44.996 Testador EURUSD,Daily (HalifaxPlus-Live): geração de cada tick

GN 0 19:36:44.996 Testador EURUSD,Daily: teste de Experts\demo.ex5 de 2015.01.01 00:00 a 2017.11.15 00:00 iniciado

CK 0 19:36:56.288 Symbols NZDUSD: símbolo a ser sincronizado

IS 0 19:36:56.288 Símbolos NZDUSD: símbolo sincronizado, 3624 bytes de informação de símbolo recebidos

JL 0 19:36:56.288 Histórico NZDUSD: sincronização do histórico iniciada

HJ 0 19:36:56.575 Histórico NZDUSD: carregar 14 Kb de dados do histórico para sincronizar em 0:00:00.078

LS 0 19:36:56.575 Histórico NZDUSD: histórico sincronizado de 2013.01.01 a 2017.11.15

CO 0 19:36:56.579 Símbolos EURNZD: símbolo a ser sincronizado

OJ 0 19:36:56.580 Símbolos EURNZD: símbolo sincronizado, 3624 bytes de informação de símbolo recebidos

DL 0 19:36:56.580 Histórico EURNZD: sincronização do histórico iniciada

MK 0 19:36:56.656 Histórico EURNZD: carregar 27 bytes de dados do histórico para sincronizar em 0:00:00.000

OD 0 19:36:56.656 Histórico EURNZD: histórico sincronizado de 2013.01.01 a 2017.11.15

IN 0 19:36:56.665 Trade 2015.01.02 03:00:00 market buy 0.10 EURUSD (1.20538 / 1.20549 / 1.20538)

PE 0 19:36:56.665 Trades 2015.01.02 03:00:00 deal #2 buy 0.10 EURUSD at 1.20549 done(based on order #2)

FH 0 19:36:56.666 Negociação 2015.01.02 03:00:00 negócio realizado [#2 comprar 0.10 EURUSD a 1.20549]

OG 0 19:36:56.666 Trade 2015.01.02 03:00:00 ordem executada comprar 0.10 em 1.20549 [#2 comprar 0.10 EURUSD em 1.20549]

FO 0 19:36:56.670 demo (EURUSD,D1) 2015.01.02 03:00:00 Buy() method executed successfully. Código de retorno=10009 (realizado em 1.20549)

NM 2 19:37:15.823 Histórico NZDUSD 2016.09.21 23:01:00: histórico corrompido detectado (s:-73370, o:73433, h:+48, l:-123, c:-117 -- tv:63, rv:11250111)

JF 2 19:37:15.823 Histórico NZDUSD 2016.09.21, contêiner ruim encontrado, deve ser ressincronizado

LQ 2 19:37:16.106 Erro 9 no histórico do testador em uma função indefinida

OH 2 19:37:16.106 O testador parou em 0% do intervalo de teste com o erro '20 NZDUSD'


Por favor, diga-me o que está errado e como posso resolver isso?