Подскажите!

 

Подскажите что не так?

Я взял у Кима функцию ExistOPNearMarket которая возвращает флаг существования позиции или ордера около рынка. Но я хочу немного переделать под себя мне нужно, что бы эта функция проверяла, есть ли ордер в заданном мной коридоре цены от текущей рыночной цены. Например, сейчас цена по евро 1.5788 и мне нужно знать есть ли в коридоре от верхней границы 1.5788 + 0,0005= 1.5793 до нижней границы 1.5788 - 0,0005=1.5783 ордер, если хотя бы на один пункт выше/ниже указанной границы то меня они меня не интересует…

Я переделал только 2 строчки было так

if (ot==OP_BUY || ot==OP_BUYLIMIT || ot==OP_BUYSTOP) {

if (MathAbs(MarketInfo(sy, MODE_ASK)-OrderOpenPrice())<ds*p) return(True);

}

if (ot==OP_SELL || ot==OP_SELLLIMIT || ot==OP_SELLSTOP) {

if (MathAbs(OrderOpenPrice()-MarketInfo(sy, MODE_BID))<ds*p) return(True);


А сделал так


if (ot==OP_BUY || ot==OP_BUYLIMIT || ot==OP_BUYSTOP) {
if ((MathAbs(OrderOpenPrice()-MarketInfo(sy, MODE_BID))-ds1*p)<(MathAbs(MarketInfo(sy, MODE_ASK)-OrderOpenPrice())<ds2*p)) return(True);
}
if (ot==OP_SELL || ot==OP_SELLLIMIT || ot==OP_SELLSTOP) {
if ((MathAbs(OrderOpenPrice()-MarketInfo(sy, MODE_BID))-ds1*p)<(MathAbs(OrderOpenPrice()-MarketInfo(sy, MODE_BID))<ds2*p)) return(True);


И добавил только в заголовке функции int ds2=5

PS - С точки зрения математики это должно быть похоже на это условие 1<2<3.

Но, что то не так!!!



Вот сам скрипт.

#property copyright "Copyright © 2008, MetaQuotes Software Corp."
#property link "https://www.metaquotes.net"
//+------------------------------------------------------------------+
//| script program start function |
//+------------------------------------------------------------------+
int start()
{
string sy="EURUSD";
int op=-1;
int mn=-1;
int ds1=35;
int ds2=10;
if(!ExistOPNearMarket(sy,op,mn,ds1,ds2)){Alert("Нет ордера в этом диапозоне!(от текущей цены)","+ ",ds1,"п."," - ",ds2,"п.");}
if(ExistOPNearMarket(sy,op,mn,ds1,ds2)){Alert("Есть ордер в этом диапозоне!(от текущей цены)","+ ",ds1,"п."," - ",ds2,"п.");}
return(0);
}
//+----------------------------------------------------------------------------+
//| Автор : Ким Игорь В. aka KimIV, http://www.kimiv.ru |
//+----------------------------------------------------------------------------+
//| Версия : 19.02.2008 |
//| Описание : Возвращает флаг существования позиции или ордера около рынка |
//+----------------------------------------------------------------------------+
//| Параметры: |
//| sy - наименование инструмента ("" или NULL - текущий символ) |
//| op - торговая операция ( -1 - любая операция) |
//| mn - MagicNumber ( -1 - любой магик) |
//| ds - расстояние в пунктах от рынка ( 1000000 - по умолчанию) |
//+----------------------------------------------------------------------------+
bool ExistOPNearMarket(string sy="EURUSD", int op=-1, int mn=-1, int ds1=5, int ds2=5) {
int i, k=OrdersTotal(), ot;
if (sy=="EURUSD" || sy=="0") sy=Symbol();
double 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)) {
ot=OrderType();
if ((OrderSymbol()==sy) && (op<0 || ot==op)) {
if (mn<0 || OrderMagicNumber()==mn) {
if (ot==OP_BUY || ot==OP_BUYLIMIT || ot==OP_BUYSTOP) {
if ((MathAbs(OrderOpenPrice()-MarketInfo(sy, MODE_BID))-ds1*p)<(MathAbs(MarketInfo(sy, MODE_ASK)-OrderOpenPrice())<ds2*p)) return(True);
}
if (ot==OP_SELL || ot==OP_SELLLIMIT || ot==OP_SELLSTOP) {
if ((MathAbs(OrderOpenPrice()-MarketInfo(sy, MODE_BID))-ds1*p)<(MathAbs(OrderOpenPrice()-MarketInfo(sy, MODE_BID))<ds2*p)) return(True);
}}}}}
return(False);
}

 

В этой функции не надо ничего изменять ( тем более так криво как у Вас). Она и так выполняет необходимое вам действие.


ds - расстояние в пунктах от рынка ( 1000000 - по умолчанию) |

Пользуйтесь этой переменной функции с указанием дистанции в 5 пунктов (например) Она и определяет ширину коридора от текущей цены вверх и вниз (по 5 пунктов соответственно)

 
D500_Rised писал (а) >>

В этой функции не надо ничего изменять ( тем более так криво как у Вас). Она и так выполняет необходимое вам действие.


ds - расстояние в пунктах от рынка ( 1000000 - по умолчанию) |

Пользуйтесь этой переменной функции с указанием дистанции в 5 пунктов (например) Она и определяет ширину коридора от текущей цены вверх и вниз (по 5 пунктов соответственно)

Что-то я не понимаю!

Я восстановил все как было у Кима но что то у меня не получается или я не понимаю…

У меня открыта позиция на расстоянии по цене 1.5753 сейчас цена 1.5788 разница между ценой открытия и рыночной ценой в 35 пунктов.

Указываю в скрипте ds=36 что на 1 пункт больше(т.е. "радиус" коридора на 1 пункт больше)

int ds=36; //"радиус" коридора в пунктах от рынка которое я устанавливаю.

При тестировании скрипта Алерт выдает что «нет в указанном диапазоне ордеров…»

Или потому что сегодня воскресенье и не все корректно работает

Восстановленный код скрипта ниже и фото с Alert –ом .

#property copyright "Copyright © 2008, MetaQuotes Software Corp."
#property link "http://www.metaquotes.net"
//+------------------------------------------------------------------+
//| script program start function |
//+------------------------------------------------------------------+
int start()
{
string sy="EURUSD";
int op=-1;
int mn=-1;
int ds=36; //"радиус" коридора в пунктах от рынка которое я устанавливаю.

if(!ExistOPNearMarket(sy,op,mn,ds)){Alert("Нет ордера в этом диапозоне!(от текущей цены)"," ",ds,"п.");}
if(ExistOPNearMarket(sy,op,mn,ds)){Alert("Есть ордер в этом диапозоне!(от текущей цены)"," ",ds,"п.");}
return(0);
}
//+----------------------------------------------------------------------------+
//| Автор : Ким Игорь В. aka KimIV, http://www.kimiv.ru |
//+----------------------------------------------------------------------------+
//| Версия : 19.02.2008 |
//| Описание : Возвращает флаг существования позиции или ордера около рынка |
//+----------------------------------------------------------------------------+
//| Параметры: |
//| sy - наименование инструмента ("" или NULL - текущий символ) |
//| op - торговая операция ( -1 - любая операция) |
//| mn - MagicNumber ( -1 - любой магик) |
//| ds - расстояние в пунктах от рынка ( 1000000 - по умолчанию) |
//+----------------------------------------------------------------------------+
bool ExistOPNearMarket(string sy="", int op=-1, int mn=-1, int ds=1000000) {
int i, k=OrdersTotal(), ot;

if (sy=="" || sy=="0") sy=Symbol();
double 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)) {
ot=OrderType();
if ((OrderSymbol()==sy) && (op<0 || ot==op)) {
if (mn<0 || OrderMagicNumber()==mn) {
if (ot==OP_BUY || ot==OP_BUYLIMIT || ot==OP_BUYSTOP) {
if (MathAbs(MarketInfo(sy, MODE_ASK)-OrderOpenPrice())<ds*p) return(True);
}
if (ot==OP_SELL || ot==OP_SELLLIMIT || ot==OP_SELLSTOP) {
if (MathAbs(OrderOpenPrice()-MarketInfo(sy, MODE_BID))<ds*p) return(True);
}
}
}
}
}
return(False);
}
 
Проверил у себя- Все работает. Вероятно Вы забываете, что для разных типов ордеров используются разные цены для расчета ( Ask & Bid)