поиск открытого ордера с заданной ценой - страница 2

 
maxsi-kmi:
Эксперт работает так:узнает текущую цену по заданной паре, узнает, есть ли открытый ордер с такой же ценой, если нет, то открывает если есть, то пишет что ордер уже есть.


Наберите в поиске через гугл: "Как правильно сравнивать числа типа double' site:mql4.com - многое прояснится...

 
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 12.03.2008                                                     |
//|  Описание : Возвращает флаг существования ордеров.                         |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (""   - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    op - операция                   (-1   - любой ордер)                    |
//|    mn - MagicNumber                (-1   - любой магик)                    |
//|    ot - время открытия             ( 0   - любое время установки)          |
//+----------------------------------------------------------------------------+
bool ExistOrders(string sy="", int op=-1, int mn=-1, datetime ot=0) {
  int i, k=OrdersTotal(), ty;

  if (sy=="0") sy=Symbol();
  for (i=0; i<k; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      ty=OrderType();
      if (ty>1 && ty<6) {
        if ((OrderSymbol()==sy || sy=="") && (op<0 || ty==op)) {
          if (mn<0 || OrderMagicNumber()==mn) {
            if (ot<=OrderOpenTime()) return(True);
          }
        }
      }
    }
  }
  return(False);
}
Везде натыкаюсь на этот код, но я не могу понять какая строка что делает, и где обявлять все "переменные" (sy,op,mn...)

 
maxsi-kmi:

Почитайте здесь https://book.mql4.com/ru/basics/functions, чтобы иметь представление, что такое ФУНКЦИЯ .

А лучше весь учебник.

О функции, почитайте здесь у автора https://www.mql5.com/ru/forum/107476/page2#67549 все доступно расписано,

там-же скрипт для тестирования .

 
r772ra:

Почитайте здесь https://book.mql4.com/ru/basics/functions, чтобы иметь представление, что такое ФУНКЦИЯ .

А лучше весь учебник.

О функции, почитайте здесь у автора https://www.mql5.com/ru/forum/107476/page2#67549 все доступно расписано,

там-же скрипт для тестирования .

Немного переделал, но не получилось..

bool ExistOrders(string sy="", int op=-1, int mn=-1, datetime ot=0) { // проверяет есть ли ордера
int i, k=OrdersTotal(), ty;
if (sy=="0") sy=Symbol(); // проверяет соответствие пары
for (i=0; i<k; i++) { //цикл перебора ордеров
ty=OrderType(); //количество ордеров
if (Bid!=OrderOpenPrice())// если цена не совпадает с ценой ордера, то открываем Buy
OrderSend(Symbol(),OP_BUY,0.1,Ask,3,Bid-15*Point,Bid+15*Point);
return(True);
}

return(False);

Но только я не могу понять где конец цикла перебора ордеров,и все равно, если цена совпадает с ценой ордера, то советник открывает еще один ордер... а не должен!

 
maxsi-kmi:

Но только я не могу понять где конец цикла перебора ордеров,и все равно, если цена совпадает с ценой ордера, то советник открывает еще один ордер... а не должен!

А если цена будет отличаться на один пункт от цены ордера, то советник тоже откроет позицию не лучше ли использовать такую функцию ?

//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 19.02.2008                                                     |
//|  Описание : Возвращает расстояние в пунктах между рынком и ближайшей       |
//|             позицей                                                        |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   ("" или NULL - текущий символ)          |
//|    op - торговая операция          (    -1      - любая позиция)           |
//|    mn - MagicNumber                (    -1      - любой магик)             |
//+----------------------------------------------------------------------------+
int DistMarketAndPos(string sy="", int op=-1, int mn=-1) {
  double d, p;
  int i, k=OrdersTotal(), r=1000000;
 
  if (sy=="" || sy=="0") sy=Symbol();
  p=MarketInfo(sy, MODE_POINT);
  if (p==0) if (StringFind(sy, "JPY")<0) p=0.0001; else p=0.01;
  for (i=0; i<k; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      if ((OrderSymbol()==sy) && (op<0 || OrderType()==op)) {
        if (mn<0 || OrderMagicNumber()==mn) {
          if (OrderType()==OP_BUY) {
            //d=MathAbs(MarketInfo(sy, MODE_ASK)-OrderOpenPrice())/p;
            d=(MarketInfo(sy, MODE_ASK)-OrderOpenPrice())/p;
            if (r>d) r=NormalizeDouble(d, 0);
          }
          if (OrderType()==OP_SELL) {
            //d=MathAbs(OrderOpenPrice()-MarketInfo(sy, MODE_BID))/p;
            d=(OrderOpenPrice()-MarketInfo(sy, MODE_BID))/p;
            if (r>d) r=NormalizeDouble(d, 0);
          }
        }
      }
    }
  }
  return(r);
}
 
н
BeerGod:

А если цена будет отличаться на один пункт от цены ордера, то советник тоже откроет позицию не лучше ли использовать такую функцию ?

напиши что делает каждая строка

int DistMarketAndPos(string sy="", int op=-1, int mn=-1) как я понимаю, здесь задается тип переменных sy, op, mn?

если, да, то почему у меня опять куча ошибок

Compiling '1.mq4'...

'(' - function definition unexpected C:\Program Files\MetaTrader 4 - RoboForex\experts\1.mq4 (35, 24)

'sy' - variable not defined C:\Program Files\MetaTrader 4 - RoboForex\experts\1.mq4 (39, 7)

'sy' - variable not defined C:\Program Files\MetaTrader 4 - RoboForex\experts\1.mq4 (39, 16)

'sy' - variable not defined C:\Program Files\MetaTrader 4 - RoboForex\experts\1.mq4 (39, 24)

'p' - variable not defined C:\Program Files\MetaTrader 4 - RoboForex\experts\1.mq4 (40, 3)

'sy' - variable not defined C:\Program Files\MetaTrader 4 - RoboForex\experts\1.mq4 (40, 16)

'p' - variable not defined C:\Program Files\MetaTrader 4 - RoboForex\experts\1.mq4 (41, 7)

'sy' - variable not defined C:\Program Files\MetaTrader 4 - RoboForex\experts\1.mq4 (41, 28)

'p' - variable not defined C:\Program Files\MetaTrader 4 - RoboForex\experts\1.mq4 (41, 41)

'p' - variable not defined C:\Program Files\MetaTrader 4 - RoboForex\experts\1.mq4 (41, 56)

'sy' - variable not defined C:\Program Files\MetaTrader 4 - RoboForex\experts\1.mq4 (44, 27)

'op' - variable not defined C:\Program Files\MetaTrader 4 - RoboForex\experts\1.mq4 (44, 35)

'op' - variable not defined C:\Program Files\MetaTrader 4 - RoboForex\experts\1.mq4 (44, 56)

'mn' - variable not defined C:\Program Files\MetaTrader 4 - RoboForex\experts\1.mq4 (45, 13)

'mn' - variable not defined C:\Program Files\MetaTrader 4 - RoboForex\experts\1.mq4 (45, 41)

'd' - variable not defined C:\Program Files\MetaTrader 4 - RoboForex\experts\1.mq4 (48, 13)

'sy' - variable not defined C:\Program Files\MetaTrader 4 - RoboForex\experts\1.mq4 (48, 27)

'p' - variable not defined C:\Program Files\MetaTrader 4 - RoboForex\experts\1.mq4 (48, 59)

'd' - variable not defined C:\Program Files\MetaTrader 4 - RoboForex\experts\1.mq4 (49, 19)

'd' - variable not defined C:\Program Files\MetaTrader 4 - RoboForex\experts\1.mq4 (49, 40)

'd' - variable not defined C:\Program Files\MetaTrader 4 - RoboForex\experts\1.mq4 (53, 13)

'sy' - variable not defined C:\Program Files\MetaTrader 4 - RoboForex\experts\1.mq4 (53, 44)

'p' - variable not defined C:\Program Files\MetaTrader 4 - RoboForex\experts\1.mq4 (53, 59)

'd' - variable not defined C:\Program Files\MetaTrader 4 - RoboForex\experts\1.mq4 (54, 19)

'd' - variable not defined C:\Program Files\MetaTrader 4 - RoboForex\experts\1.mq4 (54, 40)

'}' - unbalanced parentheses C:\Program Files\MetaTrader 4 - RoboForex\experts\1.mq4 (64, 3)

26 error(s), 0 warning(s)

 
Мил человек, функции надо помещать за последним return();} ом.
 

не вдавался в подробности что делает каждая строчка, но функция работает отлично

предупреждение при компиляции, потому что к функции нет обращений в данном примере

Function "DistMarketAndPos" is not referenced and will be removed from exp-file

//+------------------------------------------------------------------+
//|                                                         test.mq4 |
//|                        Copyright 2012, MetaQuotes Software Corp. |
//|                                        https://www.metaquotes.net |
//+------------------------------------------------------------------+
#property copyright "Copyright 2012, MetaQuotes Software Corp."
#property link      "https://www.metaquotes.net"

//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
int init()
  {
//----
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit()
  {
//----
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
  {
//----



//----
   return(0);
  }
//+----------------- Функции ----------------------------------------+

//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 19.02.2008                                                     |
//|  Описание : Возвращает расстояние в пунктах между рынком и ближайшей       |
//|             позицей                                                        |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   ("" или NULL - текущий символ)          |
//|    op - торговая операция          (    -1      - любая позиция)           |
//|    mn - MagicNumber                (    -1      - любой магик)             |
//+----------------------------------------------------------------------------+
int DistMarketAndPos(string sy="", int op=-1, int mn=-1) {
  double d, p;
  int i, k=OrdersTotal(), r=1000000;
 
  if (sy=="" || sy=="0") sy=Symbol();
  p=MarketInfo(sy, MODE_POINT);
  if (p==0) if (StringFind(sy, "JPY")<0) p=0.0001; else p=0.01;
  for (i=0; i<k; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      if ((OrderSymbol()==sy) && (op<0 || OrderType()==op)) {
        if (mn<0 || OrderMagicNumber()==mn) {
          if (OrderType()==OP_BUY) {
            //d=MathAbs(MarketInfo(sy, MODE_ASK)-OrderOpenPrice())/p;
            d=(MarketInfo(sy, MODE_ASK)-OrderOpenPrice())/p;
            if (r>d) r=NormalizeDouble(d, 0);
          }
          if (OrderType()==OP_SELL) {
            //d=MathAbs(OrderOpenPrice()-MarketInfo(sy, MODE_BID))/p;
            d=(OrderOpenPrice()-MarketInfo(sy, MODE_BID))/p;
            if (r>d) r=NormalizeDouble(d, 0);
          }
        }
      }
    }
  }
  return(r);
}
Причина обращения: