Вопросы от начинающих MQL5 MT5 MetaTrader 5 - страница 1096

 
EgorKim:

У меня есть время и цена точек A и В

Как узнать время и цену точки С ?  Она посередине между A и В

Не найду нигде примера


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

У меня есть время и цена точек A и В

Как узнать время и цену точки С ?  Она посередине между A и В

Не найду нигде примера


Время С = Время Б - ( (Время Б - Время А) / 2)

Цена по Времени С

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

Время С = Время Б - ( (Время Б - Время А) / 2)

Цена по Времени С

Проверил, иногда попадаю на выходные)

А можно как то в самой линии центр узнать?

Вот моя линия

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:

как узнать тикет последнего открытого ордера? так не работает:

Что именно Вы хотите узнать? Нужно четко разделять понятия ОРДЕР, СДЕЛКА и ПОЗИЦИЙ.

Второе: сразу внесли путаницу наименовав объекты торгового класса CTrade словами "order_1" " "order_2". Объекты класса CTrade принято называть "m_trade_1" и "m_trade_2". Это на работоспособность не влияет, но путаницу вносит.

Третье: метод PositionClose не сработает уже только потому, что вы ему передаёте тикет позиции равный нулю (а нулём Вы их инициализируете в OnInit() ) - таких идеальных условий, когда первая позиция имеет тикет "0" можно получить только в тестере.

Четвёртое: метод Buy

Примечание

Успешное окончание работы метода Buy(...) не всегда означает успешное совершение торговой операции. Необходимо проверять результат выполнения торгового запроса ( код возврата торгового сервера) вызовом метода  ResultRetcode(), а также значение, возвращаемое методом ResultDeal().


Метод ResultDeal()

Получает тикет СДЕЛКИ.

 
Vladimir Karputov:

Что именно Вы хотите узнать? Нужно четко разделять понятия ОРДЕР, СДЕЛКА и ПОЗИЦИЙ.

Второе: сразу внесли путаницу наименовав объекты торгового класса CTrade словами "order_1" " "order_2". Объекты класса CTrade принято называть "m_trade_1" и "m_trade_2". Это на работоспособность не влияет, но путаницу вносит.

Третье: метод PositionClose не сработает уже только потому, что вы ему передаёте тикет позиции равный нулю (а нулём Вы их инициализируете в OnInit() ) - таких идеальных условий, когда первая позиция имеет тикет "0" можно получить только в тестере.

Четвёртое: метод Buy

Примечание

Успешное окончание работы метода Buy(...) не всегда означает успешное совершение торговой операции. Необходимо проверять результат выполнения торгового запроса ( код возврата торгового сервера) вызовом метода  ResultRetcode(), а также значение, возвращаемое методом ResultDeal().


Метод ResultDeal()

Получает тикет СДЕЛКИ.

Спасибо! разобрался уже

в общем проблема была от обилия информации, сплетен и возможностей.... была уверенность, что в Result() не смогу поймать тикет, ибо через раз начинают вспоминать событие OnTradeTransaction() ... и понеслось!

сейчас с тестером МТ5 разбираюсь, пока нужны просто воспроизводимые примеры, речи не идет о функциональном коде - пока только тестер

еще раз спасибо за помощь!

такой код может получить тикеты последних ордеров в тестере:

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

Спасибо! разобрался уже

в общем проблема была от обилия информации, сплетен и возможностей.... была уверенность, что в Result() не смогу поймать тикет, ибо через раз начинают вспоминать событие OnTradeTransaction() ... и понеслось!

сейчас с тестером МТ5 разбираюсь, пока нужны просто воспроизводимые примеры, речи не идет о функциональном коде - пока только тестер

еще раз спасибо за помощь!

такой код может получить тикеты последних ордеров в тестере:

Да при помощи ResultOrder получится тикет ордера.

 
Vladimir Karputov:

Да при помощи ResultOrder получится тикет ордера.

ОК, с этим проблем теперь не наблюдаю, но очередная проблема появилась при использовании CTrade: вот имею запомненный тикет ордера, могу закрыть по тикету с помощью PositionClose(m_ticket)

а как узнать закрыт ли у меня ордер или нет, в MQL4 это было просто: выбрал ордер через OrderSelect() и проверил  if(OrderCloseTime()>0) - если время закрытия не равно 0, то ордер закрыт

как узнать, что ордер закрыт  используя СБ CTrade ?

 
Igor Makanu:

ОК, с этим проблем теперь не наблюдаю, но очередная проблема появилась при использовании CTrade: вот имею запомненный тикет ордера, могу закрыть по тикету с помощью PositionClose(m_ticket)

а как узнать закрыт ли у меня ордер или нет, в MQL4 это было просто: выбрал ордер через OrderSelect() и проверил  if(OrderCloseTime()>0) - если время закрытия не равно 0, то ордер закрыт

как узнать, что ордер закрыт  используя СБ CTrade ?

Забудьте про ОРДЕР! Есть позиция!

Я ведь сразу спросил: что именно Вам нужно: ОРДЕР, СДЕЛКА или ПОЗИЦИЯ? Не путайте терминологию. После исполнения торгового приказа появляется ПОЗИЦИЯ! Не ОРДЕР!


Поэтому сначала словами опишите, что делаете и что хотите получить. Вместо ОРДЕР применяйте "торговый приказ BUY" и "торговый приказ SELL". В результате получаем "позиция BUY" или "позиция SELL".

 
Igor Makanu:

ОК, с этим проблем теперь не наблюдаю, но очередная проблема появилась при использовании CTrade: вот имею запомненный тикет ордера, могу закрыть по тикету с помощью PositionClose(m_ticket)

а как узнать закрыт ли у меня ордер или нет, в MQL4 это было просто: выбрал ордер через OrderSelect() и проверил  if(OrderCloseTime()>0) - если время закрытия не равно 0, то ордер закрыт

как узнать, что ордер закрыт  используя СБ CTrade ?

Если не учитывать, что тикет позиции как правило соответствует тикету ордера, но не факт что абсолютно всегда, то можно воспользоваться без СБ функцией PositionSelectByTicket

Документация по 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[])
  {

В этот код расчета индикатора можно подставить свою формулу расчета?

Например open/2

Причина обращения: