Perguntas de Iniciantes MQL5 MT5 MetaTrader 5 - página 1096

 
EgorKim:

Tenho o tempo e o preço dos pontos A e B

Como sei o tempo e o preço do ponto C? Está no meio entre A e B.

Não consigo encontrar um exemplo em lado nenhum


//+------------------------------------------------------------------+
//| Уравнение прямой                                                 |
//+------------------------------------------------------------------+
double EquationDirect(const int left_bar,const double left_price,const int right_bar,const double right_price,const int bar_to_search) 
  {
   return(right_bar==left_bar ? left_price : (right_price-left_price)/(right_bar-left_bar)*(bar_to_search-left_bar)+left_price);
  }
//+------------------------------------------------------------------+
 
EgorKim:

Tenho o tempo e o preço dos pontos A e B

Como sei o tempo e o preço do ponto C? Está no meio entre A e B.

Não consigo encontrar um exemplo em lado nenhum.


Tempo C = Tempo B - ((Tempo B - Tempo A) / 2)

Preço no Tempo C

 
Сергей Таболин:

Tempo C = Tempo B - ((Tempo B - Tempo A) / 2)

Preço por Tempo C

Verifiquei-o, às vezes tenho um fim-de-semana)

Existe alguma forma de descobrir o centro da linha em si?

Aqui está a minha linha

void SetLow(double price_1,double price_2,datetime time_1,datetime time_2)
  {
   ObjectCreate(0,"Low",OBJ_TREND,0,time_2,price_2,time_1,price_1);
   ObjectSetInteger(0,"Low",OBJPROP_COLOR,clrAqua);
   ObjectSetInteger(0,"Low",OBJPROP_WIDTH,2);
   ObjectSetInteger(0,"Low",OBJPROP_STYLE,STYLE_DOT);
   ObjectSetInteger(0,"Low",OBJPROP_BACK,false);
   ObjectSetInteger(0,"Low",OBJPROP_RAY_RIGHT,true);
  }
 
Igor Makanu:

como se descobre o bilhete da última encomenda aberta? não funciona dessa forma:

O que quer saber exactamente? Precisamos de distinguir claramente entre os termos ORDEM, ORDEM e POSIÇÃO.

Segundo: Provocou imediatamente confusão ao nomear os objectos da classe CTrade "order_1" " "order_2". Costumavam chamar aos objectos de classe CTrade "m_trade_1" e "m_trade_2". Não afecta a usabilidade, mas acrescenta muita confusão.

Terceiro: o métodoPositionClose não funciona apenas porque lhe passa um bilhete de posição igual a zero (e inicializa-os com zero no OnInit() ) - Tais condições ideais, quando a primeira posição tem um bilhete "0", só podem ser obtidas no testador.

Quarto: O método decompra

Nota

A conclusão bem sucedida do método Buy(...) nem sempre significa uma operação comercial bem sucedida. Deve-se verificar o resultado do pedido de troca (código de retorno do servidor de troca) chamando o métodoResultRetcode() bem comoo valor retornado pelo métodoResultDeal().


MétodoResultDeal()

Recebe o bilhete de LEITURA.

 
Vladimir Karputov:

O que quer saber exactamente? É necessário distinguir claramente entre os termos ORDEM, ORDEM e POSIÇÃO.

Em segundo lugar, causou imediatamente confusão ao nomear objectos da classe CTrade com as palavras "order_1" e "order_2". Costumavam chamar aos objectos de classe CTrade "m_trade_1" e "m_trade_2". Não afecta a usabilidade, mas acrescenta muita confusão.

Terceiro: o métodoPositionClose não funciona apenas porque lhe passa um bilhete de posição igual a zero (e inicializa-os com zero no OnInit() ) - Tais condições ideais, quando a primeira posição tem um bilhete "0", só podem ser obtidas no testador.

Quarto: O método decompra

Nota

A conclusão bem sucedida do método Buy(...) nem sempre significa uma operação comercial bem sucedida. Deve-se verificar o resultado do pedido de troca ( código de retorno do servidor de troca) chamando o método ResultRetcode() bem comoo valor retornado pelo métodoResultDeal().


MétodoResultDeal()

Obtém o bilhete RECEBIDO.

Obrigado! Já o descobrimos

em geral, o problema era da abundância de informação, mexericos e oportunidades.... tinha a certeza de que não conseguiria apanhar um bilhete em Resultado(), porque o evento OnTradeTransaction() é lembrado de vez em quando ... e está ligado!

estou actualmente a trabalhar nisso com o testador MT5, estou apenas à procura de exemplos reprodutíveis, não estou a falar do código funcional - apenas de um testador por agora

mais uma vez obrigado pela ajuda!

este código pode obter os bilhetes das últimas encomendas no testador:

//+------------------------------------------------------------------+
//|                                                   tst_CTrade.mq5 |
//|                                                            IgorM |
//|                              https://www.mql5.com/ru/users/igorm |
//+------------------------------------------------------------------+
#property copyright "IgorM"
#property link      "https://www.mql5.com/ru/users/igorm"
#property version   "1.00"

input double Lot_1 = 0.10;
input double Lot_2 = 0.20;
input ulong  Magic1 = 12345;
input ulong  Magic2 = 67890;
#include<Trade\Trade.mqh>
 CTrade order_1,order_2;
ulong   ticket_1,ticket_2;
//_______________________________________________________________________ 
class CNewbar
  {
private:
   datetime          mnewtime;
   ENUM_TIMEFRAMES   mperiod;
public:
                     CNewbar()                        { mperiod=PERIOD_CURRENT;  mnewtime=TimeCurrent(); }
                     CNewbar(ENUM_TIMEFRAMES period)  { mperiod=period;          mnewtime=TimeCurrent(); }
   bool              NewBar(){ datetime t=iTime(NULL,mperiod,0); if(mnewtime<t){ mnewtime=t; return(true); } return(false);  }
  };
//_______________________________________________________________________ 

CNewbar Bar_H1(PERIOD_H1);
CNewbar Bar_M30(PERIOD_M30);
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
   order_1.SetExpertMagicNumber(Magic1);
   order_2.SetExpertMagicNumber(Magic2);
   ticket_1 = 0;
   ticket_2 = 0;
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   if(Bar_H1.NewBar())
     {
      order_1.PositionClose(ticket_1);
      if(order_1.Buy(Lot_1))
        {
         ticket_1=order_1.ResultOrder();
         Print("NewBar H1, ticket_1 = ",ticket_1);
        }
     }

   if(Bar_M30.NewBar())
     {
      order_2.PositionClose(ticket_2);
      if(order_2.Sell(Lot_2))
        {
         ticket_2=order_2.ResultOrder();
         Print("NewBar M30, ticket_2 = ",ticket_2);
        }
     }
  }
//+------------------------------------------------------------------+
 
Igor Makanu:

Obrigado! Já o tinha percebido.

de um modo geral o problema era da abundância de informação, mexericos e possibilidades.... tinha a certeza que não conseguia apanhar o bilhete em Resultado(), porque o evento OnTradeTransaction() é lembrado de vez em quando ... e está ligado!

estou actualmente a trabalhar nisso com o testador MT5, estou apenas à procura de exemplos reprodutíveis, não estou a falar do código funcional - apenas de um testador por agora

mais uma vez obrigado pela ajuda!

Tal código pode obter as carraças das últimas encomendas no testador:

Sim, utilizando ResultOrder obterá o bilhete de encomenda.

 
Vladimir Karputov:

Sim com ResultOrder o bilhete de encomenda é obtido.

Ok, agora não tenho nenhum problema com ele, mas apareceu outro problema ao usar o CTrade: tenho um bilhete de encomenda memorizado e posso fechá-lo usando o PositionClose(m_ticket)

Na MQL4, foi muito fácil descobrir se a encomenda está fechada ou não. Seleccionei-a usando OrderSelect() e verifiquei se(OrderCloseTime()>0) - se a hora de fecho não for igual a 0, a encomenda está fechada

Como posso saber se uma encomenda é fechada usando SB CTrade ?

 
Igor Makanu:

OK, agora não tenho problemas com ele, mas surgiu outro problema ao utilizar o CTrade: tenho um bilhete de encomenda memorizado e posso fechá-lo utilizando o PositionClose(m_ticket)

Na MQL4, foi muito fácil descobrir se a encomenda está fechada ou não. Seleccionei-a usando OrderSelect() e verifiquei se(OrderCloseTime()>0) - se a hora de fecho não for igual a 0, a encomenda está fechada

como sei que a encomenda é fechada utilizando SB CTrade ?

Esqueça a encomenda! Há uma posição!

Perguntei-lhe especificamente o que pretende: uma ORDEM, uma TOMADA OU uma POSIÇÃO? Não confundir a terminologia. Após a execução da ordem de comércio, aparece a POSIÇÃO, não a ENCOMENDA!


Portanto, descreva primeiro em palavras o que está a fazer e o que pretende obter. Em vez de uma ENCOMENDA, utilizar "BUY trade order" e "SELL trade order". Isto resulta numa posição "COMPRAR" ou "VENDER".

 
Igor Makanu:

OK, agora não tenho problemas com ele, mas surgiu outro problema ao utilizar o CTrade: tenho um bilhete de encomenda memorizado e posso fechá-lo utilizando o PositionClose(m_ticket)

Na MQL4, foi muito fácil descobrir se a encomenda está fechada ou não. Seleccionei-a usando OrderSelect() e verifiquei se(OrderCloseTime()>0) - se a hora de fecho não for igual a 0, a encomenda está fechada

Como posso saber se uma encomenda é fechada usando SB CTrade ?

Deixando de lado o facto de um bilhete de posição corresponder normalmente a um bilhete de encomenda, mas nem sempre, é possível utilizar a função PositionSelectByTicket sem SB

Документация по MQL5: Торговые функции / PositionSelectByTicket
Документация по MQL5: Торговые функции / PositionSelectByTicket
  • www.mql5.com
Выбирает открытую позицию для дальнейшей работы с ней по указанному тикету. Возвращает true при успешном завершении функции. Возвращает false при неудачном завершении функции. Чтобы получить информацию об ошибке, необходимо вызвать функцию GetLastError(). Функция PositionSelectByTicket() копирует данные о позиции в программное окружение, и...
 
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {

Posso substituir a minha própria fórmula de cálculo neste código de cálculo de indicador?

Por exemplo, aberto/2