Может поможет эта функция.
//+----------------------------------------------------------------------------+ //| Описание : Возвращает флаг существования позиции или ордера в заданном | //| : диапазоне от заданной цены | //+----------------------------------------------------------------------------+ //| Параметры: | //| sy - наименование инструмента ("" или NULL - текущий символ) | //| op - торговая операция ( -1 - любая операция) | //| mn - MagicNumber ( -1 - любой магик) | //| price - заданная цена ( -1 - текущая цена рынка | //| ds - расстояние в пунктах от цены ( 1000000 - по умолчанию) | //+----------------------------------------------------------------------------+ bool ExistOPNearMarkets(string sy="", int op=-1, int mn=-1, double price = -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.00001; else p=0.001; for (i=0; i<k; i++) { if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) { ot=OrderType(); if (OrderSymbol()==sy) { if (mn<0 || OrderMagicNumber()==mn) { if (op==OP_BUY && (ot==OP_BUY || ot==OP_BUYLIMIT || ot==OP_BUYSTOP)) { if ((price<0 && MathAbs(MarketInfo(sy, MODE_ASK)-OrderOpenPrice())<ds*p) || (price>0 && MathAbs(price-OrderOpenPrice())<ds*p)) { return(True); } } if (op==OP_SELL && (ot==OP_SELL || ot==OP_SELLLIMIT || ot==OP_SELLSTOP)) { if ((price<0 && MathAbs(OrderOpenPrice()-MarketInfo(sy, MODE_BID))<ds*p) || (price>0 && MathAbs(OrderOpenPrice()-price)<ds*p)) { return(True); } } } } } } return(False); }
{
int oldticket=0;
double oldlot=0;
int Ticket=0;
int Type=-1;
int KoL=OrdersHistoryTotal();
ArrayInitialize(Mas_KOL,0);
for(int i=Kol-1; i >= 0; i--)
{
if(OrderSelect(i,SELECT_BY_POS, MODE_TRADES))
{
if (OrderSymbol()== Symbol()&& OrderMagicNumber() == Magik)
{
oldticket = OrderTicket();
if (oldticket > Ticket)
{
oldlot = OrderLots();
Ticket = oldticket;
Type = OrderType();
}
Mas_KOL[0]++; //количество ордеров
}
}
}
Mas_KOL[1]=oldlot;//лот последнего ордеров
Mas_KOL[2]=Ticket;//тикет последнего ордера
Mas_KOL[3]=Type; //тип последнего ордеров
}
Да спасибо всем, но это не то, последняя позиция может быть гдени будь по середине сетки из 20 ти ордеров, брать его для расчетов не правильно.
может есть какой нибудь способ что бы можно было узнавать самую наивысшую цену открытия ордера и самую наименьшую
- к примеру в диапазоне цены от 1.300 до 1.100 было выставлено 10 отложек бай стоп из них сработало 3
- самый нижний ордер находится на цене 1.100 как узнать его цену ??? если текущая цена находится где нибудь на 1.280
Да спасибо всем, но это не то, последняя позиция может быть гдени будь по середине сетки из 20 ти ордеров, брать его для расчетов не правильно.
может есть какой нибудь способ что бы можно было узнавать самую наивысшую цену открытия ордера и самую наименьшую
- к примеру в диапазоне цены от 1.300 до 1.100 было выставлено 10 отложек бай стоп из них сработало 3
- самый нижний ордер находится на цене 1.100 как узнать его цену ??? если текущая цена находится где нибудь на 1.280
//+------------------------------------------------------------------+ //| Script program start function | //+------------------------------------------------------------------+ void OnStart() { int uptype,lowtype,i; double upmost=0; //самый верхний double lowmost=999; //самый нижний for(i=0; i<OrdersTotal(); i++) { if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) { if(OrderSymbol()==Symbol()) { if(upmost<OrderOpenPrice()) { upmost=OrderOpenPrice(); uptype=OrderType(); } } } } for(i=0; i<OrdersTotal(); i++) { if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) { if(OrderSymbol()==Symbol()) { if(lowmost>OrderOpenPrice()) { lowmost=OrderOpenPrice(); lowtype=OrderType(); } } } } MessageBox("самый верхний : "+GetNameOP(uptype)+" : по цене = "+upmost+"\n"+ "самый нижний : "+GetNameOP(lowtype)+" : по цене = "+lowmost); } //+------------------------------------------------------------------+ string GetNameOP(int op) { switch (op) { case OP_BUY : return("Buy"); case OP_SELL : return("Sell"); case OP_BUYLIMIT : return("BuyLimit"); case OP_SELLLIMIT: return("SellLimit"); case OP_BUYSTOP : return("BuyStop"); case OP_SELLSTOP : return("SellStop"); default : return("Unknown Operation"); } }Как то так.
Ребята требуется помощь в реализации сопровождения отложенными ордерами
Алгоритм.
Тренд идет вниз, выше цены на 200 пунктов ставим отложку Buystop по какому либо сигналу, если цена не пошла вверх, подключаем сопровождение - цена идет дальше вниз, через 100 пунктов прохода выше цены снова ставим отложку бай стоп, получается что выше цены на 200 пунктов через 100 ставится сетка из отложек.
Столкнулся с проблемой, когда цена цепляет 1-2 отложки и снова идет дальше вниз, требуется что бы расчет продолжался идти от последнего ордера рыночного ордера, а не от не сработавшей отложки
С отложками и их учетом не когда не сталкивался, всегда рыночными работал, тут захотелось покопаться в них и возникла проблема как делать расчет расстояний от отложек когда они становяться рыночными ордерами.
Получается так что цена цепляет отложки и на цене рыночных выставляются новые отложники
Как этого избежать
Сам блок сопровождения
//+------------------------------------------------------------------+ //| помощь.mq4 | //| Copyright 2016, MetaQuotes Software Corp. | //| https://www.mql5.com | //+------------------------------------------------------------------+ #property copyright "Copyright 2016, MetaQuotes Software Corp." #property link "https://www.mql5.com" #property version "1.00" #property strict input int Magic=12345; input double Lot=0.1; input int Distance=100; int tiket=0; //+------------------------------------------------------------------+ //| Expert initialization function | //+------------------------------------------------------------------+ int OnInit() { //--- create timer //--- return(INIT_SUCCEEDED); } //+------------------------------------------------------------------+ //| Expert deinitialization function | //+------------------------------------------------------------------+ void OnDeinit(const int reason) { //--- destroy timer } //+------------------------------------------------------------------+ //| Expert tick function | //+------------------------------------------------------------------+ void OnTick() { //--- if(Total_orders(_Symbol,OP_BUYSTOP)==0) { tiket=OrderSend(_Symbol,OP_BUYSTOP,Lot,Ask+Distance*_Point,3,0,0,NULL,Magic); if(tiket<0)Print("Ошибка OrderSend № - ",GetLastError()); } event(tiket); } //+------------------------------------------------------------------+ int Total_orders(string symbol,int type) { int n=0; int total=OrdersTotal(); for(int i=0; i<total; i++) { if(OrderSelect(i,SELECT_BY_POS)) { if(OrderType()!=type)continue; if(OrderMagicNumber()!=Magic)continue; if(OrderSymbol()!=symbol)continue; n++; } } return(n); } //+------------------------------------------------------------------+ void event(int ticket) { if(OrderSelect(ticket,SELECT_BY_TICKET)) { if(OrderType()==OP_BUY) { tiket=OrderSend(_Symbol,OP_BUYSTOP,Lot,OrderOpenPrice()+Distance*_Point,3,0,0,NULL,Magic); if(tiket<0)Print("Ошибка OrderSend № - ",GetLastError()); } } } //+------------------------------------------------------------------+
Проверил, все работает, только чуть на оборот
робот ставит отложку, ждет когда она сработает, после как сработает выше ставит еще отложку
Если же идет вниз цена, то не чего не происходит
Так у меня тоже получалось сделать...
Нужно же что бы вот выставилась отложка, цена прошла вниз на 200 пунктов, выше цены на 100 выставилась отложка, получается между отложниками с проходом вниз шаг 100 пунктов.
Далее если отложник срабатывает и становится рыночным ордером что бы от самого нижнего ордера, когда цена пошла вниз, снова начали ставятся отложники, прошли от самого нижнего ордера, пусть он рыночный или отложенный на 200 пунктов, выше на 100 поставили отложник... вот над таким алгоритмом весь мозг себе сломал... как бы если просто рыночными работать тут все просто, но мне не нужно что бы через каждые 100 пунктов открывались ордера, пусть ставяться отложники и если цена будет корректироваться чуть вверх что то сработает, но уже в этом виде серия усреднения будет намного меньше.
Проверил, все работает, только чуть на оборот
робот ставит отложку, ждет когда она сработает, после как сработает выше ставит еще отложку
Если же идет вниз цена, то не чего не происходит
Так у меня тоже получалось сделать...
Нужно же что бы вот выставилась отложка, цена прошла вниз на 200 пунктов, выше цены на 100 выставилась отложка, получается между отложниками с проходом вниз шаг 100 пунктов.
Далее если отложник срабатывает и становится рыночным ордером что бы от самого нижнего ордера, когда цена пошла вниз, снова начали ставятся отложники, прошли от самого нижнего ордера, пусть он рыночный или отложенный на 200 пунктов, выше на 100 поставили отложник... вот над таким алгоритмом весь мозг себе сломал... как бы если просто рыночными работать тут все просто, но мне не нужно что бы через каждые 100 пунктов открывались ордера, пусть ставяться отложники и если цена будет корректироваться чуть вверх что то сработает, но уже в этом виде серия усреднения будет намного меньше.

- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Ребята требуется помощь в реализации сопровождения отложенными ордерами
Алгоритм.
Тренд идет вниз, выше цены на 200 пунктов ставим отложку Buystop по какому либо сигналу, если цена не пошла вверх, подключаем сопровождение - цена идет дальше вниз, через 100 пунктов прохода выше цены снова ставим отложку бай стоп, получается что выше цены на 200 пунктов через 100 ставится сетка из отложек.
Столкнулся с проблемой, когда цена цепляет 1-2 отложки и снова идет дальше вниз, требуется что бы расчет продолжался идти от последнего ордера рыночного ордера, а не от не сработавшей отложки
С отложками и их учетом не когда не сталкивался, всегда рыночными работал, тут захотелось покопаться в них и возникла проблема как делать расчет расстояний от отложек когда они становяться рыночными ордерами.
Получается так что цена цепляет отложки и на цене рыночных выставляются новые отложники
Как этого избежать
Сам блок сопровождения