Библиотеки: MT4Orders - страница 18

 
Kirill Belousov:

Опечатка

Да, в том примере опечатка. Поправить ее уже не могу - движок форума не позволяет.

Самой библиотеки опечатка в примере, конечно, не касается.

 
fxsaber:

Да, в том примере опечатка. Поправить ее уже не могу - движок форума не позволяет.

поправили

 
o_o:

поправили

Спасибо!

 

В инклуднике mql4_to_mql5.mqh

double MarketInfo(const string Symb,const int Type)
  {
   switch(Type)
     {
      case MODE_BID:
         return(::SymbolInfoDouble(Symb, ::SYMBOL_BID));
      case MODE_ASK:
         return(::SymbolInfoDouble(Symb, ::SYMBOL_ASK));
      case MODE_DIGITS:
         return((double)::SymbolInfoInteger(Symb, ::SYMBOL_DIGITS));
      case MODE_SPREAD:
         return((double)::SymbolInfoInteger(Symb, ::SYMBOL_SPREAD));
      case MODE_STOPLEVEL:
         return((double)::SymbolInfoInteger(Symb, ::SYMBOL_TRADE_STOPS_LEVEL));
      case MODE_LOTSIZE:
         return(::SymbolInfoDouble(Symb, ::SYMBOL_TRADE_CONTRACT_SIZE));
     }

   return(-1);
  }
   return(0);
 
Kirill Belousov:

В инклуднике mql4_to_mql5.mqh

#include <MQL4_to_MQL5.mqh> // ТОЛЬКО для данного примера

Это именно пример, актуальный только для конвертации некоторых советников в описании. В данном обсуждении библиотеки были показаны гораздо лучше решения MarketInfo и другого.

В описании есть очень важное замечание, выделенное модератором (не мной)

Внимание!

Библиотека содержится только в одном файле - MT4Orders.mqh. Все остальные файлы приложены для примеров использования библиотеки. Для работы с библиотекой эти файлы не нужны.

 

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Библиотеки: MT4Orders

fxsaber, 2017.09.03 18:52

// Список изменений:
// 03.09.2017:
//   Add: Добавлены OrderTicketOpen()  - тикет MT5-сделки открытия позиции
//                  OrderOpenReason()  - причина проведения MT5-сделки открытия (причина открытия позиции)
//                  OrderCloseReason() - причина проведения MT5-сделки закрытия (причина закрытия позиции)

Пример применения

Forum on trading, automated trading systems and testing trading strategies

Last two orders

fxsaber, 2017.12.23 11:02

#include <MT4Orders.mqh>

// Возврат тикетов последних Amount-сделок, закрытых по Reason-причине
int GetLastHistoryPositions( long &Tickets[], int Amount = INT_MAX, const ENUM_DEAL_REASON Reason = DEAL_REASON_SL )
{
  int Count = ArrayResize(Tickets, 0);
  
  for (int i = OrdersHistoryTotal() - 1; (i >= 0) && (Count < Amount); i--)
    if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY) && (OrderCloseReason() == Reason))
      Tickets[ArrayResize(Tickets, ++Count) - 1] = OrderTicket();
  
  return(Count);
}

void OnStart()
{
  long Tickets[];
  
  // Последние две сделки, закрытые по SL
  for (int i = GetLastHistoryPositions(Tickets, 2) - 1; i >= 0; i--)
    Print(Tickets[i]);
}
 

Здравствуйте!  В описании написано: "Соответственно, OrderSelect в режиме SELECT_BY_TICKET в MT5 в редких случаях (в тестере) может выбрать не то, что задумывалось в MT4. "     Можете подробно написать в каких именно случаях? 

 
Jeka77769:

Здравствуйте!  В описании написано: "Соответственно, OrderSelect в режиме SELECT_BY_TICKET в MT5 в редких случаях (в тестере) может выбрать не то, что задумывалось в MT4. "     Можете подробно написать в каких именно случаях? 

Когда тикеты позиции/сделки/ордера совпадают.

 
Еще пример (описание) кроссплатформенного кода

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Советники: eaBreakeven

fxsaber, 2018.01.11 08:13

#include <MT4Orders.mqh>     // https://www.mql5.com/ru/code/16006
#include <Price_Compare.mqh> // https://www.mql5.com/ru/code/16169

input int    Breakeven           = 15;           //Breakeven in points
input int    Distance            = 5;            //Breakeven distance in points from open price of position
input int    MagicNumber         = 16112017;     //Magic number
input bool   EnableSound         = true;         //Enable/disable playing sound when breakeven set
input string SoundFile           = "alert1.wav"; //Sound file name

void OnTick()
{
  DoBreakeven();
}

double GetNewStopLoss()
{
  const double point = SymbolInfoDouble(OrderSymbol(), SYMBOL_POINT);  
  const double stop_level = SymbolInfoInteger(OrderSymbol(), SYMBOL_TRADE_STOPS_LEVEL) * point;
  
  const double price_open = OrderOpenPrice();
  const double latest_price = OrderClosePrice();  
  const double stoploss = OrderStopLoss();

  double new_stoploss = 0;
  
  //--- Move stop-loss at breakven price + Distance, if position profit greater than Breakeven points  
  return(((OrderType() == OP_BUY)  && (CP(latest_price - price_open, point) >= Breakeven * point) &&
                                      (CP(new_stoploss = price_open + Distance * point, point) > stoploss) &&
                                      (CP(latest_price - new_stoploss, point) > stop_level)) ||
         ((OrderType() == OP_SELL) && (CP(price_open - latest_price, point) >= Breakeven * point) &&
                                      ((CP(new_stoploss = price_open - Distance * point, point) < stoploss) || !stoploss) &&
                                      (CP(new_stoploss - latest_price, point) > stop_level))
         ? NormalizeDouble(new_stoploss, (int)SymbolInfoInteger(OrderSymbol(), SYMBOL_DIGITS)) : 0);
}

void DoBreakeven()
{
//If Breakeven is negative, then disable breakeven function
  if (Breakeven >= 0)      
  //Loop for positions
    for (int i = OrdersTotal() - 1; i >= 0; i--)
      if (OrderSelect(i, SELECT_BY_POS) && (OrderType() <= OP_SELL) && (!MagicNumber || (OrderMagicNumber() == MagicNumber)))
      {
        const double new_stoploss = GetNewStopLoss();
        
        if (new_stoploss)      
        {
          if (!OrderModify(OrderTicket(), OrderOpenPrice(), new_stoploss, OrderTakeProfit(), OrderExpiration()))
            Print(GetLastError());
          else if(EnableSound)
            PlaySound(SoundFile);
        }
      }
}
 

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Как изменить объем отложенного ордера?

fxsaber, 2018.01.19 16:34

#include <MT4Orders.mqh> // https://www.mql5.com/ru/code/16006

// Изменяет объем отложенного ордера. Async = true - асинхронный режим отправки приказов
bool OrderChangeLots( const long Ticket, const double Lots, const bool Async = false )
{
  return(OrderSelect(Ticket, SELECT_BY_TICKET) && (Lots != OrderLots()) && (Async
         ? (OrderDeleteAsync(Ticket) &&
            OrderSendAsync(OrderSymbol(), OrderType(), Lots, OrderOpenPrice(), 0, OrderStopLoss(), OrderTakeProfit(), OrderComment(), OrderMagicNumber(), OrderExpiration()))
         : (OrderDelete(Ticket) &&
            (OrderSend(OrderSymbol(), OrderType(), Lots, OrderOpenPrice(), 0, OrderStopLoss(), OrderTakeProfit(), OrderComment(), OrderMagicNumber(), OrderExpiration()) != -1))));
}

void OnStart()
{
  for (int i = OrdersTotal() - 1; i >= 0; i--)
    if (OrderSelect(i, SELECT_BY_POS) && (OrderType() >= OP_BUYLIMIT))
      OrderChangeLots(OrderTicket(), OrderLots() + 1, true);
}
Причина обращения: