В этой функции не надо ничего изменять ( тем более так криво как у Вас). Она и так выполняет необходимое вам действие.
ds - расстояние в пунктах от рынка ( 1000000 - по умолчанию) |
Пользуйтесь этой переменной функции с указанием дистанции в 5 пунктов (например) Она и определяет ширину коридора от текущей цены вверх и вниз (по 5 пунктов соответственно)
В этой функции не надо ничего изменять ( тем более так криво как у Вас). Она и так выполняет необходимое вам действие.
ds - расстояние в пунктах от рынка ( 1000000 - по умолчанию) |
Пользуйтесь этой переменной функции с указанием дистанции в 5 пунктов (например) Она и определяет ширину коридора от текущей цены вверх и вниз (по 5 пунктов соответственно)
Что-то я не понимаю!
Я восстановил все как было у Кима но что то у меня не получается или я не понимаю…
У меня открыта позиция на расстоянии по цене 1.5753 сейчас цена 1.5788 разница между ценой открытия и рыночной ценой в 35 пунктов.
Указываю в скрипте ds=36 что на 1 пункт больше(т.е. "радиус"
коридора на 1 пункт больше)
int ds=36; //"радиус" коридора в пунктах от рынка которое я устанавливаю.
При тестировании скрипта Алерт выдает что «нет в указанном диапазоне ордеров…»
Или потому что сегодня воскресенье и не все корректно работает
Восстановленный код скрипта ниже и фото с Alert –ом .
#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);
}
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Подскажите что не так?
Я взял у Кима функцию 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 ((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);
}