Сопровождение серий с помощью отложенных ордеров

 

Ребята требуется помощь в реализации сопровождения отложенными ордерами

Алгоритм.

Тренд идет вниз, выше цены на 200 пунктов ставим отложку Buystop по какому либо сигналу, если цена не пошла вверх, подключаем сопровождение - цена идет дальше вниз, через 100 пунктов прохода выше цены снова ставим отложку бай стоп, получается что выше цены на 200 пунктов через 100 ставится сетка из отложек.

 

Столкнулся с проблемой, когда цена цепляет 1-2 отложки и снова идет дальше вниз, требуется что бы расчет продолжался идти от последнего ордера рыночного ордера, а не от не сработавшей отложки

 

С отложками и их учетом не когда не сталкивался, всегда рыночными работал, тут захотелось покопаться в них и возникла проблема как делать расчет расстояний от отложек когда они становяться рыночными ордерами.

Получается так что цена цепляет отложки и на цене рыночных выставляются новые отложники

 

 

Как этого избежать 

Сам блок сопровождения

//==========================  Buy =====================================
       
if(totalbs > 0 || totalbuy > 0)
  {  
     price=NormalizeDouble(OrderOpenPrice() - 100*Point,Digits);
           
     if(Ask < price) {   
        if (price > Ask + 200 * Point) {            
        ticketbuy=SendOrder(OP_BUYSTOP,0.01,price,0,0,MagicNumber,comment);
        }        
     }
  }
 
расчет продолжался идти от последнего ордера рыночного ордера, - сами же пишите "рыночный" , а вам похоже нужен последний выставленный стоп-ордер
 
Мне нужно что бы отложки выставлялись с отступом 100 пунктов от последнего ордера, в не зависимости рыночный он или отложенный, сейчас же при такой реализации, отложки ставятся на ценах срабоатвших отложников, мне же этого не нужно, нужно что бы пусть они срабатывают сколько им в лезет, но когда цена вновь отойдет от последнего нижнего ордера на 200 пунктов, выше на 100 должна поставиться отложка
 

Может поможет эта функция.

//+----------------------------------------------------------------------------+
//|  Описание : Возвращает флаг существования позиции или ордера в заданном    | 
//|           : диапазоне от заданной цены                                     |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    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);
}
 
от последнего ордера, в не зависимости рыночный он или отложенный  - может что то с терминологией у вас, отложенный может стать рыночным.
 
void Terminal2()
{
int oldticket=0;
double oldlot=0;
int Ticket=0;
int Type=-1;          
int KoL=OrdersHistoryTotal();
   
ArrayInitialize(Mas_KOL,0);
   for(
int i=Kol-1>= 0i--)
     {
      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

 
Konstantin Seredkin:

Да спасибо всем, но это не то, последняя позиция может быть гдени будь по середине сетки из 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");
  }
}
Как то так.
 
Konstantin Seredkin:

Ребята требуется помощь в реализации сопровождения отложенными ордерами

Алгоритм.

Тренд идет вниз, выше цены на 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 пунктов открывались ордера, пусть ставяться отложники и если цена будет корректироваться чуть вверх что то сработает, но уже в этом виде серия усреднения будет намного меньше.

 
Konstantin Seredkin:

Проверил, все работает, только чуть на оборот

робот ставит отложку, ждет когда она сработает, после как сработает выше ставит еще отложку

Если же идет вниз цена, то не чего не происходит

 

 

Так у меня тоже получалось сделать...

Нужно же что бы вот выставилась отложка, цена прошла вниз на 200 пунктов, выше цены на 100 выставилась отложка, получается между отложниками с проходом вниз шаг 100 пунктов.

Далее если отложник срабатывает и становится рыночным ордером что бы от самого нижнего ордера, когда цена пошла вниз, снова начали ставятся отложники, прошли от самого нижнего ордера, пусть он рыночный или отложенный на 200 пунктов, выше на 100 поставили отложник... вот над таким алгоритмом весь мозг себе сломал... как бы если просто рыночными работать тут все просто, но мне не нужно что бы через каждые 100 пунктов открывались ордера, пусть ставяться отложники и если цена будет корректироваться чуть вверх что то сработает, но уже в этом виде серия усреднения будет намного меньше.

Но ведь с помощью функции, которую я привёл выше сделать то, что вы хотите не трудно. Мне это делать просто лень, а вы подумайте. Нечто подобное я когда-то давно делал.
Причина обращения: