Открытие по by market

 

Заранее приношу извинения если где-то уже есть...
Однако поиск не помог, и потому открываю эту тему.

Проблема в том... что у "моего" ДЦ 2/3 инструментов исполнения по by market
а это как известно имеет некий существенный недостаток: нельзя выставить сразу стопы
И соответственно "не работают" те скрипты и советники что сразу их ставят, т.е. имеют такой вид:

extern int StopLoss=20;
extern int TakeProfit=20;
void start()
{  int ticket;
   double loss=0; if(StopLoss>0) loss=Ask-StopLoss*Point; 
   double profit=0; if(TakeProfit>0) profit=Ask+StopLoss*Point;
   ticket=OrderSend(Symbol(),OP_BUY,lots,Ask,10,loss,profit,"",0,0,CLR_NONE);
   if (ticket<1) Print ("Error = ",GetLastError());
}

Выходом из ситуации было бы игнорирование терминалом при таком исполнении уровней и тупо подставлять 0.

Но это ещё половина решения, даже если разработчики примут к сведению...
Гораздо неудобнее то, что такими простыми средствами MQL не решить открытие со стопами
без существенной доработки скриптов... лично моего ламерского уровня хватило лишь на это:

int ticket=OrderSend(Symbol(),OP_BUY,1,Ask,100,0,0,"",0,0,CLR_NONE); 
ticket=OrderSend(Symbol(),OP_SELLLIMIT,1,Ask+100*Point,100,0,0,"",0,0,CLR_NONE);//типа стоп-лосс
ticket=OrderSend(Symbol(),OP_SELLSTOP,1,Ask-100*Point,100,0,0,"",0,0,CLR_NONE);//типа тейк-профит
if (ticket<1) Print("Ошибка = ",GetLastError());
т.е. за однин проход открывается поза по рынку и сразу же "стопы" в виде отложенных ордеров.

Однако это решение через одно место...
Хотя бы по тому что открывается в 2/3 "лишних" ордеров, три запроса на сервер, усложняется контроль.
Да ещё и уровни отложенных может отчаться от выставленные 100 пип "стопов" при
слишком подвижном рынке... т.е. по уму надо бы не Аск а уровень открытия "основной" позиции подставлять.

В общем просьба!
помогите разрубить этот узел со стопами "за раз" с открытием позиции для исполнения по маркету.

Ключевые слова для поиска, вдруг кому ещё пригодится:
by market, sell by market, buy by market, селл по маркету, бай по маркету, по рынку.

 
А после открытия позы можно менять стоп и тэйк с нуля до нужного значения?
 
Да, в остальном всё как обычно...
 

Я пытался использовать:ъ

OrderModify(???,0,Ask-100*Point,Ask+100*Point,0,CLR_NONE);

но что должно быть вместо ???
OrderTicket()

даёт ошибку...

 
kombat. Попробуй предварительно выбрать ордер по команде OrderSelect(.....). Должно помочь.
 

Дык первый OrderSend возвращает номер тикета, если нет ошибок.

Потом надо наверное задержку вставить Sleep(5000)

А потом еще проверить if(OrderSelect(ticket, SELECT_BY_TICKET))

 
OrderModify(OrderTicket(),OrderOpenPrice(),NormalizeDouble(Bid-Point*TrailingStop,Digits),NormalizeDouble((Ask+TakeProfit*Point),Digits),0,Green);
и 
OrderModify(OrderTicket(),OrderOpenPrice(),NormalizeDouble(Ask+Point*TrailingStop,Digits),NormalizeDouble((Bid-TakeProfit*Point),Digits),0,Red);
 
kombat:

Проблема в том... что у "моего" ДЦ 2/3 инструментов исполнения по by market

Будьте добры, скиньте адресок ДЦ figaro#mail.ru . Хочу попробовать адаптировать советник.
 
meta-trader2007 писал (а):
OrderModify(OrderTicket(),OrderOpenPrice(),NormalizeDouble(Bid-Point*TrailingStop,Digits),NormalizeDouble((Ask+TakeProfit*Point),Digits),0,Green);
и 
OrderModify(OrderTicket(),OrderOpenPrice(),NormalizeDouble(Ask+Point*TrailingStop,Digits),NormalizeDouble((Bid-TakeProfit*Point),Digits),0,Red);


OrderTicket, OrderOpenPrice... работают только после OrderSelect.

После OrderSend нужно обязательно делать OrderSelect, если предусматривается дальнейшая модификация ордера.

 
Кароче после открытия позы вызовите такую функцию:
void Trailingstoplossi ()
{
    Sleep (10000);
    int cnt, total;
    total=OrdersTotal();
    for(cnt=0;cnt<total;cnt++)
     {
      OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
      if(OrderType()<=OP_SELL &&   // check for opened position 
         OrderSymbol()==Symbol()&& OrderMagicNumber()==MAGIC)  // check for symbol
        {
         if(OrderType()==OP_BUY)   // long position is opened
           {   
               if(NormalizeDouble(Bid-OrderOpenPrice(),Digits)>NormalizeDouble(Point*TrailingStop,Digits))
                 {
                  if(OrderStopLoss()<NormalizeDouble(Bid-Point*TrailingStop, Digits))
                    {
                     OrderModify(OrderTicket(),OrderOpenPrice(),NormalizeDouble((Bid-Point*TrailingStop),Digits),NormalizeDouble((Ask+TakeProfit*Point),Digits),0,Green);
                     return(0);
                    }
                 }
           }
         else 
           {                
               if(NormalizeDouble((OrderOpenPrice()-Ask),Digits)>NormalizeDouble((Point*TrailingStop),Digits))
                 {
                  if((NormalizeDouble(OrderStopLoss(),Digits)>NormalizeDouble((Ask+Point*TrailingStop),Digits)) || (OrderStopLoss()==0))
                    {
                     OrderModify(OrderTicket(),OrderOpenPrice(),NormalizeDouble((Ask+Point*TrailingStop),Digits),NormalizeDouble((Bid-TakeProfit*Point),Digits),0,Red);
                     return(0);
                    }
                 }
              
           }
        }
     }
   return(0);
}
 
Вызывается функция так (сразу после команд на открытие поз напишите):
Trailingstoplossi ();
Причина обращения: