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

 
ilvic:

Можно пример как заставить этого mt5 советника работать на mt4orders?

https://www.mql5.com/ru/code/17464

Этот советник с MT4 был портирован в MT5-style, а теперь Вы хотите его еще обратно портировать.

Это можно сделать, конечно. Но без меня, к сожалению.

 
fxsaber:

Этот советник с MT4 был портирован в MT5-style, а теперь Вы хотите его еще обратно портировать.

Это можно сделать, конечно. Но без меня, к сожалению.

А можно пример мт4 варианта?

https://www.mql5.com/ru/code/7712

На подобии того как вы сделали с Spreader

// Это MT5-советник, который позволяет запускать соответствующий
// MT4-советник в мультивалютном MT5(Hedge)-тестере (с реальными тиками)

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

//#include "Spreader_v1.mq4" // https://www.mql5.com/ru/code/9484
#include "Spreader_v2.mq4" // https://www.mql5.com/ru/code/9495

void OnTick()
{
  start();
}
5_8 MACross
5_8 MACross
  • www.mql5.com
Bad Orders Советник BadOrders. Простенький советник. Breadandbutter2 Советник breadandbutter2. Опирается на индикаторы ADX и MA. 1h-4h-1d Советник 1h-4h-1d. Опирается на...
 
ilvic:

А можно пример мт4 варианта?

https://www.mql5.com/ru/code/7712

На подобии того как вы сделали с Spreader

К сожалению, MQL4_To_MQL5.mqh в свое время не был создан для конвертации и индикаторов. А в коде они присутствуют

   //Caculate indicators
   double fast1=iMA(NULL,0,mafastperiod,mafastshift,mafastmethod,mafastprice,1);
   double fast2=iMA(NULL,0,mafastperiod,mafastshift,mafastmethod,mafastprice,2);
   double slow1=iMA(NULL,0,maslowperiod,maslowshift,maslowmethod,maslowprice,1);
   double slow2=iMA(NULL,0,maslowperiod,maslowshift,maslowmethod,maslowprice,2);

Дописывать не буду. Возможно, кто-то согласится. Статьи на эту темы были.

 

fxsaber

На мт5 работает не корректно по сравнению с мт4. Открывает сделку и тут же её закрывает.

В чем может быть проблема?

#ifdef __MQL5__
double MarketInfo( const string Symb, const ENUM_SYMBOL_INFO_DOUBLE Property )  { return(SymbolInfoDouble(Symb, Property)); }
int    MarketInfo( const string Symb, const ENUM_SYMBOL_INFO_INTEGER Property ) { return((int)SymbolInfoInteger(Symb, Property)); }

#define StrToInteger StringToInteger 
#define StrToDouble StringToDouble
#define MODE_MINLOT SYMBOL_VOLUME_MIN
#define MODE_POINT     SYMBOL_POINT
#define MODE_BID       SYMBOL_BID
#define MODE_ASK       SYMBOL_ASK

void OnInit( void ) { init(); }

#include <MT4Orders.mqh>

#endif // __MQL5__

#include "simple_copier.mq4"
Файлы:
 
ilvic:

fxsaber

На мт5 работает не корректно по сравнению с мт4. Открывает сделку и тут же её закрывает.

В чем может быть проблема?

Быстро по коду пробежался. Странно, что под MT4 были написаны такие условия

if(!OrderSend(symbol_,type_,LotNormalize(lot_),price_,slip,0,0,"C4F"+IntegerToString(ticket_))) Print("Error: ",GetLastError()," during setting the pending order.");

До Print никогда не дойдет. А код, конечно, убийца HDD.


Подрихтовал для кроссплатформенности.

Файлы:
 

fxsaber

Спасибо за помощь. Но проблема та же.

Открывает ордер и тут же его закрывает. И так каждую секунду по кругу и без остановки.

На мт4 такой проблемы нет. 

 
ilvic:

Спасибо за помощь. Но проблема та же.

Открывает ордер и тут же его закрывает. И так каждую секунду по кругу и без остановки.

На мт4 такой проблемы нет. 

К сожалению, у меня нет возможности разобраться в Вашей проблеме.

 
// Список изменений:
// 26.11.2018
//   Fix: Мэджик и комментарий закрытой MT4-позиции: приоритет у соответствующих полей открывающих сделок выше, чем у закрывающих.
//   Fix: Учитывается редкое изменение MT5-OrdersTotal и MT5-PositionsTotal во время расчета MT4-OrdersTotal и MT4-OrderSelect.
//   Fix: Ордера, которые открыли позицию, но не успели удалиться MT5, библиотекой больше не учитываются.

По выделенному. Такой скрипт

#include <MT4Orders.mqh>
#include <Debug.mqh> // https://c.mql5.com/3/173/Debug.mqh

#define Ask SymbolInfoDouble(_Symbol, SYMBOL_ASK)

void OnStart()
{
  OrderSend(_Symbol, OP_BUYLIMIT, 0.1, Ask, 0, 0, 0);
  
  int Total = _P(OrdersTotal());
  
  while (!IsStopped())
  {
    const int NewTotal = OrdersTotal();
    
    if (Total != NewTotal)
    {
      _P(NewTotal);

//      if (NewTotal < Total)
//        Alert("https://www.mql5.com/ru/forum/290673#comment_9493241");
      
      Total = NewTotal;
    }
  }
}

на Hedge-счетах выдавал раньше

2018.11.26 15:27:46.513 void OnStart(), Line = 10: OrdersTotal() = 1
2018.11.26 15:27:56.128 void OnStart(), Line = 18: NewTotal = 2
2018.11.26 15:27:56.128 void OnStart(), Line = 18: NewTotal = 1


Теперь только это

2018.11.26 15:30:29.224 void OnStart(), Line = 10: OrdersTotal() = 1


Для Netting-счетов во всех случаях побороть MT5-казус (исполненный ордер не удален) пока не удалось. Т.е. библиотека не умеет (собственно, и не должна) во всех случаях обходить недоработки самой MT5-платформы.

 
fxsaber:
библиотека не умеет (собственно, и не должна) во всех случаях обходить недоработки самой MT5-платформы.

Например, эту

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

Непонятная ситуация при срабатывании отложенных ордеров.

fxsaber, 2018.11.26 13:37

Еще бывает такая ситуация:

  1. Выставили открывающий позицию маркет-ордер и OrdersTotal увеличился на единицу.
  2. Он исполнился и OrdersTotal уменьшился на единицу, но при этом PositionsTotal не увеличился на единицу. Т.е. существует позиция, но Терминал о ней не знает.

Например, нет ни позиций, ни ордеров - PositionsTotal = 0, OrdersTotal = 0.

Выставляете маркет-ордер. При этом PositionsTotal = 0, OrdersTotal = 1.

Маркет-ордер исполнился - OrdersTotal = 0. Но PositionsTotal = 0!

Нарваться на эту ситуацию - надо постараться. Заметить ее - еще сложнее. Но MT5 создает такие фокусы.

MT4Orders максимально старается подобные вещи обходить, но это не всегда возможно. Пытаются ли авторы ТС учесть такие недоработки платформы на чистом MQL5 или СБ, остается только гадать. Вряд ли.

 
// Демонстрация способа ручной отправки торговых приказов в Визуализатор.

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

#define Bid SymbolInfoDouble(_Symbol, SYMBOL_BID)
#define Ask SymbolInfoDouble(_Symbol, SYMBOL_ASK)

bool IsModify()
{
  static long PrevTime = 0;
  
  const long NewTime = FileGetInteger(__FILE__, FILE_MODIFY_DATE);
  const bool Res = (PrevTime != NewTime);
  
  if (Res)
    PrevTime = NewTime;
    
  return(Res);  
}

bool CreateFile()
{
  uchar Bytes[];
      
  return(FileSave(__FILE__, Bytes) && IsModify());
}

string GetCommand()
{
  uchar Bytes[];
  FileLoad(__FILE__, Bytes);
  
  return(CharArrayToString(Bytes));
}

bool OrdersScan( const int Type )
{
  for (int i = ::OrdersTotal() - 1; i >= 0; i--)
    if (OrderSelect(i, SELECT_BY_POS) && (OrderType() == Type))      
      return(true);    
    
  return(false);  
}

bool SendCommand( const string Command, const double Lot = 1, const int Offset = 100 )
{
  bool Res = false;
  
  if (Command == "open buy")  
    Res = (OrderSend(_Symbol, OP_BUY, Lot, Ask, 0, 0, 0) > 0);
  else if (Command == "open sell")  
    Res = (OrderSend(_Symbol, OP_SELL, Lot, Bid, 0, 0, 0) > 0);
  else if (Command == "open buylimit")  
    Res = (OrderSend(_Symbol, OP_BUYLIMIT, Lot, Ask - Offset * _Point, 0, 0, 0) > 0);
  else if (Command == "open selllimit")  
    Res = (OrderSend(_Symbol, OP_SELLLIMIT, Lot, Bid + Offset * _Point, 0, 0, 0) > 0);
  else if (Command == "close buy")  
    Res = OrdersScan(OP_BUY) && OrderClose(OrderTicket(), OrderLots(), OrderClosePrice(), 0);
  else if (Command == "close sell")
    Res = OrdersScan(OP_SELL) && OrderClose(OrderTicket(), OrderLots(), OrderClosePrice(), 0);
  else if (Command == "close buylimit")  
    Res = OrdersScan(OP_BUYLIMIT) && OrderDelete(OrderTicket());
  else if (Command == "close selllimit")
    Res = OrdersScan(OP_SELLLIMIT) && OrderDelete(OrderTicket());
    
  return(Res);
}

bool TesterManual()
{
  static const bool IsVisual = MQLInfoInteger(MQL_VISUAL_MODE) && CreateFile();
  
  return(IsVisual && IsModify() && SendCommand(GetCommand()));
}

void OnTick()
{
  TesterManual();
}


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