Preguntas de los principiantes MQL5 MT5 MetaTrader 5 - página 1096

 
EgorKim:

Tengo el tiempo y el precio de los puntos A y B

¿Cómo puedo saber la hora y el precio del punto C? Está en el medio entre A y B.

No puedo encontrar un ejemplo en ningún sitio


//+------------------------------------------------------------------+
//| Уравнение прямой                                                 |
//+------------------------------------------------------------------+
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:

Tengo el tiempo y el precio de los puntos A y B

¿Cómo puedo saber la hora y el precio del punto C? Está en el medio entre A y B.

No puedo encontrar un ejemplo en ningún sitio.


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

Precio en el momento C

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

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

Precio por tiempo C

Lo he comprobado, a veces tengo un fin de semana)

¿Hay alguna forma de averiguar el centro en la propia línea?

Esta es mi línea

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:

¿cómo se averigua el ticket del último pedido abierto? no funciona así:

¿Qué quiere saber exactamente? Hay que distinguir claramente entre los términos ORDEN, ORDEN y POSICIÓN.

Segundo: Ha provocado inmediatamente una confusión al nombrar los objetos de la clase CTrade "orden_1" " "orden_2". Solían llamar a los objetos de la clase CTrade "m_trade_1" y "m_trade_2". No afecta a la usabilidad, pero añade mucha confusión.

Tercero: el métodoPositionClose no funcionará sólo porque le pasas un ticket de posición igual a cero (y los inicializas con cero en OnInit() ) - Estas condiciones ideales, cuando la primera posición tiene una entrada "0", sólo pueden obtenerse en el probador.

Cuarto: El método decompra

Nota

La finalización con éxito del método Buy(...) no siempre significa una operación comercial exitosa. Se debe comprobar el resultado de la solicitud de comercio (código de retorno del servidor de comercio) llamando al métodoResultRetcode() así comoel valor devuelto por el métodoResultDeal().


MétodoResultDeal()

Obtiene el ticket de lectura.

 
Vladimir Karputov:

¿Qué quiere saber exactamente? Hay que distinguir claramente entre los términos ORDEN, ORDEN y POSICIÓN.

En segundo lugar, ha provocado inmediatamente una confusión al nombrar los objetos de la clase CTrade con las palabras "orden_1" y "orden_2". Solían llamar a los objetos de la clase CTrade "m_trade_1" y "m_trade_2". No afecta a la usabilidad, pero añade mucha confusión.

Tercero: el métodoPositionClose no funcionará sólo porque le pasas un ticket de posición igual a cero (y los inicializas con cero en OnInit() ) - Estas condiciones ideales, cuando la primera posición tiene un billete "0", sólo pueden obtenerse en el probador.

Cuarto: El método decompra

Nota

La finalización con éxito del método Buy(...) no siempre significa una operación comercial exitosa. Se debe comprobar el resultado de la solicitud de comercio ( código de retorno del servidor de comercio) llamando al método ResultRetcode() así comoel valor devuelto por el métodoResultDeal().


MétodoResultDeal()

Obtiene el billete RECIBIDO.

Gracias. Ya me lo imaginé

en general, el problema era de la abundancia de información, chismes y oportunidades.... estaba seguro de que no podría atrapar una entrada en Result(), porque el evento OnTradeTransaction() se recuerda de vez en cuando ... ¡y está en marcha!

Actualmente estoy trabajando en ello con MT5 tester, sólo estoy buscando ejemplos reproducibles, no estoy hablando del código funcional - sólo un probador por ahora

¡gracias de nuevo por la ayuda!

este código puede obtener las entradas de los últimos pedidos en el probador:

//+------------------------------------------------------------------+
//|                                                   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:

Gracias. Ya lo he descubierto.

en general el problema era por la abundancia de información, chismes y posibilidades.... estaba seguro de que no podía coger la entrada en Result(), porque el evento OnTradeTransaction() se recuerda de vez en cuando ... ¡y está en marcha!

Actualmente estoy trabajando en ello con MT5 tester, sólo estoy buscando ejemplos reproducibles, no estoy hablando del código funcional - sólo un probador por ahora

¡gracias de nuevo por la ayuda!

Dicho código puede obtener los ticks de las últimas órdenes en el probador:

Sí, utilizando ResultOrder obtendrá el ticket de pedido.

 
Vladimir Karputov:

Sí, con ResultOrder podemos obtener un ticket para el pedido.

Ok, ahora no tengo ningún problema con ello, pero ha aparecido otro problema al usar CTrade: tengo un ticket de orden memorizado y puedo cerrarlo usando PositionClose(m_ticket)

En MQL4, era muy fácil averiguar si la orden está cerrada o no. La seleccioné usando OrderSelect() y comprobé if(OrderCloseTime()>0) - si la hora de cierre no es igual a 0, la orden está cerrada

¿Cómo puedo saber si una orden está cerrada con SB CTrade?

 
Igor Makanu:

Bien, ahora no tengo ningún problema con ello, pero ha aparecido otro problema al usar CTrade: tengo un ticket de orden memorizado y puedo cerrarlo usando PositionClose(m_ticket)

En MQL4, era muy fácil averiguar si la orden está cerrada o no. La seleccioné usando OrderSelect() y comprobé if(OrderCloseTime()>0) - si la hora de cierre no es igual a 0, la orden está cerrada

¿Cómo sé que la orden está cerrada con SB CTrade?

¡Olvídate del orden! ¡Hay un puesto!

He preguntado específicamente qué quieres: ¿una ORDEN, una TOMA O una POSICIÓN? No hay que confundir la terminología. Una vez ejecutada la orden comercial, aparece la POSICIÓN, ¡no la ORDEN!


Por lo tanto, primero describa con palabras lo que está haciendo y lo que quiere obtener. En lugar de una ORDEN, utilice "orden de compra" y "orden de venta". El resultado es una posición de "COMPRA" o "VENTA".

 
Igor Makanu:

Bien, ahora no tengo ningún problema con ello, pero ha aparecido otro problema al usar CTrade: tengo un ticket de orden memorizado y puedo cerrarlo usando PositionClose(m_ticket)

En MQL4, era muy fácil averiguar si la orden está cerrada o no. La seleccioné usando OrderSelect() y comprobé if(OrderCloseTime()>0) - si la hora de cierre no es igual a 0, la orden está cerrada

¿Cómo puedo saber si una orden está cerrada con SB CTrade?

Dejando de lado el hecho de que un ticket de posición suele corresponder a un ticket de orden, pero no absolutamente siempre, es posible utilizar la función PositionSelectByTicket sin 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[])
  {

¿Puedo sustituir mi propia fórmula de cálculo en este código de cálculo del indicador?

Por ejemplo, open/2